本文以 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 模型训练
- 打开
mmdetection
目录:
cd mmdetection
- 新建工作目录:
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 训练过程可视化
- 在终端输入:
tensorboard --logdir=work_dirs/faster_rcnn_r50_fpn_1x_mydataset/tf_logs \
--host=<host_ip> --port=6660
命令参数:
-
--logdir
:设置tfevents
日志的路径 -
--host
:设置服务器的IP
地址 -
--port
:设置访问端口,默认值为6006
打开浏览器,在地址栏输入
<host_ip>:6660
。进入
TensorBoard
界面。
Tips:
如果打不开界面,可尝试以下操作:
- 检查终端是否按了
Ctrl+C
,导致结束了TensorBoard
进程- 检查浏览器是否为
Chrome
内核- 检查日志目录是否存在
tfevents
日志文件- 检查端口号是否冲突
- 使用
--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
:设置度量指标(voc
:mAP
,recall
|coco
:bbox
,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_results
:pkl
测试结果文件的路径 -
--eval
:设置度量指标(voc
:mAP
,recall
|coco
:bbox
,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 使用无标注图像测试模型
- 将图像转换为
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
- 测试模型
命令格式:
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
:设置度量类型(voc
:bbox
|coco
:proposal
,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_results
:pkl
测试结果文件的路径 -
--dataset
:设置数据集类型(voc
,coco
,cityscape
),默认值为coco
-
--task
: 设置任务类型(voc
:bbox
|coco
:bbox
,segm
),默认值为bbox
-
--metric
:设置度量指标(voc
:AP50
|coco
:AP
,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_logs
:json
日志文件的路径 -
--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_logs
:json
日志文件的路径
示例:
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_path
:pkl
预测结果文件的路径 -
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...]}]
命令参数:
-
result
:json
预测结果文件的路径 -
out_dir
:设置输出分析结果文件的路径 -
--ann
:json
标注文件的路径,默认值为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 结语
有帮助的话,点个赞再走吧,谢谢~
参考: