ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

路面导航标志识别实战:基于YOLOv5的机器人视觉感知与部署

路面导航标志识别实战:基于YOLOv5的机器人视觉感知与部署 简介这套标注数据集面向道路机器人视觉导航场景基于YOLOv5标记路面要素适合自动驾驶、智能小车、路面标志识别等方向的初学者与开发者使用。包内共有815个文件其中407张jpg路面实景图像与407个配套txt标签一一对应覆盖交通灯、马路、左右转标志、黄线、人行道及机器人等常见导航要素另有1个yaml配置文件可直接用于YOLOv5模型训练与验证。压缩包整体约5.52MB文件命名规范、标签格式标准方便用户直接划分训练集和测试集。目前已有773人学习下载。通过该数据集读者可快速开展目标检测模型训练省去自行采集与标注的繁琐流程尤其适合课程设计、毕业设计或机器人竞赛中的视觉导航模块开发。1. 项目概览路面导航标志识别到底在解决什么问题先说结论这个项目做的是道路机器人的视觉感知模块让它能像人一样看懂路面上的交通标志和导航标识包括交通灯、左右转箭头、黄线、人行道甚至识别前方其他机器人。模型选型用的是yolov5负责把画面中的这些目标框出来给上层决策模块提供坐标和类别信息。我在做类似项目时最大的感受是很多人一上来就急着标数据、跑模型结果发现识别效果差得离谱回头才发现问题出在没想清楚到底要识别什么、在什么场景下识别。这个项目标题里有一句话特别重要——道路机器人这四个字决定了它跟普通车载摄像头识别完全不同它是低速、近距离、俯视或平视角混合视角下的识别任务目标外观小、遮挡多、光线变化大这对数据采集和标注策略都有直接影响。所以这篇博文我不会只教你跑通yolov5而是从数据、训练、部署、调优四个维度完整拆解一个路面导航标志识别项目的落地过程。不管是做毕设、参加竞赛还是在真实机器人平台上做技术预研这套思路都能直接拿过去用。2. 数据准备路面标志识别的成败全在数据集2.1 目标类别分析与采集策略先看项目的检测类别交通灯、左右转、黄线、人行道、机器人再加上路面导航标志。这里面有个容易踩的坑——黄线和人行道不是物体而是区域或线状目标。yolov5的检测框是矩形用它框一条连续黄线或者一整条人行道本身就有天然的语义错位。所以我在做同类项目时的处理方式是黄线检测框只框近距离可见的一段黄线而不是整条线靠后处理把多个框连成线人行道框斑马线的局部条纹区域而不是整条马路牙子左右转箭头这类是标准的小目标框的标注要做到紧贴箭头外沿不能留太多背景采集数据时一定要把机器人的真实视角带进去。比如道路机器人如果是30cm高的底盘摄像头高度就在30cm左右拍出来的黄线和人行道形变跟行车记录仪的视角完全不一样。我建议直接把相机装到机器人上在真实路面跑几圈采集而不是用现成的开源交通标志数据集后者视角差异太大迁移过去效果会很差。2.2 标注规范与数据增强标注工具我用的是LabelImg和X-AnyLabeling前者轻量后者支持半自动辅助标注。针对这个项目我建议标注时遵循以下规范类别名称标注要点容易出现的问题traffic_light只框发光灯头不框整个灯杆把黑色灯杆也框进去导致特征混乱turn_left / turn_right紧贴箭头外沿不框完整标线区域过大的框让模型学会看路面而不是看箭头yellow_line只框当前可见的一段黄虚线或实线一次性框整条线目标框畸变严重crosswalk框2-3条斑马线条纹即可框的范围过大与背景区分度下降robot框完整车体包含轮子只框上半身检测框不稳定数据增强方面除了yolov5自带的 mosaic、mixup 之外我强烈建议加两种针对性增强透视变换模拟机器人行驶中上下坡导致的视角变化HSV色域扰动特别是光照变化黄线在阴影下和阳光下的色差非常大不加这个增强白天转阴天时检出率会断崖式下跌2.3 数据集规模建议很多人问要标多少张图才够。我的经验是像这种固定场景、类别不超过六类的检测任务600到1000张标注图是够用的起步规模每张图包含3到5个目标实例。如果低于这个量级比如只有一两百张模型很容易过拟合泛化能力基本没有。真实项目里如果跑出来效果不行90%的情况是数据量不够而不是网络结构有问题。3. 模型训练yolov5的关键配置与超参数调整3.1 环境配置与模型选型yolov5的环境配置是老生常谈了但我还是把稳定方案贴出来因为太多人卡在这。Python版本建议3.8到3.10PyTorch根据显卡CUDA版本选择一般用官方推荐的匹配组合最省心。核心依赖就一句git clone https://github.com/ultralytics/yolov5 cd yolov5 pip install -r requirements.txt很多人在CPU上跑训练不是不行但yolov5s在CPU上训练一个600张图的小数据集一个epoch可能就要十几分钟一个完整训练跑几十个epoch时间成本太高。有条件的话租个云GPU实例或者用Colab免费额度都能接受。模型选型上我的建议是优先用yolov5s作为基线。因为标题里的识别任务包含小目标左右转箭头yolov5n虽然更快但小目标召回率会差一些yolov5m精度确实更高但训练和推理时间都上去了对边缘端部署不友好。yolov5s是精度和速度平衡点最好的一档。3.2 训练配置文件的修改方法yolov5训练前要改两个文件数据集配置和模型配置。数据集配置比如road_sign.yaml内容大概是train: ./datasets/road_sign/train/images val: ./datasets/road_sign/val/images nc: 6 names: [traffic_light, turn_left, turn_right, yellow_line, crosswalk, robot]模型配置如果沿用yolov5s直接引用models/yolov5s.yaml就行不需要改结构nc值会在训练时自动读取。然后是训练命令我一般这样启动python train.py --data road_sign.yaml --weights yolov5s.pt --img 640 --batch 16 --epochs 100 --device 0这里的 img size 我测试过640 是性能与精度的最佳折中。调成1280对小目标精度有帮助但推理速度会变成原来的四分之一机器人实时性要求高的场景下基本跑不动。batch size 根据显存来我一般用16到32。3.3 超参数调整的实践经验yolov5提供了hyp.scratch-low.yaml和hyp.scratch-high.yaml两组超参模板。我实测下来针对路面标志识别项目最影响效果的是这几个lr0初始学习率默认0.01我用小数据集时降到0.005训练会更稳定mosaic马赛克增强默认1.0建议保留它对小目标场景非常有效fliplr水平翻转如果左右转箭头都采集了可以开0.5如果只采集了右侧视角建议关掉否则模型会把左转右转搞混关于训练轮数我的建议是先用100个epoch跑一版观察val/objectness和mAP0.5的曲线。如果val loss在最后30个epoch不再下降说明已经收敛可以提前停止。不一定要把epochs拉满到300那样容易过拟合。3.4 训练完成后的评估指标怎么看训练完不要只盯着一张 loss 图就下结论要重点看三样东西PR曲线理想曲线是右上角凸出如果曲线掉得很快说明置信度阈值设高了会丢掉很多真实目标混淆矩阵这个项目里最怕的是turn_left和turn_right互相混淆矩阵里这两格如果有数值说明数据增强里的翻转设置有问题F1-Confidence曲线F1最高的那个置信度点就是推理时最合理的conf-thres参考值我用600张标注图训练出来的yolov5s模型验证集上mAP0.5大约在0.87到0.92之间。如果你的模型离这个指标差太远基本可以确定是数据问题先去补充数据而不是调超参。4. 模型部署与推理优化让模型从PC跑进机器人4.1 模型导出与端侧推理框架选择训练完的.pt文件不能直接拿到机器人上跑需要做格式转换。我在树莓派5上部署时用的方案是先把权重导出为ONNX再转成OpenVINO的IR格式或者直接用ONNX Runtime推理。以ONNX导出为例python export.py --weights runs/train/exp/weights/best.pt --include onnx --opset 12为什么要转ONNX因为yolov5的PyTorch模型直接部署在边缘设备上不仅依赖环境重而且推理速度一般。ONNX是中间格式可以在边缘端的CPU上获得更好的推理性能也能拿到其他硬件加速平台的兼容性。如果是基于树莓派部署我的实测结论是树莓派5 CPU ONNX Runtimeyolov5s 640输入单帧推理约 200~300ms勉强达到2-3 FPS树莓派5 NCNN速度与ONNX Runtime接近差异不大树莓派5 OpenVINO推理约 120~180ms是CPU方案里最快的如果需要更高的实时性两个选择一是换更小的模型如yolov5n或做通道剪枝二是上带NPU的边缘板子或者用Intel NUC这类x86平台跑起来就完全没有压力了。4.2 检测后处理与导航决策的串联模型输出的原始结果是坐标框和置信度要让机器人真正实现导航必须做一层后处理。我在实际项目里的处理流程是拿到检测框后先按类别分组左右转箭头取检测框中心点的图像坐标通过相机标定的逆透视变换把它映射到机器人坐标系下的方向角黄线将连续帧的黄线检测框中心点连成轨迹线得到道路偏移量人行道检测到人行道后发送减速指令并用边框宽度估算距人行道的距离机器人目标计算相邻两帧目标框尺寸变化率粗略判断前方机器人的相对距离和是否在移动这一步是很多毕设项目忽略的但其实比模型训练更能体现系统的完整性。模型只负责看见理解和行动全靠后处理代码。5. 常见问题与调优实录5.1 小目标左右转箭头检测不到怎么办这是路面标志识别项目里最典型的痛点。如果你训练出来的模型对turn_left和turn_right的召回率很低按顺序检查这几个地方标注框是否过松箭头目标小如果标注时框缩得不够紧yolov5的anchor匹配就会把前景当成背景导致正样本不足图片尺寸是否够大训练时img size可以用640但如果原始图片里箭头只有10x10像素需要裁切数据集让目标在画面里占比更大或者改用SAHI切片推理是否开了mosaicmosaic增强会缩小目标在画面中的尺寸对小目标反而不利建议mosaic设为0.5左右5.2 黄线与人行道误检率偏高这两类目标天然和路面背景有大量相似纹理。我的处理方式是标注时把非目标路面也收集进来做一些负样本图片让模型学会什么情况下不该输出黄线框推理时对这两类单独提高置信度阈值比如其他类别0.25黄线设0.45利用时间序列平滑只有连续N帧都检出黄线才认为真的有黄线单帧偶发的检测直接过滤5.3 训练loss下降但mAP不升这个现象特别迷惑人我一开始也栽过跟头。大概率是数据标注有噪声比如有些框类别标错了或者某些目标没标出来。yolov5的loss会努力拟合这些矛盾标注结果在验证集上表现越来越差。解决办法用训练好的模型对训练集做一轮预测找出漏标和错标比较多的图片人工复查一遍标注把错误修正后重新训练。另外我建议训练时开着--cache ram把数据预加载到内存这样能明显减少数据读取的I/O时间尤其是数据集图片比较多的情况下训练能快一倍不止。5.4 树莓派上推理速度比预期慢在树莓派5上部署的实测数据模型版本输入尺寸CPU推理耗时可达FPSyolov5n32050~70ms10~15yolov5s640200~300ms3~5如果你的目标是20 FPS以上的实时导航CPU方案基本做不到。我把模型转为OpenVINO后yolov5s推理耗时降到150ms左右但仍然达不到实时。要更快只能在以下三个方向里做取舍缩小输入尺寸到416或320精度损失大概2到4个点用NCNN对模型做INT8量化速度能提升一半以上但小目标精度会进一步下降换成带NPU的平台比如瑞芯微RK3588系列相同的yolov5s模型能跑到30 FPS以上6. 技术选型之外的几个关键心得做路面导航标志识别这类项目模型训练只占整个工作量的30%到40%数据、部署、联调才是真正耗时间的部分。我在实际做这个项目时前期标数据用了一周多每天标两三小时训练加调优大概三天部署到机器人平台并调试后处理逻辑又花了四五天。没有把部署和后处理算进去的人工期预估往往会翻车。还有一点是关于硬件选型的建议。如果你用的是带轮子的道路机器人底盘若带有IMU惯性测量单元一定要把IMU数据跟视觉检测结果做融合。纯视觉识别黄线的抖动是很厉害的尤其在砖石路面上IMU可以帮你矫正摄像头姿态变化带来的检测框位置偏移。这个融合代码不复杂但能显著提升导航稳定性。另外如果这个项目的目标是毕设或者比赛我建议在yolov5之外加一个轻量级的端到端导航模块比如把检测到的左右转箭头角度直接转化成PWM舵机转向信号做一个简单的闭环控制。这样整个系统就不再是只识别不行动更能体现完整性和工程落地能力。最后分享一个我在实际调试中认为最有价值的技巧在机器人上运行时接一个实时视觉调试窗口把检测框、类别、置信度实时叠加到画面里。看似只是个小工具但它在现场调试时帮你省下的时间远超写这个小工具本身花费的时间。路面标志检测这种强环境依赖的任务很多问题在PC端跑数据集中完全看不出来只有放到真实路面上一跑你才能真正理解模型的感知边界在哪里。本文还有配套的精品资源点击获取
返回列表