labelme格式转换coco2017格式数据(for HTC)

为了训练HTC,我也是煞费苦心啊,分享一下自己的采坑过程吧!

前言

labelme是一款用来标注图片信息以用于作为数据集来训练识别算法,不少的博主都是使用labelme标注的数据集训练mask rcnn,确实很方便。但是有很多的网络只支持coco格式的数据集(比如我最近在使用的HTC——HybridTaskCascade,是一个mask map和bbox map都很高的网络,但是只支持coco2017格式的数据集),所以一起来回顾一下我的labele2coco的过程吧。这是本人第一篇博客,写的不对的地方,还请各位指出!

开始吧

本文不介绍如何安装和使用labelme,只介绍数据如何从labelme的json格式转换成coco2017格式。对于安装和使用不清楚的朋友请移步其他博客。
首先经过labelme标注后的数据,你会得到一个.json文件,里面存储了你的图片和标注信息。
在标注中请注意,如果你的图片中有很多同类的对象。labelme格式转换coco2017格式数据(for HTC)_第1张图片
比如这张图片中有两个人,你的标注应该是person1和person2,具体参考1

这里不再赘述原因。回到正题。得到了json文件,接下来我们将json文件转化为dataset

labelme_json_to_dataset apc2016_obj3.json -o apc2016_obj3_json

这行指令是把一个json文件转换为一个文件夹,其中包括以下内容

It generates standard files from the JSON file.
img.png: Image file.
label.png: uint8 label file.
label_viz.png: Visualization of label.png.
label_names.txt: Label names for values in label.png.

(我不清楚为什么不同于其他博主这里没有yaml文件,希望有大佬来解答)
如果要实现批量转换可以在python中用命令行操作,而我是把转化部分的函数拿了出来,自己改了下文件输入输出的位置也可以。我的代码中包含了将其归在一起的步骤,具体可见超链接。
接下来,我们将json格式的数据转化为coco格式。转化成coco格式,我们需要将每个json以及对应的原图放在一个文件夹下,如图所示。labelme格式转换coco2017格式数据(for HTC)_第2张图片
非常棒的是几天前labelme github更新了支持png格式图片向coco数据转化(虽然只是加了一个单词)。
1> 超链接中见py文件,修改文件路径就好了,如果报filenotfounderror,多检查几次路径,看看源码,是否需要你手动建一下这个文件夹。这是我的py文件。
2> 在这里,我遇到一个错,polygon must have more than two points(言外之意,多边形怎么能只有两个点呢?)我检查了一下数据集,发现可能当时有人标错了,一个polygon只有两个点,这可能是labelme的小漏洞,检测不出来,所以我回到数据集的json文件,将这一段annotation删掉就好了。
如果这里运行成功,你会得到一个装有JPG图片的文件夹和一个annotation.json文件。在这里我们已经生成好了coco2014文件,包括训练集,验证集还有对应的annotations.json文件。这个文件改完名称后就可以拿去训练实例分割的网络了(比如mask),但是新一点的语义分割的网络你还缺少一个文件,stuffthingmaps,coco2017中stuff长这样。
labelme格式转换coco2017格式数据(for HTC)_第3张图片
我在训练HTC的时候,发现几种HTC中backbone为resnet101的框架都需要这个文件,(语义分割是不是都需要他,我不确定,可以看看源码)
我们来说说怎么生成coco2017中的stuff吧,这里我翻了好多,找到一位大佬的博客2。可能这些代码后来更新过,行数对不上,还有我当时的一些迷惑吧,所以我决定重新说一下。

1、 下面提供转换工具

https://github.com/nightrome/cocostuffapi 下载这个东西

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

Alt
4、使用 PythonAPI/cocostuff/cocoSegmentationToPngDemo.py ,设置好 annPath 为你自己的 coco/annotations/instances_train2014.json 路径;然后把 Line75-Line88 注释掉(确实没啥用,如果你想看看绘图过程,可以不注释,但是一个一个关很麻烦)
labelme格式转换coco2017格式数据(for HTC)_第4张图片
4.5

中途报错:ValueError: invalid palette size,
解决方案:
引用cmap的时候改成 np.uint8(cmap).tolist()即可~

这句话加在cocostuffapi-master/PythonAPI/pycocotools/cocostuffhelper.py

大约153行 assert len(cmap) == 768, ‘Error: Color map must have exactly 256*3 elements!’ 前面

5、把cocostuff/cocoSegmentationToPngDemo.py 放到cocostuff这个文件夹外面
————————————————
版权声明:本文为CSDN博主「一个炼丹师」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Andrwin/article/details/93745871(尊重原创,我就先复制过来这一段啦,很见鬼的是,我的pycharm居然链接不到其他的package,所以我又双叒叕把部分需要的函数抄了出来完成了转换)

坑爹的是,这个地方必须需要灰度图才可以转换,所以推荐大家看看原博主的文章,提供了RGB向GRAY转换的函数,或者自己写一个都可以,再去转换。
需要提醒的是 AssertionError: Error: Color map must have exactly 256*3 elements!这个报错的时候是需要把所有train2014和val2014里的文件先转换成黑白的,然后再执行cocoSegmentationToPngDemo.py

至此,你已经生成了stuff文件(记得改名字)
labelme格式转换coco2017格式数据(for HTC)_第5张图片

将你的数据按照上面的格式整理好(注意了,上面说的灰度图不出现在这里的数据集),你就应该可以拿去跑自己的程序了,下午再写我跑HTC的经历吧。不得不说商汤科技开源的open-mmlab是真的方便,在pytorch框架下,把常见的网络模型模块化(除了yolo),训练起来方便了不少。我想要训练的HTC也在这个程序下。


  1. labelme对同一类型的多个目标的识别问题 ↩︎

  2. 语义分割 HybridTaskCascade 跑通DEMO 训练自己的数据集 ↩︎

你可能感兴趣的:(深度学习,pytorch,机器学习)