diff --git a/README.md b/README.md index 84a9a8a43454617d7cfa086836fbd61a3d4a4a01..a674b03043142b7c19723a30af9705ab25cedeea 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ PaddleSeg是基于[PaddlePaddle](https://www.paddlepaddle.org.cn)开发的端到端图像分割开发套件,覆盖了DeepLabv3+, U-Net, ICNet, PSPNet, HRNet, Fast-SCNN等主流分割网络。通过模块化的设计,以配置化方式驱动模型组合,帮助开发者更便捷地完成从训练到部署的全流程图像分割应用。 -- [特点](#特点) +- [特点](#特点) - [安装](#安装) - [使用教程](#使用教程) - [快速入门](#快速入门) @@ -31,7 +31,7 @@ PaddleSeg是基于[PaddlePaddle](https://www.paddlepaddle.org.cn)开发的端到 - **模块化设计** -支持U-Net, DeepLabv3+, ICNet, PSPNet, HRNet, Fast-SCNN六种主流分割网络,结合预训练模型和可调节的骨干网络,满足不同性能和精度的要求;选择不同的损失函数如Dice Loss, BCE Loss等方式可以强化小目标和不均衡样本场景下的分割精度。 +支持U-Net, DeepLabv3+, ICNet, PSPNet, HRNet, Fast-SCNN六种主流分割网络,结合预训练模型和可调节的骨干网络,满足不同性能和精度的要求;选择不同的损失函数如Dice Loss, Lovasz Loss等方式可以强化小目标和不均衡样本场景下的分割精度。 - **高性能** @@ -107,8 +107,8 @@ pip install -r requirements.txt ### 高级功能 * [PaddleSeg的数据增强](./docs/data_aug.md) -* [如何解决二分类中类别不均衡问题](./docs/loss_select.md) -* [特色垂类模型使用](./contrib) +* [PaddleSeg的loss选择](./docs/loss_select.md) +* [PaddleSeg产业实践](./contrib) * [多进程训练和混合精度训练](./docs/multiple_gpus_train_and_mixed_precision_train.md) * 使用PaddleSlim进行分割模型压缩([量化](./slim/quantization/README.md), [蒸馏](./slim/distillation/README.md), [剪枝](./slim/prune/README.md), [搜索](./slim/nas/README.md)) ## 在线体验 @@ -162,15 +162,15 @@ A: 降低Batch size,使用Group Norm策略;请注意训练过程中当`DEFAU * 新增[气象遥感分割方案](./contrib/RemoteSensing),支持积雪识别、云检测等气象遥感场景。 * 新增[Lovasz Loss](docs/lovasz_loss.md),解决数据类别不均衡问题。 * 使用VisualDL 2.0作为训练可视化工具 - + * 2020.02.25 **`v0.4.0`** * 新增适用于实时场景且不需要预训练模型的分割网络Fast-SCNN,提供基于Cityscapes的[预训练模型](./docs/model_zoo.md)1个 * 新增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)一个 * 新增基于PaddleSlim的分割库压缩策略([量化](./slim/quantization/README.md), [蒸馏](./slim/distillation/README.md), [剪枝](./slim/prune/README.md), [搜索](./slim/nas/README.md)) - - + + * 2019.12.15 **`v0.3.0`** @@ -182,7 +182,7 @@ A: 降低Batch size,使用Group Norm策略;请注意训练过程中当`DEFAU * 新增Paddle-Lite移动端部署方案,支持人像分割模型的移动端部署。 * 新增不同分割模型的预测[性能数据Benchmark](./deploy/python/docs/PaddleSeg_Infer_Benchmark.md), 便于开发者提供模型选型性能参考。 - + * 2019.11.04 **`v0.2.0`** diff --git a/docs/dice_loss.md b/docs/dice_loss.md new file mode 100644 index 0000000000000000000000000000000000000000..3a6e94b938cc7d4fea137ff1d8c1c9ca6891e2b6 --- /dev/null +++ b/docs/dice_loss.md @@ -0,0 +1,97 @@ +# Dice loss +对于二类图像分割任务中,经常出现类别分布不均匀的情况,例如:工业产品的瑕疵检测、道路提取及病变区域提取等。我们可使用dice loss(dice coefficient loss)解决这个问题。 + +注:dice loss和bce loss仅支持二分类。 + +## 原理介绍 +Dice loss的定义如下: + +

+
+

+ + +其中 Y 表示ground truth,P 表示预测结果。| |表示矩阵元素之和。![](./imgs/dice2.png) 表示*Y*和*P*的共有元素数, +实际通过求两者的逐像素乘积之和进行计算。例如: + +

+
+

+ +其中 1 表示前景,0 表示背景。 + +**Note:** 在标注图片中,务必保证前景像素值为1,背景像素值为0. + +Dice系数请参见[维基百科](https://zh.wikipedia.org/wiki/Dice%E7%B3%BB%E6%95%B0) + +**为什么在类别不均衡问题上,dice loss效果比softmax loss更好?** + +首先来看softmax loss的定义: + +

+
+

+ +其中 y 表示ground truth,p 表示网络输出。 + +在图像分割中,`softmax loss`评估每一个像素点的类别预测,然后平均所有的像素点。这个本质上就是对图片上的每个像素进行平等的学习。这就造成了一个问题,如果在图像上的多种类别有不平衡的表征,那么训练会由最主流的类别主导。以上面DeepGlobe道路提取的数据为例子,网络将偏向于背景的学习,降低了网络对前景目标的提取能力。 +而`dice loss(dice coefficient loss)`通过预测和标注的交集除以它们的总体像素进行计算,它将一个类别的所有像素作为一个整体作为考量,而且计算交集在总体中的占比,所以不受大量背景像素的影响,能够取得更好的效果。 + +在实际应用中`dice loss`往往与`bce loss(binary cross entroy loss)`结合使用,提高模型训练的稳定性。 + + +## PaddleSeg指定训练loss + +PaddleSeg通过`cfg.SOLVER.LOSS`参数可以选择训练时的损失函数, +如`cfg.SOLVER.LOSS=['dice_loss','bce_loss']`将指定训练loss为`dice loss`与`bce loss`的组合 + +## Dice loss解决类别不均衡问题的示例 + +我们以道路提取任务为例应用dice loss. +在DeepGlobe比赛的Road Extraction中,训练数据道路占比为:4.5%. 如下为其图片样例: +

+
+

+可以看出道路在整张图片中的比例很小。 + +### 数据集下载 +我们从DeepGlobe比赛的Road Extraction的训练集中随机抽取了800张图片作为训练集,200张图片作为验证集, +制作了一个小型的道路提取数据集[MiniDeepGlobeRoadExtraction](https://paddleseg.bj.bcebos.com/dataset/MiniDeepGlobeRoadExtraction.zip) + +### 实验比较 + +在MiniDeepGlobeRoadExtraction数据集进行了实验比较。 + +* 数据集下载 +```shell +python dataset/download_mini_deepglobe_road_extraction.py +``` + +* 预训练模型下载 +```shell +python pretrained_model/download_model.py deeplabv3p_mobilenetv2-1-0_bn_coco +``` +* 配置/数据校验 +```shell +python pdseg/check.py --cfg ./configs/deepglobe_road_extraction.yaml +``` + +* 训练 +```shell +python pdseg/train.py --cfg ./configs/deepglobe_road_extraction.yaml --use_gpu SOLVER.LOSS "['dice_loss','bce_loss']" + +``` + +* 评估 +``` +python pdseg/eval.py --cfg ./configs/deepglobe_road_extraction.yaml --use_gpu SOLVER.LOSS "['dice_loss','bce_loss']" + +``` + +* 结果比较 + +softmax loss和dice loss + bce loss实验结果如下图所示。 +图中橙色曲线为dice loss + bce loss,最高mIoU为76.02%,蓝色曲线为softmax loss, 最高mIoU为73.62%。 +

+
+

diff --git a/docs/imgs/VOC2012.png b/docs/imgs/VOC2012.png new file mode 100644 index 0000000000000000000000000000000000000000..8aa28258a82c37fdbdbb71dfcc0882391bb5f34c Binary files /dev/null and b/docs/imgs/VOC2012.png differ diff --git a/docs/loss_select.md b/docs/loss_select.md index 6749979821de5cd7387f3161e0a2bd25a9f02e4e..e32a90d324708625439e6cc306397dd90eabc4d2 100644 --- a/docs/loss_select.md +++ b/docs/loss_select.md @@ -1,101 +1,31 @@ -# 如何解决二分类中类别不均衡问题 -对于二类图像分割任务中,经常出现类别分布不均匀的情况,例如:工业产品的瑕疵检测、道路提取及病变区域提取等。 - -目前PaddleSeg提供了三种loss函数,分别为softmax loss(sotfmax with cross entroy loss)、dice loss(dice coefficient loss)和bce loss(binary cross entroy loss). 我们可使用dice loss解决这个问题。 - -注:dice loss和bce loss仅支持二分类。 - -## Dice loss -Dice loss的定义如下: - -

-
-

- - -其中 Y 表示ground truth,P 表示预测结果。| |表示矩阵元素之和。![](./imgs/dice2.png) 表示*Y*和*P*的共有元素数, -实际通过求两者的逐像素乘积之和进行计算。例如: - -

-
-

- -其中 1 表示前景,0 表示背景。 - -**Note:** 在标注图片中,务必保证前景像素值为1,背景像素值为0. - -Dice系数请参见[维基百科](https://zh.wikipedia.org/wiki/Dice%E7%B3%BB%E6%95%B0) - -**为什么在类别不均衡问题上,dice loss效果比softmax loss更好?** - -首先来看softmax loss的定义: - -

-
-

- -其中 y 表示ground truth,p 表示网络输出。 - -在图像分割中,`softmax loss`评估每一个像素点的类别预测,然后平均所有的像素点。这个本质上就是对图片上的每个像素进行平等的学习。这就造成了一个问题,如果在图像上的多种类别有不平衡的表征,那么训练会由最主流的类别主导。以上面DeepGlobe道路提取的数据为例子,网络将偏向于背景的学习,降低了网络对前景目标的提取能力。 -而`dice loss(dice coefficient loss)`通过预测和标注的交集除以它们的总体像素进行计算,它将一个类别的所有像素作为一个整体作为考量,而且计算交集在总体中的占比,所以不受大量背景像素的影响,能够取得更好的效果。 - -在实际应用中`dice loss`往往与`bce loss(binary cross entroy loss)`结合使用,提高模型训练的稳定性。 - - -## PaddleSeg指定训练loss - -PaddleSeg通过`cfg.SOLVER.LOSS`参数可以选择训练时的损失函数, -如`cfg.SOLVER.LOSS=['dice_loss','bce_loss']`将指定训练loss为`dice loss`与`bce loss`的组合 - -## Dice loss解决类别不均衡问题的示例 - -我们以道路提取任务为例应用dice loss. -在DeepGlobe比赛的Road Extraction中,训练数据道路占比为:4.5%. 如下为其图片样例: -

-
-

-可以看出道路在整张图片中的比例很小。 - -### 数据集下载 -我们从DeepGlobe比赛的Road Extraction的训练集中随机抽取了800张图片作为训练集,200张图片作为验证集, -制作了一个小型的道路提取数据集[MiniDeepGlobeRoadExtraction](https://paddleseg.bj.bcebos.com/dataset/MiniDeepGlobeRoadExtraction.zip) - -### 实验比较 - -在MiniDeepGlobeRoadExtraction数据集进行了实验比较。 - -* 数据集下载 -```shell -python dataset/download_mini_deepglobe_road_extraction.py +# Loss选择 + +目前PaddleSeg提供了6种损失函数,分别为 +- Softmax loss (softmax with cross entropy loss) +- Weighted softmax loss (weighted softmax with cross entropy loss) +- Dice loss (dice coefficient loss) +- Bce loss (binary cross entropy loss) +- Lovasz hinge loss +- Lovasz softmax loss + +## 类别不均衡问题 +在图像分割任务中,经常出现类别分布不均匀的情况,例如:工业产品的瑕疵检测、道路提取及病变区域提取等。 + +针对这个问题,您可使用Weighted softmax loss、Dice loss、Lovasz hinge loss和Lovasz softmax loss进行解决。 + +### Weighted softmax loss +Weighted softmax loss是按类别设置不同权重的softmax loss。 + +通过设置`cfg.SOLVER.CROSS_ENTROPY_WEIGHT`参数进行使用。 +默认为None. 如果设置为'dynamic',会根据每个batch中各个类别的数目,动态调整类别权重。 +也可以设置一个静态权重(list的方式),比如有3类,每个类别权重可以设置为[0.1, 2.0, 0.9]. 示例如下 +```yaml +SOLVER: + CROSS_ENTROPY_WEIGHT: 'dynamic' ``` -* 预训练模型下载 -```shell -python pretrained_model/download_model.py deeplabv3p_mobilenetv2-1-0_bn_coco -``` -* 配置/数据校验 -```shell -python pdseg/check.py --cfg ./configs/deepglobe_road_extraction.yaml -``` - -* 训练 -```shell -python pdseg/train.py --cfg ./configs/deepglobe_road_extraction.yaml --use_gpu SOLVER.LOSS "['dice_loss','bce_loss']" - -``` - -* 评估 -``` -python pdseg/eval.py --cfg ./configs/deepglobe_road_extraction.yaml --use_gpu SOLVER.LOSS "['dice_loss','bce_loss']" - -``` - -* 结果比较 - -softmax loss和dice loss + bce loss实验结果如下图所示。 -图中橙色曲线为dice loss + bce loss,最高mIoU为76.02%,蓝色曲线为softmax loss, 最高mIoU为73.62%。 -

-
-

- +### Dice loss +参见[Dice loss教程](./dice_loss.md) +### Lovasz hinge loss和Lovasz softmax loss +参见[Lovasz loss教程](./lovasz_loss.md) diff --git a/docs/lovasz_loss.md b/docs/lovasz_loss.md index 1270b3fd0fc677350f8c51a2e7a8ac704af68de5..cf57e70e68458f16d245be964882944ce420d83e 100644 --- a/docs/lovasz_loss.md +++ b/docs/lovasz_loss.md @@ -1,29 +1,37 @@ # Lovasz loss -对于图像分割任务中,经常出现类别分布不均匀的情况,例如:工业产品的瑕疵检测、道路提取及病变区域提取等。 +对于图像分割任务中,经常出现类别分布不均匀的情况,例如:工业产品的瑕疵检测、道路提取及病变区域提取等。我们可使用lovasz loss解决这个问题。 -我们可使用lovasz loss解决这个问题。Lovasz loss根据分割目标的类别数量可分为两种:lovasz hinge loss适用于二分类问题,lovasz softmax loss适用于多分类问题。 +Lovasz loss基于子模损失(submodular losses)的凸Lovasz扩展,对神经网络的mean IoU损失进行优化。Lovasz loss根据分割目标的类别数量可分为两种:lovasz hinge loss和lovasz softmax loss. 其中lovasz hinge loss适用于二分类问题,lovasz softmax loss适用于多分类问题。该工作发表在CVPR 2018上,可点击[参考文献](#参考文献)查看具体原理。 ## Lovasz hinge loss -### 使用方式 +### 使用指南 PaddleSeg通过`cfg.SOLVER.LOSS`参数可以选择训练时的损失函数, -如`cfg.SOLVER.LOSS=['lovasz_hinge_loss','bce_loss']`将指定训练loss为`lovasz hinge loss`与`bce loss`的组合。 +如`cfg.SOLVER.LOSS=['lovasz_hinge_loss','bce_loss']`将指定训练loss为`lovasz hinge loss`与`bce loss`(binary cross-entropy loss)的组合。 Lovasz hinge loss有3种使用方式:(1)直接训练使用。(2)bce loss结合使用。(3)先使用bec loss进行训练,再使用lovasz hinge loss进行finetuning. 第1种方式不一定达到理想效果,推荐使用后两种方式。本文以第2种方式为例。 -### 使用示例 +同时,也可以通过`cfg.SOLVER.LOSS_WEIGHT`参数对不同loss进行权重配比,灵活运用于训练调参。如下所示 +```yaml +SOLVER: + LOSS: ["lovasz_hinge_loss","bce_loss"] + LOSS_WEIGHT: + LOVASZ_HINGE_LOSS: 0.5 + BCE_LOSS: 0.5 +``` + +### 实验对比 我们以道路提取任务为例应用lovasz hinge loss. -在DeepGlobe比赛的Road Extraction中,训练数据道路占比为:4.5%. 如下为其图片样例: +基于MiniDeepGlobeRoadExtraction数据集与bce loss进行了实验对比。 +该数据集来源于DeepGlobe比赛的Road Extraction单项,训练数据道路占比为:4.5%. 如下为其图片样例:


可以看出道路在整张图片中的比例很小。 -#### 实验对比 - -在MiniDeepGlobeRoadExtraction数据集进行了实验对比。 +为进行快速体验,这里使用DeepLabv3+模型,backbone为MobileNetV2. * 数据集下载 我们从DeepGlobe比赛的Road Extraction的训练集中随机抽取了800张图片作为训练集,200张图片作为验证集, @@ -64,23 +72,32 @@ lovasz hinge loss + bce loss和softmax loss的对比结果如下图所示。 ## Lovasz softmax loss -### 使用方式 +### 使用指南 PaddleSeg通过`cfg.SOLVER.LOSS`参数可以选择训练时的损失函数, 如`cfg.SOLVER.LOSS=['lovasz_softmax_loss','softmax_loss']`将指定训练loss为`lovasz softmax loss`与`softmax loss`的组合。 Lovasz softmax loss有3种使用方式:(1)直接训练使用。(2)softmax loss结合使用。(3)先使用softmax loss进行训练,再使用lovasz softmax loss进行finetuning. 第1种方式不一定达到理想效果,推荐使用后两种方式。本文以第2种方式为例。 -### 使用示例 - -我们以Pascal voc为例应用lovasz softmax loss. +同时,也可以通过`cfg.SOLVER.LOSS_WEIGHT`参数对不同loss进行权重配比,灵活运用于训练调参。如下所示 +```yaml +SOLVER: + LOSS: ["lovasz_softmax_loss","softmax_loss"] + LOSS_WEIGHT: + LOVASZ_SOFTMAX_LOSS: 0.2 + SOFTMAX_LOSS: 0.8 +``` +### 实验对比 -#### 实验对比 +接下来以PASCAL VOC 2012数据集为例应用lovasz softmax loss. 我们将lovasz softmax loss与softmax loss进行了实验对比。为进行快速体验,这里使用DeepLabv3+模型,backbone为MobileNetV2. -在Pascal voc数据集上与softmax loss进行了实验对比。 * 数据集下载 +

+
+

+ ```shell python dataset/download_and_convert_voc2012.py ``` @@ -114,3 +131,7 @@ lovasz softmax loss + softmax loss和softmax loss的对比结果如下图所示

图中橙色曲线代表lovasz softmax loss + softmax loss,最高mIoU为64.63%,蓝色曲线代表softmax loss, 最高mIoU为63.55%,相比提升1.08个百分点。 + + +## 参考文献 +[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)