2. 视觉链路基础

TinyML视觉系统与云端视觉系统最大的差异在于资源边界:内存以KB计、算力以GOPS计、功耗以mW计,而延迟要求却往往在数十毫秒内。理解视觉链路的基本流程与延迟构成,是进行延迟优化的前提。只有知道时间花在哪里、为什么花在那里,才能做出有效的拆分与并行决策。本章将视觉链路拆解为采集、预处理、推理、后处理四个阶段,逐一分析其功能职责、延迟来源与测量方法,并给出一个完整的延迟拆解案例。

视觉链路延迟构成与优化切入点 ① 图像采集 传感器曝光 + 读出 MIPI/DVP传输 DMA搬运至内存 ② 预处理 缩放/裁剪/格式转换 归一化/均值减除 数据重排(NHWC→NCHW) ③ 推理 卷积/全连接/激活 内存访问瓶颈 算子调度开销 ④ 后处理 阈值/非极大抑制 分类映射/坐标换算 结果序列化 5~30ms 1~8ms 10~100ms 0.5~3ms 典型延迟占比(总延迟约50ms) 优化切入点 采集侧 降低分辨率/帧率 ROI窗口/双缓冲 预处理侧 硬件加速/查表法 算子融合/定点化 推理侧 模型剪枝/量化 算子替换/内存复用 后处理侧 简化NMS/提前退出 定点运算替代浮点

2.1 图像采集:从光子到内存的延迟链

图像采集是视觉链路的第一环,其延迟由传感器曝光时间、像素读出时间、接口传输时间和DMA搬运时间四部分构成。曝光时间取决于环境光照和目标帧率,在低照度场景下可能需要20-30ms才能积累足够光子;读出时间则与传感器分辨率、ADC位数和通道数直接相关。以OV2640为例,200万像素、10位ADC、4路并行读出时,帧读出时间约为15ms。MIPI接口传输时间与时钟频率和通道数成反比,而DMA搬运时间则取决于系统总线带宽和内存控制器效率。

在实际嵌入式系统中,采集延迟往往被低估。许多开发者只关注传感器标称帧率,却忽略了从"请求帧"到"数据可用"之间的完整时序。例如,一个标称30fps的传感器,其帧间隔为33ms,但实际曝光可能在帧间隔的前半段完成,后半段用于读出和传输。如果应用在帧间隔中点发起采集请求,实际等待时间可能接近一个完整帧周期。

经验提醒:测量采集延迟时,应使用GPIO翻转或时间戳寄存器标记曝光起始时刻,而非仅依赖传感器中断。许多传感器支持帧同步信号(FSYNC)输出,可精确测量曝光到数据就绪的时间差。

2.2 预处理:被低估的隐藏延迟

预处理阶段包括色彩空间转换(YUV→RGB)、缩放、裁剪、归一化、数据类型转换(uint8→float32)以及数据重排(NHWC→NCHW)。这些操作看似简单,但在资源受限的MCU上,其延迟可能超过推理延迟的30%。原因在于:预处理涉及大量内存读取-修改-写入操作,且通常以逐像素方式执行,无法充分利用CPU的SIMD指令或硬件加速器。

以320×240 RGB图像转换为模型输入张量为例,若模型需要224×224×3的float32输入,预处理需要完成:缩放(涉及双线性插值)、格式转换(uint8→float32)、归一化(除以255并减均值)、数据重排。在Cortex-M7 @ 200MHz上,这一过程大约需要5-8ms,而一个MobileNetV2量化模型推理仅需15-20ms。预处理延迟占比接近30%,是优化的重要目标。

预处理操作 计算量(MAC) 内存访问量 典型延迟(@200MHz)
双线性缩放(320×240→224×224) 约15万次乘法 读原图+写目标图 2-3ms
RGB→RGB归一化+类型转换 约15万次运算 读+写各150KB 1-2ms
NHWC→NCHW重排 0(纯搬运) 读+写各150KB 1-2ms
合计 约30万次 约600KB 4-7ms

预处理优化的核心思路是算子融合:将缩放、归一化、类型转换合并为单次遍历操作,避免中间结果的多次内存写入。例如,在缩放的同时完成归一化,将浮点乘法改为定点移位运算,可减少约40%的预处理延迟。

2.3 推理:计算与内存的双重瓶颈

推理延迟是视觉链路中最受关注的部分,但它的构成远比"模型计算量"复杂。推理延迟 = 算子计算时间 + 内存访问时间 + 调度开销。在TinyML场景中,内存访问时间往往超过计算时间。以3×3卷积为例,若输入特征图为32×32×16,输出为32×32×32,计算量为约47万次MAC,在Cortex-M4 @ 80MHz上约需6ms;但若采用im2col方式实现,需要额外分配约200KB的中间缓冲区,内存访问量增加3倍,实际延迟可能达到10ms以上。

调度开销同样不可忽视。一个包含50个算子的模型,若每个算子有10μs的调度开销,总开销为0.5ms,占推理延迟的3-5%。在实时性要求高的场景中,可通过算子融合(如Conv+BN+ReLU合并)减少调度次数,或使用静态图执行引擎避免动态图解释开销。

风险提示:不要仅凭模型参数量或FLOPs估算推理延迟。实际延迟受内存带宽、缓存命中率、算子实现方式影响极大。同一模型在不同框架(TFLite Micro vs CMSIS-NN)上的延迟差异可达2-3倍。

2.4 后处理:从张量到决策的最后一跳

后处理阶段将模型输出的原始张量转换为应用可用的结果。对于分类任务,后处理仅需argmax和阈值判断,延迟可忽略;但对于目标检测任务,后处理包括置信度过滤、边界框解码、非极大抑制(NMS)等操作,延迟可能达到2-5ms。NMS的复杂度为O(n²),当候选框数量超过100时,排序和IoU计算将消耗大量CPU周期。

后处理优化的常用策略包括:在模型输出端减少候选框数量(如使用稀疏预测头)、将NMS简化为贪心近似、使用定点IoU计算替代浮点运算。对于资源极度受限的场景,可考虑将NMS部分逻辑移至上位机,仅传输原始检测结果。

2.5 案例拆解:智能门锁人脸检测延迟优化

某智能门锁产品使用ESP32-S3(240MHz双核,512KB SRAM)运行人脸检测模型,原始视觉链路延迟为180ms,无法满足"从唤醒到识别完成小于150ms"的产品需求。初始延迟分布如下:

  • 图像采集(OV2640,800×600,YUV422):45ms(曝光20ms + 读出15ms + 传输10ms)
  • 预处理(缩放至160×120 + RGB888转换 + 归一化):28ms
  • 推理(MobileNetV2-0.25量化,输入160×120×3):95ms
  • 后处理(置信度过滤 + 坐标映射):12ms

优化过程分为三步。第一步,将传感器分辨率降至400×300,曝光时间从20ms降至10ms(通过提高ISO补偿),采集延迟降至25ms。第二步,将预处理中的缩放与格式转换融合,并利用ESP32-S3的SIMD指令优化,延迟从28ms降至9ms。第三步,将模型输入从160×120降至128×128,并采用深度可分离卷积的定点优化实现,推理延迟从95ms降至58ms。后处理通过简化NMS(仅保留Top-5候选框),延迟从12ms降至3ms。

优化后总延迟为25+9+58+3=95ms,满足产品需求。整个优化过程中,延迟拆解表发挥了关键作用:它帮助团队识别出采集和预处理是"隐藏瓶颈",而非仅关注推理模型本身。

阶段 优化前 优化措施 优化后 降幅
采集 45ms 降分辨率+提ISO 25ms 44%
预处理 28ms 算子融合+SIMD 9ms 68%
推理 95ms 输入裁剪+定点优化 58ms 39%
后处理 12ms 简化NMS 3ms 75%

复盘经验:延迟优化不应只盯着推理模型,采集和预处理往往存在更"廉价"的优化空间。但降分辨率会牺牲检测精度,需通过模型蒸馏或数据增强补偿;提高ISO会引入噪声,需在图像质量与延迟之间找到平衡点。

2.6 常见误区与总结

在视觉链路延迟分析中,常见误区包括:只测平均延迟不测P95/P99(实时系统应关注最坏情况);忽略缓存效应(同一算子在不同数据布局下延迟差异巨大);将传感器帧率等同于采集延迟(帧率是稳态指标,采集延迟是瞬态指标);未考虑DMA与CPU的并行性(合理使用双缓冲可隐藏采集延迟)。

正确的延迟拆解方法应遵循以下流程:首先,使用逻辑分析仪或GPIO标记各阶段起止时间,获取精确的延迟分布;其次,识别占比超过15%的阶段作为优化目标;再次,针对目标阶段进行微基准测试,区分计算瓶颈与内存瓶颈;最后,实施优化并重新测量,确保没有引入新的瓶颈。

核心结论:视觉链路延迟由采集、预处理、推理、后处理四部分构成,推理通常占比最大但并非唯一优化点。预处理和后处理在资源受限设备上可能占据30-40%的总延迟,且优化成本更低。延迟拆解应基于实测数据而非理论估算,使用GPIO标记和逻辑分析仪是获取准确延迟分布的最可靠手段。