• 使用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数据集,会自动创建,不需要人为创建
    
    • 1
    • 2
    • 3

    如果想手动划分训练集、测试集、验证集等,可以先将数据集分在不同的文件夹,然后分别生成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)))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 如何配置…/_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'])
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 如何配置…/_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/"
    
    • 1
    • 2

    使用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
    
    • 1
    • 2

    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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

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

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

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

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

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

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

  • 相关阅读:
    英语不好,能不能学会编程?
    vue的高操作--自定义指令
    永久免费H5直播点播播放器SkeyeWebPlayer.js实现webrtc流播放
    JVM类加载机制详解
    Java Integer compareTo()方法具有什么功能呢?
    WordPress管理仪表板:在15分钟内成为WordPress专家
    C++正则表达式
    混得好的人,从来不会浪费时间
    王道3.1 顺序栈以及链式栈
    Anaconda常用操作(亲测有效果)
  • 原文地址:https://blog.csdn.net/jingyu_1/article/details/126200161