前言
MMDetecion系列是难得的精品文章,请手动三连!
如果你对mmdetection一无所知,可以参考这篇文章:一文了解mmdetection(正在写)
如果你想直接部署mmdetection,请阅读本文,
看完本文,可以阅读mmdetecton从精通到高阶
该系列都是在Linux下完成,windows可能有所区别
MMDection安装
假设你已经配置好了conda虚拟环境,没配置好的看Anaconda与pytorch环境安装(正在写)
环境安装
首先,官网下载mmdetection
wget https://github.com/open-mmlab/mmdetection.git
进入mmdetection目录和虚拟环境(使用创建的虚拟环境名):
cd mmdetection
conda activate mmd
安装相关依赖
pip install mmcv-full -f https://download.openmmlab.com/mmcv/dist/cu101/torch1.6.0/index.html
pip install -r requirements/build.txt
pip install -v -e .
demo测试
在mmdetection目录下创建demo.py如下:
from mmdet.apis import init_detector, inference_detector
config_file = 'configs/faster_rcnn/faster-rcnn_r50_fpn_1x_coco.py'
'''
创建‘checkpoints’目录并下载 checkpoint
网址为: http://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_fpn_1x_coco/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth
'''
checkpoint_file = 'checkpoints/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth'
device = 'cuda:0'
img = 'demo/demo.jpg'
# 初始化检测器
model = init_detector(config_file, checkpoint_file, device=device)
inference_detector(model, 'demo/demo.jpg')
运行demo.py即可
python demo.py
你将会看到一个包含 DetDataSample 的列表,预测结果在 pred_instance 里,包含有检测框,类别和得分
创建数据集
mmdetection的数据结构如下,我们以coco数据集为例:
annotations中包含instances_train2017.json,instances_val2017.json,所有文件名不要更改
train2017, val2017, test2017分别包括训练,验证,测试图片(.png或.jpg)
mmdetection
├── mmdet
├── tools
├── configs
├── data
│ ├── coco
│ │ ├── annotations
│ │ │ ├──instances_train2017.json
│ │ │ ├──instances_val2017.json
│ │ ├── train2017
│ │ ├── val2017
│ │ ├── test2017
│ ├── cityscapes
│ │ ├── annotations
│ │ ├── leftImg8bit
│ │ │ ├── train
│ │ │ ├── val
│ │ ├── gtFine
│ │ │ ├── train
│ │ │ ├── val
│ ├── VOCdevkit
│ │ ├── VOC2007
│ │ ├── VOC2012
训练模型
通过修改配置文件,改变训练参数,以faster rcnn为例:
python ./tools/train.py ./configs/faster_rcnn/faster-rcnn_r50_fpn_1x_coco.py
加载预训练模型
train.py参数介绍:
打开tools/train.py查看超参数即可,mmdetection 3.x中train.py没有–weights超参数,在配置文件在加入load_from=‘模型文件’即可使用预训练模型
load_from = '/mmdetection//checkpoints/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth'
train.py中有--resume参数,可以加载上次未训练完的模型,即work_dirs中最新模型,配置文件加resume=True也可以实现
配置文件:
_base_ = [
'../_base_/models/faster-rcnn_r50_fpn.py',
'../_base_/datasets/coco_detection.py',
'../_base_/schedules/schedule_1x.py',
'../_base_/default_runtime.py'
]
表明模型文件继承自faster-rcnn_r50_fpn.py,数据加载继承自coco_detection.py,训练参数继承自schedule_1x.py,default_runtime.py
建议创建一个新配置文件,如my_faster_rcnn.py继承原有配置,然后修改你的自定义配置文件
_base_ = ['faster-rcnn_r50_fpn_1x_coco.py',]
修改类别classes
修改类别后一定要重新编译
python setup.py install
进入mmdetection/mmdet/evaluation/functional/class_names.py,修改def coco_classes()
def coco_classes() -> list:
"""Class names of COCO."""
return [
'3_2', '9_1', '2_1', '8', '10_1', '10_2', '9_2', '2_2', '3_1' # 你的数据类别
]
进入mmdetection/mmdet/datasets/coco.py,修改class CocoDataset(BaseDetDataset):
@DATASETS.register_module()
class CocoDataset(BaseDetDataset):
"""Dataset for COCO."""
METAINFO = {
'classes':
('3_2', '9_1', '2_1', '8', '10_1', '10_2', '9_2', '2_2', '3_1'), # 你的数据类别
以faster rcnn为例,找到继承的configs/_base_/models/faster-rcnn_r50_fpn.py,找到model的roi_head的bbox_head的num_classes,在自定义配置中修改
model = dict(
roi_head=dict(bbox_head=dict(num_classes=9),),)
关键训练参数
model = dict(
data_preprocessor=dict(
mean=[113.7506, 114.8209, 112.6435],
std=[57.9982, 59.6259, 59.5165],),
roi_head=dict(bbox_head=dict(num_classes=9),),)
mean=[113.7506, 114.8209, 112.6435], std=[57.9982, 59.6259, 59.5165]是数据集的平均值和标准差,可以看这篇文章生成数据集的平均值和标准差
train_dataloader = dict(
batch_size=2, # 训练batch大小
num_workers=2, # 训练线程
persistent_workers=True,
sampler=dict(type='DefaultSampler', shuffle=True),
batch_sampler=dict(type='AspectRatioBatchSampler'),)
rain_cfg = dict(type='EpochBasedTrainLoop', max_epochs=200, val_interval=10)
# 最大训练批次,每隔val_interval验证一次map
default_hooks=dict(checkpoint=dict(type='CheckpointHook', interval=10),)
# 每隔interval保存一次模型
load_from = '/work/yanqi/mmdetection/checkpoints/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth'
开始训练
重新编译
python setup.py install
训练
python ./tools/train.py ./configs/faster_rcnn/faster-rcnn_r50_fpn_1x_coco.py
多显卡训练看我的这篇文章MMDetection 3.x使用多GPU训练
CUDA_VISIBLE_DEVICES=0,1,2,3 torchrun --nproc_per_node=4 ./tools/train.py ./configs/yolox/yolox_s_8xb8-300e_coco.py --launcher pytorch
生成检测图片
进入demo/阅读超参数设置,以faster rcnn为例命令如下
python ./demo/image_demo.py ./data/coco/test2017 ./configs/faster_rcnn/faster-rcnn_r50_fpn_1x_coco.py --weights ./work_dirs/faster-rcnn_r50_fpn_1x_coco/epoch_100.pth --out-dir output
数据增强
数据增强见目标检测数据增强篇