3、数据集规划:任务定义、类别设计、样本数量估算、场景覆盖与平衡性考虑
在TinyML视觉项目启动之初,最容易被忽视却又决定项目成败的环节,便是数据集规划。许多开发者习惯先收集一批图片、快速标注、训练模型,直到模型在真实场景中频繁误判时,才意识到数据层面的结构性缺陷——类别定义模糊、样本分布失衡、场景覆盖不足。本章将系统讲解在动手拍摄之前,如何完成一份严谨的数据集规划方案,涵盖任务定义、类别体系设计、样本数量估算、场景覆盖策略与平衡性控制五个核心环节。
上图展示了数据集规划的五步闭环流程。需要特别强调的是,这五个步骤并非一次性完成,而是需要在项目推进过程中持续迭代。例如,当模型在验证集上出现某一类别的混淆时,往往需要回溯到类别定义或场景覆盖层面进行补充采集。下面逐一展开每个环节的具体操作方法。
3.1 任务定义:明确模型“做什么”与“怎么做”
核心原理:任务定义是数据集规划的起点,它决定了后续所有数据工作的形态。TinyML视觉任务通常分为三类:图像分类(判断整张图片属于哪个类别)、目标检测(定位并分类图中多个物体)、语义分割(对每个像素进行分类)。三者在数据标注格式、样本数量需求、模型复杂度上差异巨大。例如,一个“识别流水线上是否有缺陷零件”的任务,如果只需要判断“有/无缺陷”,属于二分类;如果需要定位缺陷位置,则属于目标检测;如果需要精确到缺陷像素区域,则属于分割任务。
判断方法:在定义任务时,建议回答以下四个问题:
- 输出粒度:最终需要的是整图标签、物体框坐标,还是像素级掩码?
- 实时性要求:推理延迟是毫秒级还是秒级?这决定了模型输入分辨率与骨干网络选择。
- 部署硬件:MCU的算力(如Cortex-M4/M7/A系列)与内存(通常几十KB到几MB)直接限制模型复杂度。
- 错误容忍度:误报和漏报哪个代价更高?例如安全监控中漏报的代价远高于误报。
以智能家居中“识别宠物是否在沙发上”为例,若定义为二分类任务,只需采集“有宠物/无宠物”两类图片;若定义为检测任务,则需要标注宠物的边界框,数据量需求增加3-5倍,且标注成本显著上升。因此,在满足需求的前提下,应选择最简单的任务形式。
3.2 类别设计:构建互斥且完整的标签体系
核心原理:类别设计是数据集规划中最需要领域知识的一环。一个优秀的类别体系应满足三个原则:互斥性(任何一张图片只能属于一个类别)、完整性(所有可能出现的情况都有归属类别)、粒度适中(类别数量与模型能力、标注成本相匹配)。
操作流程:类别设计通常遵循以下步骤:
- 列出所有可能出现的视觉状态:例如工业质检中,零件可能有“正常”、“划痕”、“凹陷”、“毛刺”四种状态。
- 合并相似状态:如果“划痕”和“擦伤”在视觉上难以区分且对业务影响相同,应合并为一个类别。
- 定义“其他/背景”类别:对于分类任务,必须包含“背景”或“无关”类别,否则模型会对未见过的内容强行归类。
- 验证互斥性:请两位标注员对同一批测试图片进行标注,计算标注一致性(如Cohen's Kappa系数),若低于0.8则说明类别定义存在歧义。
| 设计维度 | 反例(不推荐) | 正例(推荐) | 原因说明 |
|---|---|---|---|
| 类别粒度 | “狗”、“猫”、“其他动物” | “拉布拉多”、“金毛”、“其他犬种”、“猫”、“其他” | 过粗的类别会掩盖子类差异,过细则增加标注难度与样本需求 |
| 互斥性 | “室内”、“夜晚”、“有人” | “室内白天有人”、“室内夜晚有人”、“室内无人”、“室外” | 原类别可同时成立,导致标注员无所适从 |
| 完整性 | “苹果”、“香蕉” | “苹果”、“香蕉”、“其他水果”、“非水果” | 缺少“其他”类别会导致模型对未知物体产生高置信度误判 |
案例拆解:某智慧农业项目需要识别田间害虫。初始类别设计为“蚜虫”、“飞虱”、“叶蝉”三类。但在试标注中发现:① 害虫若虫阶段与成虫外观差异极大;② 部分害虫体型微小(<2mm),在640×480分辨率下难以辨认;③ 田间常见蜘蛛、瓢虫等益虫被误归为“其他”。经过复盘,最终将类别调整为“蚜虫成虫”、“蚜虫若虫”、“飞虱”、“叶蝉”、“益虫”、“其他昆虫”、“背景”七类,并规定最小标注尺寸为10×10像素。调整后标注一致性从0.72提升至0.91,模型准确率提升12%。
3.3 样本数量估算:从“经验值”到“公式化”
核心原理:样本数量并非越多越好,而是取决于任务复杂度、模型容量、类别间相似度、拍摄条件稳定性四个因素。对于TinyML场景,由于模型参数量小(通常<1M),数据量需求相对传统深度学习更低,但仍需遵循“每类样本量下限”原则。
估算方法:可采用以下经验公式作为起点:
每类最小样本量 = 500 + 50 × (类别数 - 2) + 100 × 场景变化维度
其中“场景变化维度”指光照条件数、角度变化数、背景类型数、距离档位数之和。例如,一个3分类任务,涉及2种光照(白天/夜晚)、3个角度(正面/侧面/俯视)、2种背景(室内/室外),则场景变化维度=2+3+2=7,每类最小样本量=500+50×(3-2)+100×7=1250张。
- 二分类(如“有缺陷/无缺陷”),固定光照与角度:每类300-500张即可达到90%+准确率。
- 5-10类物体识别,多场景变化:每类建议800-1500张。
- 目标检测任务:每类目标实例数(注意不是图片数)建议≥2000个,且每张图片中目标数量应有变化。
注意事项:样本量估算还需考虑类别不均衡的“长尾效应”。若某一类天然出现频率低(如工业缺陷中的“罕见裂纹”),需要额外采集或使用数据增强合成样本。此外,验证集与测试集应独立于训练集采集,且分布需尽量贴近真实部署场景,建议每类验证集≥50张、测试集≥100张。
3.4 场景覆盖:构建多维度的拍摄矩阵
核心原理:场景覆盖的目标是让训练数据分布尽可能覆盖推理时的真实数据分布。TinyML设备通常部署在固定位置(如摄像头固定于天花板)或移动设备上(如手机),其视角、光照、背景变化有一定规律。场景覆盖的核心是识别并控制“变化维度”。
操作流程:建议建立“场景覆盖矩阵”,将每个变化维度作为矩阵的一轴,确保每个组合都有样本覆盖。
| 变化维度 | 典型取值 | 对模型的影响 | 建议覆盖策略 |
|---|---|---|---|
| 光照强度 | 强光/正常/弱光/逆光 | 影响边缘检测与颜色判断 | 每种光照至少占总数10% |
| 拍摄角度 | 俯视/平视/仰视/侧视 | 影响形状特征提取 | 按实际部署角度加权分配 |
| 拍摄距离 | 近(10cm)/中(30cm)/远(1m) | 影响目标像素尺寸 | 确保最小目标尺寸≥模型输入尺寸的1/4 |
| 背景复杂度 | 纯色/简单纹理/杂乱 | 影响前景分割难度 | 至少包含20%杂乱背景 |
| 运动模糊 | 静止/轻微/严重 | 影响特征清晰度 | 模拟运动场景拍摄或后期合成 |
实战场景:某智能门铃项目需要识别“人”、“宠物”、“车辆”三类目标。初始数据集全部在白天、固定角度拍摄,模型在夜间测试时准确率从92%骤降至61%。分析发现夜间红外补光导致图像为灰度且对比度降低,且门铃安装高度(1.2米)导致俯视角度与训练数据(平视)差异明显。解决方案是:① 增加夜间红外模式拍摄样本500张/类;② 模拟门铃实际安装高度,以俯视15°-30°角度重新采集;③ 加入运动模糊模拟(行人快速经过)。补充后夜间准确率回升至87%。
3.5 平衡性控制:从数据采集到训练策略的双重保障
核心原理:类别不平衡是TinyML视觉任务中最常见的陷阱。当某一类样本数量远超其他类时,模型会倾向于将模糊样本预测为多数类,导致少数类召回率极低。平衡性控制需要从数据采集和训练策略两个层面同时入手。
数据层面策略:
- 采集配额制:为每个类别设定最低采集数量,并每日统计进度,防止“采集偏好”导致失衡。
- 重采样:对少数类进行过采样(复制或轻微增强),对多数类进行欠采样(随机剔除)。
- 合成数据:使用旋转、平移、亮度调整、添加噪声等方式对少数类进行增强,但需注意增强后的样本不能与原始样本过于相似。
训练层面策略:
- 加权损失函数:在交叉熵损失中为少数类分配更高权重,例如权重=总样本数/(类别数×该类样本数)。
- Focal Loss:适用于极端不平衡场景(如缺陷检测中正负样本比1:1000),通过调制因子降低易分类样本的损失贡献。
- 阈值调整:训练完成后,在验证集上搜索最优分类阈值,而非默认0.5。
案例复盘:一个垃圾分类项目初始数据集中,“易拉罐”类有3000张,“玻璃瓶”类仅200张。模型训练后,玻璃瓶的召回率仅为45%,大量玻璃瓶被误判为易拉罐。分析发现两类在形状和反光特性上相似。采取的措施包括:① 将玻璃瓶类样本通过旋转、亮度变化增强至800张;② 在损失函数中将玻璃瓶权重设为3.0;③ 在验证集上调整分类阈值,使玻璃瓶的召回率提升至78%,代价是易拉罐误报率上升5%。最终通过增加真实玻璃瓶采集至600张,并引入“反光纹理”特征,将玻璃瓶召回率稳定在85%以上,同时易拉罐误报率控制在2%以内。
总结复盘:数据集规划不是一次性的文档编写,而是贯穿项目始终的动态过程。建议在项目启动时用1-2天完成规划文档,明确任务定义、类别表、样本量矩阵、场景覆盖清单和平衡性指标;在数据采集过程中每周复查各类别数量与场景分布;在模型初训后,通过混淆矩阵分析定位薄弱类别,回溯数据规划进行补充。记住:数据规划的质量,决定了模型性能的上限;而模型调参只是在逼近这个上限。