使用mmdetection做实例分割

这篇具有很好参考价值的文章主要介绍了使用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

使用mmdetection做实例分割
使用mmdetection做实例分割

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

在mmdetection/configs下包含了各种现成的流行框架,比如mask-rcnn、yolo、htc等等。
使用mmdetection做实例分割

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

使用mmdetection做实例分割

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

参赛时,找到了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是评价的重要指标,越大越好

使用mmdetection做实例分割

  • 单张图片的可视化测试
%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的结果没有画出来。

使用mmdetection做实例分割
使用mmdetection做实例分割

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

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

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

尽管观察上面效果还ok,但是得分不尽如人意,数据集的挑选、标注、划分,网络的挑选等等都很重要。文章来源地址https://www.toymoban.com/news/detail-485813.html

到了这里,关于使用mmdetection做实例分割的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 十五章:使用类别峰值响应的弱监督实例分割

            目前,使用图像级别标签而不是昂贵的像素级掩码进行弱监督实例分割的研究还未得到充分探索。 本文通过利用类别峰值响应来实现一个分类网络,用于提取实例掩码,来解决这个具有挑战性的问题。 只通过图像标签的监督下,完全卷积的CNN分类器可以生成类别

    2024年02月15日
    浏览(31)
  • Fast SAM与YOLOV8检测模型一起使用实现实例分割以及指定物体分割(有代码)

    Fast SAM与YOLOV8检测模型一起使用 VX 搜索”晓理紫“ 关注并回复yolov8+fastsam获取核心代码 晓理紫 实例分割数据集的获取要比检测数据的获取更加困难,在已有检测模型不想从新标注分割数据进行训练但是又想获取相关物体的mask信息以便从像素级别对物体进行操作,这时就可以

    2024年02月13日
    浏览(23)
  • Anaconda安装及使用labelme制作实例分割自建数据集

    ①在Anaconda Prompt(虚拟环境对应的命令窗)中创建新的虚拟环境,命令如下: ②创建完成后,激活虚拟环境 ③安装labelme 正常运转需要各种依赖的包,先下载pyqt和pillow 均yes操作 ④安装labelme 至此,使用labelme的前期工作已经做完,接下来开始labelme的使用。 进入环境 打开la

    2024年02月10日
    浏览(33)
  • Stable Diffusion - 扩展 SegmentAnything 和 GroundingDINO 实例分割算法 插件的配置与使用

    欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://blog.csdn.net/caroline_wendy/article/details/131918652 Paper and GitHub: Segment Anything: SAM - Segment Anything GitHub: https://github.com/facebookresearch/segment-anything Grounding DINO: Grounding DINO: Marrying DINO with Grounded Pre-Training for Open-Set Object Detection 定位

    2024年02月15日
    浏览(32)
  • Python将COCO格式实例分割数据集转换为YOLO格式实例分割数据集

    由于本人水平有限,难免出现错漏,敬请批评改正。 更多精彩内容,可点击进入YOLO系列专栏或我的个人主页查看 YOLOv5:添加SE、CBAM、CoordAtt、ECA注意力机制 YOLOv5:yolov5s.yaml配置文件解读、增加小目标检测层 YOLOv5:IoU、GIoU、DIoU、CIoU、EIoU YOLOv7训练自己的数据集(口罩检测)

    2024年02月15日
    浏览(24)
  • 计算机视觉基础(11)——语义分割和实例分割

    在这节课,我们将学习 语义分割和实例分割 。在语义分割中,我们需要重点掌握语义分割的 概念、常用数据集、评价指标(IoU)以及经典的语义分割方法(Deeplab系列) ;在实例分割中,需要知道实力分割可以近似看为“ 目标检测+语义分割 ”,需要知道 Mask R-CNN方法的计算

    2024年01月23日
    浏览(44)
  • 有空就学学的实例分割1——Tensorflow2搭建Mask R-CNN实例分割平台

    把Mask RCNN用tensorflow2实现了一遍,至少要跟得上时代对不对。 Mask R-CNN是He Kaiming大神2017年的力作,其在进行目标检测的同时进行实例分割,取得了出色的效果。 其网络的设计也比较简单,在Faster R-CNN基础上,在原本的两个分支上(分类+坐标回归)增加了一个分支进行语义分

    2024年02月20日
    浏览(26)
  • MaskFormer:将语义分割和实例分割作为同一任务进行训练

    目标检测和实例分割是计算机视觉的基本任务,在从自动驾驶到医学成像的无数应用中发挥着关键作用。目标检测的传统方法中通常利用边界框技术进行对象定位,然后利用逐像素分类为这些本地化实例分配类。但是当处理同一类的重叠对象时,或者在每个图像的对象数量不

    2024年02月10日
    浏览(26)
  • 深度学习中语义分割、实例分割、目标检测和图像分类区别

    语义分割 实例分割 目标检测 语义分割:需要判断每个像素属于哪一个类别,属于像素级别分类标注 实例分割:相较于语义分割 会将同一类别的不同物体进行分离标注   目标检测:输入图像通常包含多个物体,对物体的位置与类别进行标注  图像分类:输入图像通常包含一

    2024年02月08日
    浏览(42)
  • 视频实例分割论文速读

    DVIS: Decoupled Video Instance Segmentation Framework 首先,题目说的是解耦视频实例分割框架,然后说了现在离线方法和在线方法都有什么不足之处。 离线方法受到紧密耦合建模范式的限制,其范式对所有帧一视同仁,忽略了相邻帧之间的相互依赖关系,导致在长期时间对齐期间引入过

    2024年02月20日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包