【Linux】RK3568-OpenCV+YOLO(七)

一、开发板与系统环境

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:

    bash 复制代码
    wget 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_BGR2RGBCOLOR_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 后处理

  1. 转置outputs[0].T(8400, 84)
  2. 遍历 :每行取 scores = row[4:]class_id = np.argmax(scores)confidence = scores[class_id]
  3. 过滤if confidence > 0.25(可调)
  4. 坐标映射:模型坐标 ÷640 × 原图尺寸
  5. NMScv2.dnn.NMSBoxes(boxes, confidences, 0.25, 0.4) 去重叠框
  6. 画框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 视频推理流程

  1. 加载 ONNX 模型:net = cv2.dnn.readNetFromONNX('yolov8n.onnx')
  2. 逐帧读取
  3. 对每帧:blobFromImagenet.forward() → 后处理 → 画框
  4. 写入输出视频
  • 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 部署流程

  1. PC 端 (Ubuntu x86_64):
    • 安装 rknn-toolkit2
    • 将 ONNX 转 RKNN:python convert.py --model yolov8n.onnx --platform rk3568 --dtype i8
    • 需要校准数据集(100~200 张)
  2. 板端
    • 安装 librknnrt.sorknn_toolkit_lite2
    • 加载 .rknn 模型:rknn = RKNNLite(); rknn.load_rknn('model.rknn'); rknn.init_runtime()
    • 推理:outputs = rknn.inference(inputs=[blob])
  3. 性能:YOLOv8n 可达 20~30 FPS,YOLOv8s 约 13 FPS

5.3 成本对比

项目 云端 AI 边缘 AI
硬件 租用 GPU 一次性开发板
网络 上传下载收费 几乎为零
延迟
隐私 数据出云 本地处理
适合 低频、大算力 高频、实时、隐私

六、模型选择与开发路线

6.1 学习路线

  1. YOLOv8n ONNX + OpenCV CPU:跑通全流程,理解预处理/后处理/画框
  2. 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)

相关推荐
j7~1 小时前
【Linux】三十八.C++ 手写 HTTP 服务器:裸 socket + fork 多进程,从 HTTP 报文解析到浏览器打开网页
linux·网络·网络协议·学习·http·网络编程
傲世仙尊2 小时前
设计者的取舍-路径fork的诞生与全局文件队列
linux
逐流人2 小时前
Containerd容器管理实战:从架构原理到nerdctlcrictl工具链
linux·运维·云原生·容器·云计算·containerd
Tairitsu_H2 小时前
[Linux] 编辑器vim、编译器和动静态链接
linux·vim·gcc·g++·动态链接·静态链接
lzx_0022 小时前
Linux指令(一) 简单了解部分指令
linux
小则又沐风a2 小时前
深入理解TCP协议----滑动窗口,流量控制
linux·网络协议·tcp
bosins12 小时前
WSL2 启动即崩溃?调整超时参数解决 Docker 阻塞问题
linux·docker·wsl
web守墓人12 小时前
【goed/ui】自定义组件设计思想篇
linux·windows·ui·golang
kuroomi13 小时前
Ingress-Nginx与kubernetes 网络
linux·运维·网络·kubernetes