FPN语义分割辛酸踩坑记(1)

由于项目需要,最近在研究语义分割,上次用了gluoncv中的FCN,但是由于样本少,而且都是小目标、多目标,组内的技术大牛建议用FPN试试。

FPN一般用于目标识别,但是也有用作语义分割的。gluoncv官网不支持FPN做semantic segmentation,于是在github上搜索,搜到一个FPN做语义分割的,但是数据集类型为cityscapes,本小白对此数据集一无所知,搜了一下,还挺复杂的,如果用自己的数据集制作cityscapes格式的数据,估计够呛。

于是又搜到了一个项目vedaseg

https://github.com/Media-Smart/vedaseg/tree/213b584a1cc4734a430f0d1eb3e6f96afd2a6d67

此项目号称可以用fpn做语义分割,于是便clone到我的aws ec2上跑了一下,失败无数次:

(1)数据读取失败

如上一篇博文所示,labelme官方提供的脚本可以将标注的语义分割数据集转换成pascal voc格式,但是!

转出来的内容和文件夹命令好像和官方标准的voc 2012不一致,更像是voc增强版(此处待考证)

中途读取数据老出错,定位了一大晚上,最后在tools/../vedaseg/datasets/voc.py中

1  def __getitem__(self, idx):
2         imgname = self.imglist[idx]
3         img_fp = os.path.join(self.root, 'JPEGImages', imgname) + '.jpg'
4         mask_fp = os.path.join(self.root, 'EncodeSegmentationClass',
5                                imgname) + '.png'

mask_fp的路径与转出来的不一致,转出来的文件夹名为SegmentationClassPNG
(2)修改之后数据能读取了,但又报了另外一个错
RuntimeError: cuDNN error: CUDNN_STATUS_NOT_INITIALIZED
查询了一下,这篇博客中说:
总结:绝大多可能就是cuda,cudnn,vs,python,pytorch版本,其中某个版本出了问题。所以广大朋友们要针对这几个逐一排查

想了想,晚上在登录EC2时系统提示有一些包可以更新,顺手就更新了,里面就包含了python2中的一些东西,会不会是更新完python命令默认用python2执行了,于是在运行脚本的命令前加了一个3,变成

python3 tools/train.py configs/voc_fpn.py

结果真是按下葫芦浮起瓢,原来的错不报了,报了新的错:

RuntimeError: CUDA error: device-side assert triggered

再次求助于搜索引掣,出来的一个参考结果是

https://blog.csdn.net/qq_30680871/article/details/103442862

该Error是在pytorch框架下出现的,其原因是样本的label种类大于了代码所设置的类别数。

返回到vedaseg项目中的voc.py中大概看了一下,没找到类别相关的设置。

再返回vedaseg项目首页,看下面的说明,

for multi-label training use config file configs/coco_multilabel_unet.py and modify some configuration, the difference between single-label and multi-label training are mainly in following parameter in config file: nclassesmulti_labelmetrics and criterion. Currently multi-label training is only supported in coco data format.

上面赫然写着一行大字:当前多标签训练只支持coco数据格式!!!
WTF!
接下来能咋办?转COCO!
另外vedaseg项目中,多标签的语义分割只支持unet,没有FPN
那么UNET和FPN的区别是啥?
看了知乎上的帖子,好像差异不是很大,都涉及特征金字塔
那就先用UNET吧
网上搜到了一个labelme格式数据转化为标准的coco数据集格式的脚本
试了一下,json文件确实生成成功了,效果如何呢?太晚了,明天验证吧,今晚继续debugging下去,I may stay up to 2 or 3 o'clock
-----------------------------------
唉,还是自己基础差,学艺不精,如果我对mxnet足够熟悉,就可以自己仿照pytorch的版本写一个FPN或者UNET的网络,然后融合到gluoncv的segmentation脚本中去直接训练voc类型的数据集了。
另外,as a CVer,I'm not familiar with the open datasets,像最常用的pascal voc和MS COCO,对它们的格式还是不太熟悉,这也需要花时间去掌握和补充。今晚到这吧,明天继续。


posted @ 2020-09-16 00:53  飞向天边  阅读(929)  评论(0编辑  收藏  举报