保姆级教程:手把手教你用YOLOX训练自己的VOC格式数据集(附完整代码修改清单)
·
零基础实战: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
训练不收敛排查:
- 检查数据标注质量
- 适当增大学习率
- 验证数据加载是否正确
- 尝试更小的模型变体(如YOLOX-Tiny)
更多推荐


所有评论(0)