【学习】使用mmdetection,在自定义数据集上进行训练。

mmdetection

1.简介

MMDetection是由open-mmlab开发的基于PyTorch的目标检测工具库,和Detectron2一样是目标检测领域非常著名的工具箱,open-mmlab是香港中文大学、商汤等机构联合成立的实验室,主要都是国内的开发者和研究者。MMDetection中目前包含数十种模型和方法,且为开发者提供了非常合适的高层接口以便开发者以MMDetection为基础进行项目的二次开发,这几年也有不少检测领域的论文采用MMDetection实现。
 

2.安装

安装建议参考官网“开始你的第一步”部分

注意选择适合的版本

注意,在步骤2中,建议使用pytorch官网的安装命令,将pytorch torchvision cudatoolkit 一并装上。记得装cudnn。

# CUDA 11.3
pip install torch==1.11.0+cu113 torchvision==0.12.0+cu113 torchaudio==0.11.0 --extra-index-url https://download.pytorch.org/whl/cu113

注意,在安装 PyTorch 时,你需要指定 CUDA 的版本。如果你不清楚应该选择哪一个,请遵循下面的建议:

  • 对于 Ampere 架构的 NVIDIA GPU,例如 GeForce 30 系列以及 NVIDIA A100,CUDA 11 是必需的。

  • 对于更早的 NVIDIA GPU,CUDA 11 是向后兼容 (backward compatible) 的,但 CUDA 10.2 能够提供更好的兼容性,也更加轻量。

注意,这种版本>=的情况,建议直接装等于指定版本如

mim install "mmcv==2.0.0"

注意

pip install -v -e .

最后面有一个点

在标准数据集上训练

建议参考B站视频,参考资料4,5

在自定义数据集上进行训练

在mmdetection官方文档目录中,找到“训练&测试”,之后选择子选项“在自定义数据集上进行训练”

主要分为如下三个部分

1.准备自定义数据集

需要使用mmdetection支持的数据集格式。

以coco数据集格式为例,需要使用labelme工具,先标注一个数据集,之后将labelme格式转为coco格式。具体方法:

Labelme格式转Coco格式-CSDN博客

转换之后可能会出现json文件里segmentation部分是空的,即只有一对中括号没有内容的情况。下图是正常的情况。

如果有上述问题,参考

https://github.com/open-mmlab/mmdetection/issues/10961

新建个py文件,使用下面的脚本改善json文件。注意路径。

import json
from pprint import pprint
def convert_bbox_to_polygon(bbox):
    x = bbox[0]
    y = bbox[1]
    w = bbox[2]
    h = bbox[3]
    polygon = [x,y,(x+w),y,(x+w),(y+h),x,(y+h)]
    return([polygon])
def main():
    file_path = "annotation_file_name.json"
    f = open(file_path)
    data = json.load(f)
    for line in data["annotations"]:
        segmentation = convert_bbox_to_polygon(line["bbox"])
        line["segmentation"] = segmentation
    with open("annotation_file_name_edit.json", 'w') as f:
        f.write(json.dumps(data))
    print('DONE')
main()

 准备好的数据集组织形式:

train和val里面是图片和json,一一对应。

2.准备配置文件

按照该路径找到想用的模型后,打开

在该文件中,指向了配置的相关参数所在的具体地方,可以按照路径打开看看。

但是不在这些文件里面直接修改,保持原状。

在项目的根目录上建立自己的myconfig.py文件,参照官方文档给出的代码:

# 新配置继承了基本配置,并做了必要的修改
_base_ = '../mask_rcnn/mask-rcnn_r50-caffe_fpn_ms-poly-1x_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/balloon/'
metainfo = {
    'classes': ('balloon', ),
    'palette': [
        (220, 20, 60),
    ]
}
train_dataloader = dict(
    batch_size=1,
    dataset=dict(
        data_root=data_root,
        metainfo=metainfo,
        ann_file='train/annotation_coco.json',
        data_prefix=dict(img='train/')))
val_dataloader = dict(
    dataset=dict(
        data_root=data_root,
        metainfo=metainfo,
        ann_file='val/annotation_coco.json',
        data_prefix=dict(img='val/')))
test_dataloader = val_dataloader

# 修改评价指标相关配置
val_evaluator = dict(ann_file=data_root + 'val/annotation_coco.json')
test_evaluator = val_evaluator

# 使用预训练的 Mask R-CNN 模型权重来做初始化,可以提高模型性能
load_from = 'https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r50_caffe_fpn_mstrain-poly_3x_coco/mask_rcnn_r50_caffe_fpn_mstrain-poly_3x_coco_bbox_mAP-0.408__segm_mAP-0.37_20200504_163245-42aa3d00.pth'

 我的代码:

# 新配置继承了基本配置,并做了必要的修改
_base_ = './configs/mask_rcnn/mask-rcnn_r50_fpn_1x_coco.py'

# 我们还需要更改 head 中的 num_classes 以匹配数据集中的类别数
model = dict(
    roi_head=dict(
        bbox_head=dict(num_classes=17), mask_head=dict(num_classes=17)))

# 修改数据集相关配置
data_root = 'D:/test11/'  # end with'/'.
metainfo = {
    'classes': ('danhong', 'huangtai', 'shejianhong', 'liewen', 'danbai',
           'nitai', 'houtai', 'chihen', 'zihong', 'baitai', 'baobaitai',
           'pangda', 'jianghong', 'hetai', 'hong', 'yuban', 'futai', ),
    'palette': [
        (220, 20, 60), (220, 20, 60), (220, 20, 60), (220, 20, 60), (220, 20, 60),
        (220, 20, 60), (220, 20, 60), (220, 20, 60), (220, 20, 60), (220, 20, 60),
        (220, 20, 60), (220, 20, 60), (220, 20, 60), (220, 20, 60), (220, 20, 60),
        (220, 20, 60), (220, 20, 60),
    ]
}
train_dataloader = dict(
    batch_size=1,
    dataset=dict(
        data_root=data_root,
        metainfo=metainfo,
        ann_file='annotations/train.json',
        data_prefix=dict(img='train/')))
val_dataloader = dict(
    dataset=dict(
        data_root=data_root,
        metainfo=metainfo,
        ann_file='annotations/val.json',
        data_prefix=dict(img='val/')))
test_dataloader = val_dataloader

# 修改评价指标相关配置
val_evaluator = dict(ann_file=data_root + 'annotations/val.json')
test_evaluator = val_evaluator

 可以对比一下改了哪些参数。

_base_改为继承的那个基本文件

num_classes改为你有几类

metainfo里面写你有具体哪几类,要与json文件里面保持一致。

下面还有几个路径,注意有没有斜杠之类的问题。

3.在自定义数据集上进行训练,测试和推理。

train

使用命令:

python tools/train.py myconfig.py

 前面是train.py路径,后面是你的配置文件的路径。

训练的结果即pth文件在

test

在myconfig.py中

test_evaluator = val_evaluator

所以使用val数据来测试

命令:

 python tools/test.py myconfig.py work_dirs/myconfig/epoch_12.pth --show

 可视化

训练过程可视化

python tools/analysis_tools/analyze_logs.py plot_curve  work_dirs/myconfig/20231116_234337/vis_data/20231116_234337.json --keys acc 

 输出一些数据

python tools/analysis_tools/analyze_logs.py plot_curve  work_dirs/myconfig/20231116_234337/vis_data/20231116_234337.json --keys loss_cls loss_bbox loss_mask --out loss.pdf  
# 加--out这一句,可输出为pdf保存,不加则直接展示出来
python tools/analysis_tools/analyze_logs.py plot_curve  work_dirs/myconfig/20231116_234337/vis_data/20231116_234337.json --keys acc --out acc.pdf  
# --keys 的值,可以替换为acc

 

 

参考资料

1.

开始你的第一步 — MMDetection 3.2.0 文档icon-default.png?t=N7T8https://mmdetection.readthedocs.io/zh-cn/latest/get_started.html2.

在标准数据集上训练预定义的模型 — MMDetection 3.2.0 文档icon-default.png?t=N7T8https://mmdetection.readthedocs.io/zh-cn/latest/user_guides/train.html3.

学习配置文件 — MMDetection 3.2.0 文档icon-default.png?t=N7T8https://mmdetection.readthedocs.io/zh-cn/latest/user_guides/config.html#base4.

比较详细的MMDetection使用说明(一)环境配置及验证_哔哩哔哩_bilibiliicon-default.png?t=N7T8https://www.bilibili.com/video/BV1YN4y1u7X6/?spm_id_from=333.788.recommend_more_video.-1&vd_source=07c2ae8d12077de4f018235a6084d27e5.

比较详细的MMDetection使用说明(二)训练Demo_哔哩哔哩_bilibiliicon-default.png?t=N7T8https://www.bilibili.com/video/BV1pW4y1S7u7/?spm_id_from=333.880.my_history.page.click&vd_source=07c2ae8d12077de4f018235a6084d27e6.

OpenMMLab · GitHubicon-default.png?t=N7T8https://github.com/open-mmlab7.

https://github.com/open-mmlab/mmdetection/issues/10961icon-default.png?t=N7T8https://github.com/open-mmlab/mmdetection/issues/109618.

使用自定义数据集训练时报错ValueError: need at least one array to concatenate · Issue #10820 · open-mmlab/mmdetection · GitHubicon-default.png?t=N7T8https://github.com/open-mmlab/mmdetection/issues/108209.
mmdetection 训练自定义数据集出现 need at least one array to concatenate_YC_Zayn的博客-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/YC_Zayn/article/details/130765326

10.目标检测篇:MMDetection 推理使用与详细踩坑记录 | Just for Life. (muyuuuu.github.io)icon-default.png?t=N7T8https://muyuuuu.github.io/2021/05/11/MMDetection-use/ 11.

使用MMDetection训练自己的数据集(COCO)_爱运动的IT小白的博客-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/weixin_53297048/article/details/131014480?spm=1001.2014.3001.5506

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值