Skip to content

Latest commit

 

History

2 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

evo-fall-quant · 跌倒检测模型的 INT8 量化与 ESP32-S3 部署实验

一个可复现的端侧 AI 部署实验:把「跌倒 / 正常」二分类 CNN 从 Keras Float32 训练, 一路做到 ESP32-S3 上的 TFLite Micro Full INT8 推理,并用独立测试集把量化的代价量化出来。

Reproducible INT8 post-training quantization and on-device ESP32-S3 deployment report for a fall-detection CNN.

主结果

canonical 量化产物:models/lesson06_full_int8.tflite SHA-256 6ed5554e6f4ab3e3288052dc7dfa816ebed89f77604c09984d15c12df5ceed63

指标 Float32 基线 Full INT8 PTQ 变化
模型体积 523,556 B 139,376 B -73.379%(3.756×)
独立测试集准确率 90.1176% 89.8824% −0.2353 pp
跌倒召回率 91.8182% 91.8182% 0
跌倒 F1 90.5830% 90.3803% −0.2027 pp
预测类别改变 — 425 例中 1 例 —

板端实测(ESP32-S3-CAM / 芯片 rev v0.2 / ESP-IDF 5.5.4 / esp-tflite-micro 1.3.7 / ESP-NN 1.3.1):

指标 结果
Tensor Arena 预留 131,072 B
Tensor Arena 实测占用 50,780 B(余量 61.3%)
MicroInterpreter::Invoke() 78.789 ms @160 MHz(≈12.69 次/秒)
固件体积 397,072 B
app 分区剩余 651,504 B(≈62%)

78.789 ms 的口径:这是单次冒烟调用的耗时,只包住 Invoke(),不含摄像头采集、缩放、 灰度化、输入量化、雷达融合与网络上传;输入为全黑图,只验证执行链路,不代表精度。 主固件里推理运行在 240 MHz 性能锁下、空闲降到 80 MHz——两者不是同一个测量上下文,不可混用。

阈值选择:为什么不取准确率最高的那个点

在 canonical 模型的 425 张独立测试帧上重算(results/lesson07_threshold_sweep_canonical.json):

跌倒阈值 准确率 跌倒精确率 跌倒召回率 跌倒 F1
0.30 88.47% 85.77% 93.18% 89.32%
0.40 88.94% 87.45% 91.82% 89.58%
0.50 89.88% 88.99% 91.82% 90.38%
0.60 90.59% 90.91% 90.91% 90.91%
0.70 91.06% 94.17% 88.18% 91.08%

准确率随阈值升高而升高,但跌倒召回率同步下降。跌倒检测里漏报(FN)的代价远高于误报(FP), 所以选点不按准确率最优:0.5 保住 91.82% 的召回,误报交给雷达门控 + 连续三帧多数票在系统层压下去。

方法学边界(必须说清楚):上面这张表是在测试集的逐样本预测上统计的,用于分析阈值与指标的取舍关系; 真正选阈值应该在验证集上做,否则就是拿测试集调参。这里没有那样做——clean 的测试集成绩只有默认 argmax(等价于阈值 0.5)那一行的 89.8824%。保留这张表的目的是展示取舍曲线,而不是宣称用它调过模型。

早期 results/threshold_analysis.json 的阈值结论建立在历史模型 models/historical/fall_int8.tflite 上, 与 canonical 模型不是同一份权重,两组数字不得混用(实验报告第 10 节)。

数据协议:怎么避免"看起来很高"的准确率

  • 按源视频分组切分:同一段源视频的帧不跨训练/验证/测试集,避免相邻近重复帧把测试成绩抬虚。 总计 2,551 帧 / 30 个源视频组 —— 训练 1,790 帧(21 组) · 验证 336 帧(4 组) · 测试 425 帧(5 组)。
  • 标定集独立:PTQ 代表性数据 200 张(跌倒/正常各 100),全部取自训练划分,测试集用量为 0。
  • 测试集只用一次:425 帧(跌倒 220 / 正常 205)只在最终验收时使用。
  • 类别索引固定 fall = 0、normal = 1。

复现步骤

pip install -r requirements.txt

python scripts/prepare_manifest.py              # 生成无泄漏清单
python scripts/train_float32.py                 # 训练 Float32 基线
python scripts/01_inspect_float32_model.py      # 检查 Float32 模型
python scripts/02_run_float32_inference.py      # 单图推理
python scripts/03_export_float32_tflite.py      # 导出 Float32 TFLite
python scripts/04_analyze_tensors_memory.py     # 张量与内存分析
python scripts/05_prepare_representative_data.py# 准备标定数据
python scripts/06_convert_full_int8.py          # Full INT8 PTQ
python scripts/07_compare_float32_int8.py       # 独立测试集对比
python scripts/08_check_tflm_deployment.py      # TFLM 部署条件检查
python scripts/09_export_model_for_esp32.py     # 生成 16 字节对齐 C 数组

板端:

cd firmware/tflm_smoke_test
idf.py set-target esp32s3
idf.py build
idf.py -p COM_PORT flash monitor

目录

.
├─ README.md / MODEL_CARD.md / LICENSE / requirements.txt
├─ docs/
│  ├─ EXPERIMENT_RESULTS.md          # 完整实验报告(14 节,含复现环境与限制)
│  ├─ experiment_summary.json        # 结构化结果(机器可读)
│  ├─ OPEN_SOURCE_CHECKLIST.md       # 开源前脱敏清单
│  ├─ LAB_NOTES.md                   # 分课学习笔记(01→11)
│  └─ 复习资料 / 思维导图 / 每日复习卡片 / 模型接入 ESP-IDF 详解
├─ scripts/                          # 训练、量化、评估、部署检查
├─ data/                             # 清单与切分协议(原始图像不分发)
├─ models/                           # canonical 模型 + historical/ 历史模型
├─ results/                          # 每一步的 JSON/CSV 报告与图表
└─ firmware/tflm_smoke_test/         # ESP-IDF 冒烟工程(只验证 schema/算子/Arena/一次推理)

已知限制

  • 帧级准确率不等于真实场景的跌倒事件检出率;数据集来自固定机位。
  • 尚无跨人、跨房间、多摄像头的外部验证。
  • 板端耗时是单次冒烟、固定 160 MHz,缺预热/多频率/百分位统计。
  • 尚未测量:功耗、含摄像头与网络的端到端延迟、每小时的误报次数。
  • 最终应用是"雷达 + 视觉 + 时序投票"的系统,系统级指标需要另一套事件级评估协议。

不随仓库分发的内容

  • 原始数据集:只提供清单与切分协议(data/),原始图像与视频不分发。
  • 含真人画面的预览图:训练/标定预览图已刻意排除,避免未获授权的可识别画面流出。
  • 主固件(跌倒检测终端本体)在另一个仓库。

环境

Python 3.11 (Conda) · TensorFlow 2.21.0 · Keras 3.15.1 · 随机种子 20260815 · ESP-IDF 5.5.4 · esp-tflite-micro 1.3.7 · esp-nn 1.3.1 · 目标 ESP32-S3-CAM (8 MB PSRAM)

许可

代码与报告采用 MIT 许可,见 LICENSE。数据集不包含在本仓库内,其权利不属于本许可范围。

About

跌倒检测模型的 INT8 量化与 ESP32-S3 部署实验:可复现报告 + 全套脚本(523KB→139KB / -73.4%,精度 -0.24pp,板端 Invoke 78.8ms)

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages