本次飞桨论文复现过程中,最终选择自选方向——DANet图像分割网络,在此将复现过程中的一些心得体会做一些总结
ai studio项目链接:https://aistudio.baidu.com/aistudio/projectdetail/813854
github链接:https://github.com/huilin16/paddle
关于danet网络
网络整体结构:
由resnet作为backbone提取图像特征,由PAM、CAM模块对提取的特征分别从空间维度和通道维度进行矩阵操作、实现特征关注,将得到的特征关注结果进行拼接、卷积后,使用上采样得到最终的预测结果
、
复现内容
在使用paddle复现过程中,由于个人能力有限,复现主要内容及改动部分如下:
- 数据预处理
- 使用Cityscapes-gtFine数据集,以8:2比例划分train、val(test)数据集
- train过程768*768随机crop,val、test过程768*768中心crop
- 自定义trainid为20类
- 网络构建:
- 使用resnet50作为backbone,各block输出通道数由[64, 128, 256, 512]改为[32, 64, 128, 256]
- CAM、PAM,input_chs由2048改为1024,inter_chs由input_chs//4改为512
- 输出结果包括CAM、PAM、CAM+PAM3部分
- train、val过程
- batch size=8
- epoch = 30
-
optimizer
-
Momentum,momentum=0.9,l2_decay=0.0001
-
- learning rate
- 由1e-4线性warmup至1e-1,2epoch;
- 由1e-1按(1e-1-1e-4)*((1-iter/total_iter)**0.9)+1e-4的polynomial_decay方法进行变化,30epoch(其中iter表示单个batch过程,1epoch表示所有batch过程,polynomial_decay的前两个epoch的学习率由warmup替换)
- loss
- softmax_with_cross_entropy
- 对CAM、PAM、CAM+PAM以0.3、0.3、0.4的比例进行加权
- 保存val accuracy最高、val loss最低2个模型
- 输出train、val过程的accuracy、loss曲线
- test过程
- 计算并输出混淆矩阵、各类iou、miou、fwiou等指标
- infer过程
- 对图像进行推理预测
最终结果:best val acc 0.8627,miou 0.4063,fwiou 0.7784
由于对网络进行了一些魔改,加上只进行了2次30epoch的训练,最终结果相较于论文有一定差距
因此,本复现结果只是对danet网络认识提供一种参考,希望大家可以一起交流学习
后续展望
danet网络,对resnet提取的特征结果进行了position、channel2种类似于non-local并行的特征选择,增强了网络对于特征的选择能力;但近来在图像通道维度的关注机制,更多地选用基于全局信息的特征提取方法(gloabl pool),并且根据CBAM网络的实验结果表明channel+spatial的串行关注结果要好于并行结果;串行关注、使用全局信息进行通道关注的结果尚未进行实验,后续可以进行进一步的对比实验
danet使用的是上采样的方法对PAM、CAM结果空间分辨率进行恢复,可以使用unet的跳跃式连接+编解码结构进行实验
关于飞桨
个人使用pytorch较多,在复现过程中,使用飞桨动态图api复现pytorch相关代码比较方便
一些经典网络,比如resnet等,官网有动态图和静态图的demo,方便学习
在社区、github、微信群等平台,飞桨官方有答疑,代码问题可以比较快速地解决
ai studio提供的计算资源相当丰富(每天12小时算力卡,连续5天登录送48小时算力卡,完全足够;gpu为v100,最高支持8卡),并且提供数据集存储服务,同时包括比赛、社区等,也会送许多奖品福利
但是也存在一些不足,比如
- api部分功能及文档教程不完善,许多api仍是静态图的调用示例,比如summary打印模型各层及大小目前尚不支持动态图
- 过多api集中在paddle.fluid.layers、paddle.fluid.dygaph中,不方便查询使用
但上述问题飞桨也正在积极结解决,在复现营学习的过程中,飞桨就已经做出了许多更新迭代,相信正式的2.0版本后会更加完善
最后,感谢本次飞桨、ai studio提供的本次学习机会。