From 0efdf2b0454ebccfed69dbc6712983873d588837 Mon Sep 17 00:00:00 2001 From: Asthestarsfalll <1186454801@qq.com> Date: Tue, 26 Sep 2023 15:57:49 +0800 Subject: [PATCH] add rfc of pidnet --- rfcs/PaddleSeg/pidnet.md | 103 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 rfcs/PaddleSeg/pidnet.md diff --git a/rfcs/PaddleSeg/pidnet.md b/rfcs/PaddleSeg/pidnet.md new file mode 100644 index 000000000..5399933d6 --- /dev/null +++ b/rfcs/PaddleSeg/pidnet.md @@ -0,0 +1,103 @@ +# 轻量语义分割网络PIDNet —— 设计文档 + +| 任务名称 | 轻量语义分割网络PIDNet | +|----------------------------------------------------------|----------------------| +| 提交作者 | Asthestarsfalll | +| 提交时间 | 2023-9-26 | +| 版本号 | V1.0 | +| 依赖飞桨版本 | develop版本 | +| 文件名 | pidnet.md
| + +# 一、概述 +## 1、相关背景 + +该模型为轻量化分割方向的前沿模型,超过自研模型ppliteseg精度和速度平衡,Cityscapes上精度直逼高精度OCRNet,数据和模型、代码均已经开源。 + + +## 2、功能目标 +为PaddleSeg 添加该模型,达到论文Table.6中的指标,进行TIPC验证lite train lite infer 链条,参考PR提交规范提交代码PR到ppseg中。 + +## 3、意义 + +为PaddleSeg 增加实时语义分割SOTA模型。 + + +# 二、业内方案调研 + +PIDNet 源码已经开源,地址:https://github.com/XuJiacong/PIDNet + +性能表现如下 + +| Model (Cityscapes) | Val (% mIOU) | Test (% mIOU)| FPS | +|:-:|:-:|:-:|:-:| +| PIDNet-S | [78.8](https://drive.google.com/file/d/1JakgBam_GrzyUMp-NbEVVBPEIXLSCssH/view?usp=sharing) | [78.6](https://drive.google.com/file/d/1VcF3NXLQvz2qE3LXttpxWQSdxTbATslO/view?usp=sharing) | 93.2 | +| PIDNet-M | [79.9](https://drive.google.com/file/d/1q0i4fVWmO7tpBKq_eOyIXe-mRf_hIS7q/view?usp=sharing) | [79.8](https://drive.google.com/file/d/1wxdFBzMmkF5XDGc_LkvCOFJ-lAdb8trT/view?usp=sharing) | 42.2 | +| PIDNet-L | [80.9](https://drive.google.com/file/d/1AR8LHC3613EKwG23JdApfTGsyOAcH0_L/view?usp=sharing) | [80.6](https://drive.google.com/file/d/1Ftij_vhcd62WEBqGdamZUcklBcdtB1f3/view?usp=sharing) | 31.1 | + +| Model (CamVid) | Val (% mIOU) | Test (% mIOU)| FPS | +|:-:|:-:|:-:|:-:| +| PIDNet-S |-| [80.1](https://drive.google.com/file/d/1h3IaUpssCnTWHiPEUkv-VgFmj86FkY3J/view?usp=sharing) | 153.7 | +| PIDNet-M |-| [82.0](https://drive.google.com/file/d/1rNGTc8LD42h8G3HaedtqwS0un4_-gEbB/view?usp=sharing) | 85.6 | + +# 四、对比分析 + +参考官方原码实现即可。 + +# 五、设计思路与实现方案 + +## 总体思路 +### Edge label 实现 + +PIDNet 中需要额外生成 edge label 以对边缘部分进行监督,虽然 PaddleSeg 中已经内置了 edge label 的方式,但是具体实现细节差距较大,因此需要单独添加该生成方法。 + +另外 PIDNet 中 edge label 跟随 label 和 image 一起参与数据增强,而 PaddleSeg 中默认行为为使用增强过后的 label 生成 edge label,因此可以考虑单独增加一个 transform,代码如下 + +```python +@manager.TRANSFORMS.add_component +class AddEdgeLabel: + def __call__(self, data): + edge = cv2.Canny(data['label'], 0.1, 0.2) + kernel = np.ones((4, 4), np.uint8) + edge = edge[6:-6, 6:-6] + edge = np.pad(edge, ((6,6),(6,6)), mode='constant') + edge = (cv2.dilate(edge, kernel, iterations=1)>50)*1.0 + data['gt_fields'].append('edge') + data['edge'] = edge + return data +``` + +### LOSS 对齐 + +PIDNet 中使用了多个loss,其中 sem_loss 为 cross_entropy 和 ohem 的组合,与 PaddleSeg 有以下冲突: +1. cross_entropy 的 reduction 参数为 False,即维持输入的形状; +2. ohem 中使用了 class weight。 + +考虑修改如下: +为 PaddleSeg 的CrossEntropyLoss 添加 use_post_process 的参数用于控制是否平均输出。 +```python + if self.use_post_process: + return self._post_process_loss(logit, label, semantic_weights, loss) + return loss +``` +为 PaddleSeg 的 OhemCrossEntropyLoss 添加 weight 参数 + +```python + if self.weight is not None: + loss = F.cross_entropy( + logit, label, weight=self.weight, ignore_index=self.ignore_index, axis=1) + else: + loss = F.softmax_with_cross_entropy( + logit, label, ignore_index=self.ignore_index, axis=1) +``` + +# 六、测试和验收的考量 + +达到论文Table.6中的指标,进行TIPC验证lite train lite infer 链条,参考PR提交规范提交代码PR到ppseg中。 + +# 七、影响面 + +对其他模块没有影响。 + +# 八、排期规划 + +可以在活动时间内完成。