一、开发板与系统环境
1.1 硬件平台
- 开发板:100ASK DShanPI R1(RK3568)
- CPU:四核 Cortex-A55 @ 2.0GHz
- NPU:1 TOPS INT8
- 内存:2GB LPDDR4(关键瓶颈)
- 存储:15GB eMMC
- 系统:Armbian 25.11 Minimal(无桌面版,Debian trixie)
- 内核:6.1.115-vendor-rk35xx(含 Rockchip 厂商驱动)
1.2 系统选择建议
- 无桌面版 vs 带桌面版:无桌面版内存占用约 115MB,带桌面版约 300MB+。2GB 内存必须用无桌面版。
- 镜像 :推荐
Armbian_community_25.11.0-trunk.413_Dshanpi-r1_trixie_vendor_6.1.115_minimal.img.xz - 首次启动配置:设置 root 密码 → 创建普通用户 → 时区选 Asia/Shanghai → 网络配置(插网线最稳)
1.3 网络与 SSH
- 有线 :
end0/end1,插网线自动 DHCP - WiFi:MT7601U 免驱网卡,但 Linux 下需内核驱动 + NetworkManager
- SSH :安装
openssh-server,用 MobaXterm 或 VS Code Remote-SSH 连接 - 远程开发:VS Code + Remote-SSH + 通义灵码(可选)
1.4 NPU 启用
-
内核已包含
rknpu.ko,但设备树默认未启用 -
需加载 overlay:
bashwget https://raw.githubusercontent.com/radxa-pkg/radxa-overlays/main/arch/arm64/boot/dts/rockchip/overlays/rk3568-npu-enable.dts sudo armbian-add-overlay rk3568-npu-enable.dts sudo reboot -
验证:
ls /dev/rknpu*、dmesg | grep -i rknpu
二、OpenCV 图像基础
2.1 图像本质
- OpenCV 图片 = numpy 数组 ,形状
(高, 宽, 通道数),类型uint8 - BGR 顺序(非 RGB),历史原因
- 像素访问:
img[y, x](y 行,x 列) - 颜色通道:
img[y, x, 0]=B,[1]=G,[2]=R
2.2 核心函数
| 函数 | 作用 | 注意 |
|---|---|---|
cv2.imread(path) |
读图 | 失败返回 None,必须检查 |
cv2.imwrite(path, img) |
保存 | 按扩展名编码 |
cv2.rectangle(img, (x1,y1), (x2,y2), color, thickness) |
画矩形 | thickness=-1 填充 |
cv2.circle(img, (cx,cy), r, color, thickness) |
画圆 | |
cv2.putText(img, text, (x,y), font, scale, color, thickness) |
写文字 | (x,y) 是左下角 |
cv2.getTextSize(text, font, scale, thickness) |
获取文字尺寸 | 返回 ((宽,高), 基线) |
cv2.cvtColor(img, code) |
颜色转换 | COLOR_BGR2RGB、COLOR_BGR2GRAY |
cv2.resize(img, (w,h)) |
缩放 | 注意 (宽,高) 顺序 |
cv2.copyMakeBorder() |
填充边框 | 用于 Letterbox |
2.3 Letterbox(YOLO 标准预处理)
- 等比例缩放 + 填充灰边到 640×640
- 保持宽高比,避免变形
- 核心逻辑:计算缩放比
r = min(640/h, 640/w),缩放后计算上下左右填充量
2.4 滤波与边缘检测
- 均值滤波 :
cv2.blur(img, (5,5)) - 高斯滤波 :
cv2.GaussianBlur(img, (5,5), 0) - 中值滤波 :
cv2.medianBlur(img, 5) - Canny 边缘检测 :
cv2.Canny(blurred, 50, 150)→ 黑白线条图 - Sobel 算子 :
cv2.Sobel(gray, cv2.CV_64F, 1, 0, ksize=3)→ 灰度浮雕图 - Canny vs Sobel:Canny 是成品(细线、抗噪),Sobel 是原料(粗糙、含噪)。CNN 卷积核自动学习类似 Canny 的特征。
三、YOLO 目标检测原理
3.1 YOLO 模型版本
| 版本 | 特点 | 适用 |
|---|---|---|
| YOLOv8n | 社区资料最丰富,部署成熟 | 学习入门 |
| YOLO26n | 边缘优先,无 NMS,CPU 提速 43% | 目标模型 |
| YOLOv11n | 精度更高,参数更少 | 进阶 |
| YOLOv12 | 注意力机制 | 边缘部署挑战大 |
| RF-DETR | 精度最高(60 mAP) | 云端/服务器 |
- n 后缀 = Nano,最小最快,适合嵌入式
3.2 模型输入输出
- 输入 :
blob,形状(1, 3, 640, 640),RGB,值 0~1 - 预处理 :
cv2.dnn.blobFromImage(img, 1/255.0, (640,640), (0,0,0), swapRB=True, crop=False) - 输出 :
(1, 84, 8400)→ 1 批次,84 个数字/框,8400 个候选框- 84 = 4 坐标 + 80 类别概率
- 8400 = 模型预测的所有位置
3.3 后处理
- 转置 :
outputs[0].T→(8400, 84) - 遍历 :每行取
scores = row[4:],class_id = np.argmax(scores),confidence = scores[class_id] - 过滤 :
if confidence > 0.25(可调) - 坐标映射:模型坐标 ÷640 × 原图尺寸
- NMS :
cv2.dnn.NMSBoxes(boxes, confidences, 0.25, 0.4)去重叠框 - 画框 :
cv2.rectangle+cv2.putText
3.4 类别名
- COCO 数据集 80 类,
class_names列表必须与训练时一致 - 模型只输出编号,文字靠代码查表
四、视频流处理
4.1 读取视频
python
cap = cv2.VideoCapture('video.mp4') # 或 0 表示摄像头
while True:
ret, frame = cap.read()
if not ret: break
# 处理 frame
cap.release()
4.2 写入视频
python
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
out = cv2.VideoWriter('output.mp4', fourcc, fps, (w, h))
out.write(frame)
out.release()
4.3 完整 YOLO 视频推理流程
- 加载 ONNX 模型:
net = cv2.dnn.readNetFromONNX('yolov8n.onnx') - 逐帧读取
- 对每帧:
blobFromImage→net.forward()→ 后处理 → 画框 - 写入输出视频
- CPU 性能:1~3 FPS(2GB RK3568)
- 优化:降分辨率、降阈值、跳帧
五、NPU 与边缘 AI
5.1 概念
- NPU:神经网络处理器,专为矩阵/卷积加速
- TOPS:每秒万亿次操作,RK3568 = 1 TOPS INT8
- INT8 量化:将 FP32 权重转为 8 位整数,模型缩小 4 倍,速度提升,精度略降
- 边缘 AI:本地推理,低延迟、隐私好、离线可用
- 云端 AI:依赖网络,按量付费,适合大规模训练
5.2 RKNN 部署流程
- PC 端 (Ubuntu x86_64):
- 安装
rknn-toolkit2 - 将 ONNX 转 RKNN:
python convert.py --model yolov8n.onnx --platform rk3568 --dtype i8 - 需要校准数据集(100~200 张)
- 安装
- 板端 :
- 安装
librknnrt.so、rknn_toolkit_lite2 - 加载
.rknn模型:rknn = RKNNLite(); rknn.load_rknn('model.rknn'); rknn.init_runtime() - 推理:
outputs = rknn.inference(inputs=[blob])
- 安装
- 性能:YOLOv8n 可达 20~30 FPS,YOLOv8s 约 13 FPS
5.3 成本对比
| 项目 | 云端 AI | 边缘 AI |
|---|---|---|
| 硬件 | 租用 GPU | 一次性开发板 |
| 网络 | 上传下载收费 | 几乎为零 |
| 延迟 | 高 | 低 |
| 隐私 | 数据出云 | 本地处理 |
| 适合 | 低频、大算力 | 高频、实时、隐私 |
六、模型选择与开发路线
6.1 学习路线
- YOLOv8n ONNX + OpenCV CPU:跑通全流程,理解预处理/后处理/画框
- YOLO26n RKNN INT8 + NPU:掌握量化、转换、NPU 调用,实现实时检测
6.2 为什么先学 YOLOv8n?
- 社区资料最多,问题容易解决
- 后处理(NMS)逻辑清晰,适合理解
- 为 YOLO26n 的无 NMS 打基础
6.3 YOLO26n 优势
- 无 NMS,延迟稳定
- CPU 推理提速 43%
- 小目标召回优化
- 官方支持 RKNN 导出
七、面试常见问题
7.1 基础概念
- YOLO 为什么快? 单阶段检测,将检测转为回归问题。
- NMS 是什么? 非极大值抑制,去除重叠框,保留最优。
- INT8 量化原理? 用 scale 和 zero_point 将浮点映射到 8 位整数。
- TOPS 含义? 每秒万亿次操作,峰值算力,实际受内存带宽、算子支持影响。
- 边缘 AI vs 云端 AI? 边缘本地推理,低延迟、隐私好;云端算力强,适合训练。
- OpenCV 是模型吗? 不是,是图像处理库,可加载模型推理。
- 传统视觉 vs 深度学习? 传统手工特征(Canny、Sobel),深度学习自动学习特征(CNN)。
7.2 项目相关
- 描述 RK3568 上 YOLOv8n 部署流程。
- 如何提升推理速度?→ 量化、NPU、降分辨率、跳帧、NMS 优化。
- 2GB 内存限制下如何优化?→ 无桌面、headless OpenCV、INT8、降低输入尺寸。
- 摄像头 USB vs CSI 区别?→ USB 即插即用但 CPU 占用高;CSI 低延迟、低 CPU,需配置设备树。
7.3 代码细节
blobFromImage参数含义。(1, 84, 8400)如何解析。- Letterbox 实现原理。
- NMS 阈值如何影响结果。
八、常用命令与工具
8.1 系统信息
bash
uname -a
cat /etc/os-release
free -h
df -h
lsusb
ip a
8.2 NPU 检查
bash
ls /dev/rknpu*
dmesg | grep -i rknpu
8.3 OpenCV 安装(headless)
bash
pip3 install opencv-python-headless numpy --break-system-packages
配置清华源:
bash
mkdir -p ~/.config/pip
cat > ~/.config/pip/pip.conf << 'EOF'
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
trusted-host = pypi.tuna.tsinghua.edu.cn
timeout = 120
EOF
8.4 视频处理
bash
ffmpeg -i input.mp4 -t 30 -c copy output_30s.mp4
8.5 开发工具
- MobaXterm:SSH + SFTP
- VS Code + Remote-SSH:远程编辑、调试
九、学习
- 先跑通,再优化:用 CPU 跑通 YOLO 全流程,理解每一行代码,再上 NPU。
- 动手敲代码:不要复制粘贴,肌肉记忆很重要。
- 善用报错:Linux 严格区分大小写,路径错误常见。
- 记录踩坑:讲出你遇到的坑和解决方案,比只讲成功更有说服力。
- 目标导向:AI 眼镜 → 边缘视觉 → 端侧部署,技能栈完全匹配。
摄像头
↓
原始帧 (BGR, 480x640x3, uint8)
↓ 预处理
Blob 张量 (RGB, 1x3x640x640, float32)
↓ 模型推理
原始预测 (1x84x8400)
↓ 后处理
检测框列表 x1,y1,x2,y2,类别,置信度
↓ 绘制
带框图像 (BGR, 原尺寸, uint8)