
ESPectre ML 数据契约训练数据与提升回放分离的架构决策与实践【免费下载链接】espectreWi-Fi CSI motion sensing for ESP32. C SDK, ESPHome, Native, and Matter frontends, browser tools, and a CLI for the full device lifecycle. GPLv3 and commercial licensing.项目地址: https://gitcode.com/GitHub_Trending/es/espectre本文以 ESPectre 仓库的架构决策记录ADRdocs/adr/2026-06-30-separate-ml-training-data-from-promotion-replays.md为主体结合 ML_TRAINING.md 训练指南、ML_DATA_COLLECTION.md 数据收集指南、data/dataset_info.json真实目录以及训练工具源码展开。面向的对象是参与 ESPectre Wi-Fi CSI 人体存在感知motion sensing模型训练的 ML 贡献者、数据集策展人与检测器维护者。读完本文你将掌握为什么“空房间”必须作为 IDLE 的一等训练域、train / selection / holdout / exclude四角色如何防止提升证据污染训练、按谱系分组交叉验证与回放安全门如何工作以及确定性种子混合增强与显式制品导出的完整约束。背景一次空房间误报引发的数据语义修正ESPectre 的部署任务把人体存在分为两类IDLE无人或无移动与MOTION有人且移动。但在采集端IDLE 实际覆盖两种物理状态empty房间内无人static_presence房间内有人但基本静止。C3 与 C6 芯片上的事故记录表明一个只用static_presence对motion训练的检测器在配对录音上表现正常却在空房间里反复出现误报。原因是模型从未在“无人但信道持续平静”的分布上见过负样本——人静立时的微小呼吸与身体晃动与完全无人的射频环境在特征空间上并不等价。修复方向是明确的将empty一并映射到 IDLE 参与训练。ADR 记录指出用empty重训后观测到的空房间失败显著减少。这一教训沉淀为项目的数据契约原则解释一个新的空房间失败应当首先视为覆盖coverage问题而不是“部署任务不包含空房间”的证据。也就是说空房间不是可选的压力测试域而是部署任务本身的一部分必须同时影响数据策展与模型提升promotion决策。与此同时ADR 还复盘了当时训练工作流的其他结构性缺陷早期候选直接在参与训练的回放录音上被选出样本内评估、合成派生数据可以跨验证折游离于其真实来源之外、单一统一目标掩盖了普通链路与低 RSSI 链路不同的物理极限、单次评估的边际使种子搜索对偶然的训练噪声过度敏感。这些问题共同指向一个目标建立一份统一的数据角色 / 谱系 / 排序 / 可复现性契约让提升证据严格不进入训练。核心决策把empty提升为 IDLE 的一等训练域ADR 采纳的第一条协议将empty与static_presence同时映射为 IDLEempty录音继续保留在训练矩阵、数据集策展与严格静默回放门quiet replay gate中。在代码中这一语义由训练工具直接固化。tools/train_ml_model.py的训练契约明确“The binary target mapsemptyandstatic_presenceto IDLE andmotionto MOTION”二进制目标将empty与static_presence映射为 IDLEmotion映射为 MOTION。数据收集指南 ML_DATA_COLLECTION.md 亦把三种标签定义为当前 v3 的主线采集目标并说明empty与static_presence共同喂给生产二分类工作流。需要注意一个细节static_presence并不是“误报的黄金真相”——在场的人可能产生真实的微移动。因此严格的无运动域是空房间录音这也是后文“静默回放门”只对empty施加零警报要求的原因。数据角色契约train/selection/holdout/exclude这是本 ADR 最核心的工程化成果。data/dataset_info.json为每一条录音分配且仅分配一个角色角色用途是否用于拟合权重train训练矩阵与按谱系分组的交叉验证是selection候选比较与部署安全门否holdout对最终胜出者的一次性最终验证否exclude保留溯源或诊断用途不参与模型选择否配套的防呆设计有三层缺失即排除训练器把没有显式dataset_role的条目一律当作exclude残缺目录无法意外进入拟合或回放。这一默认值在源码tools/lib/dataset_metadata.py中有直接定义DATASET_ROLES ADMITTED_DATASET_ROLES | {exclude}、DEFAULT_DATASET_ROLE exclude其中ADMITTED_DATASET_ROLES frozenset({train, selection, holdout})。策展必须显式声明质量校验器tools/validate_dataset_quality.py更严格——每条目录条目都必须声明dataset_role包括刻意留在exclude的条目并且永远不会自动分配角色。数据收集指南明确“add an explicitenvironmentanddataset_roleto every new entry; useexcludewhile reviewing a capture, and assigntrain,selection, orholdoutonly as a deliberate corpus decision.”配对角色必须一致dataset_metadata.py的paired_dataset_role()要求一条static_presence与其motion配对录音共享同一被采纳角色否则返回None不安全防止跨角色混用。以仓库现存的 dataset_info.json 为例可以看到真实世界的角色分配形态empty_c6_64sc_dev00007c2c6742bbac_20260712_215645_774938_0001.npzdataset_role: selection、long_recording: true——600 秒静默长录音保留给静默回放评估empty_c3_64sc_dev0000acebe64ad194_20260810_193111_666031_0001.npzdataset_role: exclude——vacation_home 环境样本保留在目录中仅作溯源static_presence_c6_64sc_dev00007c2c6742bbac_20260704_153259_586375_0001.npzdataset_role: exclude描述注明“a sustained motion-like episode contaminates the nominally static label”——标签被运动污染整对录音含其motion配对被排除。长录音的特殊约束empty录音若标记long_recording: true永不进入训练矩阵。当角色为selection或holdout时静默门会对整段录音求值并可能阻断提升角色为exclude时它仅保留给显式诊断与质量报告。保持 holdout 密封一次常规的单候选生产运行会在导出前用配置好的 selection 与 holdout 回放对最终候选求值种子搜索seed search则对每个候选只跑selection选定一个胜者后才为它打开holdout。反复在改模型的同时查阅 holdout 结果等于把 holdout 变成了 selection 数据——这是目录契约明令禁止的。按谱系分组的交叉验证合成数据不得跨折ADR 决策点 4 要求按谱系lineage分组交叉验证使每一条合成派生数据与其真实来源始终处于同一折。这是对“确定性变换不构成独立验证数据”的直接落地。训练指南中的定义是Lineage指共享足够溯源信息、因而必须留在同一验证组的一批录音Grouped cross-validation指拟合与评估折都保持每个谱系完整以减少泄漏。train_ml_model.py的 docstring 也写明其训练特性包含“Grouped cross-validation with blocked out-of-fold scoring”分组交叉验证 分块样本外评分。被拒绝的替代方案“Let synthetic derivatives cross source folds”给出了理由同一录音的确定性变换并非独立的验证数据——让它们在验证折中出现等于用记忆化冒充泛化。部署回放是绝对安全门不是排序指标ADR 决策点 5 确立部署回放deployment replays是绝对安全门。在通过安全门的候选之间才用分组 CV 的尾部指标tail metrics与逐录音比较来排序。该决策与 2026-03-08-use-host-side-validation-gates-for-detector-promotion.md 一脉相承聚合指标和分组 CV 会掩盖部署层面的失败因此提升必须经过逐录音的配对门与静默门。训练指南给出当前稳定门策略的量化形态回放类别召回原始 FP有效警报普通链路配对回放95%5%每条 static_presence 回放至多一次低 RSSI 配对压力回放90%10%不得比已导出基线更差静默empty回放N/A5%零70% 占空比配对回放同上绝对阈值同上同上警报规则先对保留配对做确定性稀疏化70% 占空比静默回放N/A5%零基于同一稀疏化后的空房间保留集其中静默empty回放的“零警报”要求只适用于 High Accuracy 检测器Lightweight 在顺序空房间测试中使用宿主侧验证 ADR 定义的有界警报预算每个空房间录音至多一次有效警报覆盖占空比下限移动到 70% 后允许的四次评估突发。static_presence回放可以使用显式警报预算因为真实微移动是合法存在的。任何弱链路回放变化仍然服从绝对压力目标与现行警报棘轮alarm ratchet。低 RSSI 弱链路保留、可见、有界而非隐藏ADR 决策点 6 规定了低 RSSI 数据的处置哲学真实的低 RSSI 采集按文档化的压力策略stress policy使用保持可见且有界不把“物理分离被压缩”当作普通链路的软件缺陷。在dataset_info.json中可以看到真实标注方式多条样本带low_rssi: true例如static_presence_c6_64sc_dev00007c2c6742bbac_20260722_191653_148862_0001.npz“AP is in hobby room”卧室采集。收集指南进一步给出量化边界流连续性准入对普通录音缺失序列超过 1% 告警、超过 3% 失败而low_rssi录音放宽到 5% 失败最大序列间隔与包间隔门保持不变。ADR 拒绝“Drop weak-link captures”理由正是它们提供了灵敏度下限附近优雅降级的实测视图。非回归边际来自测量到的种子离散度ADR 决策点 7 替换了 2026-07-27 曾采用的方向“单次评估的非回归边际”被废除改为由实测种子间离散度seed-to-seed dispersion推导的逐录音非回归边际。这解决的是种子搜索的稳定性问题单次评估的边际会让种子搜索对一次性的偶然事件噪声过度敏感。配合--seed-search-until-improvement TRIALStools/train_ml_model.py的参数每次试验都会把结果写入data/auto_generated/mlp_seed_search.json模型种子通过set_global_determinism()同步重置 Python / NumPy / PyTorch 的随机状态保证固定种子下的可复现性。拒绝检测器引导的样本加权ADR 决策点 8 是一个被反复验证后否定的方向检测器引导的样本加权detector-guided sample weighting不是默认基线的一部分。决策历史显示2026-07-07 曾尝试“用检测器引导的样本加权改进基线”两轮战役后仍被拒绝无加权训练保持默认。这印证了train_ml_model.py当前默认使用“balanced class weights”处理类别不平衡而非引入检测器输出作为训练权重。生产增强确定性、常数规模的双种子混合ADR 决策点 9 把生产增强的形态固定下来确定性常数规模种子混合具体参数属于操作性文档ML_TRAINING.md而非 ADR 内容。其历史脉络是2026-08-11 曾尝试“从单一数据增强种子视图训练”后替换为“互补视图的确定性常数规模混合”。训练指南给出的实现细节是生产训练用种子20260807与20260808构建两个确定性包视图packet views然后在每条源录音内交替保留两视图的行位置。这样得到的是约一套增强行集而非合成样本翻倍同时让模型暴露于两个种子的互补假阳性与弱召回压力尾部。源码 tools/lib/ml_training/augmentation.py 直接定义了FIXED_PACKET_AUGMENTATION_SEEDS (20260807, 20260808)且derive_seed()通过固定线性同余公式从基种子派生稳定偏移——模型种子不会改变包级增强。默认的--augment启用base,drift,burst-loss配方base适度特征抖动、包域噪声、丢包与卡顿以及稳定的0.7–1.0包率缩放70 pps 下限匹配时间准入的占空比包络drift注入一段缓慢相关的包域漂移burst-loss注入短促的丢包突发。补充一个容易混淆的语义稳定速率缩放不是丢包——它在源区间内选样并把时间戳与序列号重写为更低的干净节奏丢包与突发丢失则保留为缺失槽与污染而不是新的节奏。增强仅用于拟合与提升门的训练侧交叉验证评分、selection、holdout 与运行时推理全部使用干净回放特征。制品导出显式化force-promotion 逃生舱口ADR 决策点 10 要求制品导出显式化。训练器 tools/train_ml_model.py 提供三个递进级别# 只读训练 分组 CV不替换制品、不打开部署回放 python tools/train_ml_model.py --augment --no-export # 只读 打开 selection 门保持 holdout 密封 python tools/train_ml_model.py --augment --seed SEED --evaluate-selection # 生产提升全部门通过后才导出制品 python tools/train_ml_model.py --augment --seed SEED一次成功的提升只更新三个对齐的制品tools/lib/ml_weights.py、src/cpp/core/ml_weights.h 与data/auto_generated/ml_test_data.npz导出权重内嵌训练种子、时间戳、特征顺序、缩放器、拓扑与完整运行时数组。仓库明确要求不得手工编辑生成权重必须通过训练器导出以保持 Python / C / 回归数据三方对齐。--force-promote --seed SEED可以绕过门失败并导出固定候选但会照常打印失败的检查项。它被保留为重置已被证明无效的基线的逃生舱口且必须“刻意且可见”——其理由与证据须单独记录而非日常提升手段。决策历史一条数据管线的演进时间线ADR 用决策历史表记录了本主题的演进方向日期方向决议2026-06-30将空房间采集视为 IDLE 训练与验证的一等数据在 C3 与 C6 独立空房间失败后接受2026-07-07用检测器引导的样本加权改进基线两轮战役后拒绝无加权训练保持默认2026-07-23分离 train / selection / holdout / excluded 数据接受2026-07-27使用单次评估的非回归边际被替换为基于实测种子噪声的边际2026-08-11从单一包增强种子视图训练被替换为互补视图的确定性常数规模混合这条时间线体现了 ESPectre 的 ADR 维护约定见 docs/adr/README.md同一主题内的方向演进更新当前决策并保留历史精确的模型种子、系数与中间基线不单独建 ADR避免把操作性数值塞进架构记录。被拒绝的替代方案及其理由ADR 完整保留了六条被否决的路线每一条都对应一个真实的工程陷阱只用static_presence对motion训练排除部署 IDLE 分布中的正常组成部分且在不止一颗芯片、不止一个房间复现了误报。把empty仅保留为可选冒烟测试域空房间行为本就是部署任务的一部分必须影响数据策展与提升。在样本内配对回放上排序记忆化掩盖了泛化失败直到录音被保留reserved才暴露。让合成派生数据跨来源折同一录音的确定性变换不是独立验证数据。丢弃弱链路采集它们提供了灵敏度下限附近优雅降级的实测视图。用两份完整种子视图把增强矩阵翻倍常数规模混合即可覆盖互补压力尾部无需翻倍合成权重或内存。后果与意义ADR 记录的采纳后果总结如下训练目标与空房间、静默在场的部署行为对齐提升指标按构造即为样本外out-of-sample且保持来源谱系完整种子搜索对一次性的偶然事件噪声不再过度敏感数据角色与增强溯源成为数据集与缓存身份的一部分随着语料演进新的普通链路 holdout 与空房间数据持续具有价值。配套的验证策略仍然完整selection 与 holdout 结果保留逐录音溯源生成的制品与 Python/C 对等性在共享的宿主侧提升 ADR2026-03-08-use-host-side-validation-gates-for-detector-promotion.md下验证。空房间覆盖并不替代其他部署域——holdout、低 RSSI 门、长录音、生成制品检查与 Python/C 对等性因此依旧不可或缺。相关文档与继续阅读ML_TRAINING.md训练工作流、数据角色、门策略与导出制品的完整操作参考ML_DATA_COLLECTION.mdempty/static_presence/motion采集、NPZ 契约与dataset_info.json策展FEATURES.md生产特征集、研究台账与保留证据2026-03-08-use-host-side-validation-gates-for-detector-promotion.md分层宿主侧验证门策略本 ADR 的验证基础docs/adr/README.mdADR 目录、结构与维护约定tools/train_ml_model.py、tools/lib/dataset_metadata.py、tools/lib/ml_training/augmentation.py数据角色、种子混合与训练编排的源码实现data/dataset_info.json四角色分配的真实语料示例。【免费下载链接】espectreWi-Fi CSI motion sensing for ESP32. C SDK, ESPHome, Native, and Matter frontends, browser tools, and a CLI for the full device lifecycle. GPLv3 and commercial licensing.项目地址: https://gitcode.com/GitHub_Trending/es/espectre创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考