零基础实战:YOLOX模型从数据集准备到训练全流程详解

第一次接触目标检测模型训练时,面对复杂的代码修改和参数调整,很多初学者都会感到无从下手。本文将带你一步步完成YOLOX模型在自定义VOC格式数据集上的完整训练流程,每个操作细节都配有具体代码示例和避坑指南。

1. 环境搭建与准备工作

在开始训练之前,确保你的系统满足以下基本要求:

  • Ubuntu 18.04或更高版本(Windows可通过WSL2运行)
  • Python 3.7+
  • CUDA 11.1及以上版本(对应显卡驱动需支持)
  • 至少8GB显存的NVIDIA显卡

基础环境配置步骤

# 创建并激活虚拟环境
conda create -n yolox python=3.8 -y
conda activate yolox

# 安装PyTorch(根据CUDA版本选择)
pip install torch==1.9.0+cu111 torchvision==0.10.0+cu111 -f https://download.pytorch.org/whl/torch_stable.html

注意:PyTorch版本与CUDA的兼容性非常重要,不匹配的版本会导致训练过程报错

YOLOX源码获取与依赖安装:

git clone https://github.com/Megvii-BaseDetection/YOLOX.git
cd YOLOX
pip install -r requirements.txt
python setup.py develop

常见问题排查:

  • 如果遇到apex安装失败,可以尝试:
    git clone https://github.com/NVIDIA/apex
    cd apex
    pip install -v --disable-pip-version-check --no-cache-dir ./
    

2. VOC格式数据集准备与结构规范

一个标准的VOC格式数据集应包含以下目录结构:

VOCdevkit/
└── VOC2022/  # 年份可自定义
    ├── Annotations/  # 存放XML标注文件
    ├── JPEGImages/   # 存放原始图像
    ├── ImageSets/
    │   └── Main/     # 存放train.txt, val.txt等
    └── labels/       # YOLO格式标签(可选)

数据集划分建议比例

数据集类型 比例 说明
训练集 70% 模型主要学习数据
验证集 15% 调整超参数
测试集 15% 最终模型评估

生成数据集划分文件的Python示例:

import os
import random

image_dir = "VOCdevkit/VOC2022/JPEGImages"
all_images = [f.split('.')[0] for f in os.listdir(image_dir)]
random.shuffle(all_images)

split = int(0.7*len(all_images))
train = all_images[:split]
val_test = all_images[split:]

with open("VOCdevkit/VOC2022/ImageSets/Main/train.txt", "w") as f:
    f.write("\n".join(train))

# 同理生成val.txt和test.txt

3. 关键代码修改详解

3.1 类别定义修改

首先修改yolox/data/datasets/voc_classes.py,替换为你的实际类别:

VOC_CLASSES = (
    "person",
    "car",
    "dog",
    # 确保每个类别后都有逗号
)

警告:最后一个类别后也必须有逗号,否则会导致解析错误

3.2 模型配置文件调整

修改exps/example/yolox_voc/yolox_voc_s.py中的关键参数:

class Exp(MyExp):
    def __init__(self):
        super(Exp, self).__init__()
        self.num_classes = 3  # 与你的类别数一致
        self.depth = 1.0
        self.width = 1.0
        self.data_dir = "path/to/VOCdevkit"
        self.train_ann = "train.txt"
        self.val_ann = "val.txt"
        self.max_epoch = 300
        self.no_aug_epochs = 15
        self.basic_lr_per_img = 0.01 / 64.0

参数调整指南

  • max_epoch:根据数据集大小调整,小数据集可适当增加
  • no_aug_epochs:最后N个epoch关闭数据增强
  • basic_lr_per_img:学习率与batch size相关

3.3 数据加载器修改

调整yolox/data/datasets/voc.py中的VOCDetection类:

class VOCDetection(data.Dataset):
    def __init__(...):
        # 修改为你的实际路径
        self.root = os.path.join("path", "to", "VOCdevkit")
        self._annopath = os.path.join(self.root, "Annotations", "%s.xml")
        self._imgpath = os.path.join(self.root, "JPEGImages", "%s.jpg")
        # 修改标签处理逻辑(如有需要)

4. 训练启动与监控

4.1 命令行训练方式

单GPU训练命令示例:

python tools/train.py -f exps/example/yolox_voc/yolox_voc_s.py \
    -d 0 -b 32 --fp16 -c yolox_s.pth

参数说明:

  • -d:GPU设备ID
  • -b:batch size(根据显存调整)
  • --fp16:启用混合精度训练
  • -c:预训练权重路径

4.2 训练过程监控

YOLOX默认使用TensorBoard记录训练指标,启动监控:

tensorboard --logdir YOLOX_outputs/yolox_voc_s

关键监控指标:

  • train/loss:总损失值下降趋势
  • train/iou_loss:边界框IOU损失
  • val/AP:验证集平均精度

学习率调整策略

阶段 学习率变化 说明
热身阶段 线性增加 前5个epoch
主训练阶段 余弦衰减 直到no_aug_epochs开始
微调阶段 固定最小学习率 最后15个epoch

5. 模型测试与性能评估

5.1 单张图像测试

修改tools/demo.py进行单图测试:

def make_parser():
    parser = argparse.ArgumentParser("YOLOX Demo!")
    parser.add_argument("--path", default="./assets/dog.jpg", help="path to images")
    parser.add_argument("--conf", default=0.3, type=float, help="confidence threshold")
    parser.add_argument("--nms", default=0.3, type=float, help="nms threshold")
    # 其他参数保持不变

运行测试:

python tools/demo.py image -f exps/example/yolox_voc/yolox_voc_s.py \
    -c YOLOX_outputs/yolox_voc_s/latest_ckpt.pth --path your_image.jpg

5.2 批量评估

使用tools/eval.py进行mAP计算:

python tools/eval.py -f exps/example/yolox_voc/yolox_voc_s.py \
    -c YOLOX_outputs/yolox_voc_s/latest_ckpt.pth -b 8 -d 0

评估指标解读

  • AP@0.5:IoU阈值为0.5时的平均精度
  • AP@0.5:0.95:IoU从0.5到0.95的平均精度
  • FPS:模型推理速度(帧/秒)

6. 实战技巧与性能优化

6.1 数据增强策略

YOLOX默认使用Mosaic和MixUp增强,可在yolox/data/data_augment.py中调整:

# 修改train_augmenter中的增强参数
self.mosaic_prob = 1.0  # Mosaic概率
self.mixup_prob = 1.0   # MixUp概率
self.degrees = 10.0     # 旋转角度范围
self.translate = 0.1    # 平移比例

6.2 模型量化与加速

使用TensorRT加速推理:

from yolox.exp import get_exp
from yolox.utils import postprocess

# 加载模型
exp = get_exp("exps/example/yolox_voc/yolox_voc_s.py")
model = exp.get_model()
model.cuda()

# 转换为TRT模型
trt_file = "yolox_s.trt"
assert os.path.exists(trt_file), "TRT file not found!"
model.head.decode_in_inference = False
decoder = model.head.decode_outputs

6.3 常见错误解决方案

显存不足问题

  • 减小-b参数降低batch size
  • 添加--fp16启用混合精度
  • 使用梯度累积:
    python tools/train.py ... -b 8 --accumulate 4
    

训练不收敛排查

  1. 检查数据标注质量
  2. 适当增大学习率
  3. 验证数据加载是否正确
  4. 尝试更小的模型变体(如YOLOX-Tiny)
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐