由於項目需要,最近在研究語義分割,上次用了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: nclasses
, multi_label
, metrics
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,對它們的格式還是不太熟悉,這也需要花時間去掌握和補充。今晚到這吧,明天繼續。