YoloX训练实战:从零开始用PyTorch训练一个自定义数据集(附完整代码)
YoloX实战指南PyTorch自定义数据集训练全流程解析在工业检测、自动驾驶、安防监控等领域目标检测技术正发挥着越来越重要的作用。YoloX作为Yolo系列的最新演进版本凭借其Anchor-Free设计、SimOTA动态匹配等创新特性在精度和速度上实现了显著提升。本文将带您从零开始完成一个完整的YoloX模型训练流程涵盖数据准备、模型配置、训练优化到结果评估的全过程。1. 环境准备与数据标注1.1 基础环境配置YoloX训练需要PyTorch环境的支持建议使用Python 3.8和PyTorch 1.8版本。以下是推荐的环境配置步骤# 创建conda环境 conda create -n yolox python3.8 conda activate yolox # 安装PyTorch pip install torch1.8.1cu111 torchvision0.9.1cu111 -f https://download.pytorch.org/whl/torch_stable.html # 安装YoloX依赖 pip install yolox0.3.0 pip install opencv-python pillow tqdm tensorboard对于硬件配置建议至少使用8GB显存的GPU如NVIDIA RTX 2070及以上。如果显存不足可以通过减小batch_size或输入图像尺寸来降低显存消耗。1.2 数据集标注规范YoloX支持多种标注格式最常见的是VOC格式和COCO格式。本文以VOC格式为例介绍数据准备过程图像文件应存放在VOCdevkit/VOC2007/JPEGImages目录下标注文件XML格式存放在VOCdevkit/VOC2007/Annotations目录下每个XML文件对应一张图像包含以下关键信息annotation object nameperson/name bndbox xmin100/xmin ymin200/ymin xmax300/xmax ymax400/ymax /bndbox /object /annotation对于标注工具推荐使用LabelImg或CVATLabelImg轻量级开源工具适合小规模标注pip install labelImg labelImgCVAT功能强大的在线标注系统支持团队协作标注注意事项确保标注框紧密贴合目标边缘避免包含过多背景对于遮挡目标按可见部分标注同类目标在不同场景下应保持标注一致性。2. 数据预处理与增强2.1 数据集划分与格式转换使用voc_annotation.py脚本将数据集划分为训练集和验证集并转换为YoloX需要的格式# voc_annotation.py关键参数配置 classes_path model_data/custom_classes.txt # 自定义类别文件 trainval_percent 0.9 # 训练集验证集比例 train_percent 0.9 # 训练集比例生成的train.txt文件每行格式为图像路径 x1,y1,x2,y2,class_id x1,y1,x2,y2,class_id ...2.2 数据增强策略YoloX默认使用了Mosaic和MixUp等增强技术可以有效提升模型泛化能力。在yolox/data/data_augment.py中可以看到完整的增强流程Mosaic增强随机选取4张图像拼接为1张MixUp增强两幅图像线性叠加色彩扰动HSV空间随机调整色调、饱和度和明度几何变换随机翻转、旋转、裁剪对于特定场景如工业缺陷检测可能需要调整增强策略# 自定义增强配置示例 train_dataset YoloXDataset( ... augmentTrue, degrees10.0, # 旋转角度范围 translate0.1, # 平移比例 scale(0.5, 1.5), # 缩放范围 shear2.0, # 剪切幅度 perspective0.0, # 透视变换 )2.3 处理类别不平衡问题当数据集中各类别样本数量差异较大时可采用以下策略重采样对少数类样本进行过采样损失加权在YOLOLoss中调整各类别的权重class YOLOLoss(nn.Module): def __init__(self, num_classes, class_weightsNone): if class_weights is not None: self.class_weights torch.FloatTensor(class_weights)数据增强侧重对少数类样本应用更强的增强3. 模型配置与训练3.1 模型选择与参数配置YoloX提供多种规模的预训练模型可根据硬件条件选择模型类型参数量输入尺寸COCO AP适用场景YOLOX-Nano0.91M416x41625.8移动端/嵌入式YOLOX-Tiny5.06M416x41632.8边缘设备YOLOX-S9.0M640x64040.5通用场景YOLOX-M25.3M640x64046.9高性能需求YOLOX-L54.2M640x64049.7服务器端在train.py中关键配置参数# 模型选择 phi s # 可选 nano, tiny, s, m, l, x # 训练参数 input_shape [640, 640] # 输入图像尺寸 batch_size 8 # 根据显存调整 lr 1e-3 # 初始学习率 num_workers 4 # 数据加载线程数 # 训练策略 freeze_backbone True # 是否冻结骨干网络 mosaic_prob 1.0 # Mosaic增强概率 mixup_prob 1.0 # MixUp增强概率3.2 训练过程优化YoloX采用两阶段训练策略冻结阶段冻结骨干网络CSPDarknet仅训练检测头# 冻结骨干网络 for param in model.backbone.parameters(): param.requires_grad False解冻阶段解冻全部网络进行端到端微调训练过程中可通过TensorBoard监控关键指标tensorboard --logdirlogs常见训练问题与解决方案问题现象可能原因解决方案Loss不下降学习率过大/过小调整学习率尝试1e-4到1e-2显存不足batch_size过大减小batch_size使用梯度累积过拟合数据量不足增加数据增强添加正则化训练震荡数据标注噪声检查标注质量清洗错误样本3.3 自定义模型结构修改如需修改网络结构可编辑yolox/models/yolo_pafpn.py和yolox/models/yolo_head.py。例如增加一个检测层class YOLOXHead(nn.Module): def __init__(self, num_classes80, strides[8, 16, 32, 64]): # 新增64 stride super().__init__() # 新增一个检测头的配置 self.stems.append(BaseConv(in_channels, out_channels, ksize1)) self.cls_convs.append(...) self.reg_convs.append(...)4. 模型评估与部署4.1 评估指标解读YoloX训练过程中会输出多种评估指标mAP(mean Average Precision)综合衡量检测精度AP50IoU阈值为0.5时的AP值AP75IoU阈值为0.75时的AP值AR(Average Recall)平均召回率使用eval.py进行详细评估python tools/eval.py -n yolox-s -c yolox_s.pth -b 8 -d 1 --conf 0.0014.2 模型导出与部署YoloX支持导出为多种格式PyTorch转ONNXpython tools/export_onnx.py --output-name yolox_s.onnx -n yolox-s -c yolox_s.pthTensorRT加速trtexec --onnxyolox_s.onnx --saveEngineyolox_s.engine --fp16移动端部署Android: 使用NCNN或MNN框架iOS: 使用CoreML转换工具4.3 实际应用技巧推理优化# 设置更高效的推理参数 predictor Predictor( model, exp, trt_fileNone, decoderNone, devicegpu, fp16False, legacyFalse, )后处理调优调整置信度阈值--conf默认0.01调整NMS阈值--nms默认0.65多尺度测试exp.test_size (736, 1280) # 使用更大尺寸测试提升小目标检测5. 进阶技巧与问题排查5.1 工业场景优化策略针对工业检测的特殊需求可采取以下优化措施小目标检测优化增加高分辨率检测层使用更密集的特征金字塔添加注意力机制类别不平衡处理# 在SimOTA中调整类别权重 cost cls_cost 3.0 * iou_cost 100000.0 * (~in_boxes_and_center).float()模型轻量化使用通道剪枝知识蒸馏量化感知训练5.2 常见错误排查CUDA内存不足减小batch_size使用--fp16混合精度训练尝试梯度累积optimizer.zero_grad() for i, (images, targets) in enumerate(train_loader): loss model(images, targets) loss.backward() if (i1) % 4 0: # 每4步更新一次 optimizer.step() optimizer.zero_grad()训练出现NaN检查数据中是否存在无效标注降低学习率添加梯度裁剪torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm10.0)验证集性能差检查训练/验证数据分布是否一致尝试关闭Mosaic增强调整数据增强强度5.3 性能调优记录以下是一个典型的调优过程记录迭代修改点mAP0.5推理速度(FPS)显存占用1基线模型(YOLOX-s)0.78455.2GB2Mosaic增强0.82435.4GB3自定义锚点0.84425.3GB4FP16训练0.83623.1GB5输入尺寸800x8000.87326.8GB在实际项目中建议从简单配置开始逐步增加复杂度每次修改只调整一个变量准确记录每次修改的影响。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2571843.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!