# YOLO板端部署目标检测 ***Copyright © Quectel Wireless Solutions Co., Ltd. 2026. All rights reserved.*** --- # YOLO 是什么 **YOLO**(You Only Look Once,只看一眼)是一种基于深度卷积神经网络(CNN)的 **实时目标检测算法**,2016 年由 Joseph Redmon 等人提出,开创了"单阶段(one-stage)"目标检测的先河。 传统目标检测算法(如 R-CNN 系列)分两步:先"找候选区域",再"对每个区域分类",速度慢。而 YOLO 的核心思想是:把整张图片一次性送入网络,在 **一次前向推理** 中同时输出: - 图像中每个目标的 **类别**(如 person、bus、car…) - 每个目标的 **边框位置**(bounding box) - 每个目标属于该类别的 **置信度**(confidence) # 准备工作 ## 硬件 - **Quectel PI M2** 开发板(RK3576,板载 6 TOPS NPU) - USB 数据线连接 PC(ADB 调试) ## 板载资源(无需额外下载) M2 板 Debian 系统已预置以下资源,开箱即用: | **资源** | **路径** | | --- | --- | | NPU 推理运行时 | /usr/lib/librknnrt.so(v2.3.2) | | YOLOv5 检测程序 | /usr/bin/rknn_yolov5_demo | | YOLOv5s 模型(COCO 80 类) | /usr/share/model/yolov5/RK3576/yolov5s-640-640.rknn | | 类别标签文件 | /usr/share/model/yolov5/model/coco_80_labels_list.txt | | 测试图片 | /usr/share/model/yolov5/model/bus.jpg | ## 连接开发板 ```bash adb devices # 确认设备已连接(显示 device 状态) ``` # 单张图片检测(一步一步来) ## 第 1 步:准备测试图片 板载已有一张 COCO 标准测试图 `bus.jpg`(公交车+行人场景): ```bash adb shell "ls /usr/share/model/yolov5/model/bus.jpg" ``` ## 第 2 步:执行检测 ```bash # 进入模型目录(demo 需要在此目录找到 model/coco_80_labels_list.txt) adb shell "cd /usr/share/model/yolov5 && rknn_yolov5_demo \ /usr/share/model/yolov5/RK3576/yolov5s-640-640.rknn \ model/bus.jpg resize /tmp/bus_detected.jpg" ``` 参数说明: | **参数** | **说明** | | --- | --- | | 第 1 个 | RKNN 模型路径 | | 第 2 个 | 输入图片路径 | | 第 3 个 | 缩放方式:`resize`(拉伸)或 `letterbox`(等比留边) | | 第 4 个 | 输出图片路径 | ## 第 3 步:查看结果 ```bash adb shell "ls -la /tmp/bus_detected.jpg" # 确认检测结果文件生成 adb pull /tmp/bus_detected.jpg ./ # 拉回 PC 查看 ``` ## 运行输出 ```plaintext post process config: box_conf_threshold = 0.25, nms_threshold = 0.45 sdk version: 2.3.2 (429f97ae6b@2025-04-09T09:09:27) driver version: 0.9.8 model input height=640, width=640, channel=3 Read model/bus.jpg ... once run use 24.300000 ms person @ (209 243 286 510) 0.879723 person @ (479 238 560 526) 0.870588 person @ (109 237 232 534) 0.828112 bus @ (93 129 553 464) 0.700761 person @ (79 353 122 517) 0.307297 save detect result to /tmp/bus_detected.jpg loop count = 10 , average run 19.313700 ms ``` 可以看到:**识别出 4 个 person 和 1 个 bus**,单帧推理约 **19ms**(约 50 FPS)。 ## 检测效果 测试原图: ```{image} images/image_KP5ybcVc5oimuhxDBbuceMq9n5d.webp :width: 640px :height: 640px ``` NPU 检测结果(蓝框标注目标位置与类别): ```{image} images/image_Vz4rbxL88oNpHLxw0eccJ7QAnJe.webp :width: 640px :height: 640px ``` # 检测自己的图片 ```bash # 1. 把图片推送到板子 adb push my_photo.jpg /tmp/ # 2. 执行检测(注意要在模型目录运行) adb shell "cd /usr/share/model/yolov5 && rknn_yolov5_demo \ /usr/share/model/yolov5/RK3576/yolov5s-640-640.rknn \ /tmp/my_photo.jpg resize /tmp/my_photo_detected.jpg" # 3. 拉回结果查看 adb pull /tmp/my_photo_detected.jpg ./ ``` > 提示:若图片不是 640x640,demo 会自动缩放;`resize` 会拉伸变形,`letterbox` 保持宽高比(推荐)。 # 视频检测 视频检测流程:**视频抽帧 → 每帧 NPU 推理 → 合成带检测框的视频**。 ## 环境准备(宿主机) ```bash # PC 端需要 ffmpeg 做抽帧与合成 sudo apt install ffmpeg ``` ## 操作步骤 ```bash # 1. 推送视频到板子 adb push video.mp4 /tmp/input.mp4 # 2. 板端抽帧(用 MPP 硬解,速度极快) adb shell "mkdir -p /tmp/frames && cd /tmp/frames && \ gst-launch-1.0 filesrc location=/tmp/input.mp4 ! qtdemux ! h264parse ! \ mppvideodec ! videoconvert ! video/x-raw,format=RGB ! \ jpegenc ! multifilesink location=frame_%06d.jpg" # 3. 板端逐帧 NPU 检测 # 对每帧执行 rknn_yolov5_demo,生成带框帧(可写脚本循环) # 4. 拉回带框帧,宿主机合成视频(25fps) cat frame_*.jpg | ffmpeg -f image2pipe -framerate 25 -i - -c:v libx264 \ -pix_fmt yuv420p det_video.mp4 ``` > 完整的一键脚本可参考 SDK 内 `external/quectel-app/rknn-detect/` 目录(deploy.sh / batch_detect.sh)。 ## 检测效果视频 板端实时检测演示视频(YOLOv5s NPU 检测 + 屏幕播放):