mmdetection 实例分割任务 自定义数据集训练流程

写在前面

       版本:torch 11.0 cuda 11.3 mmcv-full 1.6.1 mmdet 2.25.1,完全按照mmcv和mmdet官方文档配的环境

        因为我的需求是需要拿出分割后的每一个实体来进行尺寸的分析,所以语义分割不行,mmsegmentation最后输出的是一个二维矩阵(还是三维我忘了),元素是相应图片位置上的种类序号。如果两个实体连在一起了,那么整个序号的排布也就连在一起了,就像力扣上的海水和空岛题目一样。所以我这里必须要用实例分割。

        因为之前没做过实例分割,sementic seg的训练速度会比instance seg的速度快很多,我这里的数据集前40个epoch全部都是ap=0,把我吓得不轻(sementic seg epoch_40的效果已经很好了),以为是我数据集有问题白调了一天,结果只是等的时间不够长。但确实比较慢。

1. 标注数据

        大家都用的Labelme,我也用的Labelme,最终转化为coco数据集(用mmdet做实例分割只能用coco类数据集,除非你自定义一个)。怎么标注网上很多,我就不介绍了。

        老版的Labelme,你如果做实例分割任务,比如你有两类cat和dog,但是一张图里有多个cat和dog,是需要标注为dog1 cat1 cat2...的。两三年之前的博客也有人说明过,例如下方。

利用labelme制作coco格式的实例分割数据集(用于mmdetection2.0中的mask部分)_一只大狼狗的博客-CSDN博客_coco实例分割

        但是比较新的Labelme,2021年之后的好像就可以了,作者更新了group_id功能,即不需要手动去输入dog1之类,直接在标注的时候加上就可以了。

        因为我是直接拿之前按语义分割做的数据集转的实例分割,所以一开始并没有写group_id,所以我自己写了个脚本,加上的,脚本很简单(我这里有三类):

import json
import os
import shutil

def change_json(filename):
    """ data_annotated是原数据所在位置,json和jpg是在一起的。data_coco是新的保存位置 """
    agg_idx,bagg_idx,eagg_idx=0,0,0
	f=open(f'data_annotated/{filename}')
	data=json.load(f)
	for item in data['shapes']:
		if item['label']=='agg':
			item['group_id']=agg_idx
			agg_idx+=1
		elif item['label']=='blocked_agg':
			item['group_id']=bagg_idx
			bagg_idx+=1
		elif item['label']=='edge_agg':
			item['group_id']=eagg_idx
			eagg_idx+=1
	f.close()

	out_f=open(f'data_coco/{filename}','w+')
	json.dump(data,out_f)
	out_f.close()


for n in os.listdir(r'data_annotated'):
	if n.endswith('json'):
		print(f"file = {n} is editing")
		change_json(n)

        处理好后,我这里是分了两个文件夹分别装的训练集和验证集,和官方给的格式保持一致。在操作的时候我是随机split成了两批文件然后分别做的两个。json+jpg转化为coco数据集可以直接从labelme的github里自带的工具就可以解决(因为我是pip安装的labelme不是下的源码)。官方也比较贴心的给了示范 ↓

https://github.com/wkentaro/labelme/blob/main/examples/instance_segmentation/labelme2coco.py

        顺带一提,一般如果你有n个类别的话,最后json文件里的category是会有n+1类的,多出来的那一类是_background_,我是把它删掉了的,不知道不删能不能行。

        最后的文件夹结构如下图所示 :

mmdetection 实例分割任务 自定义数据集训练流程_第1张图片

2. 改配置

         除了改你的所练的模型的config外,其他要改的地方包括下面几个(该部分的路径全部为mmdet根目录的相对路径):

  1. mmdet/datasets/coco.py 改类别
  2. mmdet/core/evaluation/class_names.py 改类别

3. 训练和报错

1. ERROR The testing results of the whole dataset is empty

        简而言之就是你拿不到验证测试的结果,我的解决方法是删掉了第一个_background_类同时把从1开始的category_id换到了从0开始,就不会报错了。除此之外还有可能是超参数选择的问题,比如说梯度爆炸了或者消失了,拿不到结果很正常。

        但是吧,我这边在少数情况下,不改的时候它也可以运行。很玄学

2. key error: xxx

        因为我的数据是灰度图,而且是故意保留光照的影响不作图像的归一化,因此删了很多config里的处理手法。解决方法只需要在对应的报错位置加一个判断条件即可。

 

 

你可能感兴趣的:(mmdetection 实例分割任务 自定义数据集训练流程)