欢迎光临
我们一直在努力

深入浅出TinyML 11:标签应该如何定义和检查?

标签把传感器数据连接到业务目标。标签名称相同,并不保证标注者理解相同;“异常晃动”如果没有幅值、持续时间或现场条件说明,会在数据集中形成互相冲突的样本。

标签规范应先于大规模采集完成。规范不仅列出类别名称,还要定义开始与结束、过渡段处理、未知状态、证据来源和版本。

标签质量的核心是可重复判断。两名标注者面对同一数据和证据,应能够得到一致结论。
完成本篇后,你应该能够

  • 把业务状态写成含义明确、互斥或有优先级的标签规范。
  • 将事件区间映射到窗口,并处理过渡、冲突、不确定和未知状态。
  • 运行标签生成器,比较多数覆盖、中心点和任意出现三种规则。
  • 标签是模型要学习的答案。答案本身含糊时,网络只能拟合标注矛盾,增加层数不会解决定义问题。

    一、先把核心关系连起来

    标签要对应可观察的业务状态

    每个类别应包含定义、纳入条件、排除条件和典型反例。标签粒度要与传感器能力匹配;数据中无法区分的两个业务状态,不应仅凭主观愿望拆成两类。

    分类任务需要明确单标签还是多标签。回归任务则要说明目标值来源、单位、测量误差和时间对齐方式。

    图1:稳定态、过渡态、不确定与未知输入需要不同处理

    事件边界决定窗口标签

    连续事件通常包含开始、稳定和结束阶段。窗口跨越两个状态时,可以使用占比规则、中心点规则或过渡标签,但选择后必须对全数据一致执行。

    标签时间戳还要考虑传感器、视频和人工记录之间的时钟偏差。固定偏差可以校正,随机偏差需要进入标签不确定性。

    二、未知与不确定不能被强制归类

    数据不属于任何已知类别时,应标为UNKNOWN或进入待复核队列。强行放入最接近的类别会污染边界,让模型在现场对新模式给出过高置信度。

    证据不足与真正未知要分开。不确定标签反映标注过程缺乏依据,未知标签反映业务类别集合没有覆盖该输入。

    表1:标签定义文档的必要字段

    字段应写内容避免的问题
    类别定义 物理含义、纳入和排除条件 同名不同义
    时间边界 开始、结束与过渡规则 窗口标签漂移
    证据 工况记录、视频或控制信号 仅凭波形猜测
    未知策略 UNKNOWN与UNCERTAIN处理 强制错误归类
    版本 修改原因与生效范围 模型和标签失配

    三、一致性检查与版本管理

    可以抽取一批样本由两名标注者独立标注,再统计一致率和分歧类别。分歧应回到规范修订,而非简单由多数票掩盖。

    标签定义变化后必须提升版本,并记录哪些样本需要重标。模型报告要绑定标签版本,否则不同模型指标无法公平比较。

    JSON:一条可追溯标签记录

    {   "sample_id": "device03_session17_0042",   "label": "PERIODIC_VIBRATION",   "label_version": "2.1",   "start_us": 18420000,   "end_us": 19420000,   "evidence": "motor_controller_state=RUN",   "reviewer": "reviewer_b",   "quality": "confirmed" }

    标签规范要写到两个标注者能独立得到相同结果

    每个类别至少要有定义、包含条件、排除条件和边界例子。例如“稳定运行”可定义为设备达到额定转速后持续2秒,排除启动、停机、传感器饱和和维护操作。只给一个类别名称,标注者会按自己的经验解释。

    状态可以重叠时必须定义优先级。设备既有松动又处于启动阶段,标签是双标签、主故障优先、启动优先还是UNKNOWN?单标签分类器每个窗口只能给一个目标,数据规范必须先解决冲突。

    过渡状态常包含多个类别的混合特征。把过渡窗口强制分给前一状态或后一状态,会扩大类内差异。可以单独标为TRANSITION、从训练中排除但保留测试,或根据业务接受边界制定一致规则。

    一份可执行标签说明的字段

    字段示例作用
    定义 额定转速稳定2秒后 限定状态含义
    排除 启动、停机、饱和窗口 减少类内矛盾
    优先级 安全故障高于普通状态 解决重叠
    证据 工控状态、人工记录、时间戳 支持追溯

    窗口标签规则会改变模型问题本身

    中心点规则用窗口中心时刻的状态作为标签,适合持续状态并使时间对齐简单;多数覆盖规则选择占比最大的状态,能够容忍边界;任意出现规则只要窗口内出现事件就标正类,适合高召回告警,但会让含很短事件的窗口与完整事件共享标签。

    需要设置最小纯度。多数类别只占55%时,窗口仍包含大量其他状态。可以要求主类别覆盖至少80%,否则标为TRANSITION或UNCERTAIN。阈值要写入数据版本,并在训练与评价报告中记录。

    标注质量应通过抽样复核和一致性统计监控。对同一批片段让两名标注者独立判断,统计一致率和具体分歧类型。只看总体一致率会掩盖少数关键类别,应按类别列出分歧。

    窗口纯度 = 主标签覆盖时长 / 窗口时长 若纯度 < 0.8,则示例策略返回TRANSITION,而非强制归入主类。

    四、落地检查

  • 每个类别写明物理定义、纳入条件和排除条件。
  • 统一事件开始、结束和跨边界窗口的标注规则。
  • 区分UNKNOWN、UNCERTAIN和正常过渡状态。
  • 抽取样本做双人独立标注并处理分歧。
  • 模型、样本和评价报告都绑定标签规范版本。
  • 动手:把事件时间轴转换成窗口标签

    脚本定义0~6秒的状态时间轴,并生成2秒窗口、1秒步长。每个窗口计算各状态覆盖时长;主状态覆盖不足80%时返回TRANSITION。这样可以直接审计每个标签从何而来。

    实验环境与输入

    • Python 3标准库。
    • 保存为 `label_windows.py` 并运行。
    • 时间区间采用左闭右开 `[start, end)`,避免边界重复计算。

    按顺序完成实验

  • 运行脚本,查看每个窗口的覆盖比例和最终标签。
  • 确认跨越normal与fault边界的窗口被标为TRANSITION。
  • 把纯度阈值从0.8改成0.5,观察强制标签数量增加。
  • 实现中心点规则并与覆盖规则逐窗比较,记录不同标签的位置。
  • 可直接运行:基于时间覆盖和纯度的窗口标注

    from collections import defaultdict   TIMELINE = [     (0.0, 2.4, "normal"),     (2.4, 3.0, "transition"),     (3.0, 5.2, "fault"),     (5.2, 6.0, "unknown"), ] WINDOW = 2.0 STEP = 1.0 MIN_PURITY = 0.80   def overlap(a0, a1, b0, b1):     return max(0.0, min(a1, b1) – max(a0, b0))   def label_window(start, end):     coverage = defaultdict(float)     for left, right, label in TIMELINE:         coverage[label] += overlap(start, end, left, right)     winner = max(coverage, key=coverage.get)     purity = coverage[winner] / (end – start)     final = winner if purity >= MIN_PURITY else "TRANSITION"     return final, purity, dict(coverage)   start = 0.0 while start + WINDOW <= 6.0:     end = start + WINDOW     label, purity, coverage = label_window(start, end)     print(f"[{start:.1f}, {end:.1f}) -> {label:10s} "           f"purity={purity:.0%} coverage={coverage}")     start += STEP

    先读懂代码中的关键路径

  • overlap统一使用左闭右开区间,避免相邻事件在同一边界重复贡献时长。
  • coverage保留每类覆盖秒数,最终标签之外仍有可审计证据。
  • 纯度阈值不足时返回TRANSITION,防止55%对45%的混合窗口被强制当作稳定类。
  • 窗口生成和标签映射使用同一时间基准;真实项目还要校准业务日志与传感器时钟。
  • 你应该观察到什么

    • 完全落在稳定区间的窗口获得normal或fault,纯度为100%。
    • 跨边界窗口的主类别不足80%时输出TRANSITION。
    • 降低纯度阈值后普通类别增多,但类内混合也更严重。

    成功标准

  • 标签规范明确时间区间的开闭规则、纯度阈值和冲突优先级。
  • 每个窗口能输出覆盖证据,而非只保存最终字符串。
  • UNKNOWN、UNCERTAIN和TRANSITION在业务含义上被区分。
  • 失败时从哪里查起

    标签生成问题排查

    现象原因检查
    边界点重复标记 相邻区间都包含终点 统一使用左闭右开区间
    过渡样本过多 窗口太长或边界太密 联合检查窗口与事件定义
    标注者分歧集中 类别排除条件不足 补充反例和优先级

    完成自动映射后仍要抽样查看原始波形与业务日志,验证时间同步和规则是否符合真实事件。

    把实验迁移到真实MCU项目

    标签通常离线产生,但固件状态日志决定标注质量。设备应输出状态变化的单调时间戳、原因码和版本,避免人工凭视频大致对齐。

    UNKNOWN用于未覆盖输入,TRANSITION用于已知状态边界,UNCERTAIN用于证据不足。三者可以在训练中采用不同处理,不能合并成一个含义模糊的其他类。

    标签版本变更后要重建样本索引。直接在旧窗口文件上覆盖标签会失去历史可复现性;保留原时间轴、规则版本和生成脚本,才能比较两版标签对模型的影响。

    把结果再向前推进一步

  • 为你的每个类别补写一个包含例和两个排除例。
  • 比较中心点、多数覆盖和任意出现规则对误报与漏报的影响。
  • 设计两名标注者的复核表,按类别统计分歧而非只给总一致率。
  • 收束:标签规范需要同时定义类别、时间边界、未知状态、证据和版本。清晰标签能够减少数据冲突,也为现场拒识和后续维护留下入口。

    参考资料: TensorFlow Lite Micro 官方代码仓库 更新时间:2026 年 8 月 5 日

    赞(0)
    未经允许不得转载:171主机测评 » 深入浅出TinyML 11:标签应该如何定义和检查?
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址