mmdetection训练 测试步骤
训练
# 使用预训练模型了
nohup python tools/train.py configs/tood/tood_r50_fpn_1x_fwpd.py > tood-visdrone.log 2>&1 & tail -f tood-visdrone.log
nohup python tools/train.py configs/tood/tood_r50_fpn_1x_fwpd.py \
--cfg-options model.backbone.init_cfg=None > tood-visdrone-scratch.log 2>&1 &
tail -f tood-visdrone-scratch.log
这里我使用的是nohup命令,启动后台训练,这样前面控制台断开也可以后台继续运行。
--cfg-options 这里选择None,不使用预训练模型,我需要做对比试验,就直接从头开始训练的
把训练日志写进log文件里 && 通过tail命令实时显示日志文件,这个也可以不看,主要是方便看有没有报错
测试
# 测试
python tools/test.py configs/tood/tood_r50_fpn_1x_fwpd.py work_dirs/tood_r50_fpn_1x_fwpd/best_coco_bbox_mAP_epoch_150.pth --show --show-dir test_save
# 快速测试,快速查看分数,不保存画了框的图片
python tools/test.py configs/tood/tood_r50_fpn_1x_fwpd.py work_dirs/tood_r50_fpn_1x_fwpd/best_coco_bbox_mAP_epoch_150.pth
建议使用第二个命令,直接掠过画图过程,会比较快。
输出的如下面所示:
Accumulating evaluation results...
DONE (t=0.69s).Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.833Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=1000 ] = 0.962Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=1000 ] = 0.890Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=1000 ] = 0.812Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=1000 ] = 0.958Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=1000 ] = 1.000Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.855Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=300 ] = 0.855Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=1000 ] = 0.855Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=1000 ] = 0.837Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=1000 ] = 0.974Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=1000 ] = 1.000
10/18 20:52:11 - mmengine - INFO -
+----------+-------+--------+--------+-------+-------+-------+
| category | mAP | mAP_50 | mAP_75 | mAP_s | mAP_m | mAP_l |
+----------+-------+--------+--------+-------+-------+-------+
| car | 0.882 | 0.978 | 0.937 | 0.843 | 0.983 | 1.0 |
| people | 0.785 | 0.945 | 0.844 | 0.781 | 0.934 | nan |
+----------+-------+--------+--------+-------+-------+-------+
10/18 20:52:11 - mmengine - INFO - bbox_mAP_copypaste: 0.833 0.962 0.890 0.812 0.958 1.000
10/18 20:52:11 - mmengine - INFO - Epoch(test) [367/367] coco/car_precision: 0.8820 coco/people_precision: 0.7850 coco/bbox_mAP: 0.8330 coco/bbox_mAP_50: 0.9620 coco/bbox_mAP_75: 0.8900 coco/bbox_mAP_s: 0.8120 coco/bbox_mAP_m: 0.9580 coco/bbox_mAP_l: 1.0000 data_time: 0.0154 time: 0.2207
另外:需要修改代码
_base_ = 'tood_r50_fpn_1x_coco.py'model = dict(bbox_head=dict(num_classes=2)
)# 修改数据集相关配置
data_root = '/mnt/disk3/sunjiahui/data/yolov8_train_val/'
metainfo = {'classes': ('car', 'people' ),# 'palette': [# (220, 20, 60),# ]
}
train_dataloader = dict(batch_size=8,num_workers=8,dataset=dict(data_root=data_root,metainfo=metainfo,ann_file='train/annotations/train.json',data_prefix=dict(img='train/images')))
# 文件路径:data_root + ann_file
# /mnt/disk3/sunjiahui/data/yolov8_train_val/train/train.jsonval_dataloader = dict(batch_size=8,num_workers=8,dataset=dict(data_root=data_root,metainfo=metainfo,ann_file='val/annotations/val.json',data_prefix=dict(img='val/images')))# 4. 【关键修正】显式地、完整地覆盖评估器配置
val_evaluator = dict(type='CocoMetric', # 评估器类型通常保持不变ann_file=data_root + 'val/annotations/val.json' # 确保这里的路径是你的验证集标注文件!
)test_dataloader = dict(batch_size=8,num_workers=8,dataset=dict(data_root=data_root,metainfo=metainfo,ann_file='test/annotations/test.json',data_prefix=dict(img='test/images')))# 修改评价指标相关配置
val_evaluator = dict(ann_file=data_root + 'val/annotations/val.json')
test_evaluator = dict(ann_file=data_root + 'test/annotations/test.json',classwise=True # 显示每个类别的AP
)default_hooks = dict(logger=dict(type='LoggerHook', interval=50),checkpoint=dict(type='CheckpointHook',interval=10, # 每 10 轮保存一次(这个值可以随你定)save_best='coco/bbox_mAP', # 关键!自动保存 mAP 最高的模型rule='greater', # 规则是“越大越好”max_keep_ckpts=3 # 最多保留几个模型(-1表示全部保留)),# ---------------------------------
)
# 使用预训练的模型权重来做初始化
load_from = 'tood_r50_fpn_1x_coco_20211210_103425-20e20746.pth'# 覆盖默认的训练计划
train_cfg = dict(type='EpochBasedTrainLoop', # 训练循环的类型,保持默认即可max_epochs=200, # <<< 将最大轮数设置为 200val_interval=50) # <<< 每训练 10 轮在验证集上评估一次