赞
踩
MMDetection是由open-mmlab开发的基于PyTorch的目标检测工具库,和Detectron2一样是目标检测领域非常著名的工具箱,open-mmlab是香港中文大学、商汤等机构联合成立的实验室,主要都是国内的开发者和研究者。MMDetection中目前包含数十种模型和方法,且为开发者提供了非常合适的高层接口以便开发者以MMDetection为基础进行项目的二次开发,这几年也有不少检测领域的论文采用MMDetection实现。
安装建议参考官网“开始你的第一步”部分
注意选择适合的版本
注意,在步骤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官方文档目录中,找到“训练&测试”,之后选择子选项“在自定义数据集上进行训练”
主要分为如下三个部分
需要使用mmdetection支持的数据集格式。
以coco数据集格式为例,需要使用labelme工具,先标注一个数据集,之后将labelme格式转为coco格式。具体方法:
转换之后可能会出现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,一一对应。
按照该路径找到想用的模型后,打开
在该文件中,指向了配置的相关参数所在的具体地方,可以按照路径打开看看。
但是不在这些文件里面直接修改,保持原状。
在项目的根目录上建立自己的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文件里面保持一致。
下面还有几个路径,注意有没有斜杠之类的问题。
使用命令:
python tools/train.py myconfig.py
前面是train.py路径,后面是你的配置文件的路径。
训练的结果即pth文件在
在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 文档https://mmdetection.readthedocs.io/zh-cn/latest/get_started.html2.
OpenMMLab · GitHubhttps://github.com/open-mmlab7.
使用自定义数据集训练时报错ValueError: need at least one array to concatenate · Issue #10820 · open-mmlab/mmdetection · GitHubhttps://github.com/open-mmlab/mmdetection/issues/108209.
mmdetection 训练自定义数据集出现 need at least one array to concatenate_YC_Zayn的博客-CSDN博客https://blog.csdn.net/YC_Zayn/article/details/130765326
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。