医疗数据不出院:基于 FHE 的 ECG 心电异常检测密文推理实践
此项目开源地址:
基于 Latti-ai 的医疗健康领域 FHE 密文推理实践:心电图异常检测项目总结
1. 项目背景
最近完成了一个医疗健康领域密文推理项目,方向是“医疗数据不出院”的 AI 推理实践。
项目中,我选择 ECG 心电图异常检测作为具体场景,基于 MIT-BIH Arrhythmia Database 构建二分类模型,并使用 Latti-ai 框架将明文模型转换为支持 FHE 的密文推理模型。
简单来说,这个项目想解决的问题是:在不暴露原始医疗数据的情况下,是否还能完成 AI 推理?
最终实验结果表明,模型可以在密文状态下完成心电异常检测任务。虽然相比明文推理存在一定精度损失和计算开销,但整体预测一致性较高,说明 FHE 在医疗 AI 隐私保护推理场景中具有一定可行性。
2. 项目任务说明
本项目对应的任务方向是:
医疗健康领域的密文推理,包括心电图、医疗影像等场景。
项目目标可以概括为三点:
第一,选择一个医疗健康场景,完成可运行的 AI 推理任务。
第二,基于合规途径获取数据,并完成模型训练。
第三,基于 Latti-ai 将明文推理模型转换为支持 FHE 的密文推理模型,并重点观察密文推理后的精度损失是否处于可接受范围内。
在本项目中,我选择了 ECG 心电图异常检测作为实验场景,使用 MIT-BIH Arrhythmia Database 作为数据来源,构建二分类模型,并完成明文训练与密文推理对比。项目文档中记录的整体流程为:数据处理、明文训练、FHE 适配、模型编译、密文推理。
3. 技术方案概述
本项目的整体流程如下:
数据处理
↓
明文模型训练
↓
FHE 模型适配
↓
模型编译
↓
密文推理
↓
结果对比与分析
其中,最核心的部分是从普通神经网络推理转换到 FHE 密文推理。
普通深度学习模型中常见的 ReLU、Sigmoid、BatchNorm 等操作,在 FHE 环境下并不一定能直接高效支持。因此,在模型转换过程中,需要对部分算子进行适配,例如使用多项式近似替代原本的非线性激活操作。
本项目中使用了 Latti-ai 框架完成密文推理相关流程。Latti-ai 是一个面向加密数据 AI 推理的框架,项目中基于它完成模型转换、编译和密文推理执行。
4. 数据集与数据处理
本项目使用的数据集为 MIT-BIH Arrhythmia Database,采样率为 360Hz,数据内容包括 ECG 心电信号和对应标注。
4.1 数据处理方式
原始 ECG 信号不能直接输入卷积神经网络,因此需要先进行切片和预处理。
项目中的处理流程如下:
R 峰定位
↓
围绕 R 峰截取 256 个采样点
↓
Z-score 标准化
↓
将 1×256 向量 reshape 为 16×16
↓
输入模型,格式为 1×16×16
其中,每个心拍样本以 R 峰为中心进行切片,左侧取 99 个点,右侧取 156 个点,总长度为 256。随后进行 Z-score 标准化,并将一维心电信号转换为 16×16 的二维形式,方便使用 CNN 进行分类。
4.2 标签定义
项目中将心拍分为两类:
| 类别 | 标签 | 含义 |
|---|---|---|
| Normal | 0 | 正常心拍 |
| Abnormal | 1 | 异常心拍 |
正常类别包括 N、L、R、e、j 等符号;异常类别包括 A、a、J、S、V、E、F、/、f、Q 等符号。
4.3 数据不平衡问题
医疗数据中一个非常典型的问题是类别不平衡。
在本项目中,正常样本数量明显多于异常样本。训练集中 Normal 样本为 72068,Abnormal 样本为 8485,比例约为 8.5:1。验证集和测试集也保持类似比例。
如果直接训练,模型很容易偏向多数类,也就是更倾向于预测为正常。对于医疗场景来说,这种偏差是比较危险的,因为漏检异常样本可能带来更大的风险。
因此,本项目采用了如下策略:
训练集:Oversampling 到 1:1
验证集 / 测试集:保持原始分布
这样做的好处是,训练阶段可以缓解类别不平衡问题,而验证和测试阶段仍然尽量贴近真实数据分布。
5. 模型训练
本项目使用 PyTorch 完成明文模型训练,模型名称为 two_conv,输入尺寸为:
1 × 16 × 16
任务类型为二分类:
Normal / Abnormal
明文模型训练命令如下:
python examples/test_ecg/train.py \
--model-name two_conv \
--epochs 20 \
--batch-size 32 \
--lr 0.001 \
--num-workers 4 \
--torch-num-threads 4 \
--num-classes 2 \
--processed-dir ./examples/test_ecg/processed_over_1to1 \
--output-dir ./examples/test_ecg/runs/exp_over/model \
--input-shape 1 16 16
训练完成后,得到明文模型权重:
train_baseline.pth
6. FHE 密文推理适配
明文模型不能直接用于 FHE 推理,因为 FHE 对计算操作有较强限制。尤其是神经网络中的非线性操作,在密文环境下往往需要使用多项式近似进行替换。
因此,本项目进行了 FHE 模型适配,核心操作包括:
加载明文模型权重 ↓ 进行 Poly Replacement ↓ 使用多项式模块替换部分算子 ↓ 导出适合 FHE 编译的模型
项目中使用的关键参数包括:
--poly_model_convert
--degree 4
--upper-bound 3.0
--poly-module RangeNormPoly2d
对应命令如下:
python examples/test_ecg/train.py \
--poly_model_convert \
--model-name two_conv \
--pretrained ./examples/test_ecg/runs/exp_over/model/train_baseline.pth \
--epochs 3 \
--batch-size 16 \
--lr 0.0005 \
--num-workers 4 \
--torch-num-threads 4 \
--num-classes 2 \
--processed-dir ./examples/test_ecg/processed_over_1to1 \
--output-dir ./examples/test_ecg/runs/exp_over/model \
--export-dir ./examples/test_ecg/runs/exp_over/task/server \
--input-shape 1 16 16 \
--degree 4 \
--upper-bound 3.0 \
--poly-module RangeNormPoly2d
这一阶段的主要目的,是在尽量保持模型表达能力的前提下,让模型结构适合密文环境中的计算。
7. 模型编译与密文推理
完成 FHE 适配后,需要将模型进一步编译为可执行的密文推理任务。
模型编译命令如下:
python training/run_compile.py \
--input ./examples/test_ecg/runs/exp_over/model/trained_poly.onnx \
--output ./examples/test_ecg/runs/exp_over \
--style multiplexed
随后生成执行配置:
python inference/interface/gen_mega_ag.py \
--task-dir ./examples/test_ecg/runs/exp_over/task
最后执行密文推理:
python examples/test_ecg/run_fhe_batch10.py
项目中也准备了样本生成脚本,用于从测试集中抽取正常和异常样本,构建密文推理输入。
8. 实验结果
8.1 明文模型结果
明文模型整体表现如下:
| 指标 | 数值 |
|---|---|
| Accuracy | 0.9079 |
| Weighted F1 | 0.8932 |
| ROC-AUC | 0.9438 |
| PR-AUC | 0.8133 |
从结果来看,明文模型在 ECG 异常检测任务上已经具备较好的分类能力。
分类别结果如下:
| 类别 | Precision | Recall | F1-score |
|---|---|---|---|
| Normal | 0.9809 | 0.9428 | 0.9615 |
| Abnormal | 0.8350 | 0.8445 | 0.8249 |
其中异常类别的 Recall 为 0.8445,说明模型能够识别大部分异常心拍,这对医疗辅助诊断任务比较关键。
8.2 密文推理结果
在单样本测试中,密文推理结果如下:
| 指标 | 数值 |
|---|---|
| 单样本推理时间 | 约 11s |
| Max Error | 0.0023 |
| Result | PASS |
在 400 条样本测试中,明文模型与 FHE 密文模型结果如下:
| 指标 | 明文模型 | FHE 密文模型 |
|---|---|---|
| Accuracy | 88.50% | 83.50% |
| Macro F1 | 88.49% | 83.50% |
| Weighted F1 | 88.49% | 83.50% |
| Plaintext-Ciphertext Agreement | - | 91.00% |
从结果可以看出,FHE 密文推理模型相比明文模型存在一定精度下降,但整体仍然保持了较高的一致性。400 样本测试中,明密文预测一致率达到 91.00%。
9. 项目中遇到的问题与解决方法
这一部分是 CSDN 文章中很重要的内容,建议重点写。因为读者不仅关心最终结果,也关心你是怎么解决问题的。
问题一:医疗数据类别不平衡
问题描述
ECG 数据中正常心拍数量远大于异常心拍数量。训练集中 Normal 和 Abnormal 的比例约为 8.5:1。
如果直接训练,模型可能通过大量预测正常类别获得较高 Accuracy,但对异常样本识别能力不足。
在医疗场景中,这种情况尤其需要注意,因为异常样本往往才是临床更关注的目标。
解决方法
我在训练集上使用 Oversampling,将正常样本和异常样本比例调整到 1:1。
同时,验证集和测试集保持原始分布,不做过采样处理。
这样既能让模型在训练时更充分学习异常类别特征,又能保证最终评估结果更贴近真实场景。
问题二:一维 ECG 信号如何适配 CNN 输入
问题描述
原始 ECG 是一维时间序列信号,而项目中使用的是卷积模型。如何将 ECG 信号转换为适合模型输入的格式,是前期需要解决的问题。
解决方法
我采用了基于 R 峰的切片方式,每个样本截取 256 个点,然后将 1×256 的一维信号 reshape 成 16×16 的二维结构。
这样做的好处是:
第一,保留了心拍局部波形信息。
第二,可以使用轻量 CNN 进行特征提取。
第三,输入维度较小,更适合后续 FHE 推理。
问题三:明文模型不能直接用于密文推理
问题描述
普通深度学习模型中的很多算子在 FHE 环境下并不友好。例如 ReLU 等非线性激活函数,在密文状态下难以直接计算。
如果不做模型适配,模型无法顺利完成密文推理。
解决方法
项目中采用了 Poly Replacement 的方式,对模型中的部分非线性操作进行多项式替换。
具体使用参数包括:
degree = 4
upper-bound = 3.0
poly-module = RangeNormPoly2d
通过这种方式,可以让模型结构更适合 FHE 编译和密文推理。
问题四:密文推理存在精度损失
问题描述
经过 FHE 适配后,模型的部分运算被多项式近似替代,因此密文模型与原始明文模型之间会存在一定误差。
这会直接影响最终分类结果。
解决方法
我通过明文模型和 FHE 模型的对比实验来评估精度损失。
在 400 条样本测试中,明文模型 Accuracy 为 88.50%,FHE 密文模型 Accuracy 为 83.50%,精度下降约 5 个百分点;同时,明密文预测一致率达到 91.00%。
从项目角度来看,这说明密文推理虽然会带来一定性能损失,但整体预测结果仍然具有较高一致性,具备进一步优化和落地探索价值。
问题五:密文推理速度明显慢于明文推理
问题描述
FHE 的计算开销远高于普通明文推理。项目中单样本密文推理时间约为 11 秒。
对于实时医疗监测场景来说,这个速度还不够理想。
解决方法
目前项目采用的是轻量模型结构,并尽量降低输入尺寸和网络复杂度。
后续可以从以下方向继续优化:
- 减少模型层数和参数量。
- 优化多项式近似阶数。
- 尝试批量推理。
- 调整编译策略。
- 使用更高性能的 CPU 或服务器环境。
- 对模型结构进行 FHE 友好化设计。
问题六:路径、环境和平台差异带来的调试成本
问题描述
项目涉及 Windows 和 Linux 两种环境。数据处理可以在 Windows 或 Linux 上运行,但密文推理和算子替换主要依赖 Linux 环境。
因此,在实际开发过程中,路径配置、依赖版本、文件目录结构都会影响运行结果。
解决方法
我将流程拆分为几个阶段:
数据预处理
模型训练
FHE 转换
模型编译
样本生成
密文推理
每个阶段单独验证输出文件是否正确,再进入下一步。
同时,固定项目目录结构,例如:
processed_over_1to1/
runs/exp_over/model/
runs/exp_over/task/
这样可以减少因为路径错误导致的调试问题。
10. 项目收获
通过这个项目,我对医疗 AI 和隐私计算的结合有了更直观的理解。
10.1 对医疗 AI 的理解
医疗 AI 不仅仅是训练一个高精度模型,还需要考虑数据来源、合规性、数据分布、异常样本召回率以及真实场景中的使用条件。
尤其是在 ECG 异常检测任务中,Accuracy 并不是唯一指标。对于异常类别,Recall 和 F1-score 同样重要,因为漏检异常样本可能带来更高风险。
10.2 对 FHE 的理解
FHE 的价值在于,它允许模型在不接触明文数据的情况下完成计算。
这对于医疗场景非常有意义,因为医院可以保留原始数据,外部算法服务方只接触加密数据,从而降低隐私泄露风险。
但 FHE 目前也存在明显挑战,例如计算速度慢、支持算子有限、模型结构需要适配、精度可能下降等。
10.3 对工程落地的理解
这个项目不是单纯的模型训练,而是一个完整工程流程:
数据 → 模型 → 转换 → 编译 → 推理 → 指标评估
每一步都可能出现问题,需要逐步验证。
这让我认识到,隐私计算项目更强调系统能力,而不只是算法精度。
11. 后续优化方向
如果继续优化这个项目,我认为可以从以下几个方向进行:
11.1 优化模型结构
可以尝试设计更适合 FHE 的轻量网络,例如减少非线性层数量、降低卷积层复杂度、控制中间特征维度。
11.2 优化多项式替换策略
当前使用 degree=4 的多项式替换,后续可以尝试不同 degree 和 upper-bound 参数,观察精度和推理速度之间的平衡。
11.3 扩大测试样本规模
当前已经完成单样本、200 样本和 400 样本测试。后续可以进一步扩大测试规模,使评估结果更稳定。
11.4 引入更多医疗场景
除了 ECG 心电异常检测,还可以继续尝试:
医学影像分类
肺部疾病识别
眼底图像辅助诊断
医学检验指标风险预测
11.5 优化推理性能
密文推理时间仍然是落地时的重要问题。后续可以结合批量推理、并行计算、编译优化和硬件优化进一步降低推理延迟。
12. 总结
本项目完成了一次医疗健康领域 FHE 密文推理的完整实践。
项目以 ECG 心电图异常检测为应用场景,基于 MIT-BIH Arrhythmia Database 完成数据处理和明文模型训练,并使用 Latti-ai 框架完成 FHE 模型适配、模型编译和密文推理。
实验结果表明,FHE 密文推理在保护数据隐私的同时,能够完成有效的 AI 分类任务。虽然密文模型相比明文模型存在一定精度损失和推理耗时增加,但整体结果仍然具有较好的参考价值。
在 400 条样本测试中,明文模型 Accuracy 为 88.50%,FHE 密文模型 Accuracy 为 83.50%,明密文预测一致率达到 91.00%。这说明 FHE 技术在医疗 AI 隐私保护推理场景中具有一定可行性。
对我来说,这个项目最大的收获是:医疗 AI 的真正落地,不只是模型精度问题,还必须同时考虑数据安全、合规要求、工程部署和推理效率。FHE 为“数据可用不可见”提供了一种很有价值的技术路径,也让我对隐私计算在医疗领域的应用有了更深入的认识。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)