前言
因为培养计划等原因,最近在一家机器视觉公司实习,目前在使用MMDetection框架,想先试着用Mask-RCNN进行自定义(公司的)数据集训练,记录一下训练的流程。
一、数据集制作
我用的是labelme。首先conda激活一个环境(假设是openmmlab),pip install labelme,安装完成后在该环境内启动(直接输入 labelme)。具体标注数据集的方法略过,比较简单且网上教程很友好。标注好后会生成json文件,需要转换成coco或者voc文件,不过训练的话得转换成COCO数据集或者VOC数据集,具体方法参考以下:
1.划分数据集验证集,不过图片不能自动保存
2. 官方转COCO数据集链接
3.官方转VOC数据集链接
4.下次做数据集的时候试试他的方法
5.标注实例分割数据集时的一个注意事项
二、MMdetection训练部分
官网自定义数据集方法
因为初学,还是在模仿阶段。参考官网训练自定义的气球数据集,先在configs文件夹内创建配置文件家box_img,里面创建py文件,文件命名按照格式来,也可以自定义,舒服就行。代码如下:
# 官方文档里的配置代码
# 新配置继承了基本配置,并做了必要的修改
# 不同数据集他继承的文件也不一样
_base_ = '../mask_rcnn/mask-rcnn_r101_fpn_2x_coco.py'
# 我们还需要更改 head 中的 num_classes 以匹配数据集中的类别数
model = dict(
roi_head=dict(
bbox_head=dict(num_classes=1), mask_head=dict(num_classes=1)))
# 修改数据集相关配置
data_root = '../data/box_img/'
metainfo = {
'classes': ('box', ),
'palette': [
(220, 20, 60),
]
}
# 根据自己放数据集的位置进行修改
train_dataloader = dict(
batch_size=1,
dataset=dict(
data_root=data_root,
metainfo=metainfo,
ann_file='annotations/instances_train2017.json',
data_prefix=dict(img='train2017/')))
val_dataloader = dict(
dataset=dict(
data_root=data_root,
metainfo=metainfo,
ann_file='annotations/instances_val2017.json',
data_prefix=dict(img='val2017/')))
test_dataloader = val_dataloader
# 修改评价指标相关配置
val_evaluator = dict(ann_file=data_root + 'annotations/instances_val2017.json')
test_evaluator = val_evaluator
# 使用预训练的 Mask R-CNN 模型权重来做初始化,可以提高模型性能 他会下载到一个cache文件夹内,不知道在哪里改,强迫症犯了
load_from = 'https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r101_fpn_2x_coco/mask_rcnn_r101_fpn_2x_coco_bbox_mAP-0.408__segm_mAP-0.366_20200505_071027-14b391c7.pth'
之后,就可以运行train.py了,加几个必要的参数就行,其余不用改。
启动训练后,会在output/boxImg_maskRCNN_101那创建一个以时间命名的文件夹以及一个更详细的配置文件,也就是下图中的py文件(epoch是我最后训练过程中生成的,按理现在还没有)
之后在这个文件中,对模型进行进一步的修改,比如说每隔多少个epoch保存一下,日志保存的间隔是多少等。修改完后,把train配置里的py文件,改为上面这个,重新运行train.py文件,开始训练。
三、测试部分
没太多好讲的,test.py里面还是挺详细,按照格式来添加配置项就行了