Detectron2提供了全景分割Panopic Segmentation模型在coco2017全景分割数据集上的训练途径,遗憾的是官方文档并没有提供在自定义数据集上训练全景分割模型的说明,这个事实已经在Detectron2的GitHub Issues中的一篇帖子train Panoptic Segmentation model on custom dataset内得到了印证→_→
由于毕业设计需要,因而仔细阅读了Detectron2官方文档中关于训练Panoptic Segmentation模型的只言片语,以及Issues里所有关于利用Panoptic Segmentation模型训练自定义数据集的提问帖,总结了训练自定义数据集的方法。本篇博客首先介绍了自定义数据集的部分制作步骤,重点介绍由coco instance格式向coco panoptic格式的转换。
【注:本示例实验数据集仅包含两个类别,所有实验内容均在colab内进行】
将利用到数据标注工具labelme,用户可以在labelme中分别加载数据集图片,设定所有类别名称后手动在图片上标记目标的范围。如果事先没有接触过labelme的安装及操作过程,可以全网搜索一下使用方法。这里推荐一个B站的labelme使用教程。
在利用labelme对一张图片进行标注后,将会自动生成一个与图片名称相同的后缀为json的文件,里面存储了图片名称、编号和所有标注的节点位置信息等。
接下来我们需要将这些json文件转化为Detectron2适用的coco instance格式。
格式转换上我参考了一篇名为《将labelme标记的数据转为coco格式》的文章。
Detectron2在训练模型前首先要注册数据集,注册内容包括一个包含数据集内所有标注信息的json文件,因此我们需要将已转化为coco instance格式的所有json合并成一个,这里参考的文章标题为《语义分割 多个COCO2014格式的Json文件合并》。
为了方便后续讲述,这里暂时给合并后的json文件起两个名字:
已合并的coco instance json文件名 | 所属数据集 |
annotations_coco_train.json | 训练集 |
annotations_coco_valid.json | 验证集 |
(注:这两个coco instance json一定要保留作为最终数据集的一部分!因为注册数据集有需要)
1.下载panoptic API并安装
!git clone https://github.com/cocodataset/panopticapi.git
!pip install -e panopticapi
下载成功后文件夹panopticapi中内容如下图所示:
其中panoptic_coco_categories.json包含了coco 2018挑战赛中的使用的所有类别的列表。可以看到里面包含了以不同id为标识的各种类别,不同类别可能属于相同的父类(supercategory)下。
分离出一条单独的类别记录以供观察:
{"supercategory": "person", "color": [220, 20, 60], "isthing": 1, "id": 1, "name": "person"}
新建一个相同的json文件,并仿照panoptic_coco_categories.json中类别列表的格式定义自己的类。我这里的数据集包含的是全球范围内的数值模式数据,仅有一个类“TC”(热带气旋)。
(其实严格来说感觉我的数据集并不完全属于全景分割类别,因为我的数据集中只有一个类,不过实验证明并不影响利用全景分割方法训练(#^.^#))
[{"supercategory": "weather", "color": [218, 165, 32], "isthing": 1, "id": 1, "name": "TC"}]
除了id号要根据原coco instance json中的id号按顺序填写外,color、supercategory等属性均可根据自己的数据集自行定义。将新的json文件定义为panoptic_coco_categories_TC.json。
在panopticapi文件夹中打开converters/detection2panoptic_coco_format.py,该文件是用于将coco instance格式的json转化为coco panoptic格式的关键文件。panopticapi提供了多种json格式转换方式,所有格式转换文件的使用办法参见GitHub文档。运行detection2panoptic_coco_format.py的代码如下所示,其中input_json_file指的是coco instance格式的文件,output_json_file是输出的coco panoptic格式文件,文件名和路径可自行定义,这里训练集的输出文件名为panoptic_annotations_coco_valid.json。
!python panopticapi/converters/detection2panoptic_coco_format.py \
--input_json_file /content/drive/MyDrive/annotations_coco_valid.json \
--output_json_file /content/drive/MyDrive/panoptic_annotations_coco_valid.json \
--categories_json_file panopticapi/panoptic_coco_categories_TC.json
运行后格式转换完成,输出内容包括名为panoptic_annotations_coco_valid.json的文件以及名为panoptic_annotations_coco_valid的文件夹。
文件夹包含了根据json文件信息所生成的所有图像的全景注释(可视作对每一份图像生成了RGB格式的掩膜,每份全景注释的文件名与其对应的样本数据相同),图像中的实例将按照panoptic_coco_categories_TC.json中对应类别约定的color进行着色。上文中约定的TC类别颜色[218, 165, 32]约为金色,效果如下。
(注:detection2panoptic_coco_format.py修改了原coco instance格式json文件中的ann_id,如果想要保留原有的ann_id,只需注释掉原文件的第65行,内容如下所示)
ann['id'] = segment_id #【注释该行】
至此,coco instance→coco panoptic的json文件格式转换完成啦√
在Detectron2中注册自定义数据集时,对于训练全景分割模型的数据集,用于注册数据集的register_coco_panoptic_separated函数要求提供一个含有所有样本对应灰度掩码的文件夹。制作灰度掩码图片时,注意保存为PIL的“L”格式,每个类别的实例使用与id号值相同的灰度值即可,没有类别的区域灰度值为0。由于博主使用的数据本身包含掩膜,因此在这里不再介绍其他灰度掩码的制作方法→_→此处灰度掩码文件夹命名为annotations_coco_valid。
(注:每份灰度掩码的文件名与其对应的样本数据须相同)
至此适合Panoptic Segmentation的自定义数据集制作完成,共包含以下内容:
自定义数据集制作完成后,下一篇文章将介绍Detectron2全景分割模型训练自定义数据集的步骤。
新人小白首篇博客,欢迎批评指正、讨论与补充细节❤