4、视觉感知基础:图像采集、预处理、颜色空间转换与特征提取方法
TinyML机器人上的视觉感知,本质上是将物理世界的光学信号,通过受限的硬件资源(如低功耗摄像头、MCU或边缘AI加速器)转换为可供机器学习模型或控制逻辑使用的数字特征。与云端视觉不同,TinyML视觉必须在功耗、内存、延迟和带宽的多重约束下完成“采集—处理—理解”的闭环。本章将系统拆解这一链路中的四个核心环节:图像采集的硬件与接口约束、预处理的标准流程、颜色空间转换的数学意义与工程选择,以及面向嵌入式环境的特征提取方法。理解这些基础,是后续实现视觉引导抓取、巡线避障或手势识别等机器人应用的前提。
上图展示了TinyML机器人视觉感知的完整链路。从图像采集到特征提取,每一级都伴随着数据量的急剧缩减:例如,一张QVGA(320×240)的RGB565图像原始数据量为150KB,经过ROI裁剪、颜色空间转换和特征提取后,最终送入分类器的特征向量可能仅有几十到几百字节。这种“由粗到精”的数据流设计,是TinyML视觉系统能够在资源受限平台上运行的关键。下面我们逐一深入每个环节。
4.1 图像采集:硬件接口与数据格式选择
核心原理:图像采集是视觉感知的起点,其核心任务是将CMOS传感器输出的模拟或数字信号,通过特定接口传输到主控芯片的内存中。在TinyML机器人中,常用的传感器包括OV2640(200万像素)、OV7725(30万像素)和MT9V034(全局快门)。接口方面,DVP(Digital Video Port)是MCU最常用的并行接口,而MIPI-CSI则多见于带有ISP的SoC平台。选择的关键指标并非像素高低,而是帧率、功耗、接口带宽和驱动复杂度的平衡。
操作流程:
- 传感器初始化:通过I2C总线写入寄存器配置,设置输出分辨率(如QVGA 320×240)、像素格式(RGB565、YUV422或RAW Bayer)、帧率(15-30fps)以及自动曝光/白平衡模式。
- DMA传输配置:在MCU中配置DMA通道,将摄像头输出的数据直接搬运到内存缓冲区,避免CPU逐像素拷贝。例如,STM32F4系列可使用DCMI接口+DMA双缓冲机制。
- 帧同步与丢弃:通过VSYNC(垂直同步)和HSYNC(水平同步)信号判断帧边界,只处理完整的帧,丢弃撕裂帧。
- 数据格式转换:若传感器输出RAW Bayer格式,需在MCU内完成去马赛克(Debayer)插值,但该操作计算量大,通常建议直接选用输出RGB565或YUV422的传感器,或使用带ISP的摄像头模组。
4.2 预处理:从原始图像到有效区域
核心原理:预处理的目标是消除无关信息、增强目标特征、降低后续计算量。在TinyML场景中,预处理必须使用整数运算和定点算术,避免浮点库带来的开销。常见的预处理操作包括:裁剪(Crop)、缩放(Resize)、颜色空间转换、直方图均衡和噪声滤波。
关键操作与判断方法:
- ROI裁剪:根据机器人固定安装的摄像头视角,预先设定感兴趣区域。例如,巡线机器人只处理图像底部1/3区域,可减少2/3的计算量。
- 缩放算法:双线性插值效果好但计算量大;最近邻插值速度快但有锯齿。对于TinyML,推荐使用整数倍降采样(如每2×2像素取平均值),既平滑又高效。
- 去噪:3×3中值滤波对椒盐噪声有效,但需要排序操作。更轻量的是使用“如果中心像素与周围差异过大则替换为邻域均值”的条件滤波。
- 直方图均衡:用于增强对比度,但全局均衡在MCU上需要遍历整帧统计直方图,开销较大。实际中常使用固定增益的伽马校正(LUT查表法)替代。
| 预处理操作 | 计算量(QVGA) | 内存占用 | 适用场景 |
|---|---|---|---|
| ROI裁剪 | 极低(仅复制) | 0(指针偏移) | 固定视角机器人 |
| 整数降采样 | 低(约10K次加法) | 0(原地操作) | 通用 |
| 中值滤波 | 高(每像素9次比较) | 1行缓冲 | 传感器噪声大时 |
| LUT伽马校正 | 低(查表) | 256字节 | 光照不均 |
4.3 颜色空间转换:从RGB到HSV/YCrCb的工程意义
核心原理:RGB颜色空间适合显示,但三个通道高度相关,且对光照变化敏感。在机器人视觉中,我们更关心颜色的色相(Hue)、饱和度(Saturation)和亮度(Value/Intensity)。HSV空间将颜色信息与亮度分离,使得颜色阈值分割对光照变化具有鲁棒性。YCrCb(或YCbCr)空间则广泛用于JPEG压缩和肤色检测,其Y分量代表亮度,Cb和Cr代表蓝色差和红色差。
转换公式与定点化:RGB到HSV的转换涉及浮点运算和分支判断,在MCU上直接实现效率较低。工程上常采用两种优化策略:
- 查找表法:将RGB565的5位R、6位G、5位B组合成16位索引,预先计算HSV值存入Flash中的查找表。表大小为2^16×2字节=128KB,对于大容量Flash可行。
- 简化计算法:使用整数运算近似。例如,计算饱和度时用
(max-min)*255/max,使用除法器IP或移位近似。
对于YCrCb转换,公式为线性变换,非常适合用整数乘加实现:
// 定点化YCrCb转换(输入RGB888,输出YCrCb)
int y = ( 66*r + 129*g + 25*b + 128) >> 8;
int cb = (-38*r - 74*g + 112*b + 128) >> 8;
int cr = (112*r - 94*g - 18*b + 128) >> 8;
// 注意:上述系数基于BT.601标准,需加上128偏移量
4.4 特征提取:从像素到可决策的数值
核心原理:特征提取是将预处理后的图像数据压缩为具有判别能力的数值向量。在TinyML机器人中,特征提取必须满足实时性、低维度和鲁棒性。根据任务复杂度,可选择传统手工特征或轻量级CNN特征。
传统特征方法:
- 颜色直方图:统计HSV空间中H通道的分布(如32个bin),形成32维特征向量。该特征对平移和旋转不敏感,适合目标识别。
- 边缘方向直方图:使用Sobel算子计算梯度幅值和方向,统计方向直方图(如8个bin),适合形状识别。
- 局部二值模式(LBP):对每个像素与邻域比较生成二进制码,统计直方图。LBP对单调灰度变化具有不变性,适合纹理识别。
- 区域统计矩:计算ROI内像素的均值、方差、质心位置等,用于快速判断目标是否存在。
轻量级CNN特征:当使用带有NPU的芯片(如K210、ESP32-S3+AI扩展)时,可部署MobileNetV1或SqueezeNet的量化版本。输入图像通常缩放至96×96或128×128,经过深度可分离卷积提取特征图,最后通过全连接层输出分类概率。特征提取的中间层输出(如最后卷积层的特征图)也可直接作为控制信号,例如判断目标中心坐标。
| 特征类型 | 维度 | 计算量 | 鲁棒性 | 典型应用 |
|---|---|---|---|---|
| 颜色直方图 | 16-64 | 低 | 光照敏感 | 球体追踪 |
| LBP直方图 | 256 | 中 | 光照不变 | 地面纹理识别 |
| HOG(简化) | 36-108 | 高 | 几何不变 | 行人检测 |
| CNN特征 | 128-512 | 高(需NPU) | 强 | 多目标分类 |
4.5 实战案例:基于颜色特征的红色小球追踪系统
背景与约束:我们为一台基于ESP32-S3的差速驱动机器人设计视觉追踪功能。硬件为OV2640摄像头(DVP接口)、240MHz双核MCU、512KB SRAM。目标是在室内光照变化环境下,实时追踪一个红色乒乓球,并输出其屏幕坐标供PID控制器跟踪。
初始现象与目标:初始使用RGB阈值分割,发现当阳光从窗户射入时,地面反光导致红色区域误检率高达40%。目标是将误检率降至5%以下,同时保持30fps处理速度。
关键参数与调试过程:
- 第一步:将图像从RGB565转换为HSV(使用查表法,表存于Flash)。转换后,H通道对光照的敏感度显著降低。
- 第二步:设定HSV阈值:H∈[0,8]∪[172,180],S∈[100,255],V∈[50,255]。通过串口打印实时HSV值,手动调整阈值范围。
- 第三步:对二值化图像进行连通域标记(使用两遍扫描算法),计算最大连通域的质心和面积。若面积小于50像素,则视为噪声忽略。
- 第四步:将质心坐标从320×240映射到[-1,1]范围,作为PID控制器的输入。
结果对比:改进后,误检率从40%降至3%,处理帧率稳定在28fps(受限于摄像头帧率)。CPU占用率约65%,仍有空间运行避障逻辑。
风险与代价:查表法消耗128KB Flash,对于1MB Flash的ESP32-S3可接受。但若使用更低端芯片(如STM32F103,512KB Flash),则需改用简化整数计算法,牺牲部分精度。
4.6 总结与工程复盘
视觉感知基础的核心在于数据流管理。从采集到特征提取,每一步都要问三个问题:数据量是否过大?计算是否可定点化?特征是否对光照鲁棒?在TinyML机器人中,没有“万能”的视觉方案,只有基于硬件约束和任务需求的最优平衡。建议读者在开发初期,先使用PC端Python脚本验证算法效果,再逐步移植到嵌入式平台,并利用MCU的硬件加速器(如DMA、SIMD指令)优化热点函数。最后,务必在真实光照环境下进行充分测试,因为实验室的荧光灯和户外的自然光对颜色特征的影响截然不同。