1. 项目缘起为什么要在树莓派上跑YOLOv5几年前当我第一次尝试把目标检测模型塞进树莓派时那感觉就像试图让一辆家用轿车去拉重型卡车。模型要么慢得像幻灯片要么直接因为内存不足而崩溃。但今天情况已经大不相同。随着YOLOv5这类兼顾精度与速度的模型出现以及树莓派硬件性能的持续提升尤其是树莓派4B/5的算力在边缘设备上实现实时目标检测不再是天方夜谭。这个项目的核心价值就是将一个前沿的AI视觉能力从云端或高性能服务器“拉”到我们手边这个巴掌大小、功耗仅几瓦的设备上。想象一下你可以用它做一个能识别宠物的智能喂食器、一个能统计人流的小型监控终端或者一个能自动识别零件的工业质检原型机而所有这些都不需要依赖网络数据完全本地处理响应速度极快隐私性也得到保障。“树莓派部署YOLOv5”这个标题背后其实是一系列非常具体的技术挑战和工程选择如何在资源受限的ARM架构上搭建合适的Python环境如何为树莓派优化过的OpenCV如何选择并转换适合边缘部署的YOLOv5模型格式以及如何编写高效的前后处理代码来真正“跑起来”并看到结果接下来我将结合我多次在树莓派3B、4B和5上折腾YOLOv5的经验把这套流程掰开揉碎了讲清楚目标是让你看完就能动手避开我踩过的所有坑。2. 战前准备硬件、系统与基础环境搭建工欲善其事必先利其器。在开始写代码之前我们需要一个稳定且高效的基础环境。这一步的扎实程度直接决定了后续所有步骤的顺利与否。2.1 硬件选择与系统烧录首先看硬件。树莓派3B是底线它的CPU和内存1GB运行YOLOv5非常吃力只能跑最轻量的模型如YOLOv5n且帧率可能只有1-2 FPS更适合学习原理。树莓派4B4GB或8GB内存版本是目前性价比最高的选择其四核Cortex-A72处理器和更强的GPU为运行稍大一点的模型如YOLOv5s提供了可能。如果你追求极致性能且预算充足树莓派5绝对是新宠其CPU和GPU性能有显著提升运行YOLOv5s的帧率可以轻松突破10 FPS体验流畅很多。系统方面Raspberry Pi OS原Raspbian是官方推荐且兼容性最好的选择。我强烈建议使用64位版本Raspberry Pi OS 64-bit因为PyTorch等深度学习框架对64位ARMaarch64的支持越来越完善能更好地利用内存和指令集。使用Raspberry Pi Imager工具烧录系统时记得在设置中预先开启SSH、配置Wi-Fi和地区设置这样烧录好的SD卡插入树莓派就能直接无头启动无需连接显示器键盘通过SSH远程操作方便得多。系统首次启动后有几件必做的事更新系统源树莓派默认的软件源在国外速度很慢。务必更换为国内镜像源如清华源或中科大源。这能让你后续安装软件的速度提升数十倍。# 备份原文件 sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak sudo cp /etc/apt/sources.list.d/raspi.list /etc/apt/sources.list.d/raspi.list.bak # 使用sed命令替换以清华源为例请根据你选择的源修改 sudo sed -i s|raspbian.raspberrypi.org|mirrors.tuna.tsinghua.edu.cn/raspbian|g /etc/apt/sources.list sudo sed -i s|archive.raspberrypi.org|mirrors.tuna.tsinghua.edu.cn/raspberrypi|g /etc/apt/sources.list.d/raspi.list执行系统更新换源后立即更新软件列表并升级现有包。sudo apt update sudo apt full-upgrade -y sudo reboot扩展文件系统使用sudo raspi-config工具选择Advanced Options-Expand Filesystem确保SD卡的所有空间都被利用。2.2 Python环境与关键依赖安装树莓派系统通常预装了Python 3.9或更高版本这已经足够。我们不建议使用系统自带的Python环境直接安装各种包容易引起冲突。最佳实践是使用venv创建一个独立的虚拟环境。# 安装虚拟环境工具如果未安装 sudo apt install -y python3-venv python3-pip # 创建一个名为‘yolov5’的虚拟环境 python3 -m venv yolov5_env # 激活虚拟环境 source yolov5_env/bin/activate激活后命令行提示符前会出现(yolov5_env)字样。接下来安装最关键的依赖之一OpenCV。在树莓派上从源码编译OpenCV是一个耗时数小时的痛苦过程。幸运的是我们有预编译的轮子wheel可以安装。这里需要安装OpenCV-Python的headless版本不包含GUI相关功能更轻量适合服务器/无头模式。# 安装必要的系统库 sudo apt install -y libatlas-base-dev libhdf5-dev libhdf5-serial-dev libjasper-dev libqtgui4 libqt4-test # 使用国内镜像安装OpenCV pip install opencv-python-headless -i https://pypi.tuna.tsinghua.edu.cn/simple注意如果安装过程中遇到与libjasper-dev相关的错误可以尝试先安装libjpeg-dev和libpng-dev或者直接不安装libjasper-dev它用于JPEG2000格式支持非必需。其他基础依赖也一并安装pip install numpy pandas matplotlib seaborn pyyaml tqdm -i https://pypi.tuna.tsinghua.edu.cn/simple3. YOLOv5的部署从源码到模型环境准备好后我们就可以把YOLOv5请进来了。这里有两个关键动作获取源码和准备模型。3.1 获取与配置YOLOv5源码YOLOv5的官方仓库在GitHub上更新活跃。我们直接克隆下来。git clone https://github.com/ultralytics/yolov5.git cd yolov5克隆完成后强烈建议切换到某个稳定的发布版本标签而不是使用最新的master分支因为master可能包含未经验证的最新改动容易引入不兼容问题。# 查看所有标签 git tag # 切换到某个稳定版本例如 v7.0 git checkout v7.0接下来安装YOLOv5项目所需的Python包。项目根目录下的requirements.txt文件列出了所有依赖。同样使用国内镜像加速。pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple这里有个大坑requirements.txt里默认的torch和torchvision是x86架构的版本在ARM架构的树莓派上无法安装。我们需要为ARM64手动安装PyTorch。3.2 为ARM64安装PyTorch这是整个部署过程中最具挑战性的一步。PyTorch官方为Linux/ARM提供了一些预编译版本但可能不是最新版。我们需要从PyTorch官网找到适合aarch64的版本。访问 PyTorch官网 选择如下配置PyTorch Build: Stable (1.13.1)Your OS: LinuxPackage: PipLanguage: PythonCompute Platform: CPU。然后它会给出安装命令但通常链接指向的仍是x86版本。一个更可靠的方法是直接下载为树莓派64位系统预编译的wheel文件。社区有维护者提供了编译好的版本。你可以搜索“piwheels torch”来寻找或者使用以下命令尝试安装版本号可能需要调整# 这是一个示例具体URL可能随时间变化请以piwheels或PyTorch论坛信息为准 pip install torch torchvision --extra-index-url https://download.pytorch.org/whl/cpu如果上述方法失败最稳妥但最慢的方式是从源码编译PyTorch但这可能需要数小时甚至更长时间且对树莓派的内存至少2GB和散热是巨大考验。我的经验是对于树莓派4B/5可以尝试安装较旧的、有预编译aarch64 wheel的版本例如torch1.10.0配合torchvision0.11.1。有时在piwheels.org一个为树莓派预编译Python包的仓库上能找到合适的版本。确保你的pip已配置为使用piwheels作为额外索引# 在 /etc/pip.conf 或用户家目录的 .pip/pip.conf 中添加 [global] extra-index-urlhttps://www.piwheels.org/simple然后尝试安装pip install torch1.10.0 torchvision0.11.0安装完成后务必验证python -c import torch; print(torch.__version__); print(torch.zeros(1).device)应该能正确输出版本号并且显示设备为cpu树莓派通常只使用CPU进行推理。3.3 模型选择与下载YOLOv5提供了从n(nano)到x(extra large)一系列不同大小的预训练模型在精度和速度之间权衡。模型参数量 (M)推理速度 (CPU)适用场景YOLOv5n~1.9最快树莓派3B对速度要求极高精度要求低YOLOv5s~7.2快树莓派4B/5首选较好的速度与精度平衡YOLOv5m~21.2中等树莓派5可尝试精度更高速度下降明显YOLOv5l/x~46.5/86.7慢不推荐在树莓派上使用速度无法接受对于树莓派部署YOLOv5s是最实用的起点。YOLOv5的源码自带自动下载预训练模型的功能。在项目根目录下运行Python脚本即可python -c from models.common import *; from utils.downloads import *; attempt_download(yolov5s.pt)或者你可以直接从YOLOv5的GitHub Release页面手动下载yolov5s.pt文件放到项目根目录下。4. 推理实战编写你的第一个检测脚本模型就位是时候让它“看见”并“说出”结果了。我们将编写一个简单的Python脚本完成从读取图像、推理到绘制结果的全过程。4.1 基础推理脚本解析在YOLOv5项目根目录下创建一个名为detect_pi.py的文件import torch import cv2 import numpy as np from pathlib import Path import time # 导入YOLOv5的工具函数 from models.experimental import attempt_load from utils.general import non_max_suppression, scale_boxes from utils.plots import colors, plot_one_box from utils.torch_utils import select_device class YOLOv5Detector: def __init__(self, weights_pathyolov5s.pt, devicecpu): 初始化检测器 :param weights_path: 模型权重文件路径 :param device: 运行设备cpu 或 cuda树莓派只能是cpu self.device select_device(device) # 加载模型 self.model attempt_load(weights_path, deviceself.device) self.model.eval() # 设置为评估模式 # 获取模型的一些属性 self.stride int(self.model.stride.max()) self.names self.model.module.names if hasattr(self.model, module) else self.model.names print(f模型加载成功类别: {self.names}) def preprocess(self, img0): 预处理图像使其符合模型输入要求 :param img0: 原始BGR图像 (numpy array, H, W, C) :return: 预处理后的tensor # 模型期望的输入尺寸通常是640x640 img_size 640 # 保持长宽比进行resize h, w img0.shape[:2] r min(img_size / h, img_size / w) new_h, new_w int(h * r), int(w * r) img_resized cv2.resize(img0, (new_w, new_h), interpolationcv2.INTER_LINEAR) # 创建画布并填充到img_size canvas np.full((img_size, img_size, 3), 114, dtypenp.uint8) canvas[:new_h, :new_w, :] img_resized # 转换通道顺序: HWC to CHW, BGR to RGB img canvas.transpose(2, 0, 1) img img[::-1, :, :] # BGR to RGB img np.ascontiguousarray(img) # 转换为tensor并归一化 img torch.from_numpy(img).to(self.device) img img.float() / 255.0 # 归一化到 0-1 if img.ndimension() 3: img img.unsqueeze(0) # 增加batch维度 return img, (h, w), (new_h, new_w) def detect(self, img0, conf_thres0.25, iou_thres0.45): 执行目标检测 :param img0: 原始BGR图像 :param conf_thres: 置信度阈值 :param iou_thres: 非极大值抑制的IOU阈值 :return: 绘制了检测框的图像检测结果列表 # 1. 预处理 img, (orig_h, orig_w), (new_h, new_w) self.preprocess(img0) # 2. 推理 with torch.no_grad(): pred self.model(img)[0] # 3. 后处理非极大值抑制 pred non_max_suppression(pred, conf_thres, iou_thres) detections [] img_result img0.copy() # 4. 处理检测结果 for det in pred: if len(det): # 将检测框坐标从预处理后的尺寸映射回原始图像尺寸 det[:, :4] scale_boxes(img.shape[2:], det[:, :4], (orig_h, orig_w)).round() for *xyxy, conf, cls in det: label f{self.names[int(cls)]} {conf:.2f} # 在图像上绘制框和标签 plot_one_box(xyxy, img_result, labellabel, colorcolors(int(cls), True), line_thickness2) detections.append({ bbox: [int(coord) for coord in xyxy], class: self.names[int(cls)], confidence: float(conf) }) return img_result, detections if __name__ __main__: # 初始化检测器 detector YOLOv5Detector(weights_pathyolov5s.pt, devicecpu) # 测试1: 读取本地图片 img_path data/images/bus.jpg # YOLOv5仓库自带示例图片 if Path(img_path).exists(): img0 cv2.imread(img_path) if img0 is not None: start time.time() result_img, dets detector.detect(img0) end time.time() print(f检测耗时: {(end-start)*1000:.2f} ms) print(f检测到 {len(dets)} 个目标: {dets}) # 保存结果 cv2.imwrite(result_bus.jpg, result_img) print(结果已保存至 result_bus.jpg) else: print(f无法读取图片: {img_path}) else: print(f示例图片不存在请准备一张测试图片。) # 测试2: 使用摄像头可选需要连接USB摄像头或树莓派官方摄像头模块 # 这部分代码将在下一节详细展开。这个脚本定义了一个YOLOv5Detector类封装了加载模型、预处理、推理和后处理的完整流程。preprocess函数是关键它负责将任意尺寸的输入图像转换为模型要求的640x640正方形输入同时保持原始比例通过填充灰边。detect函数则串联了整个流程。4.2 连接摄像头进行实时检测静态图片检测只是开始实时视频流才是边缘AI的舞台。树莓派支持官方Camera Module或普通的USB摄像头。这里以更通用的USB摄像头为例。首先确保摄像头已连接并被系统识别# 安装v4l-utils工具 sudo apt install -y v4l-utils # 查看视频设备 v4l2-ctl --list-devices通常USB摄像头设备文件是/dev/video0。修改或创建detect_camera.py脚本import cv2 import time from detect_pi import YOLOv5Detector # 导入我们刚才写的检测器 def main(): # 初始化检测器 print(正在加载YOLOv5模型...) detector YOLOv5Detector(weights_pathyolov5s.pt, devicecpu) print(模型加载完毕。) # 打开摄像头 # 参数0通常代表系统默认摄像头也可能是/dev/video0 cap cv2.VideoCapture(0) # 可以设置分辨率降低分辨率可以提升帧率 cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640) cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480) if not cap.isOpened(): print(无法打开摄像头) return print(开始实时检测按 q 键退出。) fps_counter 0 fps 0 start_time time.time() while True: ret, frame cap.read() if not ret: print(获取帧失败。) break # 执行检测 det_start time.time() result_frame, detections detector.detect(frame) det_end time.time() # 计算并显示FPS fps_counter 1 if fps_counter 30: # 每30帧计算一次平均FPS fps fps_counter / (time.time() - start_time) fps_counter 0 start_time time.time() cv2.putText(result_frame, fFPS: {fps:.1f}, (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2) cv2.putText(result_frame, fLatency: {(det_end-det_start)*1000:.0f}ms, (10, 60), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 255), 2) # 显示结果 cv2.imshow(YOLOv5 on Raspberry Pi, result_frame) # 按q退出 if cv2.waitKey(1) 0xFF ord(q): break # 释放资源 cap.release() cv2.destroyAllWindows() print(程序结束。) if __name__ __main__: main()运行这个脚本你应该能看到一个显示摄像头画面的窗口上面有实时绘制的检测框和FPS信息。在树莓派4B上运行YOLOv5s处理640x480分辨率的图像帧率大概在2-5 FPS之间。这是纯CPU推理的典型性能。5. 性能优化与实战调优看到实时画面只是第一步让它在你的具体项目里“可用”甚至“好用”还需要一系列的优化和调整。5.1 模型轻量化与转换YOLOv5的PyTorch模型.pt在推理时包含了许多用于训练和验证的额外逻辑。我们可以通过torch.jit.trace或torch.jit.script将其转换为TorchScript格式.torchscript.pt这通常会移除一些冗余操作并可能带来轻微的推理速度提升同时模型也更便于移植。# 在detect_pi.py的类中添加或单独运行 def export_torchscript(self, save_pathyolov5s.torchscript.pt): 将模型导出为TorchScript格式 # 创建一个示例输入 example_input torch.randn(1, 3, 640, 640).to(self.device) # 跟踪模型 traced_script_module torch.jit.trace(self.model, example_input) traced_script_module.save(save_path) print(f模型已导出为TorchScript: {save_path}) return traced_script_module更进一步的优化是使用ONNX Runtime。ONNX是一种开放的模型格式ONNX Runtime是针对不同硬件优化的推理引擎。将PyTorch模型转为ONNX再用ONNX Runtime在树莓派上推理有时能获得比原生PyTorch更好的性能尤其是利用了一些特定算子的优化。# 安装ONNX和ONNX Runtime pip install onnx onnxruntime -i https://pypi.tuna.tsinghua.edu.cn/simple然后使用YOLOv5自带的导出脚本python export.py --weights yolov5s.pt --include onnx --img 640 --batch 1这会在当前目录生成yolov5s.onnx文件。你可以编写一个使用onnxruntime进行推理的类来替换PyTorch部分。但请注意在树莓派的ARM CPU上ONNX Runtime的性能优势可能并不明显有时甚至不如优化良好的PyTorch这需要实际测试对比。5.2 推理参数调优在detect函数中有两个关键参数直接影响速度和结果conf_thres置信度阈值默认0.25。提高它如0.5可以过滤掉更多低置信度的预测框减少后处理的计算量并让结果更干净但可能会漏检一些模糊目标。在树莓派上适当提高此值如0.4是提升速度的有效手段。iou_thresNMS的IOU阈值默认0.45。它控制重叠框的合并程度。降低此值如0.3会合并更多重叠框可能让检测框更少速度稍快但过低的值可能导致本应分开的两个紧挨物体被错误合并。一个实用的调优策略是先在PC上使用验证集确定一个能接受精度损失的conf_thres和iou_thres下限然后在树莓派上使用这个更严格的参数组合来提速。5.3 输入分辨率与帧率权衡模型输入尺寸固定为640x640但我们的摄像头采集的原始分辨率是可以调整的。cv2.VideoCapture的set方法可以设置采集分辨率。降低采集分辨率是提升帧率最直接有效的方法因为预处理中的resize操作计算量会减少。cap.set(cv2.CAP_PROP_FRAME_WIDTH, 320) # 设置为320x240或更低 cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 240)代价是图像细节丢失小目标检测能力下降。你需要根据你的应用场景是检测远处的人脸还是近处的零件来权衡。另一种思路是跳帧处理。如果应用场景对实时性要求不是绝对的30FPS可以每2帧或3帧处理一帧。frame_count 0 skip_frames 2 # 每3帧处理1帧 while True: ret, frame cap.read() frame_count 1 if frame_count % (skip_frames 1) ! 0: continue # 跳过这一帧 # ... 处理这一帧 ...5.4 使用多线程进行流水线优化一个常见的性能瓶颈是摄像头采集I/O、图像预处理CPU、模型推理CPU、后处理与显示I/O都在一个线程中顺序执行。我们可以使用Python的threading或queue模块将采集和推理放到不同的线程中形成流水线。import threading import queue import time class CameraBuffer: def __init__(self, camera_id0, buffer_size2): self.cap cv2.VideoCapture(camera_id) self.buffer queue.Queue(maxsizebuffer_size) self.running True self.thread threading.Thread(targetself._capture, daemonTrue) self.thread.start() def _capture(self): while self.running: ret, frame self.cap.read() if ret: if self.buffer.full(): try: self.buffer.get_nowait() # 丢弃最旧的一帧 except queue.Empty: pass self.buffer.put(frame) time.sleep(0.001) # 避免空转 def read(self): try: return self.buffer.get(timeout1.0) except queue.Empty: return None def release(self): self.running False self.thread.join() self.cap.release() # 在主循环中使用CameraBuffer来获取帧然后在另一个线程或主线程中进行检测。这样当模型在处理上一帧时摄像头已经在采集下一帧了可以有效减少因等待I/O造成的空闲时间提升整体吞吐量。对于树莓派由于CPU核心有限通常是四核复杂的多线程可能带来额外的上下文切换开销简单的双线程采集处理通常能带来最佳收益。6. 进阶之路模型训练与自定义部署使用预训练模型能检测80类COCO数据集中的物体人、车、动物等。但你的项目很可能需要检测特定的物体比如某种昆虫、某个品牌的logo、或者生产线上的一种缺陷。这就需要训练你自己的YOLOv5模型。6.1 准备自定义数据集模型训练的第一步是数据。你需要收集包含目标物体的图片并用标注工具如LabelImg、CVAT、Roboflow进行标注生成YOLO格式的标签文件每张图片对应一个.txt文件内容为class_id x_center y_center width height坐标是归一化后的值。数据集目录结构应如下custom_dataset/ ├── images/ │ ├── train/ │ │ ├── image1.jpg │ │ └── ... │ └── val/ │ ├── image100.jpg │ └── ... └── labels/ ├── train/ │ ├── image1.txt │ └── ... └── val/ ├── image100.txt └── ...然后创建一个数据集配置文件custom_data.yaml# 数据集路径相对于yolov5根目录 path: ../custom_dataset # 训练集和验证集路径 train: images/train val: images/val # 类别数 nc: 2 # 例如检测猫和狗就是2类 # 类别名称列表 names: [cat, dog]6.2 在云端或高性能设备上训练由于树莓派算力有限训练模型必须在更强大的机器上进行如带GPU的PC、云服务器。在准备好数据和配置文件后在YOLOv5目录下运行python train.py --img 640 --batch 16 --epochs 50 --data custom_data.yaml --weights yolov5s.pt--img 640: 输入图像尺寸。--batch 16: 批大小根据你的GPU内存调整。--epochs 50: 训练轮数。--data: 指向你的数据集配置文件。--weights: 使用预训练的yolov5s.pt权重进行迁移学习这比从零开始训练快得多效果也好。训练完成后最佳模型会保存在runs/train/exp/weights/best.pt。6.3 将自定义模型部署回树莓派将训练好的best.pt文件拷贝到树莓派上替换之前脚本中的yolov5s.pt路径即可。同时你需要更新代码中的类别名称列表self.names使其与你的自定义类别对应。如果你的自定义类别数很少例如只有1-3类你甚至可以尝试使用更小的模型架构如YOLOv5n进行训练和部署以获得更快的推理速度。6.4 针对树莓派的模型剪枝与量化高级这是更深层次的优化旨在减少模型大小和计算量。剪枝移除模型中冗余的权重或通道。YOLOv5官方并未直接提供剪枝工具但可以使用一些第三方库如torch.nn.utils.prune进行尝试。注意剪枝后通常需要微调fine-tune以恢复精度。量化将模型权重和激活从浮点数FP32转换为低精度整数如INT8。这能显著减少模型体积和内存占用并可能利用CPU的整数指令加速。PyTorch提供了动态量化和静态量化工具。对于树莓派可以尝试使用torch.quantization.quantize_dynamic进行动态量化仅量化权重import torch.quantization # 加载模型 model attempt_load(yolov5s.pt, devicecpu) model.eval() # 动态量化指定要量化的层如线性层和卷积层 quantized_model torch.quantization.quantize_dynamic( model, {torch.nn.Linear, torch.nn.Conv2d}, dtypetorch.qint8 ) # 保存量化模型 torch.save(quantized_model.state_dict(), yolov5s_quantized.pth)量化后的模型在推理时需要使用量化的算子。性能提升效果因模型和硬件而异需要仔细评估精度损失。7. 避坑指南与经验总结回顾整个部署过程有几个地方最容易让人卡住这里集中总结一下PyTorch安装失败这是最大的拦路虎。务必确认Python是64位系统是64位。优先寻找为aarch64或linux_armv7l预编译的wheel文件。使用piwheels镜像源是很好的尝试。如果都不行考虑使用更轻量级的推理引擎替代完整的PyTorch例如ONNX Runtime或TensorFlow Lite需要先将YOLOv5模型转换到对应格式。内存不足OOM树莓派内存有限。如果遇到Killed或Segmentation fault很可能是内存耗尽。解决方法使用更小的模型YOLOv5n降低推理时的输入图像尺寸在preprocess函数中修改img_size如改为320确保没有其他内存大户进程在运行考虑为树莓派增加交换空间swap。# 创建2GB的交换文件 sudo fallocate -l 2G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile # 永久生效编辑 /etc/fstab添加一行/swapfile none swap sw 0 0摄像头无法打开或帧率极低检查摄像头权限ls -l /dev/video*确保当前用户有读写权限。尝试使用libcamera驱动适用于树莓派官方摄像头模块V3。对于USB摄像头在cv2.VideoCapture中尝试不同的后端如cv2.CAP_V4L2。cap cv2.VideoCapture(0, cv2.CAP_V4L2)推理速度慢除了前面提到的降低分辨率、跳帧、调整阈值、使用TorchScript等方法还可以尝试禁用OpenCV的GUI显示cv2.imshow非常耗资源可以远程SSH运行时不显示使用sudo raspi-config超频树莓派CPU有风险需做好散热确保树莓派电源足额5V/3A性能模式已开启echo performance | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor。检测框漂移或不准确首先检查你的自定义数据集标注是否准确。对于预训练模型它在COCO数据集上训练对于非常见或特定角度的物体可能效果不佳。考虑使用更多样化的数据微调模型。另外检查预处理和后处理中的坐标缩放逻辑是否正确确保scale_boxes函数使用的尺寸参数是对的。将YOLOv5部署到树莓派是一个典型的边缘AI应用落地过程。它不仅仅是运行一段代码更涉及到硬件选型、系统配置、环境搭建、模型优化、性能调优等一系列工程问题。这个过程可能会充满挑战但当你看到自己亲手搭建的系统在小小的树莓派上实时识别出周围的世界时那种成就感是无与伦比的。希望这篇详细的指南能帮你扫清障碍顺利踏上边缘智能开发的实践之路。记住最好的学习就是动手去做然后迭代优化。