首页/新闻资讯/正文详情

YOLOv5+ROS部署实战:行人红绿灯检测全流程解析

发布时间:2026/9/24 21:20:07 来源:云帆数科 栏目:资讯中心
YOLOv5+ROS部署实战:行人红绿灯检测全流程解析
简介基于YOLOv5 ROS部署版实现行人和红绿灯识别的源码工程包含训练好的权重与说明文档主要面向计算机、电子信息工程、数学等专业的大学生用于课程设计、期末大作业或毕业设计中的目标检测与ROS应用场景帮助读者快速搭建交通参与者识别实验环境。压缩包共123个文件大小约83.87MB文件类型涵盖Python脚本、YAML配置、模型权重(.pt/.pth)、Shell脚本、Dockerfile、Markdown说明、Jupyter Notebook等其中py/yaml支撑推理与参数配置pt/pth提供预训练模型md/ipynb用于原理讲解与快速上手。目前已有1933人学习下载对于需要参考完整项目做二次开发的同学具有一定热度。内容还包括YOLOv5网络结构说明、注意力机制报告、示例图片及测试脚本并针对ROS部署做了适配流程相对完整读者可在现有代码基础上自行修改功能、调参或扩展数据集作为毕业设计或竞赛项目的参考资料较为合适。1. 基于YOLOv5的ROS部署版行人和红绿灯识别从模型到节点的一次性打通很多做机器人课题的同学卡住的往往不是模型训练而是怎么把检测结果灌进ROS这个“黑匣子”里。这份基于YOLOv5的ROS部署版资源就是把这条链路整体打包好的例子用现成的YOLOv5权重对行人、红绿灯做检测省去自己写一堆图像桥接代码的功夫。资源里带了源码、权重和说明文档还配有Dockerfile和tutorial.ipynb适合课程设计、期末大作业或者刚接触ROS检测的工程师当作参考资料来用。它解决的问题很具体让YOLOv5从“吃一张JPG的Python脚本”变成“订阅一个图像话题就能持续出框的ROS节点”。如果你手里有现成摄像头或者UVc相机顺着这份资源的思路能很快跑出一套本地部署的识别链路。2. 部署前先看懂耦合关系YOLOv5推理和ROS消息循环怎么衔接2.1 为什么标准YOLOv5不能直接进ROS原版YOLOv5的detect.py接收命令行里的source参数可以是图片、视频、摄像头。它的工作方式是单次调用读文件、跑网络、保存结果。这里面没有“持续循环”和“消息订阅”的概念。ROS节点的运行模式是event-driven的。节点要先初始化订阅某个话题之后每一帧图像到达时回调函数被触发在回调里做推理再把结果发布出去。这个流程里没有命令行参数控制的source位置图像输入变成sensor_msgs/Image消息输出要么是另一个图像话题要么是检测结果的消息数组。所以部署版要做的第一件事就是把YOLOv5包装成“节点”而不是“脚本”。在这份资源里你会看到类似yolo_detect_node.py这样的节点文件它做的事情就是典型的四步初始化节点、订阅图像话题、调用YOLOv5推理、发布结果话题。理解这个关系后面调试的时候就不会一头扎进模型代码里而是先看话题传输对不对。2.2 为什么选YOLOv5加ROS这套组合YOLOv5不是最新的算法但它在业内留存了大量工程化资源部署路径非常成熟。训练好的权重可以直接加载也可以用torch.hub方式调用导出ONNX、TensorRT也比较方便。对于课程设计和工程demo来说YOLOv5的精度、速度和代码可读性比较均衡。选择ROS做载体是因为机器人系统里所有传感器数据都以话题形式流动。摄像头在驱动节点里发布图像话题其他模块订阅这个话题互相解耦。YOLOv5节点只负责“看”后续的决策、导航、报警模块可以再订阅检测结果各自独立运行。这套组合真正的价值在于你只需要关心检测节点内部怎么调参外部接口用ROS标准消息就能对接。比如行人的检测结果可以接一个跟踪节点红绿灯的检测结果可以接一个位置估算节点互不干扰。2.3 资源包结构里藏着的部署思路解压这个RAR包后文件清单并不复杂每个文件都有明确用途。文件在部署中承担的角色Dockerfile把ROS、PyTorch、YOLOv5依赖打成一个镜像解决环境不一致问题setup.cfgPython包安装配置配合pip install -e .使用让项目能作为包导入tutorial.ipynb按单元格执行的教程适合先在Jupyter里把单张图片的检测跑通bus.jpg / zidane.jpg测试图片YOLOv5仓库自带的样例图用于快速回归验证README.md项目导读包含权重路径、启动方式等说明yolov5_network.mdYOLOv5网络结构解析适合想理解Backbone、Neck、Head的读者注意力机制报告.md注意力机制扩展思路对红绿灯这种小目标检测有直接帮助我拿到这类资源一般先看README再打开tutorial.ipynb最后才碰launch文件和节点代码。这样的顺序能最快的知道模型到底能不能跑再去解决话题层面的问题。另外COCO预训练的YOLOv5模型本身就能检测person和traffic light这两个类别。也就是说即使你没有自训练的数据集直接用预训练权重也能完成基本需求。这对课程设计非常友好算是“开箱即用”的兜底方案。3. 把部署版跑通环境、镜像和第一个检测节点3.1 环境准备Ubuntu版本、ROS版本和依赖选择这类的资源基本都依赖ROS1因为launch文件和rospy都是ROS1的东西。常见搭配是Ubuntu 20.04加ROS Noetic对应Python 3.8PyTorch生态兼容性也比较好。ROS安装建议直接使用小鱼一键安装脚本的大名至少可以少走很多弯路。命令行安装方式社区里已经很成熟这里不再重复。装完之后记得验证一下ROS环境变量用echo $ROS_DISTRO确认当前环境确实指向Noetic而不是后面又source了别的ROS2。深度学习依赖方面YOLOv5需要PyTorch、torchvision、opencv-python、numpy等。如果不想让ROS环境被pip依赖搞乱优先使用资源里的Dockerfile构建镜像。Docker的好处是可以隐藏掉宿主机Python版本差异缺点是挂载摄像头和GPU时要多配置几步。如果选择本地conda环境我在实际项目中更习惯的做法是# 先创建独立环境避免和ROS自带的Python打架 conda create -n yolov5_ros python3.8 -y conda activate yolov5_ros # 在项目根目录下执行读取setup.cfg完成包安装 pip install -e . # 额外安装YOLOv5缺失的依赖 pip install torch torchvision opencv-python numpy pandas matplotlib这里的pip install -e .会读取setup.cfg中的package配置把项目注册成一个可导入的Python包。否则直接在节点脚本里写import yolo_module会找不到模块。建议先跑这一步再启动ROS节点。3.2 用Dockerfile构建镜像并启动容器如果主机上已经有NVIDIA显卡可以优先考虑Docker方案。以下命令需要在RAR包解压后的根目录执行。# 构建镜像镜像名建议带版本号避免以后改Dockerfile后分不清 docker build -t yolov5_ros:v1 . # 启动交互式容器使用宿主机网络并把摄像头设备挂载进去 docker run -it --network host --gpus all \ -v /dev/video0:/dev/video0 \ yolov5_ros:v1 /bin/bash这段命令里最关键的是--network host。ROS节点之间的通信依赖ROS_MASTER_URI如果容器默认使用bridge网络容器内的IP是172.17.0.x这种和宿主机、其他机器的话题通信很容易失败。使用宿主机网络后容器里的节点就相当于跑在宿主机上ROS的Topic通信从根源上省掉了网络层的问题。--gpus all只有在搭配nvidia-container-toolkit时才有效。如果报错参考后面避坑章节的解决办法。/dev/video0是USB摄像头的设备文件容器里默认看不到宿主机设备必须手动挂载。3.3 编写launch文件启动检测节点launch文件的作用是把节点参数固化下来以后每次启动不用记一堆命令行参数。这里给出一个常见的launch写法。launch node nameyolo_detect_node pkgyolov5_ros typeyolo_detect_node.py outputscreen param nameimage_topic value/camera/rgb/image_raw/ param nameweights_path value$(find yolov5_ros)/weights/best.pt/ param nameconf_thres value0.5/ param nameiou_thres value0.45/ param nameimg_size value640/ /node /launch参数image_topic指定图像输入话题这个值必须和相机驱动节点发布的话题一致。weights_path用$(find yolov5_ros)定位包路径比自己写绝对路径可靠得多。conf_thres是置信度阈值数值越低框出越多但误检也会变多iou_thres是NMS的IOU阈值控制重叠框去重力度img_size是推理输入尺寸640是速度和精度的平衡点。这里给一个提醒很多新手拿到包后路径里的包名不一定叫yolov5_ros有时叫yolov5_detect或vision_yolo。launch里的pkg和type要改成实际包名否则roslaunch会报找不到package。以README为准。3.4 节点核心逻辑图像桥接、推理、发布结果下面这段代码是一个典型的YOLOv5 ROS节点核心框架可以直接对照工程源码看。#!/usr/bin/env python3 import rospy import cv2 import torch from sensor_msgs.msg import Image from cv_bridge import CvBridge from std_msgs.msg import Header class YoloNode: def __init__(self): rospy.init_node(yolo_detect_node, anonymousTrue) self.bridge CvBridge() self.image_sub rospy.Subscriber( rospy.get_param(~image_topic, /camera/rgb/image_raw), Image, self.callback ) self.pub rospy.Publisher(/yolo_detection/image, Image, queue_size1) weights rospy.get_param(~weights_path, weights/best.pt) self.model torch.hub.load(ultralytics/yolov5, custom, pathweights, force_reloadFalse) self.model.conf rospy.get_param(~conf_thres, 0.5) self.model.iou rospy.get_param(~iou_thres, 0.45) rospy.loginfo(YOLOv5 node started with weights: %s, weights) def callback(self, msg): # 1. ROS图像转OpenCV BGR图像 frame self.bridge.imgmsg_to_cv2(msg, desired_encodingbgr8) # 2. 转成RGB送入模型YOLOv5模型是在RGB图像上训练的 rgb cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) results self.model(rgb, size640) # 3. 渲染检测框后转回ROS图像消息 rendered results.render()[0] pub_msg self.bridge.cv2_to_imgmsg(rendered, encodingrgb8) pub_msg.header msg.header self.pub.publish(pub_msg) if __name__ __main__: try: node YoloNode() rospy.spin() except rospy.ROSInterruptException: pass这份代码的注释已经覆盖了三个关键转折点cv_bridge转换、RGB通道顺序、ROS消息发布。特别要注意通道顺序。OpenCV默认读入的是BGR而PyTorch模型输入通常是RGB不做转换的话颜色语义就乱了行人还能识别但红绿灯这种依赖颜色特征的目标会明显变差。results.render()[0]返回的是画好框的numpy数组直接转成Image消息发布。如果后续要做跟踪或者决策更专业的做法是解析results.xyxy[0]提取边界框坐标和类别发布成vision_msgs/Detection2DArray不过图像话题足够满足可视化验证需求了。3.5 正式连接相机前先用资源里的测试图做静态回归在把USB摄像头对准真实道路前先用Zidane或Bus图验证权重是否正常。这是成本最低的验证手段。# 在YOLOv5项目目录下执行placeholder替换为实际权重路径 python detect.py --weights weights/best.pt --source zidane.jpg --conf 0.5如果检测结果里至少能看到person说明权重本身没有问题。接着再用tutorial.ipynb里的单元格跑一遍对比输出框的坐标和置信度。这个步骤能排除掉一大半“模型压根没加载成功”的坑让后续ROS联调更可控。4. 避坑行人和红绿灯识别在ROS部署里最容易翻车的六个点4.1 三个环境类翻车点话题接不上、Docker GPU没启用、摄像头映射丢失现象一节点启动后没有任何报错但rqt_image_view里看不到检测结果rostopic list里也没有期待的话题输出。原因订阅的图像话题和相机驱动节点发布的话题不一致。真实相机常是/camera/color/image_raw而资源里默认写成/camera/rgb/image_raw名字差一个单词话题就完全接不上。解决先执行rostopic list | grep image查看实际话题名再用rostopic hz /实际话题名确认帧率。确认无误后修改launch文件里的image_topic参数。我自己的习惯是每次启动前都强制扫一遍话题名绝不凭记忆写。现象二容器里执行nvidia-smi失败PyTorch检测到CUDA但推理时崩溃或回退到CPU。原因Docker容器缺少GPU运行时支持或者宿主机没有安装nvidia-container-toolkit。解决宿主机先执行sudo apt install nvidia-container-toolkit重启Docker运行容器时追加--gpus all参数。如果还是没有GPU可用就老老实实改代码用CPU推理并把img_size降到480或320至少让CPU跑得动。现象三加载usb_cam或运行摄像头节点时提示Failed to open /dev/video0或权限错误。原因容器没映射摄像头设备或者当前用户不在video组里。解决先用ls /dev/video*确认设备是否存在。容器启动时加--device/dev/video0必要的时候把video0和video1成对映射。本地环境则执行sudo usermod -aG video $USER重新登录后生效。这个坑在课程设计演示前出现概率极高建议提前一天验证摄像头通路。4.2 三个模型类翻车点权重与类别错位、小目标漏检、ROS版本混用现象四节点能跑但检测结果里完全找不到traffic light或者类别ID全部混乱。原因自训练权重文件里包含的类别列表是被“烤”进权重的如果权重只有两个类person和traffic_light而代码还在读COCO的80类names就会出现标签错位。解决在Python里加载权重后直接打印model.names这个属性返回的是权重自带的类别列表。如果是自训练权重确认你的类别索引顺序和训练数据一致。如果是预训练COCO权重person的ID是0traffic light的ID是9。这个基础信息能避免后面所有后处理逻辑跑偏。现象五行人检测基本没问题但红绿灯漏检严重尤其小尺寸红绿灯几乎每帧都丢。原因默认输入尺寸640对红绿灯这种十几像素的小目标不太友好。原图分辨率本身低下采样后特征图上的有效信息只剩几个像素点。解决优先把img_size调高到1280效果立竿见影代价是推理帧率降到原来的三分之一。如果对帧率有要求就先对图像上方区域做ROI裁切只让模型检测车头前方的固定区域。资源里的注意力机制报告.md讨论的SE和CBAM注意力模块就是针对这种小目标的改进方向可以作为后续自训练的参考。现象六按照教程安装完ROS用roslaunch启动时提示找不到rospy或者launch文件解析报错。原因安装了ROS2环境没有安装ROS1。ROS2用rclpylaunch格式也从XML变成了Python两者完全不兼容。解决确认系统环境变量echo $ROS_DISTRO。如果输出的是humble或foxy说明当前是ROS2。建议直接用Ubuntu 20.04的Docker镜像跑ROS1 Noetic或者重装ROS1。很多这类资源长期没有升级ROS2版本硬迁移成本不低不如在ROS1环境里先把功能验证完。5. 验证与进阶从固定图回归到频率可控的端到端测试5.1 用固定图片回归给每次修改留后悔药每次修改节点参数或者更换权重都先跑一张资源里自带的测试图记录下检测框的数量、类别和置信度。这个做法的价值在于模型出了问题你能第一时间判断是权重的问题还是ROS链路的问题。两个通道分开排查效率要高得多。具体操作很简单打开tutorial.ipynb按单元格执行把输出结果里的坐标和置信度记下来。以后谁改了代码、换了权重跑完同一张图对一下数值不对就是被改坏了。这在团队项目里尤其重要。5.2 没有摄像头就先用模拟图像源把话题链路跑通很多课程设计里硬件设备是答辩前才借到的。为了不把所有测试压在最后几天可以写一个简单节点循环发布固定图片。#!/usr/bin/env python3 import rospy import cv2 from sensor_msgs.msg import Image from cv_bridge import CvBridge rospy.init_node(image_publisher) pub rospy.Publisher(/camera/rgb/image_raw, Image, queue_size10) bridge CvBridge() img cv2.imread(zidane.jpg) rate rospy.Rate(10) while not rospy.is_shutdown(): msg bridge.cv2_to_imgmsg(img, encodingbgr8) msg.header.stamp rospy.Time.now() pub.publish(msg) rate.sleep()这是我在移植节点时惯用的方法。它能保证输入话题以固定10Hz发布不受摄像头帧率波动影响便于测量检测节点本身的吞吐能力。先用这种模拟源把整个链路跑通再换真实摄像头出问题时就能明确责任在节点还是硬件。5.3 用话题频率衡量部署质量别只看可视化效果节点跑起来后执行rostopic hz /yolo_detection/image观察输出频率。输入10Hz输出稳定在10Hz说明节点性能合格。如果输出只有2Hz说明推理耗时太长图像积压严重。此时优先降低img_size和iou_thres其次检查模型是否误用了FP32而没有开启FP16。我用这个套路调过一个项目当时为了压低误检率把置信度阈值降到0.2结果红绿灯框全乱了几乎每个路灯都在跳框。后来加了两个约束检测框中心位置变化必须连续且置信度低于阈值时直接丢弃。从那以后我每次接到新的YOLOv5 ROS部署包都会强制先走一遍“固定图回归、模拟源链路、话题频率测量”这三个动作养成习惯后很少再被部署问题卡住。希望这套流程对你也有用。本文还有配套的精品资源点击获取

相关推荐

zip伪加密原理与修复实战:标志位、十六进制修改与脚本批量处理
zip伪加密原理与修复实战:标志位、十六进制修改与脚本批量处理

"你好,这个压缩包有密码"——双击一个 zip 却弹出这个提示,给你文件的人又信誓旦旦说没设过密码,这种尴尬我碰上过不止一次。更麻烦的场景是在安全分析时:邮件网关放过了这个"带密码"的附件,等你把… · 2026/9/24 21:20:00

Python孪生神经网络点选识别:少样本相似度匹配实战
Python孪生神经网络点选识别:少样本相似度匹配实战

简介:基于Python孪生神经网络实现的点选识别项目,专门解决点选验证码的自动识别问题,适合希望在深度学习与图像识别领域动手实践的小白或进阶学习者,也可用于毕业设计、课程作业与工程实训。项目在高端显卡上训练100轮&#xff0c… · 2026/9/24 21:20:00

小批量包装如何做出高口碑?五家样本企业的打法与成本控制
小批量包装如何做出高口碑?五家样本企业的打法与成本控制

做了十几年包装印刷,早年间听到最多的一句话是:“你这么点量,连一包矿泉水的外箱都凑不齐,谁会给你开机?”那时候,小批量在供应链里就是个尴尬词,工厂不想接,采购不敢找,… · 2026/9/24 21:20:00

航空触摸屏供应商怎么选?三个梯队与实战选型指南
航空触摸屏供应商怎么选?三个梯队与实战选型指南

先说一个反直觉但挺现实的现象:这几年找我咨询“航空触摸屏供应商怎么选”的,很多并不是做航空电子出身的老航电工程师,反而是做工业自动化、最近接到通航、无人机、航空地面保障设备或者飞行模拟器项目的朋友。大家习惯把“航空触摸屏”当成… · 2026/9/24 21:56:28

大模型学习路线全攻略:从环境配置到微调部署实战
大模型学习路线全攻略:从环境配置到微调部署实战

1. 大模型学习路线到底该怎么走1.1 先搞清楚你学大模型是为了什么很多人一上来就问“大模型怎么学”,这个问题本身就有问题。就像你问“车怎么开”,但没说你是要开家用轿车还是重型卡车,是跑城市道路还是越野山路。学大模型也一样&#xff0c… · 2026/9/24 21:56:21

机器学习驱动的基本面量化选股:从因子工程到多模型回测实战
机器学习驱动的基本面量化选股:从因子工程到多模型回测实战

简介:基于Python的机器学习驱动的基本面量化投资研究项目,面向金融工程、量化投资及机器学习交叉领域的开发者与学生,提供一套完整可运行的源码与配套数据集。项目整合多种机器学习算法,围绕公司财务基本面构建选股与预测模型&… · 2026/9/24 21:56:21

腾讯云部署DeepSeek Harness插件市场dsh-market全攻略
腾讯云部署DeepSeek Harness插件市场dsh-market全攻略

如果你最近在折腾 DeepSeek Harness,那 dsh-market 这个名字你一定不陌生。简单说,DeepSeek Harness 是一个把 DeepSeek 模型能力包装成“可编排、可扩展”的智能体开发框架,而 dsh-market 就是为它准备的插件市场,类似 VS Code 的… · 2026/9/24 21:56:15

Android蓝牙连接兼容旧版本:从权限到扫描连接的完整避坑指南
Android蓝牙连接兼容旧版本:从权限到扫描连接的完整避坑指南

1. 先回答一个分岔问题:你要连的是经典蓝牙还是BLE做Android蓝牙项目前,最怕的不是不会写代码,而是根本没想明白自己连的是什么设备。我最早接到"android蓝牙连接-兼容旧版本"这个需求时,客户给的设备清单里有老式的串口… · 2026/9/24 21:56:01

Python实战:用python-pptx实现PPT自动化生成与批量处理
Python实战:用python-pptx实现PPT自动化生成与批量处理

1. 为什么我想用Python折腾PPT先交代一下背景:我平时的工作里,做汇报PPT属于高频动作。季度总结、项目复盘、方案评审、培训材料……一个月下来怎么也有五六次。一开始我也和大多数人一样,老老实实手动排版、对齐、调字号、加动画&#xff0c… · 2026/9/24 21:56:01

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程
基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为… · 2026/9/24 0:00:13

1D-CNN时间序列建模实战:从Conv1d原理到工业落地
1D-CNN时间序列建模实战:从Conv1d原理到工业落地

简介:面向时间序列数据建模的一维卷积神经网络完整实现,适合深度学习入门者及需要快速验证时序模型的研究者,能够从音频、文本、传感器或股价等序列中挖掘局部特征与时间依赖。压缩包体积很小,只有3KB,内含3个Python脚… · 2026/9/24 0:00:26

柔软的L:汉语语流中被忽视的舌肌张力控制
柔软的L:汉语语流中被忽视的舌肌张力控制

1. 这个“L”不是字母表里的L,而是舌尖上的L最近在几个方言群和语音教学社群里,反复看到有人发一句:“也说字母L:柔软的长舌”。初看以为是英语发音课笔记,点开才发现全是方言爱好者、播音系学生、语言康复师甚至戏曲演… · 2026/9/24 0:00:44

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码