手把手教你用YOLOv5训练自己的交通标志数据集(从LabelImg标注到模型部署)
从零构建YOLOv5交通标志检测器的实战指南在自动驾驶和智能交通系统快速发展的今天准确识别道路标志已成为计算机视觉领域的重要应用场景。不同于传统图像处理方法基于深度学习的目标检测技术能够适应复杂环境变化而YOLOv5以其卓越的速度-精度平衡成为工业界首选。本教程将带您完整走通数据标注、模型训练到部署的全流程特别针对初学者可能遇到的坑点提供解决方案。1. 数据准备与标注规范1.1 构建高质量数据集的黄金法则交通标志检测的特殊性在于目标通常只占图像的极小部分约3%-8%像素面积这对数据质量提出了更高要求。建议采集数据时注意多场景覆盖包含白天/夜间、晴天/雨雪、城市/高速等不同环境视角多样性前视、斜视、仰视等不同拍摄角度分辨率标准单目标至少占据50×50像素区域推荐使用德国交通标志检测基准数据集(GTSDB)作为基础配合自行采集的本地化数据。典型数据目录应遵循以下结构dataset/ ├── raw_images/ │ ├── daytime/ │ ├── night/ │ └── adverse_weather/ └── labeled_data/ ├── train/ │ ├── images/ │ └── labels/ └── val/ ├── images/ └── labels/1.2 LabelImg标注实战技巧安装LabelImg只需执行pip install labelImg labelImg # 启动图形界面标注时需特别注意边界框应紧贴标志边缘保留约2-5像素余量同类标志在不同光照条件下应保持标签一致遮挡超过30%的标志建议标记为difficult类别标注过程中频繁使用快捷键可提升效率W创建边界框CtrlS保存当前标注D下一张图像A上一张图像完成标注后会生成PASCAL VOC格式的XML文件需转换为YOLO格式的txt文件。转换脚本示例import xml.etree.ElementTree as ET import os def convert(size, box): dw 1./size[0] dh 1./size[1] x (box[0] box[1])/2.0 y (box[2] box[3])/2.0 w box[1] - box[0] h box[3] - box[2] x x*dw w w*dw y y*dh h h*dh return (x,y,w,h) def convert_annotation(xml_file, classes): in_file open(xml_file) out_file open(xml_file.replace(.xml, .txt), w) tree ET.parse(in_file) root tree.getroot() for obj in root.iter(object): cls obj.find(name).text if cls not in classes: continue cls_id classes.index(cls) xmlbox obj.find(bndbox) b (float(xmlbox.find(xmin).text), float(xmlbox.find(xmax).text), float(xmlbox.find(ymin).text), float(xmlbox.find(ymax).text)) bb convert((width, height), b) out_file.write(str(cls_id) .join([str(a) for a in bb]) \n)2. YOLOv5环境配置与训练优化2.1 高效训练环境搭建推荐使用conda创建隔离环境conda create -n yolov5 python3.8 conda activate yolov5 pip install torch1.10.0cu113 torchvision0.11.1cu113 -f https://download.pytorch.org/whl/torch_stable.html git clone https://github.com/ultralytics/yolov5 cd yolov5 pip install -r requirements.txt关键依赖版本控制组件推荐版本作用PyTorch1.10.0深度学习框架CUDA11.3GPU加速cuDNN8.2.0深度神经网络加速库OpenCV4.5.4图像处理2.2 数据配置文件精调data.yaml文件是训练的核心配置文件示例如下train: ../dataset/train/images val: ../dataset/val/images test: ../dataset/test/images nc: 58 # 根据实际类别数调整 names: [前方障碍, 牛群, 小心, ..., 限速(30)] # 完整类别列表建议添加以下高级参数提升性能rect: True启用矩形训练减少填充像素cache: ram使用内存缓存加速训练pad: 0.5图像填充比例2.3 训练参数调优策略启动基础训练命令python train.py --img 640 --batch 16 --epochs 100 --data data.yaml --weights yolov5s.pt针对交通标志检测的特殊调参技巧学习率设置初始值0.01大批量或0.001小批量使用余弦退火调度lr0: 0.01 lrf: 0.2 # 最终学习率lr0*lrf锚框优化python utils/autoanchor.py --data data.yaml小目标检测增强启用mosaic数据增强使用--multi-scale参数添加小目标检测层修改models/yolov5s.yaml常见报错解决方案CUDA out of memory减小batch_size或图像尺寸标签加载失败检查txt标签文件路径和格式NaN损失降低学习率或使用梯度裁剪3. 模型评估与性能提升3.1 关键指标解读训练完成后在runs/train/exp目录下会生成关键结果文件results.png损失函数和mAP变化曲线confusion_matrix.png类别混淆矩阵val_batchX_labels.jpg验证集预测示例重点关注以下指标指标优秀值改进方法mAP0.50.85增加数据多样性mAP0.5:0.950.65调整锚框尺寸推理速度5ms使用更小模型变体3.2 模型压缩与加速使用TensorRT加速推理的典型流程python export.py --weights best.pt --include engine --device 0模型优化前后对比指标FP32TensorRT-FP16提升推理速度12ms3ms4倍模型大小14MB4MB3.5倍mAP0.870.86-1%4. 部署实战与边缘设备优化4.1 多种部署方案对比根据应用场景选择合适方案平台推荐方案优势适用场景服务器FlaskONNX高吞吐量云端处理嵌入式TensorRT低延迟车载设备移动端CoreML/TFLite跨平台手机APP4.2 树莓派部署实例在树莓派4B上的优化步骤安装必要依赖sudo apt install libatlas-base-dev libopenblas-dev pip install onnxruntime opencv-python-headless转换模型为ONNX格式python export.py --weights best.pt --include onnx --dynamic编写推理脚本import cv2 import onnxruntime as ort session ort.InferenceSession(best.onnx) def preprocess(img): img cv2.resize(img, (640, 640)) img img.transpose(2, 0, 1) return img.astype(float32) / 255.0 frame cv2.imread(test.jpg) inputs {session.get_inputs()[0].name: preprocess(frame)[None]} outputs session.run(None, inputs)4.3 性能瓶颈分析使用py-spy进行性能分析pip install py-spy py-spy top --pid $(pgrep -f python infer.py)典型优化方向图像预处理耗时使用OpenCV的UMat加速模型计算瓶颈量化到INT8精度后处理耗时优化NMS实现在Jetson Nano上的实测数据显示经过优化后推理速度可从原始的120ms提升至28ms满足实时性要求。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2453455.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!