Skip to content

Commit 954ef31

Browse files
authored
polish PaddleSeg loss docs (#269)
1 parent 5ce8d78 commit 954ef31

File tree

5 files changed

+169
-121
lines changed

5 files changed

+169
-121
lines changed

README.md

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
PaddleSeg是基于[PaddlePaddle](https://www.paddlepaddle.org.cn)开发的端到端图像分割开发套件,覆盖了DeepLabv3+, U-Net, ICNet, PSPNet, HRNet, Fast-SCNN等主流分割网络。通过模块化的设计,以配置化方式驱动模型组合,帮助开发者更便捷地完成从训练到部署的全流程图像分割应用。
1212

13-
- [特点](#特点)
13+
- [特点](#特点)
1414
- [安装](#安装)
1515
- [使用教程](#使用教程)
1616
- [快速入门](#快速入门)
@@ -31,7 +31,7 @@ PaddleSeg是基于[PaddlePaddle](https://www.paddlepaddle.org.cn)开发的端到
3131

3232
- **模块化设计**
3333

34-
支持U-Net, DeepLabv3+, ICNet, PSPNet, HRNet, Fast-SCNN六种主流分割网络,结合预训练模型和可调节的骨干网络,满足不同性能和精度的要求;选择不同的损失函数如Dice Loss, BCE Loss等方式可以强化小目标和不均衡样本场景下的分割精度。
34+
支持U-Net, DeepLabv3+, ICNet, PSPNet, HRNet, Fast-SCNN六种主流分割网络,结合预训练模型和可调节的骨干网络,满足不同性能和精度的要求;选择不同的损失函数如Dice Loss, Lovasz Loss等方式可以强化小目标和不均衡样本场景下的分割精度。
3535

3636
- **高性能**
3737

@@ -107,8 +107,8 @@ pip install -r requirements.txt
107107
### 高级功能
108108

109109
* [PaddleSeg的数据增强](./docs/data_aug.md)
110-
* [如何解决二分类中类别不均衡问题](./docs/loss_select.md)
111-
* [特色垂类模型使用](./contrib)
110+
* [PaddleSeg的loss选择](./docs/loss_select.md)
111+
* [PaddleSeg产业实践](./contrib)
112112
* [多进程训练和混合精度训练](./docs/multiple_gpus_train_and_mixed_precision_train.md)
113113
* 使用PaddleSlim进行分割模型压缩([量化](./slim/quantization/README.md), [蒸馏](./slim/distillation/README.md), [剪枝](./slim/prune/README.md), [搜索](./slim/nas/README.md))
114114
## 在线体验
@@ -162,15 +162,15 @@ A: 降低Batch size,使用Group Norm策略;请注意训练过程中当`DEFAU
162162
* 新增[气象遥感分割方案](./contrib/RemoteSensing),支持积雪识别、云检测等气象遥感场景。
163163
* 新增[Lovasz Loss](docs/lovasz_loss.md),解决数据类别不均衡问题。
164164
* 使用VisualDL 2.0作为训练可视化工具
165-
165+
166166
* 2020.02.25
167167

168168
**`v0.4.0`**
169169
* 新增适用于实时场景且不需要预训练模型的分割网络Fast-SCNN,提供基于Cityscapes的[预训练模型](./docs/model_zoo.md)1个
170170
* 新增LaneNet车道线检测网络,提供[预训练模型](https://github.com/PaddlePaddle/PaddleSeg/tree/release/v0.4.0/contrib/LaneNet#%E4%B8%83-%E5%8F%AF%E8%A7%86%E5%8C%96)一个
171171
* 新增基于PaddleSlim的分割库压缩策略([量化](./slim/quantization/README.md), [蒸馏](./slim/distillation/README.md), [剪枝](./slim/prune/README.md), [搜索](./slim/nas/README.md))
172-
173-
172+
173+
174174
* 2019.12.15
175175

176176
**`v0.3.0`**
@@ -182,7 +182,7 @@ A: 降低Batch size,使用Group Norm策略;请注意训练过程中当`DEFAU
182182
* 新增Paddle-Lite移动端部署方案,支持人像分割模型的移动端部署。
183183
* 新增不同分割模型的预测[性能数据Benchmark](./deploy/python/docs/PaddleSeg_Infer_Benchmark.md), 便于开发者提供模型选型性能参考。
184184

185-
185+
186186
* 2019.11.04
187187

188188
**`v0.2.0`**

docs/dice_loss.md

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
# Dice loss
2+
对于二类图像分割任务中,经常出现类别分布不均匀的情况,例如:工业产品的瑕疵检测、道路提取及病变区域提取等。我们可使用dice loss(dice coefficient loss)解决这个问题。
3+
4+
注:dice loss和bce loss仅支持二分类。
5+
6+
## 原理介绍
7+
Dice loss的定义如下:
8+
9+
<p align="center">
10+
<img src="./imgs/dice.png" hspace='10' height="46" width="200"/> <br />
11+
</p>
12+
13+
14+
其中 Y 表示ground truth,P 表示预测结果。| |表示矩阵元素之和。![](./imgs/dice2.png) 表示*Y**P*的共有元素数,
15+
实际通过求两者的逐像素乘积之和进行计算。例如:
16+
17+
<p align="center">
18+
<img src="./imgs/dice3.png" hspace='10' /> <br />
19+
</p>
20+
21+
其中 1 表示前景,0 表示背景。
22+
23+
**Note:** 在标注图片中,务必保证前景像素值为1,背景像素值为0.
24+
25+
Dice系数请参见[维基百科](https://zh.wikipedia.org/wiki/Dice%E7%B3%BB%E6%95%B0)
26+
27+
**为什么在类别不均衡问题上,dice loss效果比softmax loss更好?**
28+
29+
首先来看softmax loss的定义:
30+
31+
<p align="center">
32+
<img src="./imgs/softmax_loss.png" height="130" /> <br />
33+
</p>
34+
35+
其中 y 表示ground truth,p 表示网络输出。
36+
37+
在图像分割中,`softmax loss`评估每一个像素点的类别预测,然后平均所有的像素点。这个本质上就是对图片上的每个像素进行平等的学习。这就造成了一个问题,如果在图像上的多种类别有不平衡的表征,那么训练会由最主流的类别主导。以上面DeepGlobe道路提取的数据为例子,网络将偏向于背景的学习,降低了网络对前景目标的提取能力。
38+
`dice loss(dice coefficient loss)`通过预测和标注的交集除以它们的总体像素进行计算,它将一个类别的所有像素作为一个整体作为考量,而且计算交集在总体中的占比,所以不受大量背景像素的影响,能够取得更好的效果。
39+
40+
在实际应用中`dice loss`往往与`bce loss(binary cross entroy loss)`结合使用,提高模型训练的稳定性。
41+
42+
43+
## PaddleSeg指定训练loss
44+
45+
PaddleSeg通过`cfg.SOLVER.LOSS`参数可以选择训练时的损失函数,
46+
`cfg.SOLVER.LOSS=['dice_loss','bce_loss']`将指定训练loss为`dice loss``bce loss`的组合
47+
48+
## Dice loss解决类别不均衡问题的示例
49+
50+
我们以道路提取任务为例应用dice loss.
51+
在DeepGlobe比赛的Road Extraction中,训练数据道路占比为:4.5%. 如下为其图片样例:
52+
<p align="center">
53+
<img src="./imgs/deepglobe.png" hspace='10'/> <br />
54+
</p>
55+
可以看出道路在整张图片中的比例很小。
56+
57+
### 数据集下载
58+
我们从DeepGlobe比赛的Road Extraction的训练集中随机抽取了800张图片作为训练集,200张图片作为验证集,
59+
制作了一个小型的道路提取数据集[MiniDeepGlobeRoadExtraction](https://paddleseg.bj.bcebos.com/dataset/MiniDeepGlobeRoadExtraction.zip)
60+
61+
### 实验比较
62+
63+
在MiniDeepGlobeRoadExtraction数据集进行了实验比较。
64+
65+
* 数据集下载
66+
```shell
67+
python dataset/download_mini_deepglobe_road_extraction.py
68+
```
69+
70+
* 预训练模型下载
71+
```shell
72+
python pretrained_model/download_model.py deeplabv3p_mobilenetv2-1-0_bn_coco
73+
```
74+
* 配置/数据校验
75+
```shell
76+
python pdseg/check.py --cfg ./configs/deepglobe_road_extraction.yaml
77+
```
78+
79+
* 训练
80+
```shell
81+
python pdseg/train.py --cfg ./configs/deepglobe_road_extraction.yaml --use_gpu SOLVER.LOSS "['dice_loss','bce_loss']"
82+
83+
```
84+
85+
* 评估
86+
```
87+
python pdseg/eval.py --cfg ./configs/deepglobe_road_extraction.yaml --use_gpu SOLVER.LOSS "['dice_loss','bce_loss']"
88+
89+
```
90+
91+
* 结果比较
92+
93+
softmax loss和dice loss + bce loss实验结果如下图所示。
94+
图中橙色曲线为dice loss + bce loss,最高mIoU为76.02%,蓝色曲线为softmax loss, 最高mIoU为73.62%。
95+
<p align="center">
96+
<img src="./imgs/loss_comparison.png" hspace='10' height="208" width="516"/> <br />
97+
</p>

docs/imgs/VOC2012.png

224 KB
Loading

docs/loss_select.md

Lines changed: 28 additions & 98 deletions
Original file line numberDiff line numberDiff line change
@@ -1,101 +1,31 @@
1-
# 如何解决二分类中类别不均衡问题
2-
对于二类图像分割任务中,经常出现类别分布不均匀的情况,例如:工业产品的瑕疵检测、道路提取及病变区域提取等。
3-
4-
目前PaddleSeg提供了三种loss函数,分别为softmax loss(sotfmax with cross entroy loss)、dice loss(dice coefficient loss)和bce loss(binary cross entroy loss). 我们可使用dice loss解决这个问题。
5-
6-
注:dice loss和bce loss仅支持二分类。
7-
8-
## Dice loss
9-
Dice loss的定义如下:
10-
11-
<p align="center">
12-
<img src="./imgs/dice.png" hspace='10' height="46" width="200"/> <br />
13-
</p>
14-
15-
16-
其中 Y 表示ground truth,P 表示预测结果。| |表示矩阵元素之和。![](./imgs/dice2.png) 表示*Y**P*的共有元素数,
17-
实际通过求两者的逐像素乘积之和进行计算。例如:
18-
19-
<p align="center">
20-
<img src="./imgs/dice3.png" hspace='10' /> <br />
21-
</p>
22-
23-
其中 1 表示前景,0 表示背景。
24-
25-
**Note:** 在标注图片中,务必保证前景像素值为1,背景像素值为0.
26-
27-
Dice系数请参见[维基百科](https://zh.wikipedia.org/wiki/Dice%E7%B3%BB%E6%95%B0)
28-
29-
**为什么在类别不均衡问题上,dice loss效果比softmax loss更好?**
30-
31-
首先来看softmax loss的定义:
32-
33-
<p align="center">
34-
<img src="./imgs/softmax_loss.png" height="130" /> <br />
35-
</p>
36-
37-
其中 y 表示ground truth,p 表示网络输出。
38-
39-
在图像分割中,`softmax loss`评估每一个像素点的类别预测,然后平均所有的像素点。这个本质上就是对图片上的每个像素进行平等的学习。这就造成了一个问题,如果在图像上的多种类别有不平衡的表征,那么训练会由最主流的类别主导。以上面DeepGlobe道路提取的数据为例子,网络将偏向于背景的学习,降低了网络对前景目标的提取能力。
40-
`dice loss(dice coefficient loss)`通过预测和标注的交集除以它们的总体像素进行计算,它将一个类别的所有像素作为一个整体作为考量,而且计算交集在总体中的占比,所以不受大量背景像素的影响,能够取得更好的效果。
41-
42-
在实际应用中`dice loss`往往与`bce loss(binary cross entroy loss)`结合使用,提高模型训练的稳定性。
43-
44-
45-
## PaddleSeg指定训练loss
46-
47-
PaddleSeg通过`cfg.SOLVER.LOSS`参数可以选择训练时的损失函数,
48-
`cfg.SOLVER.LOSS=['dice_loss','bce_loss']`将指定训练loss为`dice loss``bce loss`的组合
49-
50-
## Dice loss解决类别不均衡问题的示例
51-
52-
我们以道路提取任务为例应用dice loss.
53-
在DeepGlobe比赛的Road Extraction中,训练数据道路占比为:4.5%. 如下为其图片样例:
54-
<p align="center">
55-
<img src="./imgs/deepglobe.png" hspace='10'/> <br />
56-
</p>
57-
可以看出道路在整张图片中的比例很小。
58-
59-
### 数据集下载
60-
我们从DeepGlobe比赛的Road Extraction的训练集中随机抽取了800张图片作为训练集,200张图片作为验证集,
61-
制作了一个小型的道路提取数据集[MiniDeepGlobeRoadExtraction](https://paddleseg.bj.bcebos.com/dataset/MiniDeepGlobeRoadExtraction.zip)
62-
63-
### 实验比较
64-
65-
在MiniDeepGlobeRoadExtraction数据集进行了实验比较。
66-
67-
* 数据集下载
68-
```shell
69-
python dataset/download_mini_deepglobe_road_extraction.py
1+
# Loss选择
2+
3+
目前PaddleSeg提供了6种损失函数,分别为
4+
- Softmax loss (softmax with cross entropy loss)
5+
- Weighted softmax loss (weighted softmax with cross entropy loss)
6+
- Dice loss (dice coefficient loss)
7+
- Bce loss (binary cross entropy loss)
8+
- Lovasz hinge loss
9+
- Lovasz softmax loss
10+
11+
## 类别不均衡问题
12+
在图像分割任务中,经常出现类别分布不均匀的情况,例如:工业产品的瑕疵检测、道路提取及病变区域提取等。
13+
14+
针对这个问题,您可使用Weighted softmax loss、Dice loss、Lovasz hinge loss和Lovasz softmax loss进行解决。
15+
16+
### Weighted softmax loss
17+
Weighted softmax loss是按类别设置不同权重的softmax loss。
18+
19+
通过设置`cfg.SOLVER.CROSS_ENTROPY_WEIGHT`参数进行使用。
20+
默认为None. 如果设置为'dynamic',会根据每个batch中各个类别的数目,动态调整类别权重。
21+
也可以设置一个静态权重(list的方式),比如有3类,每个类别权重可以设置为[0.1, 2.0, 0.9]. 示例如下
22+
```yaml
23+
SOLVER:
24+
CROSS_ENTROPY_WEIGHT: 'dynamic'
7025
```
7126
72-
* 预训练模型下载
73-
```shell
74-
python pretrained_model/download_model.py deeplabv3p_mobilenetv2-1-0_bn_coco
75-
```
76-
* 配置/数据校验
77-
```shell
78-
python pdseg/check.py --cfg ./configs/deepglobe_road_extraction.yaml
79-
```
80-
81-
* 训练
82-
```shell
83-
python pdseg/train.py --cfg ./configs/deepglobe_road_extraction.yaml --use_gpu SOLVER.LOSS "['dice_loss','bce_loss']"
84-
85-
```
86-
87-
* 评估
88-
```
89-
python pdseg/eval.py --cfg ./configs/deepglobe_road_extraction.yaml --use_gpu SOLVER.LOSS "['dice_loss','bce_loss']"
90-
91-
```
92-
93-
* 结果比较
94-
95-
softmax loss和dice loss + bce loss实验结果如下图所示。
96-
图中橙色曲线为dice loss + bce loss,最高mIoU为76.02%,蓝色曲线为softmax loss, 最高mIoU为73.62%。
97-
<p align="center">
98-
<img src="./imgs/loss_comparison.png" hspace='10' height="208" width="516"/> <br />
99-
</p>
100-
27+
### Dice loss
28+
参见[Dice loss教程](./dice_loss.md)
10129
30+
### Lovasz hinge loss和Lovasz softmax loss
31+
参见[Lovasz loss教程](./lovasz_loss.md)

docs/lovasz_loss.md

Lines changed: 36 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,37 @@
11
# Lovasz loss
2-
对于图像分割任务中,经常出现类别分布不均匀的情况,例如:工业产品的瑕疵检测、道路提取及病变区域提取等。
2+
对于图像分割任务中,经常出现类别分布不均匀的情况,例如:工业产品的瑕疵检测、道路提取及病变区域提取等。我们可使用lovasz loss解决这个问题。
33

4-
我们可使用lovasz loss解决这个问题。Lovasz loss根据分割目标的类别数量可分为两种:lovasz hinge loss适用于二分类问题,lovasz softmax loss适用于多分类问题。
4+
Lovasz loss基于子模损失(submodular losses)的凸Lovasz扩展,对神经网络的mean IoU损失进行优化。Lovasz loss根据分割目标的类别数量可分为两种:lovasz hinge loss和lovasz softmax loss. 其中lovasz hinge loss适用于二分类问题,lovasz softmax loss适用于多分类问题。该工作发表在CVPR 2018上,可点击[参考文献](#参考文献)查看具体原理
55

66

77
## Lovasz hinge loss
8-
### 使用方式
8+
### 使用指南
99

1010
PaddleSeg通过`cfg.SOLVER.LOSS`参数可以选择训练时的损失函数,
11-
`cfg.SOLVER.LOSS=['lovasz_hinge_loss','bce_loss']`将指定训练loss为`lovasz hinge loss``bce loss`的组合。
11+
`cfg.SOLVER.LOSS=['lovasz_hinge_loss','bce_loss']`将指定训练loss为`lovasz hinge loss``bce loss`(binary cross-entropy loss)的组合。
1212

1313
Lovasz hinge loss有3种使用方式:(1)直接训练使用。(2)bce loss结合使用。(3)先使用bec loss进行训练,再使用lovasz hinge loss进行finetuning. 第1种方式不一定达到理想效果,推荐使用后两种方式。本文以第2种方式为例。
1414

15-
### 使用示例
15+
同时,也可以通过`cfg.SOLVER.LOSS_WEIGHT`参数对不同loss进行权重配比,灵活运用于训练调参。如下所示
16+
```yaml
17+
SOLVER:
18+
LOSS: ["lovasz_hinge_loss","bce_loss"]
19+
LOSS_WEIGHT:
20+
LOVASZ_HINGE_LOSS: 0.5
21+
BCE_LOSS: 0.5
22+
```
23+
24+
### 实验对比
1625
1726
我们以道路提取任务为例应用lovasz hinge loss.
18-
在DeepGlobe比赛的Road Extraction中,训练数据道路占比为:4.5%. 如下为其图片样例:
27+
基于MiniDeepGlobeRoadExtraction数据集与bce loss进行了实验对比。
28+
该数据集来源于DeepGlobe比赛的Road Extraction单项,训练数据道路占比为:4.5%. 如下为其图片样例:
1929
<p align="center">
2030
<img src="./imgs/deepglobe.png" hspace='10'/> <br />
2131
</p>
2232
可以看出道路在整张图片中的比例很小。
2333
24-
#### 实验对比
25-
26-
在MiniDeepGlobeRoadExtraction数据集进行了实验对比。
34+
为进行快速体验,这里使用DeepLabv3+模型,backbone为MobileNetV2.
2735
2836
* 数据集下载
2937
我们从DeepGlobe比赛的Road Extraction的训练集中随机抽取了800张图片作为训练集,200张图片作为验证集,
@@ -64,23 +72,32 @@ lovasz hinge loss + bce loss和softmax loss的对比结果如下图所示。
6472

6573

6674
## Lovasz softmax loss
67-
### 使用方式
75+
### 使用指南
6876

6977
PaddleSeg通过`cfg.SOLVER.LOSS`参数可以选择训练时的损失函数,
7078
`cfg.SOLVER.LOSS=['lovasz_softmax_loss','softmax_loss']`将指定训练loss为`lovasz softmax loss``softmax loss`的组合。
7179

7280
Lovasz softmax loss有3种使用方式:(1)直接训练使用。(2)softmax loss结合使用。(3)先使用softmax loss进行训练,再使用lovasz softmax loss进行finetuning. 第1种方式不一定达到理想效果,推荐使用后两种方式。本文以第2种方式为例。
7381

74-
### 使用示例
75-
76-
我们以Pascal voc为例应用lovasz softmax loss.
82+
同时,也可以通过`cfg.SOLVER.LOSS_WEIGHT`参数对不同loss进行权重配比,灵活运用于训练调参。如下所示
83+
```yaml
84+
SOLVER:
85+
LOSS: ["lovasz_softmax_loss","softmax_loss"]
86+
LOSS_WEIGHT:
87+
LOVASZ_SOFTMAX_LOSS: 0.2
88+
SOFTMAX_LOSS: 0.8
89+
```
7790
91+
### 实验对比
7892
79-
#### 实验对比
93+
接下来以PASCAL VOC 2012数据集为例应用lovasz softmax loss. 我们将lovasz softmax loss与softmax loss进行了实验对比。为进行快速体验,这里使用DeepLabv3+模型,backbone为MobileNetV2.
8094
81-
在Pascal voc数据集上与softmax loss进行了实验对比。
8295
8396
* 数据集下载
97+
<p align="center">
98+
<img src="./imgs/VOC2012.png" width="50%" height="50%" hspace='10'/> <br />
99+
</p>
100+
84101
```shell
85102
python dataset/download_and_convert_voc2012.py
86103
```
@@ -114,3 +131,7 @@ lovasz softmax loss + softmax loss和softmax loss的对比结果如下图所示
114131
</p>
115132

116133
图中橙色曲线代表lovasz softmax loss + softmax loss,最高mIoU为64.63%,蓝色曲线代表softmax loss, 最高mIoU为63.55%,相比提升1.08个百分点。
134+
135+
136+
## 参考文献
137+
[Berman M, Rannen Triki A, Blaschko M B. The lovász-softmax loss: a tractable surrogate for the optimization of the intersection-over-union measure in neural networks[C]//Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2018: 4413-4421.](http://openaccess.thecvf.com/content_cvpr_2018/html/Berman_The_LovaSz-Softmax_Loss_CVPR_2018_paper.html)

0 commit comments

Comments
 (0)