☰
树莓派5跑YOLOv5:工业视觉检测部署实战全记录
2026/10/1 1:04:16 网站建设 项目流程

做工业视觉这些年,我一直是 x86 平台的忠实用户。工控机、迷你主机、二手工作站,都试了个遍,直到前阵子接了一个车间改造的小项目,才真正把树莓派 5 塞进了生产现场。

先说背景:客户那边需要给一台热压机加装一个物料到位检测装置,要求低成本、本地推理、不依赖云端。我看了一眼现场环境,再瞄了一眼预算单,决定试试树莓派 5 跑 YOLOv5。说实话,刚拿到手的时候信心满满,心想这好歹是 8GB 内存的四核 A76,跑个轻量级检测模型还不是洒洒水。结果真进了车间,从刷系统到稳定运行,前后卡了六件事,每一件都让我记忆深刻。

这篇就聊聊我在实际部署过程中踩过的坑和最终的解决办法,给想在小钢炮上跑 YOLOv5 的朋友一些参考。

1. 树莓派 5 的选购与装机准备

1.1 版本选择和散热方案的权衡

树莓派 5 的 CPU 性能确实比 4B 强了一大截,主频最高能到 2.4GHz,而且是四核 A76 架构,IPC 提升明显。但性能上来了,发热问题也一并跟着来了。

我之前在 4B 上用的是那种小铝鳍片加风扇的方案,跑个分类任务倒还压得住。但到了 5 代,这招不灵了。用官方系统跑个压力测试,不到五分钟温度就直接顶到 85 度,频率咔咔往下掉,推理速度也跟着掉了一半还多。

注意:树莓派 5 最大的散热坑在于 SoC 封装位置和 4B 不一样,传统的树莓派 4B 散热片(尤其那种居中设计的)装上以后贴合度很差,导热效果大打折扣。

我最终换成了带热管的大面积散热器,风扇转速调到 60% 恒定运行,温度稳定在 55 度上下。如果你打算长期在车间环境跑推理,散热这块千万别省钱。

1.2 电源适配器的隐藏标准

树莓派 5 改用 PCIe 接口供电(当然,实际是通过 USB-C 口输入),官方要求 5V/5A 的电源。我之前偷懒,直接用了手头 4B 的 5V/3A 电源,结果开机就提示欠压,系统频繁降频,SSD 偶尔还会掉盘。

这里解释一下为什么 5A 这么重要:树莓派 5 在高负载下,峰值电流能飙到 4A 以上,如果电源余量不足,电压跌落导致欠压保护,后果就是外设随机失灵。SSD、摄像头、继电器模块全部跟着遭殃。

经验之谈:给树莓派 5 配电源时,别只看标称电流,尽量选线损小的线材,USB-C 线越短越好,我用的是 0.5 米的短线,比 1 米的稳定不少。

2. 系统安装:从 Ubuntu 到树莓派 OS 的选择

2.1 安装 Ubuntu 的诱惑与陷阱

很多人一上来就想着给树莓派 5 装 Ubuntu,我一开始也是这个思路。毕竟网上关于 Ubuntu 的教程多,遇到问题好搜,而且心理上觉得 Ubuntu “更专业”。

实际装的是 Ubuntu Server 24.04,装完以后发现几个问题:

  • 树莓派 5 的 PCIe SSD 支持在 Ubuntu 下需要额外配置 bootloader,否则启动引导会从 SD 卡找。
  • GPU 驱动(V3D)的 OpenGL 支持不如树莓派 OS 成熟,某些依赖 OpenGL 的视觉库会出现渲染异常。
  • 硬件编解码器(HEVC 解码)的驱动在 Ubuntu 下不如官方系统完善,虽然我们用不到视频流解码,但这表明整体适配度有差距。

我折腾了一个下午以后,果断换回树莓派 OS(Bookworm,64位)。事实证明,在树莓派上跑视觉应用,官方系统的底层支持更稳妥。

2.2 系统烧录时的网络配置技巧

烧录系统时有个容易被忽略的细节:树莓派 OS 镜像工具可以在烧录前就预设 WiFi 和 SSH 配置,这比开机以后再去接显示器配置方便多了。

但如果你的车间现场没有 WiFi,只有网线口,那就要注意:树莓派 5 的板载网口是千兆的,插上网线以后默认走 DHCP。如果你现场的交换机没有 DHCP 服务,就需要在cmdline.txt里手动配置静态 IP,否则系统起不来,你也不知道它到底跑没跑起来。

我当时用的是最土的办法:先在家里的路由器下把系统配好,把静态 IP 写死在/etc/dhcpcd.conf,然后拿到车间插网线直接就能 SSH 进去。这个步骤花费不到五分钟,但给我省了后续两天的麻烦。

3. 构建 Python 环境的宝藏与天坑

3.1 Python 版本和虚拟环境的兼容性问题

树莓派 OS 2024 年后的版本默认 Python 是 3.11(Bookworm 带的是 3.9 和 3.11 并存),这对跑 YOLOv5 来说是个好消息,因为 YOLOv5 官方要求 Python 3.8+。

但天坑在于 Bookworm 系统默认启用了externally-managed-environment机制,直接pip install会被系统拦截,报一个“externally-managed-environment”的错误。很多新手这步就卡住了。

我的解决方案是直接建虚拟环境:

python3 -m venv yolov5_env source yolov5_env/bin/activate pip install --upgrade pip

然后所有依赖全装在虚拟环境里面,日后哪怕系统 Python 环境被搞崩了,也不影响项目的正常运行。

3.2 换源问题:别全盘照抄 PyPI 源

国内部署 Python 环境,换 PyPI 源是常规操作。但 YOLOv5 的requirements.txt里有几个包(比如torch、torchvision)在 PyPI 镜像源下的版本,是专门为 ARM 架构编译的 wheel 包。

如果你用阿里云的 PyPI 源,需要确认是否支持linux_aarch64平台的 torch wheel。实测下来,清华源对 ARM 的 torch 支持比较好,可以直接下载预编译版本,不需要现场编译。

pip install torch torchvision --index-url https://download.pytorch.org/whl/cpu

重要:PyTorch 官方对树莓派 5 的 CPU 推理支持非常完善,--index-url直接指向官方 CPU 版 wheel 仓库即可。千万别用默认源,否则会触发在树莓派上编译 PyTorch 的绝望流程,编译几个小时以后报错,你是真的会想砸东西。

4. 部署 YOLOv5:从 PC 到 ARM 的模型迁移

4.1 模型导出和精度损失

我的办公电脑上训练好的 YOLOv5s 模型,.pt格式,直接搬到树莓派上跑,理论上没问题。但实际运行推理的时候,发现检测框有少量偏移,精度明显下降。

排查了半天,发现原因是训练时用的是 GPU 版本的 PyTorch(CUDNN backends),模型在推理时启用了半精度(FP16)。而树莓派是 CPU 推理,ARM 平台上某些算子对 FP16 的支持不好,导致计算精度变化。

解决办法很简单:导出模型时强制使用 FP32,并且用torch.jit的 traced 模型进行部署。

model.model[-1].export = True model.eval() dummy_input = torch.zeros(1, 3, 640, 640) traced_model = torch.jit.trace(model, dummy_input) traced_model.save("best_fp32.pt")

这样转换出来的模型在树莓派上跑,精度和 GPU 推理基本对齐。

4.2 模型剪枝和尺寸优化

YOLOv5s 的参数量大概在 7.2M,权重文件 14MB 左右。看起来不大,但推理延迟在树莓派 5 上仍然偏高——实测 640x640 输入,单帧推理时间在 1.8 秒到 2.1 秒之间。

如果是静态场景检测,比如我这个工位物料到位检测,2 秒一帧也能用。但如果场景需要更实时,就要考虑轻量化模型,比如 YOLOv5n,参数量只有 1.9M,推理速度能提到 0.8 秒左右。

我最终选的是折中方案:保留 YOLOv5s,但把输入尺寸从 640 降到 416。检测精度依旧满足需求,推理速度提升到 1.2 秒一帧。

4.3 使用 NCNN 前传框架

如果觉得 YOLOv5 原生 PyTorch 部署在树莓派上太慢,可以考虑用 NCNN 进行推理加速。

NCNN 是腾讯开源的神经网络前向计算框架,专门针对移动端和嵌入式平台做了优化,对 ARM 平台的支持相当到位。我的尝试结果是:同样一个模型,NCNN 的推理速度比 PyTorch 原生快 2 倍左右(取决于量化程度)。

NCNN 部署的难点在于模型转换,需要先.pt→.onnx→.param/.bin,中间偶发算子不支持的问题,但好在 YOLOv5 的算子相对简单,转换起来比较顺利。

5. 摄像头接入与数据流

5.1 USB 摄像头还是 CSI 摄像头?我的建议

车间环境复杂,一开始我直接用了一个普通的 USB 摄像头,以为插上就能用。事实上也确实能用,但有几个问题:

  • USB 摄像头在树莓派 5 上默认走 UVC 协议,CPU 占用偏高。
  • 帧率不稳定,尤其在高分辨率模式下,偶尔掉帧。
  • 车间里有电焊机等大功率设备,USB 线容易受电磁干扰,画面出现水波纹。

后来换了 CSI 接口的树莓派官方摄像头模块(Camera Module 3),情况改善很多:

  • CSI 接口走专用数据通道,不占 USB 控制器带宽。
  • 树莓派 OS 对 CSI 摄像头的底层支持非常完善,画质和帧率都更稳定。
  • 支持自动对焦,调试方便很多。

5.2 图像采集参数设置

无论用哪种摄像头,都需要在代码里设定合理的采集参数。这里给出一个参考配置:

import cv2 cap = cv2.VideoCapture(0, cv2.CAP_V4L2) cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1280) cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 720) cap.set(cv2.CAP_PROP_FPS, 20) cap.set(cv2.CAP_PROP_BUFFERSIZE, 1) # 其他参数 cap.set(cv2.CAP_PROP_BRIGHTNESS, 128) cap.set(cv2.CAP_PROP_CONTRAST, 128) cap.set(cv2.CAP_PROP_SATURATION, 128) cap.set(cv2.CAP_PROP_GAIN, 0)

注意BUFFERSIZE设置为 1,这很关键。默认的缓冲区会积压好几帧,导致你取到的图像是几百毫秒前的,对于实时检测任务来说就是灾难。

6. 图像预处理与推理流水线的打磨

6.1 图像格式转换的性能瓶颈

YOLOv5 要求输入是 RGB 格式、归一化到 0~1 区间的 Tensor。但 OpenCV 默认读出来是 BGR,且取值范围是 0~255。如果直接对每一帧都做这些转换,会白白消耗 CPU 算力。

我的做法是提前把 YOLOv5 的预处理步骤集成到推理代码里,用torchvision.transforms处理。减少图像数据在 Python 层和底层之间的拷贝次数。

更极致一点:直接用cap.read()读出的 numpy 数组,转换为 torch tensor 后直接推理,避免cv2.cvtColor和np.transpose的额外开销。

img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) img = img.astype(np.float32) / 255.0 img = np.transpose(img, (2, 0, 1)) img_tensor = torch.from_numpy(img).unsqueeze(0)

这段代码放在循环外面做一次,推理循环里只做 Tensor 和模型的交互,性能提升还是很明显的。

6.2 推理结果后处理和 IO 控制

推理完成以后,拿到的是检测框坐标、置信度和类别 ID。在车间场景里,除了在画面上画框,还需要把检测结果转成 IO 信号,比如当检测到“物料到位”时,输出一个高电平给 PLC 或者继电器。

我用的方案是树莓派的 GPIO 控制。

import RPi.GPIO as GPIO GPIO.setmode(GPIO.BCM) GPIO.setup(17, GPIO.OUT) # 物料到位信号 # 在推理循环内 if detections: GPIO.output(17, GPIO.HIGH) else: GPIO.output(17, GPIO.LOW)

细节是:GPIO 输出电平变化不能太快。如果一帧检测有物料、下一帧没有,PLC 那边会接到一个抖动的信号。我的处理方式是加一个保持计数——连续三帧检测到才输出高电平,连续三帧没检测到才拉低。这个简单的防抖逻辑,在现场实际运行中非常有效。

7. 长时间运行的稳定性和鲁棒性

7.1 看门狗与自动重启

车间设备要求 7x24 小时不间断运行,树莓派虽然皮实,但遇到电压波动或者系统死锁,还是需要自动恢复机制。

我给树莓派加了一个硬件看门狗(基于树莓派 GPIO 实现的看门狗脚本),用 systemd 服务监控推理进程和网络状态。如果进程崩溃或者网络失联超过指定秒数,就自动重启树莓派或者至少重启 Python 服务。

sudo apt install watchdog sudo systemctl enable watchdog

在/etc/watchdog.conf里配置监控的服务名称和 GPIO 引脚,实测下来基本能保证系统“跑不死”。

7.2 日志记录和远程监控

现场调试的一大痛点是不能随时过去看屏幕。我加了一个简单的主循环日志系统:

  • 推理日志写到/var/log/yolo_detect.log
  • 用logging模块的RotatingFileHandler做日志轮转,避免日志文件无限膨胀。
  • 如果检测到连续 30 帧都没有任何识别结果,往日志里写入告警级信息,方便远程排查是画面模糊、摄像头掉线还是模型失效。

再配合 SSH 远程登录,大部分问题都能在办公室就解决。

8. 现场部署和维护的几个补充建议

8.1 供电和接地

车间里电焊机、大电机、变频器全开的时候,电网质量非常恶劣。我之前在实验室跑得好好的 PCIe SSD,到了车间连续两次出现文件系统损坏,后来排查发现是供电瞬时跌落导致的掉盘。

解决方案:

  • 树莓派 5 的电源接线,不要从普通插座取电,改成从工业开关电源(明纬等)单独拉一路直流供电。
  • 给电源加个 EMI 滤波器。
  • 在树莓派的 USB-C 口前,加一个防反接和过压保护的电路模块。

这一套加完,供电环节再没出过问题。

8.2 散热和防尘

车间环境粉尘普遍比较重。树莓派 5 的风扇用了不到一个月,叶片上就糊了一层灰,风量明显下降。

建议:

  • 风扇进风口加一层过滤棉,或者直接用防尘网把整个板子罩住。
  • 每两周做一次清灰。
  • 如果条件允许,把树莓派装进带散热孔的金属接线盒里,既防尘又防电磁干扰。

9. 最终调参和效果对比

最后给一张我在现场实测的数据表,环境温度 28 度,树莓派 5 8GB,CSI 摄像头,YOLOv5s,输入 416x416:

项目实测数据
单帧预处理耗时35ms 到 45ms
单帧推理耗时700ms 到 1100ms
单帧后处理耗时2ms 到 5ms
整帧流水线耗时约 1.2 秒
CPU 平均占用80% 到 90%
核心温度55 度到 62 度
检测精度(mAP@0.5)0.89(相比 GPU 端下降 2%)

说实话,这个性能不算亮眼,但足够满足车间物料检测的节拍需求。

有一次我在现场看到检测模块连续稳定跑了三天三夜没出岔子,次品率下降了 0.7 个百分点。那一刻还是有点感慨——树莓派 5 这个小板子,加一块 CSI 摄像头,加一套 YOLOv5,再配上工业供电和防护外壳,硬是顶进了一线车间,还得天天跟电焊火花和粉尘打交道。

如果非要让我给后来者一个总结性的建议,我会说:树莓派 5 的性能上限决定了它做不了复杂的工业视觉,但在轻量化检测场景里,只要把散热、供电、模型优化这三件基本功做扎实,它完全能当一台合格的小型边缘计算盒子用。至于后来我又入手的 AI 套件(Hailo-8L),推理性能又上了一个台阶,那就是另一个故事了。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询