目录
前言
最近想开发一个小型机器人,碰巧看到了 RDK x5 发布了,参数对于我来说非常合适,就买了一块回来玩。
外设也是非常丰富,机器人开发的接口都是有的
板子实物非常好看哈哈:
架构图
机器人大概的框架是这样的,也算比较简单的,也是比较入门的架构。
-
视觉:摄像头作为图形输入端,采集外部的图像,让机器人有一双眼睛,在 RDK x5 的板子上使用加速引擎对视觉模型进行部署,速度 25 fps 完全没有压力,
-
运动: 运动的主控主要是交给 STM32F103 ,其负责底部电机还有小型液晶屏的显示交互。
开发过程
下面重点讲解下开发的过程,主要涉及以下几点:
- 摄像头
- YOLO 量化部署
- 底版开发
摄像头
我用的摄像头是 MIPI 摄像头,简单说下 MIPI 摄像头的原理
MIPI:移动产业处理器接口(Mobile Industry Processorinterface) 是MIPI联盟发起的为移动应用处理器制定的开放标准。
更多细节见 MIPI官网
MIPI摄像头的工作原理主要包括以下几个步骤:
- 数据传输:MIPI接口支持高速、低延迟的数据传输,确保相机捕获的图像和视频数据能够迅速且准确地传输到主处理器(如应用处理器)进行处理1。
- 协议支持:CSI(Camera Serial Interface)是关键协议,定义了相机传感器与处理器之间如何交换图像数据1。
- 同步与控制:同步信号和控制信号的传输确保相机与处理器之间的同步操作,并允许处理器对相机进行配置和控制,如调整曝光时间、增益等参数1。
- 图像处理:处理器接收到来自MIPI相机的原始图像数据后,会进行一系列图像处理操作,如去噪、色彩校正、图像压缩等,以生成最终可供显示或存储的图像1。
MIPI接口的特点和优势:
- 优化功耗:MIPI接口通过低压差分信号传输,降低了功耗,提高了设备的续航能力2。
- 高速传输:数据传输速率可以达到Gbps级别,满足了IT领域对高速数据传输的需求2。
- 减少引脚数:采用串行通信方式可以大幅减少物理接口数量,同时提高数据传输的速率和效率3。
- 差分信号传输:有效地减少了电磁干扰(EMI)对信号质量的影响,提高了信号传输的稳定性和可靠性3。
- 多种通信协议:支持多种通信协议,可以根据需求进行选择和定制,具有较高的灵活性2。
MIPI接口在移动设备中的应用
MIPI接口广泛应用于智能手机、平板电脑、可穿戴设备等移动设备的摄像头、显示屏、存储和其他外设与主处理器之间的连接。通过优化数据传输速率、功耗和物理连接等方面的设计,MIPI接口使得移动设备能够搭载更高性能的相机系统,从而提供更出色的拍照和录像体验1。
在 RDK x5 上使用 MIPI 摄像机非常简单, RDK x5 文档如下;
RDK相机驱动的逻辑:
模型转换
因为我的项目需要微调 YOLO,训练好之后,将 pth -> onnx -> ptq -> bin 然后直接部署就可以了。
微调过程这里不展开讲了,有兴趣的同学可以参考我的博文:《 深度学习实战 | 智慧工地安全帽和危险区域检测系统(代码已开源!) 》 ,里面会从数据集准备到微调全链路覆盖讲解,非常详细。
每款芯片都有自己的推理引擎,例如 英伟达的 TensorRT,瑞芯微的 RKNN,高通的 SNPE,RDK x5 也有自己的推理引擎,我们需要完成浮点模型到 D-Robotics 混合异构模型的转换,经过这个阶段,我们将得到一个可以在D-Robotics 处理器上运行的模型。
模型转换使用 hb_mapper makertbin
工具完成,转换期间会完成模型优化和校准量化等重要过程,校准需要依照模型预处理要求准备校准数据。 为了方便您全面了解模型转换,本节将依次介绍校准数据准备、转换工具使用、转换内部过程解读、转换结果解读和转换产出物解读等内容。
准备校准数据
在进行模型转换时,校准阶段会需要 100份左右 标定样本输入,每一份样本都是一个独立的数据文件。 为了确保转换后模型的精度效果,我们希望这些校准样本来自于您训练模型使用的 训练集或验证集 ,不要使用非常少见的异常样本,例如 纯色图片、不含任何检测或分类目标的图片等。
转换配置文件中的 preprocess_on
参数,该参数启用和关闭状态下分别对应了两种不同的预处理样本要求。 preprocess_on
关闭状态下,我们需要把取自训练集/验证集的样本做与模型推理(inference)前一样的前处理, 处理完后的校准样本会与原始模型具备一样的数据类型( input_type_train
)、尺寸( input_shape
)和 layout( input_layout_train
),对于 featuremap
输入的模型,可以通过 numpy.tofile
命令将数据保存为float32格式的二进制文件, 工具链校准时会基于 numpy.fromfile
命令进行读取。 例如,YOLOv5 训练的用于分类的原始浮点模型,它只有一个输入节点,输入信息描述如下:
- 输入类型:
BGR
- 输入layout:
NCHW
- 输入尺寸:
1x3x640x640
使用验证集做模型推理(inference)时的数据预处理如下:
图像长宽等比 scale, 并缩放到 32 的倍数,如果不足 32 则用 144,144,144
的 pad 补齐。
使用 hb_mapper makertbin
工具转换模型
hb_mapper makertbin
提供两种模式,开启 fast-perf
模式和不开启 fast-perf
模式。
fast-perf
模式开启后,会在转换过程中生成可以在板端运行最高性能的bin模型,工具内部主要进行以下操作:
-
将BPU可执行算子尽可能运行在BPU上(RDK X5 则可以通过yaml文件中node_info参数指定在BPU上运行的算子)。
-
删除模型首尾不可删除的CPU算子,包括:
Quantize/Dequantize
(QAT过程会有的算子)、Transpose
、Cast
、Reshape
等。 -
以性能最高的O3优化等级编译模型。
hb_mapper makertbin
命令使用方式如下:
不开启 fast-perf 模式:
shell
hb_mapper makertbin --config ${config_file} \
--model-type ${model_type}
开启 fast-perf 模式:
bash
hb_mapper makertbin --fast-perf --model ${caffe_model/onnx_model} --model-type ${model_type} \
--proto ${caffe_proto} \
--march ${march}
底版开发
底盘开发主要是 STM32F103 使用 软件 I2C 好 舵机控制版通信,舵机控制板会控制 3个舵机的运动,主要是让摄像头始终跟随某个物体使用的。
底板的 STM32 和控制板 RDK x5 只要是用串口通信的,整个协议也比较简单,这里不做过多的阐述了。
结语
好啦,以上就是我用 RDK x5 做的小机器人,后续我会持续更新,感谢大家看到这里。RDK x5 的板子真的非常好用,还在慢慢摸索更多功能哈哈。