mmdetection使用
mmdetection 大部分模型都需要coco格式数据集
xml / txt 转 coco
- 注意coco数据集的格式 类别id 是从下标1开始的
- 在json文件的最后一行可以看见 类别id对应的类别名称 {“names”:‘panel_1’,“id”:1}
更改class_name
- mmdetection/mmdet/datasets/coco.py
CLASSES = ("",)
- mmdetection/mmdet/core/evaluation/classes_names.py
def coco_classes(): return ["",]
- 注意这里两处classes的顺序和拼写,要和训练的json 最后一行的类别顺序一致
更改自己要跑的模型的configs文件
- 例如yolox_s
mmdetection/configs/yolox/yolox_s_8×8_300e_coco.py- 需要更改 检测头的 num_classes = 自己的类别数量(在文件开头)
- 需要更改
train = dict{ }、val = dict { }、test = dict { }
的路径img_prefix
和anno_file
为自己的数据路径. - (可选)
- 更改__base__里的内容,比如学习率,batch size,
- 也可以指定
work_dirs = "your_work_dirs_path"
(模型保存的路径)、 - 也可以指定预训练模型加载路径
load_from=" your_checkpoint_path"
- 例如cascade_rcnn
mmdetection/configs/cascade_rcnn/cascade_rcnn_r50_fpn_1x_coco.py
需要在 configs/base/ 下找到这四个文件依次修改_base_ = [ '../_base_/models/cascade_rcnn_r50_fpn.py', '../_base_/datasets/coco_detection.py', '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' ]
- 需要更改 检测头的
num_classes =
自己的类别数量(在文件开头,cascade有三个级联检测头,所以要更改三处)(在cascade_rcnn_r50_fpn.py里面) - 需要更改
train = dict{ }、val = dict { }、test = dict { }
的路径img_prefix
和anno_file
为自己的数据路径. (在coco_detection.py里面) - (可选)
- 更改__base__里的内容,比如学习率,batch_size,
- 也可以指定
work_dirs="your_work_dirs_path"
(模型保存的路径)、 - 也可以指定预训练模型加载路径
load_from=" your_checkpoint_path"
- 需要更改 检测头的
训练
- 单卡训练
python tools/train.py your_config_file_path_here
- 分布式多卡训练
bash ./tools/dist_train.sh your_config_file_path_here 2 #2 代表两块卡 默认 0 and 1 CUDA_VISIBLE_DEVICES=0,2,3 bash ./tools/dist_train.sh your_config_file_path_here 3 #指定三块卡训练
- 恢复训练
--resume-from your_pth_path #从已经训练好的某个epoch恢复训练
结果生成
- 默认生成在mmdetection/work_dirs/ 文件下
- 模型权重文件epoch.pth
- log日志
- 你的完整训练config文件会在这里在保存一次,(下次可以用这个config文件直接训练,比较方便)
测试
-
基本命令
python tools/test.py work_dirs/yolox_/faster_rcnn_r50_fpn_1x_voc0712.py work_dirs/yolox_/faster_rcnn_r50_fpn_1x_voc0712/latest.pth # 分别输入完整conf 权重文件路径(均在你指定的work_dirs下)
-
可视化
--show-dir work_dirs/visual_result(你想要保存可视化结果的文件夹)
-
生成json格式的结果
--format-only --options "jsonfile_prefix=./results/result" # 会在results下生成result.bbox.json
-
其他参数
--options "classwise=True" #输出每类的map
--eval mAP #输出mAP
--eval bbox #输出 bbox map
-
也可以多卡测试 同训练
例子:bash ./tools/dist_test.sh configs_start/start/cascade_r50_1600_koi.py work_dirs/cascade_r50_fpn_1600_koi/epoch_5.pth 2 --format-only --options "jsonfile_prefix=./results/cascade_r50_fpn_1600_koi_epoch_5_result" 4
-
其他一些测试操作示例
loss: python tools/analysis_tools/analyze_logs.py plot_curve work_dirs/detectors_cascade_rcnn_r50_1x_coco/20210426_132037.log.json --keys loss --out work_dirs/detectors_cascade_rcnn_r50_1x_coco/loss_results.jpg map: python tools/analysis_tools/analyze_logs.py plot_curve work_dirs/detectors_cascade_rcnn_r50_1x_coco/20210426_132037.log.json --keys bbox_mAP bbox_mAP_50 bbox_mAP_75 --out work_dirs/detectors_cascade_rcnn_r50_1x_coco/map_results.jpg model 复杂度 python tools/analysis_tools/get_flops.py configs_water/detectors/detectors_cascade_rcnn_r50_1x_coco.py --shape 1333 800