边缘AI计算方案
文档版本:V1.0 | 适用系统:Linux 6.1 / Android14 | 适用硬件:C-3576BQ V10 核心板 + M4-R2(ShimetaPi)底板 | 更新日期:2026-10-23
1. 概述
1.1 功能简介
边缘 AI 计算方案基于 M4-R2(RK3576)集成的 NPU(标称 6 TOPS INT8 算力),在板端直接运行深度学习推理,实现目标检测、人脸识别、OCR 文字识别、图像分类等 AI 应用,无需依赖云端,兼顾低延迟、低带宽与数据本地化。
RK3576 NPU 支持 INT8/INT16/FP16 多种量化精度,配套 Rockchip RKNN 工具链(RKNN-Toolkit2 + RKNN Runtime),可将 TensorFlow、PyTorch、ONNX 等主流框架模型转换为 RKNN 格式后在板端高效部署。
1.2 应用场景
- 智能安防:人脸检测与识别、行人/车辆检测、行为分析(详见人脸检测与识别)
- 工业质检:缺陷检测、OCR 字符识别(详见OCR文字识别)
- 智慧零售:客流统计、商品识别、行为分析
- 边缘网关:视频结构化、数据预处理后上云
- 智能交互:手势识别、表情识别、语音唤醒视觉联动
1.3 硬件规格
| 项目 | 规格 | 来源 |
|---|---|---|
| NPU | 标称 6 TOPS(INT8),三核心架构描述,以实际 SDK 为准 | 参考说明 |
| 支持精度 | INT8 / INT16 / FP16 | 参考说明 |
| CPU | 4×A72(最高 2.2GHz)+ 4×A53(1.8GHz),8nm 工艺 | 已验证 |
| 内存 | LPDDR5 4GB | 已验证 |
| 存储 | eMMC 32GB+ / TF 卡(SD3.0,最高 128GB) | 已验证 |
| 摄像头接入 | USB 摄像头 / MIPI CSI(以实际 SDK 支持为准) | 待板上验证 |
注意:6 TOPS 为平台标称算力,实际可用算力受温度、频率与模型负载影响,需板端实测(待板上验证)。RK3576 无 M0 核心,推理任务全部由 NPU 与 A72/A53 承担。
1.4 软件栈
| 组件 | 说明 | 参考文档 |
|---|---|---|
| RKNN-Toolkit2 | PC 端模型转换/量化/模拟验证工具 | RKNN Toolkit2安装与使用 |
| RKNN Runtime | 板端推理运行时(librknnrt.so) | 分类模型部署(LeNet-ResNet) |
| RKNPU 内核驱动 | rknpu2 内核驱动与固件 | NPU架构与性能概览 |
| 推理后端 | C / C++ / Python API(rknn_api) | 目标检测部署(YOLOv5-v7-v8) |
2. 方案架构
2.1 系统架构
+------------------------------------------------------------+
| 应用层(Application) |
| 目标检测 | 人脸识别 | OCR | 图像分类 | 业务逻辑 |
+------------------------------------------------------------+
| 推理层(Inference) |
| RKNN C/Python API(librknnrt.so / rknn_api) |
+------------------------------------------------------------+
| 运行层(Runtime) |
| RKNPU 内核驱动 | DRM 显示 | RGA 预处理 | MPP |
+------------------------------------------------------------+
| 硬件层(Hardware) |
| RK3576 SoC | NPU(6 TOPS) | Mali-G52 MC3 | 内存 |
+------------------------------------------------------------+2.2 推理数据流
摄像头/图像源 ──> MPP(解码) ──> RGA(缩放/格式转换) ──> NPU 推理 ──> 解析后处理 ──> 业务应用
│
RKNN Runtime(rknn_run)2.3 核心能力说明
| 模块 | 说明 |
|---|---|
| 推理 | NPU 硬件加速推理(INT8/INT16/FP16) |
| 模型 | RKNN 格式模型(.rknn),支持主流框架转换 |
| 图像 | RGA 预处理(缩放、格式转换、Crop) |
| 视频 | MPP 视频解码,支持多路视频流接入(路数以板端实测为准) |
| 扩展 | USB 摄像头接入、双千兆以太网回传数据 |
3. 硬件准备
| 类别 | 名称/型号 | 数量 | 说明 |
|---|---|---|---|
| 核心板 | C-3576BQ V10(RK3576) | 1 | 4GB LPDDR5 + eMMC |
| 底板 | M4-R2(ShimetaPi) | 1 | 网络、USB、显示接口 |
| 摄像头 | USB 摄像头 / MIPI CSI 模组 | 1+ | 根据方案选择(待板上验证) |
| 显示(可选) | HDMI 显示器 或 MIPI DSI 屏 | 1 | 可视化调试 |
| 电源 | 5V 适配器(典型 5V,最大 5.5V,电流 4A) | 1 | 供电 |
4. 软件准备
4.1 开发环境
| 环境 | 说明 |
|---|---|
| 开发主机 | Ubuntu 64 位,安装 RKNN-Toolkit2(PC 端模型转换与验证) |
| 板端 | RK3576 Linux SDK / Android14 SDK,包含 RKNN Runtime 与驱动 |
| 参考 | RKNN Toolkit2安装与使用 |
4.2 模型准备流程
- 在开发主机训练或获取模型(PyTorch / TensorFlow / ONNX 等)
- 使用 RKNN-Toolkit2 进行模型转换与量化(INT8/INT16/FP16)
- 生成 RKNN 格式模型文件(
.rknn) - 将模型文件与推理程序部署到板端
模型转换与量化细节见模型转换与量化。
5. 板端配置
5.1 检查 NPU 状态
# 查看 NPU 驱动/固件版本(路径以实际 SDK 为准)
dmesg | grep -i rknpu
# 查看 NPU 设备节点
ls /dev/rknpu*5.2 推理程序运行
# 运行 RKNN 推理示例(以实际 SDK 示例为准)
./rknn_classify_demo model.rknn input.jpg说明:若执行报错,检查驱动版本与模型对应关系(rknpu2 驱动版本需匹配 RKNN-Toolkit2 版本),并确认 RGBA/BGR 输入格式与 RGA 预处理一致。
6. 应用开发示例
6.1 RKNN 推理示例(C/C++)
#include <rknn_api.h>
#include "rknn_matmul_api.h" /* 如使用矩阵乘法 API */
static void *load_file(const char *path, int *size)
{
FILE *fp = fopen(path, "rb");
long fsize;
void *buf;
if (!fp)
return NULL;
fseek(fp, 0, SEEK_END);
fsize = ftell(fp);
fseek(fp, 0, SEEK_SET);
buf = malloc(fsize);
if (fread(buf, 1, fsize, fp) != (size_t)fsize) {
free(buf);
fclose(fp);
return NULL;
}
fclose(fp);
*size = fsize;
return buf;
}
int rknn_infer_example(const char *model_path, const char *image_path)
{
rknn_context ctx;
rknn_input inputs[1];
rknn_output outputs[8];
int model_size;
void *model = NULL;
int ret;
/* 1. 加载 RKNN 模型 */
model = load_file(model_path, &model_size);
ret = rknn_init(&ctx, model, model_size, 0, NULL);
if (ret < 0) {
printf("rknn_init error: %d\n", ret);
return -1;
}
/* 2. 读取并预处理输入图像(缩放/格式转换,可用 RGA 加速) */
/* ... 图像读取与预处理(省略) ... */
/* 3. 设置输入 */
inputs[0].index = 0;
inputs[0].type = RKNN_TENSOR_UINT8;
inputs[0].size = img_size;
inputs[0].fmt = RKNN_TENSOR_NHWC;
inputs[0].buf = img_data;
ret = rknn_inputs_set(ctx, 1, inputs);
if (ret < 0) {
printf("rknn_inputs_set error: %d\n", ret);
return -1;
}
/* 4. 执行推理 */
ret = rknn_run(ctx, NULL);
if (ret < 0) {
printf("rknn_run error: %d\n", ret);
return -1;
}
/* 5. 获取输出 */
memset(outputs, 0, sizeof(outputs));
/* 按模型实际输出个数配置 outputs[i].index / want_float */
ret = rknn_outputs_get(ctx, 1, outputs, NULL);
if (ret < 0) {
printf("rknn_outputs_get error: %d\n", ret);
return -1;
}
/* 6. 后处理与业务逻辑(分类/检测/识别,省略) */
/* 7. 释放资源 */
rknn_outputs_release(ctx, 1, outputs);
rknn_destroy(ctx);
free(model);
return 0;
}6.2 RKNN 推理示例(Python)
import numpy as np
from rknnlite.api import RKNNLite
# 加载模型
rknn_lite = RKNNLite()
ret = rknn_lite.load_rknn('model.rknn')
if ret != 0:
print('load_rknn failed, ret =', ret)
exit(-1)
# 初始化运行环境(0: 使用 NPU 核心,以实际 SDK 为准)
ret = rknn_lite.init_runtime(core_mask=RKNNLite.NPU_CORE_AUTO)
if ret != 0:
print('init_runtime failed, ret =', ret)
exit(-1)
# 读取并预处理图像
img = ... # 图像读取与预处理(缩放至模型输入尺寸,省略)
# 执行推理
outputs = rknn_lite.inference(inputs=[img])
# 后处理与业务逻辑(省略)
print(outputs)
# 释放资源
rknn_lite.release()完整可运行示例以实际 RKNN SDK 提供的 demo 为准(见目标检测部署(YOLOv5-v7-v8))。
7. 常见问题
| 问题 | 处理方法 |
|---|---|
| 推理结果全错/输出 NaN | 检查输入数据格式(NHWC/NCHW)、量化参数与模型输入尺寸 |
| 加载模型失败(init 报错) | 确认驱动固件版本与模型转换工具版本匹配 |
| 推理速度慢 | 使用 INT8 量化、检查 NPU 频率与温度、减少预处理开销(见NPU性能调优与调试) |
| 摄像头无图像 | 检查 USB 摄像头枚举与 V4L2 设备节点(ls /dev/video*) |
| 内存不足(OOM) | 缩小输入尺寸或 batch,释放不再使用的 rknn_context |
| 多路视频推理卡顿 | 确认单路/多路并发路数上限(以板端实测为准),降低分辨率或帧率 |
8. 相关文档
| 文档 | 说明 |
|---|---|
| NPU架构与性能概览 | NPU 架构与性能指标 |
| RKNN Toolkit2安装与使用 | 工具链安装 |
| 模型转换与量化 | 模型转换与量化 |
| 目标检测部署(YOLOv5-v7-v8) | 目标检测部署示例 |
| 人脸检测与识别 | 人脸应用示例 |
| OCR文字识别 | OCR 应用示例 |
| NPU性能调优与调试 | 性能调优 |
| 视频编解码(MPP) | 视频解码与图像处理 |
| RGA图像处理 | 图像预处理加速 |
