此项目开源地址:

基于 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 秒。

对于实时医疗监测场景来说,这个速度还不够理想。

解决方法

目前项目采用的是轻量模型结构,并尽量降低输入尺寸和网络复杂度。

后续可以从以下方向继续优化:

  1. 减少模型层数和参数量。
  2. 优化多项式近似阶数。
  3. 尝试批量推理。
  4. 调整编译策略。
  5. 使用更高性能的 CPU 或服务器环境。
  6. 对模型结构进行 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 为“数据可用不可见”提供了一种很有价值的技术路径,也让我对隐私计算在医疗领域的应用有了更深入的认识。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐