使用mmdetection做实例分割

使用mmdetection做实例分割

2022华为开发者大赛·无人车挑战赛,初赛使用mmlab的mmdetection作为baseline。基于baseline训练自己的网络完成实例分割。

在这个比赛中使用华为云的OBS桶、Modelarts平台。

mmdetection继承了目标检测、语义分割、实例分割的很多流行网络框架,也支持自定义。

有关mmdetection的介绍已经挺多了,这里只是总结如何训练自己的模型。

本文关键词:mmdetection、实例分割、mask-rcnn、HTC、coco

无人车大赛baseline(包括OBS、Modelarts简单使用)

由于 个人也没有多少调参经验 以及 比赛中个人所采用的优化的效果不明显,就不介绍优化网络的策略了,需要的同学可以自行搜索相关内容。

零、准备环境

没有环境,一切都瞎忙活。

配置环境前,先确认一下本地的cuda、pytorch版本。

参考以下文档,下载与电脑cuda版本、pytorch版本匹配的mmcv版本。

mmcv的github官网

mmcv的gitee官网

mmdetection的github官网

mmdetection的gitee官网

一、准备数据集

好的数据集(包括标注文件)也是训练好坏的重要标准。

原始图片肯定越多越好,本文采用labelme作为标注工具,下面简单介绍如何标注数据集:

  1. 安装labelme

  2. 如何标注文件

  3. 转coco格式

python labelme2coco.py data_annotated data_dataset_coco --labels labels.txt
# data_annotated 为 labelme标注的数据集
# data_dataset_coco 为 转换后的coco数据集,会自动创建,不需要人为创建

如果想手动划分训练集、测试集、验证集等,可以先将数据集分在不同的文件夹,然后分别生成coco格式数据。

一般数据都是不够的,最好做一下数据增强,数据增强的工具很多,可以自行搜索。

增强时:注意避免对标注产生影响。例如改变颜色,那就要注意标注的类别是否和颜色高度相关,比如红绿灯就不适合做这方面的数据增强。

二、修改配置文件

训练之前,要先有网络模型,数据集和训练的一些超参数的配置。

这些框架在mmdetection中作了很好的集成,只要简单的修改,就可以完成网络的构建,这里我们简单介绍如何配置。

  1. 如何配置数据集文件

进入到 mmdetection/mmdet/datasets文件夹下,找到coco.py,将其中的CLASSES修改成为需要的类型,并查找所有的num_classes,改成需要的数目。或者新建一个py文件,将coco.py中的内容拷贝过来,进行修改,修改数据集名称、CLASSES以及num_classes,并且这样还需要打开__init__.py,在里面添加你设置的类别,如下。

注意不仅要在__all__添加,还要在上面添加 from xx import xx

在这里插入图片描述
在这里插入图片描述

  1. 如何配置网络模型文件

在mmdetection/configs下包含了各种现成的流行框架,比如mask-rcnn、yolo、htc等等。
在这里插入图片描述

在每一个文件夹下面都有一个README.md,简单介绍了该网络,也可以根据README.md来判断是不是我们需要的网络。

在这里插入图片描述

由于本文做的是实例分割,所以选择查阅相关论文或者其他文档,找到适合做实例分割的网络模型。

参赛时,找到了mask-rcnn、ms-rcnn、cascade-mask-rcnn、htc等,耦合pafpn,当然这些网络是层次递进的,一般来说,新提出的网络要比早期的网络效果要好。

为了方便管理,对于我们自己的网络,最好新建一个文件夹,里面放我们的配置文件,例如参赛时,在mmdetection\configs下新建了wrc文件夹,并在wrc文件夹新建了wrc.py文件存放。

  • 以ms-rcnn网络为例简单介绍,其余网络可以自行设计
_base_ = [
    '../_base_/models/mask_rcnn_r50_fpn.py',	#网络配置文件
    '../_base_/datasets/wrc.py',				#数据集配置文件
    '../_base_/schedules/schedule_1x.py',   	#训练配置文件
    '../_base_/default_runtime.py'
]

#可以认为:以上内容会直接copy过来
#下面的内容会对上面copy过来的部分进行替换		(一种类似继承的机制)

model = dict(
    type='MaskScoringRCNN',						
    neck=dict(
        type='PAFPN',				#这部分将原来的FPN替换成PAFPN
        in_channels=[256, 512, 1024, 2048],
        out_channels=256,
        num_outs=5),
    roi_head=dict(
        type='MaskScoringRoIHead',
        mask_iou_head=dict(
            type='MaskIoUHead',
            num_convs=4,
            num_fcs=2,
            roi_feat_size=14,
            in_channels=256,
            conv_out_channels=256,
            fc_out_channels=1024,
            num_classes=6)),
    # model training and testing settings
    train_cfg=dict(rcnn=dict(mask_thr_binary=0.5)))
  • 如何配置…/_base_/datasets/wrc.py

wrc.py是新建的文件,可以结合实际情况修改,wrc.py修改自coco_instance.py(做实例分割)。

这个文件重点修改data_root以及下面的train、val、test中的地址。

dateset_type改成之前配置的文件,也就是数据集的类型(在__init__中注册的那个wrc)。

# dataset settings
dataset_type = 'wrc'
data_root = '/home/ma-user/work/wrc/data/labeled/'
img_norm_cfg = dict(
    mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True)
train_pipeline = [
    dict(type='LoadImageFromFile'),
    dict(type='LoadAnnotations', with_bbox=True, with_mask=True),
    dict(type='Resize', img_scale=(1333, 800), keep_ratio=True),
    dict(type='RandomFlip', flip_ratio=0.5),
    dict(type='Normalize', **img_norm_cfg),
    dict(type='Pad', size_divisor=32),
    dict(type='DefaultFormatBundle'),
    dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']),
]
test_pipeline = [
    dict(type='LoadImageFromFile'),
    dict(
        type='MultiScaleFlipAug',
        img_scale=(1333, 800),
        flip=False,
        transforms=[
            dict(type='Resize', keep_ratio=True),
            dict(type='RandomFlip'),
            dict(type='Normalize', **img_norm_cfg),
            dict(type='Pad', size_divisor=32),
            dict(type='DefaultFormatBundle'),
            dict(type='Collect', keys=['img']),
        ])
]
data = dict(
    samples_per_gpu=2,				#batch_size相关设置
    workers_per_gpu=2,
    train=dict(
        type=dataset_type,
        ann_file=data_root + 'train/annotations.json',
        img_prefix=data_root+'train',
        pipeline=train_pipeline),
    val=dict(
        type=dataset_type,
        ann_file=data_root + 'val/annotations.json',
        img_prefix=data_root+'val',
        pipeline=test_pipeline),
    test=dict(
        type=dataset_type,
        ann_file=data_root + 'test/annotations.json',
        img_prefix=data_root+'test',
        pipeline=test_pipeline))
evaluation = dict(metric=['bbox'])

  • 如何配置…/_base_/schedules/schedule_1x.py

这部分可以修改优化器等,也可以采用默认。

例如:可以将SGD修改成Adaw,当然后面的参数也要修改。

不同优化器接收的参数略有差异,可以查找相关文档

注意:epoch是不要太小。

  • 如何配置…/_base_/default_runtime.py

这部分一般不修改,采用默认配置。

三、开始训练

经过以上的准备,就可以开始训练了。

在mmdetection/tools下包括了train.py,是用来训练模型的,常用的方式如下:

cd /home/ma-user/work/wrc/mmdetection
python ./tools/train.py configs/wrc/wrc.py --work-dir "/home/ma-user/work/wrc/ckpt/"

使用mmdetection/configs/wrc/wrc.py配置文件,其中包括了数据集位置、网络、学习策略等。

–work-dir指定存放checkpoint的存放位置,会生成epoch_x.pth的相关文件,pth文件就是我们的训练结果。

四、测试结果

一个网络要投入使用,必须进行相关的测试,一个模型要提交判分之前,也要在本地进行一些测试。

  • 批量测试

mmdetecition/tools下包括了test.py,用来测试,如下:

cd /home/ma-user/work/wrc/mmdetection
python tools/test.py  configs/wrc/wrc.py ../ckpt/epoch_1.pth  --eval-options  'classwise=True'  --eval bbox  proposal

wrc.py必须和训练的配置文件一样,否则可能会出现其他状况,使得模型不匹配报错。

epoch_1.pth就是上面train.py训练的一个epoch的结果,一般前几个epoch的效果都不会很好,至少得6-15个左右才能有一个还不错的pth(我们的数据集大致有5000张图片,6个类别)。

会得到如下的结果:其中mAP是评价的重要指标,越大越好

在这里插入图片描述

  • 单张图片的可视化测试
%cd /home/ma-user/work/wrc/mmdetection

from mmdet.apis import init_detector
from mmdet.apis import inference_detector
from mmdet.apis import show_result_pyplot
 
# 模型配置文件-
config_file = 'configs/wrc/wrc.py'
 
# 预训练模型文件,
checkpoint_file = '../ckpt/epoch_12.pth'
 
# 通过模型配置文件与预训练文件构建模型
model = init_detector(config_file, checkpoint_file)
 
# 测试单张图片并进行展示
img = '../data/labeled/test/JPEGImages/109.jpg'
result = inference_detector(model, img)
show_result_pyplot(model,img, result)

以下是得到的部分结果:show_result_pyplot函数默认的阈值是0.1,得分小于0.1的结果没有画出来。

在这里插入图片描述
在这里插入图片描述

以上图片来自HTC网络训练的结果测试。

(在本次比赛中,个人提交的网络训练,得分mask-rcnn < cascade-rcnn < ms-rcnn < htc)

在参赛时,还使用了baseline的customize_service.py进行模型部署,但是这已经不在本文的介绍范围了。

尽管观察上面效果还ok,但是得分不尽如人意,数据集的挑选、标注、划分,网络的挑选等等都很重要。

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值