最近半年我一直在折腾基于RV1126B的AI摄像头项目,从最初只是听说过“这是个瑞芯微的视觉处理器SoC”,到后来能稳定跑通图像采集、硬件编码、NPU本地推理整条链路,中间踩掉的坑比想象中多得多。如果你也想把手里的AI摄像头想法落地,而不是一直停留在看资料和刷评测的阶段,这篇笔记应该能帮你省下不少时间。
先简单交代一下背景。RV1126B是瑞芯微面向IPC和AI边缘设备推出的一颗视觉处理器SoC,集成了四核Cortex-A7 CPU、RISC-V安全MCU、NPU、ISP以及硬件编解码模块,定位非常明确:就是要做网络摄像头、智能门铃、AI边缘盒子这类产品。它和同系列早期芯片RV1126最大的区别,是部分型号直接内置了DDR颗粒,硬件设计上可以省掉外挂DDR的走线和物料成本,对很多非专业硬件团队来说相当友好。
这篇文章不打算给你念规格书,而是把我实际做过的选型对比、开发环境搭建、Camera链路调试、模型部署和排障经验完整拆开。适合这几类人参考:刚拿到RV1126B核心板准备跑第一个demo的工程师、从上位机或应用开发转嵌入式的同学,以及正在评估“要不要选RV1126B做量产主控”的产品负责人。
1. 为什么选RV1126B做AI摄像头:芯片定位与选型逻辑
1.1 RV1126B在视觉SoC梯队里的真实位置
先说结论:RV1126B并不是一颗性能怪兽,它在整个视觉SoC市场里属于“够用、省心、画质处理能力在线”的中端AI视觉方案。
国内做摄像头主控SoC的玩家不少,海思的Hi3516系列在安防领域占有率很高,但供货和资料获取的难度不用多说;君正的T系列更偏低功耗IPC,AI算力不是强项;瑞芯微的RV11xx系列走的是“图像质量+轻量AI”路线,RV1126B就是这条线里集成度很高的选手。
我画了一张简化规格表,方便你快速建立认知:
| 项目 | RV1126B主要规格 |
|---|---|
| CPU | 四核Cortex-A7 + RISC-V MCU(用于安全/低功耗场景) |
| NPU | 2 TOPS(INT8),支持TensorFlow、PyTorch、ONNX等模型 |
| ISP | 支持多路输入,带3A、宽动态、低照度处理 |
| 视频编解码 | 硬件H.264/H.265编解码 |
| 存储 | 部分型号集成DDR颗粒,支持eMMC/SD/SPI NOR |
| 外设 | MIPI CSI/DSI、USB、Ethernet、SDIO、UART/I2C/SPI等 |
| 典型场景 | IPC、AI摄像头、人脸门禁、智能分析盒子 |
2 TOPS算力在2025年看并不夸张,但对摄像头场景来说非常合适。一颗2T算力的NPU,跑YOLOv5s这类轻量检测网络足够,同时芯片整体功耗控制得还行,外壳不带风扇也不至于烫手。真正吃资源的其实不是单帧推理,而是多路视频编码和图像缩放这类并行任务,这两块RV1126B都交给了硬件模块处理,给CPU留出了余量。
1.2 主控SoC选型时最容易忽略的几件事
很多人选型只看算力和接口数量,我实际做完一个项目后,总结出几个容易被忽略的点。
第一是内存和存储规划。RV1126B内置DDR虽然简化了硬件,但容量是固定的,你没法像用RV1126外挂DDR那样随意扩展。模型推理、帧缓冲、编码码流、系统缓存都共用同一块内存。选型时一定先把模型运行内存、2路摄像头缓冲、RTSP并发路数大致估算一遍,再确认内置DDR容量到底够不够。我见过有人把YOLOv5s模型、1080p三路sensor、双路编码全塞进去,结果CMA分配不足,摄像头直接初始化失败。
第二是外设匹配。做AI摄像头不等于只跑模型。你需要几路sensor?是否要接麦克风做语音对讲?要不要WiFi模块?需不需要以太网口?每个外设都会占掉引脚和控制器资源。RV1126B的引脚复用关系比较绕,选型阶段建议把原理图引脚分配表先拉出来,对照自己的硬件需求逐项勾选,别等画板时才发现MIPI CSI和某个SDIO复用冲突。
第三是量产烧录方式。开发阶段用SD卡很方便,但量产如果继续用SD卡,效率和可靠性都跟不上。RV1126B支持eMMC、SPI NOR等多种启动介质,选型时要提前确定量产用什么介质,因为这会直接影响UBoot和内核的配置,后期改启动介质往往比想象中麻烦。
第四是工具链和资料完整度。这是我认为最关键的一点。RV1126B能形成完整的RKNN工具链、ISP调试工具、SDK示例工程。相比之下,有些芯片单独看规格参数很漂亮,但拿到手发现SDK是半成品,光适配一个sensor驱动就要折腾一个月,这种隐性成本在选型时一定要算进去。
2. 搭建开发环境:从SDK到第一次点亮屏幕
2.1 SDK结构分析与版本选择
拿到RV1126B核心板之后,第一件事不是急着写代码,而是把官方SDK完整解压出来,老老实实把目录结构认一遍。
SDK常见的顶层目录包括:kernel(内核源码)、u-boot(引导代码)、buildroot(根文件系统构建)、app(上层应用示例)、external(第三方组件)、docs(文档)、media(多媒体相关代码和库)、output(编译产物)。整个SDK的特点是模块化很强,每个部分可以单独编译,也可以执行一键全量编译脚本。
这里有个容易踩的坑:RV1126B的SDK版本和RV1126并不完全通用,你不能随便拿一颗周边芯片的SDK硬编。同一套SDK里,不同板级配置对应的设备树、内核config、UBoot defconfig都可能不同。我在第一次编译时就吃过亏,直接用了默认配置编出来的固件,烧到RV1126B开发板上,内存容量识别不对,启动后系统频繁卡死。
正确的做法是:先确认SDK中是否带有与你手上开发板对应的板级配置文件,通常在device/rockchip/目录下能看到以板卡型号命名的文件夹。如果你买的是第三方核心板,供应商一般会提供补丁包,需要先把补丁打上再编译。首次全量编译耗时可能非常长,我自己的机器完整编一遍大约要两三个小时,强烈建议用一台配置好一点、散热靠谱的电脑,或者直接扔到云编译服务器上。
2.2 烧录固件与启动流程
RV1126B的启动流程是一条典型的SoC启动链:芯片内部BootROM上电后找到Loader,Loader负责初始化DDR并引导UBoot,UBoot加载内核,内核挂载根文件系统。如果某个环节异常,板子就表现为反复重启、串口无输出或者卡在某一阶段。
开发阶段烧录用Windows下的RKDevTool比较多,操作流程大概是这样:
- 安装瑞芯微USB驱动(DriverAssistant)。
- 板子断电,按住板上的RECOVERY/恢复按键不放,插入USB线连接电脑,然后上电。
- 打开RKDevTool,确认软件能识别到设备,进入“升级固件”或“按地址烧录”页面。
- 加载Loader和对应的分区镜像,执行烧录。
- 烧录完成后重新上电,接串口看启动日志。
阶段开发我强烈建议用“按地址烧录”而不是每次整包烧录。我第一次没有分区表概念,只改了一个内核设备树,结果整个固件重编重烧,光烧录就花了十几分钟,效率极低。按地址烧录时,只需要单独烧boot.img或resource.img,开发循环会快很多。
串口调试线一定要接上,RV1126B的串口波特率通常是1500000,IT比普通的115200高不少。如果你用普通的USB转串口模块,要确认芯片支持这个波特率,否则log会乱码。
2.3 交叉编译环境与远程调试
RV1126B是ARM架构,板子上没法直接跑X86的编译工具链,所以要在电脑上配置交叉编译环境。SDK里的buildroot会生成一套交叉编译工具链,路径一般在buildroot/output/host/bin/下,编译器前缀类似arm-rockchip-linux-gnueabihf-gcc。
编译一个最简单的C程序验证环境:
export PATH=$SDK_PATH/buildroot/output/host/bin:$PATH arm-rockchip-linux-gnueabihf-gcc -o hello hello.c编出来的hello文件,通过adb push或scp传到板子上执行。如果板子能打印输出,说明交叉编译环境没有问题。
远程调试阶段有个经验:如果只改一个应用层程序,可以优先用NFS把rootfs挂载到板子上,代码编译完直接放到NFS目录,板子上重启应用即可,不用重新烧录文件系统。配置NFS其实不复杂,在电脑上开一个共享目录,板子内核启动时通过root=/dev/nfs参数挂载。使用这种方法,整个开发循环从“编译-烧录-重启”缩短为“编译-重启应用”,体验提升非常明显。
3. 摄像头图像链路:从MIPI接入到ISP出图
3.1 摄像头模组选型与MIPI CSI设备树配置
AI摄像头项目里,图像源质量决定了后面所有环节的上限。RV1126B的ISP对不同sensor的适配能力有差异,最省力的方式是选SDK官方适配过的sensor模组。我这边用的是SC3336和IMX335这两个系列,驱动和tuning文件在SDK里都有现成的,踩坑少很多。
如果真要选一颗SDK里没有适配的新sensor,意味着你要自己做以下工作:确认sensor输出RAW格式(RAW10还是RAW12)、MIPI lane数、I2C地址、供电时序、reset/pwdn GPIO的极性,然后自己写驱动和调tuning。这不是不能做,但工作量绝对超预期,首次调通可能就要一两周。
设备树里MIPI CSI的配置是整个摄像头链路的第一关。我自己在配置的时候,会把下面这几项单独检查一遍:
- I2C总线编号是否正确,sensor挂在哪个I2C控制器上。
- reset GPIO和pwdn GPIO的极性,高有效还是低有效。
- >&i2c3 { status = "okay"; sc3336: sc3336@2b { compatible = "smartsens,sc3336"; reg = <0x2b>; reset-gpios = <&gpio2 RK_PB2 GPIO_ACTIVE_LOW>; pwdn-gpios = <&gpio2 RK_PB1 GPIO_ACTIVE_HIGH>; rockchip,camera-module-index = <0>; rockchip,camera-module-facing = "back"; port { sc3336_out: endpoint { remote-endpoint = <&mipi_in_ucam0>; >from rknn.api import RKNN rknn = RKNN() # 配置目标平台、量化方式和归一化参数 rknn.config(target_platform='rv1126', mean_values=[[0, 0, 0]], std_values=[[255, 255, 255]]) # 加载onnx模型 rknn.load_onnx(model='yolov5s.onnx') # 执行量化并生成rknn模型 rknn.build(do_quantization=True, dataset='dataset.txt') rknn.export_rknn('yolov5s.rknn')
这里最关键的是
dataset.txt,它指定了量化校准用的图片路径,每行一张图片。量化是把模型权重从FP32压缩到INT8的过程,如果校准图太少或者内容单一,量化后的精度可能崩得很难看。我的习惯是准备100张左右能代表现场光照条件的图,而不是从训练集里随便挑几张。转换中最常见的报错是“Unsupported operator”,意思是RKNN工具链遇到了不支持的算子。解决思路不是硬刚,而是改模型结构,把复杂算子替换成等价的标准算子。比如有些网络里用自定义的Attention模块,ONNX导出后算子很杂,这时可以直接把模型换回YOLOv5原版结构,省心很多。
板端加载RKNN模型的C代码框架大概是下面这个样子:
rknn_context ctx; rknn_init(&ctx, model_data, model_size, 0, NULL); rknn_input_output_num io_num; rknn_query(ctx, RKNN_QUERY_IN_OUT_NUM, &io_num, sizeof(io_num)); rknn_input inputs[1]; inputs[0].index = 0; inputs[0].type = RKNN_TENSOR_UINT8; inputs[0].size = width * height * 3; inputs[0].fmt = RKNN_TENSOR_NHWC; inputs[0].buf = image_data; rknn_inputs_set(ctx, 1, inputs); rknn_run(ctx, NULL); rknn_output outputs[1]; outputs[0].want_float = 0; rknn_outputs_get(ctx, 1, outputs, NULL);一个容易踩的坑是输入排布和归一化。训练时如果是RGB输入,RV1126B端往往也要求RGB顺序,但V4L2从ISP拿到的图像可能是NV12等格式,需要先做格式转换。建议打印一下RKNN模型输出的shape和数值范围,确认理解正确后再写后处理逻辑。
4.3 推理性能实测与多任务调度
部署完成后,我做了性能实测。一个轻量检测模型输入416x416,NPU单帧推理耗时大约在40~60毫秒之间;如果再加上取流、画框、编码推流,整个端到端在12~18帧/秒左右。这个水平做室内监控、跌倒检测等场景是够用的,但要是想抓高速运动物体,就得把输入降到320x320,或者换一个更小的backbone。
要提升整体帧率,核心思路是把各个任务拆到不同线程,并减少CPU侧的耗时操作。比如图像缩放和颜色转换可以交给RGA硬件,画框后处理放到单独的线程,不要让NPU推理线程阻塞在编码上。RV1126B的CPU是四核A7,单核性能不强,必须用好多核调度。我在项目里把采集线程绑在CPU0/1,推理后处理绑在CPU2/3,整体稳定性和帧率都有提升。
5. 踩坑实录:常见问题与排查速查
5.1 启动不停重启或卡死的排查套路
RV1126B项目最常见的第一个问题就是板子不上电或反复重启。这种问题我建议按下面顺序排查:先看电源,用5V/2A以上的电源供电,避免供电不足导致DDR初始化失败;再插串口线看log停在哪个阶段。
如果串口完全没有输出,重点检查BootROM是否运行、Loader是否损坏,尝试重新烧录Loader。如果log卡在loader阶段,多半是DDR初始化失败,可以看看内置DDR的型号配置是否与实际颗粒一致。如果log卡在kernel阶段,则重点检查内核设备树和启动介质参数。串口能完整打印到登录提示符,整条启动链路就基本正常了。
5.2 摄像头不出图、花屏、偏色的快速定位
摄像头链路的问题,我一直用“分阶段定位”的方法,绝不凭感觉瞎调。先通过I2C确认sensor是否存在,再读sensor内部chip id,确认sensor已经正常启动;然后查MIPI相关寄存器和ISP状态,确认数据通路通了;最后才打开画面看画质。
如果sensor有响应但不出图,优先检查reset和pwdn引脚配置。这两个引脚配置错误的情况非常常见,比如GPIO_ACTIVE_LOW写成了GPIO_ACTIVE_HIGH,sensor一直在复位状态,自然无法工作。如果画面颜色不对,比如整体偏绿或偏紫,基本就是bayer格式匹配错了,调整ISP的bayer order即可。
5.3 模型推理报错与精度异常排查
模型层面,我遇到最多的问题集中在三块:RKNN工具链版本和板端runtime版本不匹配、量化精度劣化、后处理坐标错误。
版本不匹配的典型表现是程序在板子上加载rknn模型失败,提示版本相关错误。解决方法只有一个:严格使用SDK配套的RKNN Toolkit和板端librknnmrt版本,不要随手拿最新版工具链去转换。量化精度劣化则要从dataset.txt和归一化参数下手,确认校准图分布、mean/std与训练一致。后处理坐标错误通常是因为模型输出是相对于输入图像的坐标,而显示画面经过了缩放,转换坐标时需要按比例映射回去。
5.4 几条让项目更稳的实战建议
项目做到后期,我总结出几条实实在在的经验。第一条,先把官方demo完整跑一遍再改自己的业务逻辑。瑞芯微SDK里有很多demo,覆盖RTSP推流、人脸检测、物体分类等场景,把这些demo跑通能帮助你确认硬件和SDK环境没问题,后续排错时心里有底。第二条,开发过程中每个阶段留存一份稳定镜像。我在改sensor驱动时,每确认一个稳定版本就把固件镜像备份一次,后面改崩了随时能回到上一个正常状态。第三条,硬件设计上一定要预留串口、I2C测试点和足够的GND。
最后分享一个我自己特别深的体会。AI摄像头这个项目,技术栈横跨嵌入式、图像调试和模型部署,最容易翻车的地方往往不是某个高深算法,而是链路里那些小连接:电源纹波、I2C地址、tuning文件版本、RKNN工具链版本、buffer不够……我踩过最惨的一次,是sensor设备树里pwdn引脚多配了一个GPIO方向,导致sensor偶尔初始化失败,整整排查了两天。做这个项目之后,我给自己立了一个规矩:每一步都先确认“上一级输出是否正常,再往下走”。如果你也被某个摄像头问题卡了好几天,不妨先回头检查一下链路最前端,往往会有意想不到的收获。