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

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

2021.9.1 更新:适配 MMDetection v2.16

目录:

  • MMDetection v2 目标检测(1):环境搭建
  • MMDetection v2 目标检测(2):数据准备
  • MMDetection v2 目标检测(3):配置修改
  • MMDetection v2 目标检测(4):模型训练和测试

服务器的环境配置:

  • 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= --port=6660

命令参数:

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

你可能感兴趣的:(MMDetection v2 目标检测(4):模型训练和测试)