标签把传感器数据连接到业务目标。标签名称相同,并不保证标注者理解相同;“异常晃动”如果没有幅值、持续时间或现场条件说明,会在数据集中形成互相冲突的样本。
标签规范应先于大规模采集完成。规范不仅列出类别名称,还要定义开始与结束、过渡段处理、未知状态、证据来源和版本。
| 标签质量的核心是可重复判断。两名标注者面对同一数据和证据,应能够得到一致结论。 |
| 完成本篇后,你应该能够
标签是模型要学习的答案。答案本身含糊时,网络只能拟合标注矛盾,增加层数不会解决定义问题。 |
一、先把核心关系连起来
标签要对应可观察的业务状态
每个类别应包含定义、纳入条件、排除条件和典型反例。标签粒度要与传感器能力匹配;数据中无法区分的两个业务状态,不应仅凭主观愿望拆成两类。
分类任务需要明确单标签还是多标签。回归任务则要说明目标值来源、单位、测量误差和时间对齐方式。

图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,而非强制归入主类。 |
四、落地检查
动手:把事件时间轴转换成窗口标签
脚本定义0~6秒的状态时间轴,并生成2秒窗口、1秒步长。每个窗口计算各状态覆盖时长;主状态覆盖不足80%时返回TRANSITION。这样可以直接审计每个标签从何而来。
实验环境与输入
- Python 3标准库。
- 保存为 `label_windows.py` 并运行。
- 时间区间采用左闭右开 `[start, end)`,避免边界重复计算。
按顺序完成实验
可直接运行:基于时间覆盖和纯度的窗口标注
|
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 |
先读懂代码中的关键路径
你应该观察到什么
- 完全落在稳定区间的窗口获得normal或fault,纯度为100%。
- 跨边界窗口的主类别不足80%时输出TRANSITION。
- 降低纯度阈值后普通类别增多,但类内混合也更严重。
成功标准
失败时从哪里查起
标签生成问题排查
| 边界点重复标记 | 相邻区间都包含终点 | 统一使用左闭右开区间 |
| 过渡样本过多 | 窗口太长或边界太密 | 联合检查窗口与事件定义 |
| 标注者分歧集中 | 类别排除条件不足 | 补充反例和优先级 |
完成自动映射后仍要抽样查看原始波形与业务日志,验证时间同步和规则是否符合真实事件。
把实验迁移到真实MCU项目
标签通常离线产生,但固件状态日志决定标注质量。设备应输出状态变化的单调时间戳、原因码和版本,避免人工凭视频大致对齐。
UNKNOWN用于未覆盖输入,TRANSITION用于已知状态边界,UNCERTAIN用于证据不足。三者可以在训练中采用不同处理,不能合并成一个含义模糊的其他类。
标签版本变更后要重建样本索引。直接在旧窗口文件上覆盖标签会失去历史可复现性;保留原时间轴、规则版本和生成脚本,才能比较两版标签对模型的影响。
把结果再向前推进一步
收束:标签规范需要同时定义类别、时间边界、未知状态、证据和版本。清晰标签能够减少数据冲突,也为现场拒识和后续维护留下入口。
参考资料: TensorFlow Lite Micro 官方代码仓库 更新时间:2026 年 8 月 5 日
![【Bug已解决】[WebNN][WebGPU EP] Device tensor can not be properly initialized 解决方案-171主机测评](https://www.171host.com/wp-content/uploads/2026/08/20260823213208-6a8b66d855b21-220x150.png)

