MMDetection v2 目标检测(4):模型训练和测试

本文以 Faster R-CNN 为例,介绍如何使用 MMDetection v2,在 VOC 格式的自定义数据集上,训练和测试模型。

2021.9.1 更新:适配 MMDetection v2.16

目录:

服务器的环境配置:

  • Ubuntu:18.04.5
  • CUDA:10.1.243
  • Python:3.7.9
  • PyTorch:1.5.1
  • MMDetection:2.16.0

1 模型训练

  1. 打开 mmdetection 目录:
cd mmdetection
  1. 新建工作目录:
mkdir work_dirs

1.1 训练模型

命令格式:

# 单 GPU 训练
python tools/train.py ${CONFIG_FILE} [optional arguments]
# 多 GPU 训练
bash tools/dist_train.sh ${CONFIG_FILE} ${GPU_NUM} [optional arguments]

命令参数:

  • config_file:模型配置文件的路径
  • gpu_num:使用 GPU 的数量
  • --work-dir:设置存放训练生成文件的路径
  • --resume-from:设置恢复训练的模型检查点文件的路径
  • --no-validate(不建议):设置训练时不验证模型
  • --seed:设置随机种子,便于复现结果

示例:

# 单 GPU 训练
python tools/train.py \
    configs/myconfig/faster_rcnn_r50_fpn_1x_mydataset.py \
    --work-dir work_dirs/faster_rcnn_r50_fpn_1x_mydataset \
    --seed 0
# 多 GPU 训练
bash tools/dist_train.sh \
    configs/myconfig/faster_rcnn_r50_fpn_1x_mydataset.py 4 \
    --work-dir work_dirs/faster_rcnn_r50_fpn_1x_mydataset \
    --seed 0

训练完成后,生成的模型检查点和日志文件,存放在 ./work_dirs 目录下。

1.2 训练过程可视化

  1. 在终端输入:
tensorboard --logdir=work_dirs/faster_rcnn_r50_fpn_1x_mydataset/tf_logs \
    --host=<host_ip> --port=6660

命令参数:

  • --logdir:设置 tfevents 日志的路径
  • --host:设置服务器的 IP 地址
  • --port:设置访问端口,默认值为 6006
  1. 打开浏览器,在地址栏输入 <host_ip>:6660

  2. 进入 TensorBoard 界面。

Tips:
如果打不开界面,可尝试以下操作:

  1. 检查终端是否按了 Ctrl+C,导致结束了 TensorBoard 进程
  2. 检查浏览器是否为 Chrome 内核
  3. 检查日志目录是否存在 tfevents 日志文件
  4. 检查端口号是否冲突
  5. 使用 --host 设置服务器的 IP 地址

2 测试模型

2.1 测试模型

命令格式:

# 单 GPU 测试
python tools/test.py ${CONFIG_FILE} ${CHECKPOINT_FILE} \
    [--out ${RESULT_FILE}] [--eval ${EVAL_METRICS}] [--show]
# 多 GPU 测试
bash tools/dist_test.sh ${CONFIG_FILE} ${CHECKPOINT_FILE} ${GPU_NUM} \
    [--out ${RESULT_FILE}] [--eval ${EVAL_METRICS}]

命令参数:

  • config_file:模型配置文件的路径
  • checkpoint_file:模型检查点文件的路径
  • gpu_num:使用的 GPU 数量
  • --out:设置输出 pkl 测试结果文件的路径
  • --work-dir:设置存放 json 日志文件的路径
  • --eval:设置度量指标(vocmAP, recall | cocobbox, segm, proposal
  • --show:设置显示有预测框的测试集图像
  • --show-dir:设置存放有预测框的测试集图像的路径
  • --show-score-thr:设置显示预测框的阈值,默认值为 0.3
  • --fuse-conv-bn: 设置融合卷积层和批归一化层,能够稍微提升推理速度

示例:

# 单 GPU 测试
python tools/test.py \
    configs/myconfig/faster_rcnn_r50_fpn_1x_mydataset.py \
    work_dirs/faster_rcnn_r50_fpn_1x_mydataset/latest.pth \
    --show
# 多 GPU 测试
bash tools/dist_test.sh \
    configs/myconfig/faster_rcnn_r50_fpn_1x_mydataset.py \
    work_dirs/faster_rcnn_r50_fpn_1x_mydataset/latest.pth 4 \
    --out work_dirs/faster_rcnn_r50_fpn_1x_mydataset/result.pkl \
    --eval mAP

测试结果文件评估

命令格式:

python tools/analysis_tools/eval_metric.py \
    ${CONFIG_FILE} ${PKL_RESULTS} \
    [--eval ${EVAL_METRICS}]

命令参数:

  • config_file:模型配置文件的路径
  • pkl_resultspkl 测试结果文件的路径
  • --eval:设置度量指标(vocmAP, recall | cocobbox, segm, proposal

示例:

python tools/analysis_tools/eval_metric.py \
    configs/myconfig/faster_rcnn_r50_fpn_1x_mydataset.py \
    work_dirs/faster_rcnn_r50_fpn_1x_mydataset/result.pkl \
    --eval mAP

2.2 使用无标注图像测试模型

  1. 将图像转换为 coco 格式

命令格式:

python tools/dataset_converters/images2coco.py \
    ${IMG_PATH} ${CLASSES} ${OUT} \
    [--exclude-extensions]

命令参数:

  • img_path:图像文件的根路径
  • classes:类别列表文本文件的路径
  • out:设置输出 json 标注文件的路径
  • --exclude-extensions:设置需要排除的文件后缀名

示例:

python tools/dataset_converters/images2coco.py
  1. 测试模型

命令格式:

python tools/test.py ${CONFIG_FILE} ${CHECKPOINT_FILE} \
    --format-only --options ${JSONFILE_PREFIX} [--show]

命令参数:

  • --format-only:设置只对测试结果进行格式处理
  • --options ${JSONFILE_PREFIX}:设置 json 测试结果文件的前缀名

示例:

./tools/test.py \
    configs/myconfig/faster_rcnn_r50_fpn_1x_mydataset.py \
    work_dirs/faster_rcnn_r50_fpn_1x_mydataset/result.pkl \
    --format-only --options "jsonfile_prefix=work_dirs/faster_rcnn_r50_fpn_1x_mydataset/results"

2.3 测试模型鲁棒性

命令格式:

python tools/analysis_tools/test_robustness.py \
    ${CONFIG_FILE} ${CHECKPOINT_FILE} \
    [--out ${RESULT_FILE}] [--eval ${EVAL_METRICS}]

命令参数:

  • config_file:模型配置文件的路径
  • checkpoint_file:模型检查点文件的路径
  • --out:设置输出 pkl 测试结果文件的路径
  • --eval:设置度量类型(vocbbox | cocoproposal, proposal_fast, bbox, segm, keypoints
  • --corruptions:设置图像损坏类型(all, benchmark, noise, blur, weather, digital, holdout, None),默认值为 benchmark
  • --severities:设置图像损坏程度(0, 1, 2, 3, 4, 5),默认值为 0 1 2 3 4 5
  • --iou-thr:设置 voc 评估的 IoU 阈值,默认值为 0.5
  • --show:设置显示有预测框的测试集图像
  • --show-dir:设置存放有预测框的测试集图像的路径
  • --show-score-thr:设置显示预测结果的阈值,默认值为 0.3
  • --seed:设置随机种子,便于复现结果
图像损坏类型

示例:

python tools/analysis_tools/test_robustness.py \
    configs/myconfig/faster_rcnn_r50_fpn_1x_mydataset.py \
    work_dirs/faster_rcnn_r50_fpn_1x_mydataset/latest.pth \
    --out work_dirs/faster_rcnn_r50_fpn_1x_mydataset/robustness.pkl \
    --eval bbox --corruptions noise weather --severities 1 2 --seed 0

测试结果文件评估

命令格式:

python tools/analysis_tools/robustness_eval.py ${PKL_RESULTS} \
    [--dataset ${DATASET}] [--task ${TASK}] [--metric ${EVAL_METRICS}]

命令参数:

  • pkl_resultspkl 测试结果文件的路径
  • --dataset:设置数据集类型(voc, coco, cityscape),默认值为 coco
  • --task: 设置任务类型(vocbbox | cocobbox, segm),默认值为 bbox
  • --metric:设置度量指标(vocAP50 | cocoAP, AP50, AP75, APs, APm, APl, AR1, AR10, AR100, ARs, ARm, ARl
度量指标

示例:

python tools/analysis_tools/robustness_eval.py \
    work_dirs/faster_rcnn_r50_fpn_1x_mydataset/robustness_results.pkl \
    --dataset voc --task bbox --metric AP50

3 演示模型

命令格式:

# 图像
python demo/image_demo.py ${IMAGE_FILE} ${CONFIG_FILE} ${CHECKPOINT_FILE} \
    [--device ${GPU_ID}] [--score-thr ${SCORE_THR}]
# 摄像头
python demo/webcam_demo.py ${CONFIG_FILE} ${CHECKPOINT_FILE} \
    [--device ${GPU_ID}] [--camera-id ${CAMERA-ID}] [--score-thr ${SCORE_THR}]
# 视频
python demo/video_demo.py ${VIDEO_FILE} ${CONFIG_FILE} ${CHECKPOINT_FILE} \
    [--device ${GPU_ID}] [--score-thr ${SCORE_THR}] [--out ${OUT_FILE}] \
    [--show] [--wait-time ${WAIT_TIME}]

命令参数:

  • img_file:图像文件的路径
  • vedio_file:视频文件的路径
  • config_file:模型配置文件的路径
  • checkpoint_file:模型检查点文件的路径
  • --device:设置计算设备类型(cpu, cuda:0),默认值为 cuda:0
  • --camera-id:设置摄像头的编号,默认值为 0
  • --score-thr:设置测试结果的阈值,默认值为 0.3
  • --out:设置输出有预测框的视频文件的路径
  • --show:设置显示有预测框的视频
  • --wait-time:设置视频帧显示间隔时间,默认值为 0 (s)

示例:

# 图像
python demo/image_demo.py demo/demo.jpg \
    configs/myconfig/faster_rcnn_r50_fpn_1x_mydataset.py \
    work_dirs/faster_rcnn_r50_fpn_1x_mydataset/latest.pth --device cpu
# 摄像头
python demo/webcam_demo.py \
    configs/myconfig/faster_rcnn_r50_fpn_1x_mydataset.py \
    work_dirs/faster_rcnn_r50_fpn_1x_mydataset/latest.pth --device cuda:0
# 视频
python demo/video_demo.py demo/demo.mp4 \
    configs/myconfig/faster_rcnn_r50_fpn_1x_mydataset.py \
    work_dirs/faster_rcnn_r50_fpn_1x_mydataset/latest.pth --device cuda:0
    --out work_dirs/faster_rcnn_r50_fpn_1x_mydataset/result.mp4

4 工具箱

4.1 日志分析

绘制学习曲线

命令格式:

python tools/analysis_tools/analyze_logs.py plot_curve log.json \
    [--keys ${KEYS}] [--title ${TITLE}] [--legend ${LEGEND}] \
    [--backend ${BACKEND}] [--style ${STYLE}] [--out ${OUT_FILE}]

命令参数:

  • plot_curve:绘制曲线
  • json_logsjson 日志文件的路径
  • --keys:设置度量指标(acc, loss, loss_cls, loss_bbox, mAP, etc.)
  • --title:设置曲线标题
  • --legend:设置曲线图例
  • --backend:设置后端
  • --style:设置风格
  • --out:设置输出 jpg 绘制曲线文件的路径

示例:

python tools/analysis_tools/analyze_logs.py plot_curve \
    work_dirs/faster_rcnn_r50_fpn_1x_mydataset/20201030_162432.log.json \
    --keys loss --out work_dirs/faster_rcnn_r50_fpn_1x_mydataset/plot_result.jpg

计算训练时间

命令格式:

python tools/analysis_tools/analyze_logs.py cal_train_time log.json

命令参数:

  • cal_train_time:计算训练时间
  • json_logsjson 日志文件的路径

示例:

python tools/analysis_tools/analyze_logs.py cal_train_time \
    work_dirs/faster_rcnn_r50_fpn_1x_mydataset/20201030_162432.log.json

计算模型复杂度

命令格式:

python tools/analysis_tools/get_flops.py \
    ${CONFIG_FILE} [--shape ${INPUT_SHAPE}]

命令参数:

  • config_file:模型配置文件的路径
  • --shape:输入图像尺寸,默认值为 1280 800

示例:

python tools/analysis_tools/get_flops.py \
    configs/myconfig/faster_rcnn_r50_fpn_1x_mydataset.py \
    --shape 1333 800

4.2 结果分析

命令格式:

python tools/analysis_tools/analyze_results.py \
    ${CONFIG} ${PREDICTION_PATH} ${SHOW_DIR} \
    [--show] [--wait-time ${WAIT_TIME}] \
    [--topk ${TOPK}] [--show-score-thr ${SHOW_SCORE_THR}]

命令参数:

  • config:模型配置文件的路径
  • prediction_pathpkl 预测结果文件的路径
  • show_dir:设置存放有预测框的图像文件的路径
  • --show:设置显示有预测框的图像
  • --wait-time:设置图像显示间隔时间,默认值为 0 (s)
  • --topk:设置需要保存预测图像的数量,默认值为 20
  • --show-score-thr:设置显示预测结果的阈值,默认值为 0

示例:

python tools/analysis_tools/analyze_results.py \
    configs/myconfig/faster_rcnn_r50_fpn_1x_mydataset.py \
    work_dirs/faster_rcnn_r50_fpn_1x_mydataset/result.pkl \
    work_dirs/faster_rcnn_r50_fpn_1x_mydataset/results \
    --show --topk 10 --show-score-thr 0.3

4.3 误差分析

命令格式:

python tools/analysis_tools/coco_error_analysis.py \
    ${RESULT} ${OUT_DIR} \
    [--ann ${ANN}] [--types ${TYPES[TYPES...]}]

命令参数:

  • resultjson 预测结果文件的路径
  • out_dir:设置输出分析结果文件的路径
  • --annjson 标注文件的路径,默认值为 data/coco/annotations/instances_val2017.json
  • --types:设置预测结果类型,默认值为 bbox

示例:

python tools/analysis_tools/coco_error_analysis.py \
    work_dirs/faster_rcnn_r50_fpn_1x_mydataset/results.bbox.json \
    work_dirs/faster_rcnn_r50_fpn_1x_mydataset/results \
    --ann=data/coco/annotations/instances_val2017.json
    --types='bbox'

4.4 其他

浏览训练集图像

命令格式:

python tools/misc/browse_dataset.py ${CONFIG_FILE} \
    [--output-dir ${OUTPUT_DIR}] [--show-interval ${SHOW_INTERVAL}]

命令参数:

  • config_file:模型配置文件的路径
  • --output-dir:设置输出有标注框的训练集图像的路径
  • --show-interval:设置图像显示间隔时间,默认值为 2 (s)

示例:

python tools/misc/browse_dataset.py configs/myconfig/faster_rcnn_r50_fpn_1x_mydataset.py

Tips:
如果需要使用 GUI,来浏览有预测框的图像文件,可下载 DetVisGUI

打印完整配置

命令格式:

python tools/misc/print_config.py ${CONFIG_FILE}

命令参数:

  • config_file:模型配置文件的路径

示例:

python tools/misc/print_config.py configs/myconfig/faster_rcnn_r50_fpn_1x_mydataset.py

5 结语

有帮助的话,点个赞再走吧,谢谢~

参考:

  1. 最新版本的mmdetection2.0 (v2.0.0版本)环境搭建、训练自己的数据集、测试以及常见错误集合
  2. Inference and train with existing models and standard datasets
  3. Useful Tools and Scripts
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,752评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,100评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,244评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,099评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,210评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,307评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,346评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,133评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,546评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,849评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,019评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,702评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,331评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,030评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,260评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,871评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,898评论 2 351