MMDetection训练YOLOX模型后,如何用官方工具分析日志并调优?以VisDrone实验为例
MMDetection训练YOLOX模型后的日志分析与调优实战:以VisDrone数据集为例
当你完成YOLOX模型在VisDrone数据集上的训练后,看着测试集0.246的mAP分数,是否感到困惑?与论文中0.3+的结果相比,这个差距从何而来?本文将带你深入分析训练日志,找出性能瓶颈,并提供一套完整的调优方案。
1. 训练日志分析基础
训练日志是模型训练过程的"黑匣子",记录了每个epoch的关键指标变化。在MMDetection框架中,日志通常以JSON格式保存在工作目录的 vis_data 子文件夹中。这些数据包含三类核心信息:
- 评估指标 :bbox_mAP、bbox_mAP_50、bbox_mAP_75等
- 损失函数 :分类损失(loss_cls)、回归损失(loss_bbox)、目标损失(loss_obj)
- 学习率 :当前学习率值(lr)
使用MMDetection内置的 analyze_logs.py 工具,我们可以将这些数据可视化:
# 生成mAP变化曲线
python tools/analysis_tools/analyze_logs.py plot_curve \
yolox_x/20231210_224605/vis_data/20231210_224605.json \
--out mAP_curve.png \
--keys bbox_mAP
# 生成损失曲线
python tools/analysis_tools/analyze_logs.py plot_curve \
yolox_x/20231210_224605/vis_data/20231210_224605.json \
--out loss_curve.png \
--keys loss_cls loss_bbox loss_obj
提示:建议同时监控训练集和验证集的损失曲线,对比两者差异能更准确判断模型状态
2. 诊断模型问题:从曲线中找线索
2.1 过拟合与欠拟合识别
通过分析损失和mAP曲线,可以判断模型是否存在以下问题:
| 现象 | 训练集损失 | 验证集损失 | mAP曲线 | 可能原因 |
|---|---|---|---|---|
| 欠拟合 | 高且下降慢 | 高且下降慢 | 上升缓慢 | 模型容量不足/学习率过低 |
| 过拟合 | 持续下降 | 先降后升 | 先升后降 | 数据量不足/正则化不够 |
| 理想状态 | 平稳下降 | 平稳下降 | 持续上升 | - |
在VisDrone案例中,如果观察到:
- 训练150轮后mAP仍在上升 → 考虑增加epoch
- 验证损失在后期反弹 → 可能需要早停或增强正则化
2.2 学习率分析
YOLOX默认使用余弦退火学习率调度。理想情况下,损失曲线应该呈现平滑下降趋势。如果出现:
- 剧烈波动 :初始学习率可能过高
- 下降停滞 :学习率可能过低
- 突然上升 :可能是梯度爆炸的征兆
检查学习率是否适配单GPU训练(原始配置为8GPU,需按线性规则缩放):
# 单GPU时的学习率调整
optim_wrapper = dict(
optimizer=dict(
type='SGD',
lr=0.01/8, # 原始0.01为8GPU配置
momentum=0.9,
weight_decay=5e-4)
)
3. 针对性调优策略
3.1 数据增强优化
VisDrone数据集的特点是:
- 小目标占比高(无人机俯拍视角)
- 目标密集(人群、车流)
- 光照变化大
建议调整YOLOX的Mosaic和MixUp增强参数:
# 在config文件中修改
train_pipeline = [
dict(type='Mosaic', img_scale=(640, 640), prob=1.0),
dict(
type='RandomAffine',
scaling_ratio_range=(0.6, 1.4), # 原为(0.5, 1.5)
border=(-320, -320)),
dict(
type='MixUp',
img_scale=(640, 640),
ratio_range=(0.6, 1.6), # 降低混合强度
pad_val=114.0),
dict(type='YOLOXHSVRandomAug'), # 增强色彩扰动
dict(type='RandomFlip', prob=0.5),
]
注意:对于小目标检测,过强的Mosaic可能破坏目标上下文关系,建议适当降低缩放比例
3.2 模型结构调整
YOLOX-X在VisDrone上可能过大,可尝试:
- 更换backbone :考虑YOLOX-S或YOLOX-Tiny
- 调整FPN结构 :增强对小目标的检测能力
- 修改anchor设置 :适配VisDrone目标尺度
示例配置修改:
model = dict(
type='YOLOX',
backbone=dict(
deepen_factor=0.33, # 原为1.0(YOLOX-X)
widen_factor=0.375),
neck=dict(
in_channels=[96, 192, 384], # 对应缩小后的backbone
out_channels=96),
bbox_head=dict(
num_classes=10,
in_channels=96,
feat_channels=96,
strides=[8, 16, 32],
use_depthwise=True)) # 使用深度可分离卷积减小参数量
3.3 训练策略调优
针对VisDrone的特点,建议调整:
- 延长训练周期 :从150 epoch增至300 epoch
- 修改学习率调度 :增加warmup阶段
- 调整正负样本比例 :因小目标多,需增加正样本
配置示例:
# 训练调度调整
param_scheduler = [
dict(
type='LinearLR',
start_factor=1e-4, # warmup
by_epoch=True,
begin=0,
end=5),
dict(
type='CosineAnnealingLR',
eta_min=1e-6, # 最低学习率
begin=5,
T_max=295, # 总epoch-warmup
end=300,
by_epoch=True)
]
# 损失函数调整
bbox_head=dict(
loss_cls=dict(
use_sigmoid=True,
loss_weight=1.0,
reduction='sum',
pos_weight=3.0), # 增加正样本权重
loss_bbox=dict(type='IoULoss', loss_weight=5.0))
4. 高级分析与实验设计
4.1 消融实验记录
建立科学的实验记录表格,系统比较不同配置效果:
| 实验编号 | 模型规模 | 数据增强 | 学习率 | Epoch | mAP@0.5 | 备注 |
|---|---|---|---|---|---|---|
| 1 | YOLOX-X | 默认 | 0.00125 | 150 | 0.246 | 基线 |
| 2 | YOLOX-S | 调整后 | 0.0025 | 300 | 0.278 | +MixUp减弱 |
| 3 | YOLOX-S | 自定义 | 0.0025 | 400 | 0.302 | +warmup |
4.2 错误分析工具
使用MMDetection的 analysis_tools/analyze_results.py 进行错误分析:
python tools/analysis_tools/analyze_results.py \
configs/yolox/yolox_s_coco.py \
checkpoints/yolox_x/best_coco_bbox_mAP_epoch_149.pth \
--show-dir error_analysis/
该工具会生成以下分析结果:
- 假阳性分析 :背景误检、类别混淆
- 假阴性分析 :漏检目标尺度分布
- 定位误差 :边界框IOU分布
4.3 可视化诊断技巧
-
激活热图 :观察模型关注区域
from mmdet.visualization import PALETTE model.show_result( img, result, score_thr=0.3, show=True, bbox_color=PALETTE[10], text_color=(200, 200, 200)) -
特征图可视化 :检查不同层特征响应
def hook_fn(module, input, output): # 对输出特征图取平均并可视化 feature_map = output[0].mean(dim=0).detach().cpu().numpy() plt.imshow(feature_map) backbone.conv1.register_forward_hook(hook_fn)
在实际调优过程中,我发现VisDrone数据集中"pedestrian"和"people"类别的混淆是影响mAP的主要因素之一。通过调整分类损失权重和增加这两个类别的数据增强,可以使mAP提升约2-3个百分点。
更多推荐




所有评论(0)