2、基础知识:TinyML模型输出的原始形式(分类概率、回归值、检测框等)与常见后处理目标
TinyML模型在MCU、DSP或低功耗NPU上完成推理后,产生的只是一组张量(Tensor)数据。这些数据是模型对输入样本的数学映射结果,尚未形成可供业务系统直接使用的决策指令。理解模型输出的原始形式及其物理含义,是设计后处理流程的前提。本章将系统梳理分类、回归、检测、分割等常见任务的输出结构,并明确后处理的核心目标——将“数值”转化为“动作”。
2.1 分类任务的输出:概率向量与logits
核心原理:图像分类、关键词识别(KWS)、异常检测等任务,模型最后一层通常输出一个长度为N的向量(N为类别数)。若经过Softmax激活,每个元素取值范围为[0,1]且总和为1,代表模型对输入属于各类别的置信度。若输出层为全连接层且未加激活(即logits),数值范围可为任意实数,需配合Softmax或Argmax使用。
判断方法:在TinyML场景中,由于MCU浮点能力有限,常使用量化后的int8或uint8输出。此时需要记录零点(zero_point)和缩放系数(scale),将量化值反量化为浮点概率。例如TensorFlow Lite Micro的输出张量,其q参数存储在tensor.quantization_params中。
// 伪代码:反量化分类概率
float dequantize(uint8_t q_val, float scale, int zero_point) {
return ( (float)q_val - (float)zero_point ) * scale;
}
// 取最大概率类别
uint8_t class_id = argmax(output_tensor, num_classes);
案例拆解:以关键词识别“是/否/静音”三分类为例,模型输出为3个int8值。若反量化后得到[0.2, 0.7, 0.1],则最大概率为“是”。但若阈值设为0.6,则0.7通过;若环境噪声导致输出[0.4, 0.45, 0.15],则最大概率不足阈值,应判定为“不确定”,避免误触发。
2.2 回归任务的输出:连续数值与多维坐标
核心原理:回归任务输出一个或多个连续值,例如温度预测、距离估计、人体关键点坐标(x,y)、电机转速等。输出层通常为线性激活(无激活函数),数值范围取决于数据归一化方式。常见做法是输出归一化到[0,1]或[-1,1]的值,后处理时再映射到实际物理范围。
操作流程:
- 确认输出张量的维度(如1x2表示两个坐标值)。
- 反量化(若模型为量化模型)。
- 乘以缩放系数并加上偏移量,还原为物理值。
- 应用限幅(clamp),防止超出合理范围。
| 任务类型 | 输出维度 | 典型后处理 | 示例 |
|---|---|---|---|
| 温度预测 | 1 | 限幅、EMA平滑 | 输出0.65 → 映射为65°C |
| 人体关键点 | 17x2 | 坐标缩放、连接线绘制 | 输出(0.3,0.8) → 像素(96,256) |
| 距离估计 | 1 | 中值滤波、阈值判断 | 输出0.42 → 距离0.42m |
常见误区:忽略输出值的归一化基准。例如训练时若将温度除以100进行归一化,则推理输出0.65需乘以100才能得到65°C。若忘记反归一化,后续所有阈值判断将完全失效。
2.3 目标检测输出:检测框、类别与置信度
核心原理:检测模型(如MobileNet SSD、YOLO-Tiny)输出多个候选框,每个框包含:边界框坐标(x,y,w,h)、类别概率、置信度分数。在TinyML中,输出张量通常被展平为一维数组,需要按固定步长解析。例如SSD输出格式为:[num_detections, (y1,x1,y2,x2, class_id, score)]。
判断方法:解析检测框时需注意坐标系的归一化方式。常见两种:中心点坐标(cx,cy,w,h)或角点坐标(y1,x1,y2,x2)。后处理需将归一化坐标乘以图像宽高得到像素坐标,再进行NMS(非极大值抑制)去除重叠框。
// 解析SSD输出(假设输出为浮点数组)
for (int i = 0; i < num_detections; i++) {
float y1 = output[i*7 + 0] * img_height;
float x1 = output[i*7 + 1] * img_width;
float y2 = output[i*7 + 2] * img_height;
float x2 = output[i*7 + 3] * img_width;
int class_id = (int)output[i*7 + 4];
float score = output[i*7 + 5];
if (score > conf_threshold) {
// 保存候选框
}
}
案例拆解:在MCU上运行人员检测,输入图像为96x96,模型输出5个候选框。其中两个框IoU为0.7,置信度分别为0.8和0.5。NMS将保留高置信度框,抑制低置信度框。若阈值设为0.5,则最终输出1个有效框,触发“有人进入”事件。
2.4 分割与异常检测输出:逐像素掩码与重构误差
核心原理:语义分割模型输出与输入同分辨率的逐像素类别概率图;异常检测模型(如自编码器)输出重构误差图或异常分数。在TinyML中,由于算力限制,分割输出通常下采样至原图的1/8或1/16,后处理需进行上采样(最近邻或双线性插值)恢复至原尺寸。
操作流程:
- 解析输出张量,每个像素位置包含C个类别概率(C为类别数)。
- 对每个像素执行Argmax,得到类别ID。
- 可选:应用条件随机场(CRF)或中值滤波平滑边缘。
- 将类别ID映射为颜色或业务标签。
常见误区:直接对量化输出做Argmax,忽略量化误差导致的类别边界噪声。建议先对概率做3x3中值滤波,再取Argmax。
2.5 后处理的核心目标:从数值到可靠决策
核心原理:后处理的目标可归纳为四个层次:去伪(降低误报)、存真(提高召回)、平滑(消除抖动)、映射(绑定动作)。在资源受限的TinyML设备上,后处理必须在几毫秒内完成,且不能引入过多计算开销。
判断方法:设计后处理流水线时,需根据业务容忍度选择策略:
| 业务场景 | 误报代价 | 漏报代价 | 推荐策略 |
|---|---|---|---|
| 火灾报警 | 高(消防出动) | 极高(生命危险) | 高阈值+连续N帧确认 |
| 手势识别 | 低(可重试) | 中(体验差) | 低阈值+滑动窗口投票 |
| 电机故障检测 | 中(停机检查) | 高(设备损坏) | EMA平滑+迟滞比较 |
案例拆解:工业设备振动监测,模型输出异常概率。若单次概率超过0.7即报警,则可能因随机噪声误报。采用“连续3次超过0.7才报警”的投票策略,误报率降低80%,但报警延迟增加约300ms(假设推理间隔100ms)。若设备允许此延迟,则策略有效。