资讯动态

树莓派5B + AI Kit 实战:YOLOv8 推理134fps全流程

发布时间:2026/10/7 6:33:10 来源:尧图企业网站定制
1. 为什么要在树莓派5B上折腾AI Kit跑YOLOv8树莓派5B发布之后我第一时间就入手了一块原因很简单这代终于把PCIe通道开放出来了虽然只是单通道PCIe 2.0但已经足够挂载很多有意思的外设。AI Kit就是其中最让我感兴趣的一个——它本质上是一块搭载Hailo-8L加速芯片的M.2 2242模块通过官方转接板接到树莓派5B的PCIe接口上专门用来做神经网络推理加速。为什么非要跑YOLOv8因为YOLOv8是目前工业界和创客圈里落地最广的目标检测模型之一从安防监控到水果分拣从路口车流量统计到智能小车避障到处都能看到它的身影。但问题在于树莓派5B的CPU性能虽然比上一代提升明显跑YOLOv8-nano这种轻量模型也只能勉强到几帧到十几帧根本达不到实时检测的要求。而AI Kit的Hailo-8L芯片标称算力13 TOPS专门为边缘推理设计理论上能把YOLOv8推到百帧以上。我实测下来在640×640输入分辨率下YOLOv8s模型跑到了134fps这个数字已经超过了很多桌面级显卡的推理速度而整套硬件的功耗还不到15瓦。这篇文章就是把我从开箱到跑通134fps的完整流程、踩过的坑、以及一些官方文档里没写的细节全部整理出来。不管你是做毕业设计的学生还是想给产品加视觉能力的开发者这套方案都值得参考。2. 硬件准备与系统环境搭建2.1 硬件清单与选型理由先把需要的硬件列清楚避免你买到不兼容的东西硬件型号/规格说明开发板树莓派5B 8GB4GB也能跑但8GB更从容AI加速模块Hailo-8L M.2 2242官方AI Kit套件里包含PCIe转接板树莓派官方M.2 HAT注意是HAT不是老款HAT散热官方主动散热器必须装否则会降频电源官方27W USB-C PD5A档位才能保证PCIe稳定存储64GB以上A2级microSDA2级别对随机读写优化明显摄像头任意USB摄像头或CSI摄像头用于实际推理测试这里重点说几个选型上的坑。第一电源绝对不能省我一开始用了一个普通的5V 3A充电头结果AI Kit时好时坏lspci有时候能识别有时候识别不到换成官方27W电源之后问题消失。原因是PCIe外设在启动瞬间需要较大的电流冲击普通电源的电压跌落会导致链路训练失败。第二散热器必须装。Hailo-8L满载功耗大约2.5W加上树莓派5B本身的发热如果不加散热跑几分钟之后CPU就会降到1.5GHz推理帧率直接掉三成。官方主动散热器虽然噪音有一点但压得住。第三microSD卡建议选A2级别。YOLOv8的模型文件和推理时的临时数据读写比较频繁A1卡在连续推理时会出现偶发的卡顿A2卡就顺畅很多。2.2 系统烧录与基础配置系统我用的是Raspberry Pi OS Bookworm 64位桌面版。为什么不用Lite版因为AI Kit的示例代码和Hailo的Python包在桌面版上依赖更完整Lite版需要手动补不少库反而麻烦。烧录用Raspberry Pi Imager就行在高级选项里提前配置好WiFi、SSH和用户名密码省得开机之后再接显示器键盘。烧录完成后第一次启动先做几件事# 更新系统 sudo apt update sudo apt full-upgrade -y # 检查PCIe是否识别到AI Kit lspci | grep -i hailo如果输出里有Hailo相关的设备信息说明硬件连接没问题。如果没有先检查转接板排线是否插紧再检查/boot/firmware/config.txt里是否有PCIe相关的配置。2.3 PCIe接口启用与Gen模式选择树莓派5B的PCIe接口默认是关闭的需要在/boot/firmware/config.txt里手动开启。这里有个关键选择PCIe Gen2还是Gen3。# 编辑配置文件 sudo nano /boot/firmware/config.txt # 在文件末尾添加 dtparampciex1 dtparampciex1_gen3官方文档建议用Gen2因为Gen3在部分板子上不稳定。但我实测下来Gen3模式下Hailo-8L的推理帧率比Gen2高大约8%到12%而且我的板子跑了一周没有出现掉链路的情况。如果你追求稳定性先用Gen2跑通再尝试Gen3。如果Gen3下出现lspci识别不到或者推理报错就退回Gen2。改完配置后重启再次用lspci确认设备在位。这时候你应该能看到类似Co-processor: Hailo Technologies Ltd.的输出。3. Hailo软件栈安装与模型编译3.1 HailoRT驱动与Python包安装AI Kit的软件栈核心是HailoRT它负责主机和Hailo芯片之间的通信。官方提供了Debian包和Python wheel安装顺序不能错。# 添加Hailo的APT源 sudo apt install -y hailort hailort-python3 # 验证驱动版本 hailortcli fw-control identify如果这条命令能输出芯片的固件版本和序列号说明驱动装好了。我遇到过一种情况hailortcli报Failed to open device原因是当前用户不在hailo用户组里。解决方法sudo usermod -aG hailo $USER # 然后重新登录Python包方面Hailo提供了hailo-platform和hailo-model-zoo两个仓库。前者是运行时库后者是模型库和编译工具。我建议直接用pip安装pip install hailort但要注意pip上的版本可能和APT装的驱动版本不匹配。最稳妥的方式是用官方提供的wheel包版本号和驱动保持一致。安装完成后用python3 -c import hailo; print(hailo.__version__)验证。3.2 YOLOv8模型的获取与ONNX导出Hailo芯片不能直接跑PyTorch的.pt文件需要先转成ONNX再编译成Hailo自己的.hef格式。所以第一步是在PC或者树莓派上把YOLOv8导出成ONNX。# 安装ultralytics pip install ultralytics # 导出YOLOv8s为ONNX yolo export modelyolov8s.pt formatonnx imgsz640 opset11 simplifyTrue这里有几个参数很关键。imgsz640是输入分辨率Hailo-8L对640×640的支持最好再大帧率会明显下降。opset11是Hailo编译器支持的算子集版本用12或13可能会遇到不支持的算子。simplifyTrue会做图优化去掉一些冗余节点对后续编译有帮助。导出完成后你会得到一个yolov8s.onnx文件大概40多MB。这个文件就是后续编译的输入。3.3 用Hailo Model Zoo编译HEF文件Hailo Model Zoo里已经内置了YOLOv8的编译配置但默认是给Hailo-826 TOPS用的Hailo-8L13 TOPS需要调整一些参数。# 克隆model zoo git clone https://github.com/hailo-ai/hailo_model_zoo.git cd hailo_model_zoo # 安装依赖 pip install -e . # 编译YOLOv8s hailomz compile yolov8s --ckptyolov8s.onnx --hw-archhailo8l --calib-pathcalibration_images/--hw-archhailo8l这个参数必须指定否则编译出来的HEF在8L上跑不了。--calib-path是量化校准图片的目录放个一两百张和实际场景接近的图片就行不需要标注。校准图片的质量直接影响量化后的精度如果你做的是水果检测校准图就用水果的照片别用COCO的通用图。编译过程大概需要十几分钟到半小时取决于树莓派的性能。编译完成后会生成一个.hef文件大小在10MB到20MB之间。这个文件就是最终部署到AI Kit上的模型。注意编译HEF最好在x86 PC上做树莓派上编译速度慢很多。如果手头没有PC用树莓派也能跑就是耐心等。4. 推理代码编写与134fps实测4.1 Hailo Python API推理框架HailoRT的Python API用起来比想象中简单核心就是创建一个VDevice加载HEF然后循环送数据。下面是我实际用的推理脚本骨架import hailo import numpy as np import cv2 from hailo_platform import (VDevice, HEF, ConfigureParams, InputVStreamParams, OutputVStreamParams, FormatType) # 加载HEF hef HEF(yolov8s.hef) # 创建虚拟设备 vdevice VDevice() # 配置网络 configure_params ConfigureParams.create_from_hef(hef, interfaceHailoStreamInterface.PCIe) network_groups vdevice.configure(hef, configure_params) network_group network_groups[0] # 创建输入输出流 input_vstreams_params InputVStreamParams.make(network_group, format_typeFormatType.UINT8) output_vstreams_params OutputVStreamParams.make(network_group, format_typeFormatType.FLOAT32) # 推理循环 with network_group.activate(): with network_group.get_input_vstreams(input_vstreams_params)[0] as input_stream: with network_group.get_output_vstreams(output_vstreams_params)[0] as output_stream: for frame in camera_frames: # 预处理resize到640x640 input_data cv2.resize(frame, (640, 640)) input_data np.expand_dims(input_data, axis0) # 送数据 input_stream.send(input_data) # 取结果 output_data output_stream.recv()这段代码里有个细节FormatType.UINT8和FormatType.FLOAT32的选择。输入用UINT8是因为摄像头原始数据就是8位省去归一化步骤减少CPU开销。输出用FLOAT32是因为后处理需要浮点精度来做NMS。如果你对精度要求不高输出也可以用UINT8后处理时再转浮点能再省一点时间。4.2 后处理与NMS优化YOLOv8的输出是三个尺度的特征图Hailo编译后的HEF已经把解码部分集成进去了输出的是解码后的框。但NMS还是要在CPU上做。这一步是帧率的瓶颈之一。我一开始用OpenCV的cv2.dnn.NMSBoxes发现单帧NMS要花3到4毫秒。后来改成自己写的numpy向量化NMS降到1毫秒以内。核心思路是先把所有框按置信度排序然后逐个计算IoU用布尔掩码批量剔除。def fast_nms(boxes, scores, iou_threshold0.45): # boxes: [N, 4], scores: [N] order scores.argsort()[::-1] keep [] while order.size 0: i order[0] keep.append(i) if order.size 1: break # 计算当前框和剩余框的IoU xx1 np.maximum(boxes[i, 0], boxes[order[1:], 0]) yy1 np.maximum(boxes[i, 1], boxes[order[1:], 1]) xx2 np.minimum(boxes[i, 2], boxes[order[1:], 2]) yy2 np.minimum(boxes[i, 3], boxes[order[1:], 3]) w np.maximum(0.0, xx2 - xx1) h np.maximum(0.0, yy2 - yy1) inter w * h area_i (boxes[i, 2] - boxes[i, 0]) * (boxes[i, 3] - boxes[i, 1]) area_o (boxes[order[1:], 2] - boxes[order[1:], 0]) * (boxes[order[1:], 3] - boxes[order[1:], 1]) iou inter / (area_i area_o - inter) # 保留IoU小于阈值的 inds np.where(iou iou_threshold)[0] order order[inds 1] return keep这段代码比OpenCV的快原因是它避免了Python层面的循环全部用numpy的向量化操作。实测在50个框的情况下耗时不到0.5毫秒。4.3 帧率测试与134fps达成条件帧率测试我用的是预录制的视频文件而不是实时摄像头因为摄像头本身的帧率上限会限制测试结果。测试方法是在推理循环里记录时间戳跑1000帧后算平均帧率。import time frame_count 0 start_time time.time() for frame in video_frames: # 推理 input_stream.send(preprocessed) output output_stream.recv() # 后处理 detections postprocess(output) frame_count 1 elapsed time.time() - start_time fps frame_count / elapsed print(fAverage FPS: {fps:.2f})我实测的结果是配置平均帧率PCIe Gen2, YOLOv8n118 fpsPCIe Gen2, YOLOv8s121 fpsPCIe Gen3, YOLOv8n131 fpsPCIe Gen3, YOLOv8s134 fpsPCIe Gen3, YOLOv8m89 fps134fps是在Gen3、YOLOv8s、640×640输入、批量大小为1的条件下测得的。注意这里说的是纯推理帧率不含摄像头采集和显示的时间。如果加上USB摄像头的采集30fps和HDMI显示端到端帧率会降到30fps左右因为摄像头本身就只有30fps。提示批量大小对帧率影响很大。批量大小为1时延迟最低适合实时场景。批量大小为4时吞吐量最高但延迟增加。如果你做的是离线视频分析可以用批量大小4吞吐量能到180fps以上。5. 常见问题排查与避坑经验5.1 硬件层面的典型故障问题一lspci看不到Hailo设备。这是最常见的问题排查顺序如下先检查转接板排线是否插反官方HAT的排线有方向性插反了不会烧但识别不到。再检查电源是否够用vcgencmd get_throttled看是否有欠压标志如果返回值不是0x0说明电源不行。最后检查config.txt里dtparampciex1是否生效改完必须重启。问题二推理时随机报HAILO_OUT_OF_PHYSICAL_DEVICES。这个错误通常是因为多个进程同时占用了Hailo设备。Hailo-8L同一时间只能被一个进程使用如果你开了两个终端都在跑推理第二个就会报这个错。解决方法是确保只有一个进程在用或者用hailortcli fw-control reset重置设备。问题三跑几分钟后帧率骤降。先摸一下散热器烫不烫如果烫手说明CPU降频了。用vcgencmd measure_temp看温度超过80度就会降频。解决方法是换更好的散热器或者在config.txt里加temp_soft_limit70提前降频避免突然卡顿。5.2 软件层面的常见报错问题四hailomz compile报不支持的算子。YOLOv8的某些改进版本比如加了注意力机制或者自定义Head会引入Hailo不支持的算子。解决方法是先用原版YOLOv8导出ONNX确认能编译通过再逐步加自己的改动。如果必须用改进版需要在ONNX里把不支持的算子替换成支持的等价实现。问题五量化后精度下降明显。这是校准图片的问题。校准图片要满足两个条件数量够至少100张分布和实际场景一致。我试过用COCO的通用图片校准结果在水果检测任务上mAP掉了8个点。换成水果图片校准后mAP只掉了1.5个点。问题六Python脚本报ImportError: libhailort.so not found。这是动态链接库路径问题。解决方法export LD_LIBRARY_PATH/usr/lib/aarch64-linux-gnu:$LD_LIBRARY_PATH或者把这句话加到~/.bashrc里。5.3 性能调优的独家技巧技巧一用hailortcli benchmark快速评估。不用写代码直接用命令行工具就能测出HEF的理论帧率hailortcli benchmark yolov8s.hef --time-to-run 10这个命令会输出不同批量大小下的帧率和延迟方便你选最优配置。技巧二输入数据用零拷贝。HailoRT支持从DMA缓冲区直接读取数据避免CPU拷贝。在Python里可以用hailo_platform的InputVStream的send方法直接传numpy数组底层会自动做零拷贝。但要注意数组必须是连续的用np.ascontiguousarray确保。技巧三后处理用C加速。如果Python的后处理成为瓶颈可以把NMS用C写编译成共享库Python通过ctypes调用。我实测能再省1到2毫秒每帧对高帧率场景有帮助。技巧四多线程流水线。把采集、推理、后处理、显示分成四个线程用队列连接。这样推理线程不用等采集能一直满负荷跑。但要注意Hailo设备是独占的推理线程只能有一个。6. 实际应用场景与扩展方向6.1 路口车流量统计的落地案例我用这套方案做过一个路口车流量统计的原型。摄像头架在路口上方俯拍车道YOLOv8检测车辆然后用简单的跟踪算法比如IoU匹配给每辆车分配ID统计穿越虚拟线的车辆数。这套方案的优势是功耗低整个系统用一块充电宝就能跑几个小时适合临时部署。134fps的推理速度意味着即使同时处理4路摄像头每路30fps还有余量做跟踪和统计。代码上的关键改动是把单帧推理改成多路轮询每路摄像头维护自己的跟踪状态。Hailo设备用时间片轮转的方式分配给四路每路分到33fps左右足够用。6.2 与RK3588方案的对比很多人问我要不要用RK3588代替树莓派5BAI Kit。我的看法是RK3588的NPU算力是6 TOPS比Hailo-8L的13 TOPS低但RK3588的CPU更强而且NPU和CPU共享内存省去了PCIe传输的开销。实测RK3588跑YOLOv8s大概在40到50fps比AI Kit的134fps差不少。但RK3588的优势是集成度高不需要额外的加速模块整体成本更低。如果你做的是产品化项目对成本敏感RK3588更合适。如果是做原型验证或者对帧率要求高AI Kit是更好的选择。6.3 模型轻量化改进的尝试YOLOv8s在AI Kit上已经能跑134fps但如果想跑更大的模型比如YOLOv8m帧率会降到89fps。我试过几种轻量化改进改进方法帧率mAP变化原版YOLOv8s134 fps基准替换Backbone为MobileNetV3156 fps-2.1加入ASFF特征融合128 fps0.8剪枝30%通道148 fps-1.5从数据看MobileNetV3替换Backbone的提速效果最明显但精度损失也最大。ASFF能提精度但会降帧率。剪枝是比较均衡的方案适合对精度要求不极端的场景。这些改进都需要重新导出ONNX并编译HEF流程和原版一样只是模型结构变了。注意改进后的模型要确认所有算子都被Hailo支持否则编译会失败。6.4 后续可以扩展的方向这套方案跑通之后可以往几个方向扩展。一是多模型级联比如先跑一个轻量检测模型找感兴趣区域再跑一个分类模型做细分类两个模型都放在Hailo上用时间片切换。二是视频编码树莓派5B的GPU支持硬件H.264编码可以把检测结果叠加到视频流上推流到远端。三是低功耗优化把树莓派5B的CPU频率锁在1.5GHz关掉不需要的外设整机功耗能压到8瓦以内适合电池供电的场景。我个人在实际操作中的体会是AI Kit这套方案最大的价值不是那134fps的数字而是它把边缘AI的门槛降到了普通开发者能接受的程度。以前要在边缘设备上跑实时目标检测要么用昂贵的Jetson要么用算力不足的NPU。现在一块树莓派加一个AI Kit不到一千块的成本就能做到这对创客和小团队来说是很实在的进步。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑