MS COCO 2014 数据集的cocoapi只能获得 instance mask(下图右);但是要是想获得 class semantic segmentation(下图左),现在的官方cocoapi貌似并没提供这个api。
实现环境:
- Python
实现方法:
coco官网的2017年数据集中可以发现有Stuff Segmentation,同时提供了新版的能获取Stuff Segmentation的cocoapi:link 。里面的 PythonAPI/cocostuff/cocoSegmentationToPngDemo.py
可以获得类别的Segmentation,但是这个是仅针对2017年的dataset的(博主发现直接使用会报错或者只能得到一片黑的图)。
在研究了2017的dataset和新版cocoapi后,发现2017的dataset的 category ids
与2014的dataset不一样,变成:
1-91 % thing categories (not used for stuff segmentation)
92-182 % stuff categories
183 % other category (all thing pixels)
新版cocoapi根据stuff categories来对同一个class赋予颜色,直接使用原来的category ids(1-91)无法进行stuff分类(所以一片黑),因此对代码稍作改动即可作用于2014的数据集!
实现步骤:
1、下载新版cocoapi:https://github.com/nightrome/cocoapi
2、进入PythonAPI/pycocotools/cocostuffhelper.py
,改动:
(1) Line141:
from:
labelMap = cocoSegmentationToSegmentationMap(coco, imgId, includeCrowd=includeCrowd)
to:
labelMap = cocoSegmentationToSegmentationMap(coco, imgId, checkUniquePixelLabel=False, includeCrowd=includeCrowd)
(2) Line142 后面加上:
labelMap = labelMap + 91
3、进入 PythonAPI/
:
make
4、使用 PythonAPI/cocostuff/cocoSegmentationToPngDemo.py
,设置好 annPath
为你自己的 coco/annotations/instances_train2014.json
路径;然后把 Line75-Line88 注释掉
5、运行即可
结果:
常见问题:
“Exception: Error: Some pixels have more than one label”:
- 原因:2014的dataset可能存在一个pixel对应多个label的情况,2017的Stuff Segmentation应该不存在这个问题,所以新版cocoapi会检查异常
- 解决方法:不检查异常(多个label则由后者覆盖),即看一下 Line141 有没有加上
checkUniquePixelLabel=False
(查看上方实现步骤2-(1))
得到的图像全黑:
- 原因:检查原来 Line142的 labelMap 有没有加上91。若没加上,category ids仍为1-91,无法着色。
- 解决方法:查看上方实现步骤2-(2)
References:
[1] coco dataset官网:http://cocodataset.org/#download
http://cocodataset.org/#stuff-eval
[2] cocoapi(旧版):https://github.com/cocodataset/cocoapi
[3] cocoapi(新版):https://github.com/nightrome/cocoapi