我用 Vibe‑Coded 在 Rust 中实现了 GPU 加速的人脸裁剪工具——原因如下

发布: (2026年2月22日 GMT+8 04:09)
5 分钟阅读
原文: Dev.to

Source: Dev.to

问题描述

  • 在线服务会把你的图片上传到他人的服务器(对学生数据来说根本不可接受)。
  • 桌面工具在批处理时会卡顿或产生不一致的结果。

我需要一种能够在本地处理数百张图片、产生确定性结果并且速度快的方案。

为什么选择 Rust?

生态系统 – Rust 的 crate 生态现在已经可以和 Python 的丰富程度相媲美。需要 GPU 计算?有 wgpu。人脸检测推理?可以使用 ndarrayimage crates 来构建。GUI?egui。从 CSV、Excel、Parquet、SQLite 批量导入数据?成熟且维护良好的 crate 已经全部覆盖。我几乎没有遇到需要自己写绑定或自行实现解决方案的墙——构建块已经准备好。

Vibe coding – 当你把 LLM 作为副驾驶来写代码时,编译器的错误信息就成了超能力。Rust 能准确告诉你哪里出错、为什么出错,甚至往往还能给出修复方案。把 Rust 编译错误喂给 LLM 可以一次性解决,这在 C 的段错误或动态语言的运行时 panic 中是很难做到的。这种紧密的反馈循环让我比使用任何其他系统语言都高效得多。

架构概览

  • 人脸检测:YuNet,一种轻量级神经网络,足够快可以实时使用。我从头实现了推理流水线,使用自定义 WGSL 计算着色器,避免了沉重的 ONNX Runtime 依赖,并且对 GPU 流程拥有完整控制。
  • 计算着色器:七个自定义着色器负责从图像预处理到人脸检测推理再到后处理增强的全部工作。流水线尽可能保持在 GPU 上运行,最小化昂贵的 CPU↔GPU 数据传输。
  • 增强流水线:自动色彩校正、曝光、亮度、对比度、饱和度、锐化、皮肤平滑、红眼去除以及人像背景模糊。每个操作都有 GPU 与 CPU 两条路径,并能自动回退。
  • 批处理与数据映射:导入 CSV、Excel、Parquet 或 SQLite 文件来驱动批量命名。提供学生姓名和照片文件名的电子表格,工具即可完成其余工作。

难点

  • 显存管理
  • 多人脸检测
  • 跨平台 GPU 支持

我交付的内容

  • 6+ 种裁剪预设:LinkedIn、护照、Instagram、身份证、头像、证件照,以及完全自定义尺寸。
  • 质量评分:基于拉普拉斯方差的清晰度分析,将每个裁剪划分为低、中、高质量。
  • 原生 GUI,使用 egui 构建——实时预览、撤销/重做以及处理历史。
  • CLI 模式,便于脚本化和自动化。
  • 4 种导出格式,并支持可配置的质量设置。
  • MIT 许可证,完全开源。
  • 代码库约 97 % 为 Rust。

我的收获

  1. 先写 GPU 路径 – 围绕 CPU 设计并在之后再加上 GPU 往往会导致数据流尴尬和不必要的拷贝。应先以 GPU 为中心设计,必要时再添加 CPU 回退。
  2. 批处理会暴露所有边缘情况 – 能在 10 张图片上跑通的工具,在 1 000 张时会出现全新的故障。单图模式下看不见的内存泄漏在大规模时会成为致命问题。
  3. 确定性输出很重要 – 处理身份证照片等官方文档时,同一输入产生略有差异的裁剪是不可接受的。要在 GPU 与 CPU 路径之间实现浮点可复现性,需要付出相当的努力。

亲自尝试

  • GitHub:
  • Website:
0 浏览
Back to Blog

相关文章

阅读更多 »

Steel Bank Common Lisp

关于 Steel Bank Common Lisp(SBCL),它是一款高性能的 Common Lisp 编译器。它是开源/自由软件,采用宽松的许可证。除此之外,...