你有没有想过,"看一眼你的脸"能榨出多少信息?
手机相册能把同一个人的照片归到一起。小区门禁一刷脸就开门。直播间里,你的脸被美颜瞬间"修好"。
这些事背后,都是同一类技术:人脸分析。
过去做出这样的功能,得有一支算法团队,还得有一堆昂贵的模型。现在有个叫 UniFace 的开源项目,把这些能力打包成一个 Python 工具库,装好就能用。
官方的定位是把检测、对齐、关键点、识别、解析、视线、属性和防伪,都放在同一套接口下。

一张脸,15 种"读法"
按官方 README 的说法,UniFace 覆盖 15 类任务。我把它们换成大白话,分成六组:
① 找到脸、量出脸
- 人脸检测:先找出照片里哪儿有脸,相当于给每张脸画个框。
- 面部关键点:在脸上标出几十到几百个点,眼角、嘴角、鼻尖都算,可以做美颜、做表情动画。
- 人脸质量评估:给一张脸的"可用度"打分。糊了、歪了、被挡了,分数就低。

② 把脸"抠"出来
- 人脸解析:把脸分成皮肤、眉毛、嘴唇、头发等 19 个区域,做虚拟试妆用得上。
- 人像抠图:把人从背景里干净地分离出来,视频会议里的虚拟背景就是这个原理。

③ 看你朝哪儿
- 头部姿态:判断你是抬头、低头还是侧脸。
- 视线估计:判断你的眼睛正盯着哪个方向。

④ "读"脸
- 年龄、性别、种族
- 情绪:开心、生气、惊讶等(AffectNet 的 7 类或 8 类标签)
- 脸部状态:睁眼还是闭眼、戴不戴眼镜或墨镜、戴不戴口罩

⑤ 辨真假
- 活体检测(防伪):分辨镜头前是真人,还是一张照片、一段翻拍视频。刷脸支付要防被冒用,就靠它。

⑥ 认人,或者藏人
- 人脸识别:判断两张照片是不是同一个人。
- 人脸跟踪:在视频里给同一个人一个固定编号。
- 向量库检索:在成千上万张脸里,快速找出最像的那一个。
- 人脸匿名化:一键把脸打码。

争议在哪:一个工具,两种用法
最让我觉得"微妙"的,是它把两头都做了。
一头,是能识别你是谁、猜你多大、判断你的情绪和种族的能力。这些功能放在监控场景里,很容易越界。学界对"靠脸判断情绪"的准确性也一直有争议,毕竟你脸上的表情,不一定等于你心里的感受。
另一头,是同一个项目里专门有一个"隐私"模块,官方文档写得很直白:人脸匿名化通过模糊或遮盖图片和视频里的脸来保护隐私,并且提供五种打码方式。
也就是说,"认出你"和"帮你藏起来",用的是同一套底层技术。

技术本身没有立场,用它的人才有。它把门槛从"需要一个团队"降到了"会复制粘贴代码",这对做正经产品的人是好消息,对想乱来的人,门槛也一起降低了。
所以我的建议是,以后看到"刷脸",不妨多问一句:这张脸被拿去做了什么?存在哪里?谁能查?
顺带提醒一个商用的坑。UniFace 本身是 MIT 协议,但部分预训练权重的协议并不一样,商用前需要先核对许可。README 和授权页里点名过 YOLOv5-Face、YOLOv8-Face 的权重是 GPL-3.0,FairFace 的权重是 CC BY 4.0。代码免费,不等于模型也能随便商用。
技术爱好者专区
1. 安装
pip install "uniface[cpu]" # CPU 和 Apple Silicon
pip install "uniface[gpu]" # NVIDIA CUDA
按官方说明,它支持 CPU、Apple Silicon 和 CUDA,权重在首次使用时自动下载,并用 SHA-256 校验。
2. "一个 API"到底怎么用
核心是 FaceAnalyzer。官方说明:它一次调用就能完成检测、对齐和识别,属性类模型需要你按需加进去。
import cv2
from uniface import FaceAnalyzer, FairFace
analyzer = FaceAnalyzer(predictors=[FairFace()])
for face in analyzer.analyze(cv2.imread("photo.jpg")):
print(face.bbox, face.sex, face.age_group, face.embedding.shape)
设计思路很清楚:
- bbox(人脸框)、confidence(置信度)、landmarks(关键点)、embedding(特征向量)始终有值。
- 年龄、性别、种族、情绪、质量等属性,在你没传入对应 predictor 之前保持为 None。
这种"按需加载"的设计,好处是你只为用到的功能付算力。
3. 模型底座:每个任务都能换模型

4. 隐私模块:三行代码给人脸打码
这是最适合新手上手的功能。以下代码来自官方文档:
from uniface.detection import RetinaFace
from uniface.privacy import BlurFace
import cv2
detector = RetinaFace()
blurrer = BlurFace(method='gaussian', blur_strength=5.0)
image = cv2.imread("photo.jpg")
faces = detector.detect(image)
anonymized = blurrer.anonymize(image, faces)
cv2.imwrite("anonymized.jpg", anonymized)
官方提供五种打码方式:
|
方法 |
效果 |
|
pixelate |
马赛克,新闻里最常见 |
|
gaussian |
平滑模糊 |
|
blackout |
纯色遮盖,隐私性最强 |
|
elliptical |
椭圆形模糊,更贴合脸型 |
|
median |
保边模糊,带点艺术效果 |
5. 实时摄像头打码
import cv2
from uniface.detection import RetinaFace
from uniface.privacy import BlurFace
detector = RetinaFace()
blurrer = BlurFace(method='pixelate')
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
if not ret:
break
faces = detector.detect(frame)
frame = blurrer.anonymize(frame, faces, inplace=True)
cv2.imshow('Anonymized', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
inplace=True 会直接修改原图,更快也更省内存。做直播或监控流处理时值得开。

6. 进阶玩法:只给"别人"打码
文档里还有一个很实用的思路:先用识别模型提取每张脸的特征向量,跟白名单里的人比对相似度,匹配上的不打码,其余的全部打码。适合"视频里只保留自己出镜"这类场景。
核心逻辑就是余弦相似度加阈值,官方示例的默认阈值是 0.6。
7. 值得关注的工程细节
- 模型可替换:同一任务有多个模型可选,可以在速度和精度之间自己取舍。
- 全平台加速:支持 CPU、Apple Silicon、NVIDIA CUDA。
- 自带向量检索:内置基于 FAISS 的向量库,做"以脸搜脸"不用另外搭。
- 有完整文档:含 Notebook、教程、模型库和阈值校准指南。
发表评论 取消回复