
BlindSight 利用全同态加密实现视频人像检测,服务器全程无法看到画面
来源标题:Show HN: Video Analysis with Homomorphic Encryption
BlindSight 能在不暴露视频帧的情况下检测摄像头画面中是否有人。客户端在本地加密视频帧,Belfort eML 服务器直接在密文上完成推理并返回加密结果,只有持有密钥的客户端才能解密,图像从未以明文离开本机。检测模型 PersonNet 是一个约 6 万参数的四层卷积网络,在 Wake Vision 数据上训练。
以下正文由 AI 翻译自 Hacker News 最新(原文版权归原站所有),可能存在偏差,重要内容请以原文为准。
BlindSight 能检测网络摄像头画面中是否有人,而全程不暴露任何视频帧。客户端负责显示视频、捕获帧,并用 FHE(全同态加密)对帧进行加密。Belfort eML 服务器直接在这些加密帧上执行推理,返回一个加密的判定结果。端到端加密,服务器始终看不到图像。只有客户端持有密钥,能够解密判定结果。BlindSight 基于 Belfort eML(https://eml.belfortlabs.com)构建。
捕获、加密和解密全部在你笔记本电脑上的同一个进程中完成,因此图像在离开设备之前始终处于加密状态。
在首帧能够被分类之前,部署需要评估密钥(evaluation keys)。这些密钥由与客户端密钥相同的种子派生而来,有两种方式将它们加载到 GPU 上:
无论采用哪种方式,密钥都是每个客户端 token 生成一次,而不是每帧生成一次。
检测器是 PersonNet,一个小型卷积网络:四层,约 6 万参数,仅由在 FHE 下开销低廉的运算构建。输入一张 64×64 的图像,它输出摄像头附近是否有人。该模型在 Wake Vision 上训练,"near person" 标签由 Open Images 的边界框推导而来。
训练好的权重位于仓库中的 model/training/runs/baseline/best.pt,因此运行演示无需自行训练。如果你想更换模型或数据,model/README.md 说明了如何重新训练。
路径 说明 eml/ Belfort ML 示例(eML 是 encrypted ML 的缩写)。provider.py 编译并部署模型。client.py 加密图像并解密判定结果:支持在窗口中从实时网络摄像头采集(macOS、Linux 和 WSL 2),也支持从样本帧(--samples)或你自己的图像(--images)读取。 model/ PersonNet:其预处理、训练和明文推理,以及训练好的权重。 dataset/ Wake Vision,已下载并标注:Belfort ML 示例所用的样本帧,以及训练数据。 INSTALL.md macOS、Linux 和 WSL 2 的安装步骤。 assets/ 架构图:architecture_diagram.drawio 及其 SVG 导出文件,如上所示。 LICENSE、NOTICE Apache-2.0,以及模型训练数据的归属说明(见 Licence)。
你需要准备 macOS 14 或更新版本的 Apple Silicon、Linux(x86-64 或 ARM),或安装了 WSL 2 的 Windows。 uv 和一个 C++20 编译器。仓库的每个部分都通过 uv run 运行,首次运行时会自动配置环境;Belfort ML 客户端首次运行时会用编译器构建其加密代码。INSTALL.md 列出了各平台的步骤;在 Mac 上只需两条命令,在 Linux 和 WSL 2 上稍多几条。
样本帧。从 Wake Vision 中抽取的两个带标签数据集。校准帧用于模型提供方对编译后的模型进行校准,测试帧用于事后检验。一条命令即可下载并准备好两者(约 1.1 GB,登录 Hugging Face 后需几分钟)。数据集中的其他内容都不需要,因为权重已经训练好了:
cd dataset uv run prepare_dataset.py # -> dataset/samples/test.npz, calibration.npz cd - # 返回仓库根目录
dataset/README.md 介绍了 Hugging Face 登录和详细说明。
你需要两个终端,都从仓库根目录启动。
cd eml export BELFORT_API_KEY=blf_live_... # 你的 API key uv run provider.py compile # 每个模型执行一次;之后复用 uv run provider.py serve --dev # 仅用于开发:启动一个生成密钥的 GPU 部署
compile 需要校准帧,因为在 FHE 下每个 ReLU 都被替换为多项式,而多项式只在有限范围内准确。将 dataset/samples/calibration.npz 中的 512 帧输入模型,可以告诉编译器这些范围是什么。之后 client.py --samples 发送的测试帧来自数据集的另一个划分(dataset/samples/test.npz),因此模型是在未曾调优过的帧上接受检验。
如果 compile 因 name_taken 失败,说明自上次编译模型以来有内容发生了变化:权重、校准帧、编译选项或 Belfort 版本。运行 uv run provider.py delete 后重新编译。
serve --dev 以开发者模式启动 GPU 部署:网关选择密钥种子,GPU 据此生成评估密钥。部署就绪后,serve 会将客户端 token 写入 eml/.client-token,将种子写入 eml/.secret-seed-* 供终端 2 使用,并同时打印两行 export 命令,以便客户端在其他机器上运行。开发者模式仅供开发使用:网关知道种子,因此理论上可以解密部署所服务的内容。若要让密钥仅由自己掌握,请不带 --dev 运行 serve,具体见 eml/README.md 的第 5 步。
预计需要 5 到 10 分钟部署才能就绪。网关会启动一个新的 GPU 实例,随后 GPU 生成评估密钥。等待期间不计费;额度从部署就绪的那一刻开始计算。
使用客户端期间请保持该终端不动。按 Enter 可停止部署;它也会在 30 分钟后自动停止。运行期间会消耗额度,按 10 分钟向上取整计费。
eml/README.md 的第 1 步和第 2 步有更详细的说明,包括编译选项,其 Belfort release 一节说明了各包所固定的版本。
cd eml uv run client.py # 读取终端 1 写入的客户端 token
如果客户端在另一台机器上运行,请先执行终端 1 打印的两行 export 命令:BELFORT_CLIENT_TOKEN 和 BELFORT_CLIENT_SECRET_SEED。
client.py 启动时会先构建其加密代码,首次需要几分钟,然后用终端 1 交过来的种子生成密钥对。GPU 已经持有评估密钥,因此无需上传任何内容,客户端准备好分类后窗口即会打开。
预计每帧需要数秒。大部分时间花在你的计算机与服务器之间传输密文:加密图像上传、加密判定结果回传。GPU 上的加密推理(也称 FHE 求值)只需要几百
(原文较长,此处译出前 6000 字,完整内容请点「打开原文」。)
正文由 探How 从来源站点 RSS 同步,内容未经改写;遇到排版缺失或需要图片、视频时请以原文为准。