第四章:人脸关键点定位——从68点到468点的进化之路
人脸关键点检测,说白了就是给脸画「骨架」。
我刚开始接触这个领域时,觉得不就是找几个点嘛,能有多难?结果第一次在侧脸45度角上跑模型,关键点直接飞到耳朵后面去了……嗯,从那以后我再也不敢小看这个任务了。
4.1 为什么需要关键点检测?
你想想看,美颜的第一步是什么?是知道「哪里是脸」。但光知道脸在哪还不够——
- 你要磨皮,得知道哪些区域是皮肤,哪些是眼睛眉毛
- 你要大眼,得精确找到眼角位置
- 你要瘦脸,得知道下颌线的轮廓
- 你要加贴纸,得知道鼻子在哪、嘴巴张没张开
这些需求,全得靠关键点来支撑。我个人习惯把关键点检测比作「人脸操作的坐标系」——没有坐标系,你所有操作都是盲打。
4.2 三种主流点数:68、106、468
行业内最常用的三种点数,各有各的适用场景。我列个表给你看:
| 点数 | 代表方案 | 特点 | 我常用的场景 |
|---|---|---|---|
| 68点 | dlib 经典模型 | 轻量、速度快、CPU可跑 | 实时预览、低端设备 |
| 106点 | 国内厂商常用(如商汤) | 比68点更精细,尤其眉骨和嘴唇 | 美颜滤镜、贴纸特效 |
| 468点 | MediaPipe Face Mesh | 稠密重建级,含轮廓深度信息 | 3D贴纸、AR特效 |
我在项目中遇到过这样一个坑:客户要求「实时美颜」,我一开始上了468点模型,结果中端手机直接掉到15帧。后来换成68点+局部插值,帧率回到30帧,效果客户也满意。说白了,选点数不是越多越好,得看你的算力预算。
4.3 基于dlib的68点检测
dlib 的 68 点检测器,可以说是入门必备。它基于梯度提升树(GBDT)回归,速度极快。
核心思路:先做人脸检测,再在检测框内做关键点回归。两步走,稳得很。
代码实现其实很简单,我直接贴核心部分:
import dlib
import cv2
# 加载预训练模型
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")
img = cv2.imread("face.jpg")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = detector(gray, 1) # 1表示上采样一次,提高小脸检测率
for face in faces:
landmarks = predictor(gray, face)
for i in range(68):
x = landmarks.part(i).x
y = landmarks.part(i).y
cv2.circle(img, (x, y), 2, (0, 255, 0), -1)
我的小技巧:dlib 的检测器对正脸效果极好,但大侧脸容易漏检。我一般会先做一次人脸对齐,或者用 MTCNN 做前置检测,再喂给 dlib 做关键点。
4.4 基于OpenCV的补充方案
OpenCV 从 3.4 版本开始,也内置了人脸关键点检测器。它用的是 LBF(局部二值特征)算法,模型文件很小,只有几MB。
import cv2
facemark = cv2.face.createFacemarkLBF()
facemark.loadModel("lbfmodel.yaml")
# 先用OpenCV的人脸检测器找到人脸框
face_cascade = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
# 关键点检测
ok, landmarks = facemark.fit(gray, faces)
if ok:
for landmark in landmarks[0]:
x, y = landmark.ravel()
cv2.circle(img, (int(x), int(y)), 2, (0,0,255), -1)
我曾经踩过的坑:OpenCV 的 LBF 模型对遮挡非常敏感。有一次测试戴口罩的照片,关键点全崩了。后来我加了口罩检测逻辑,如果检测到口罩,就只取上半脸的关键点,放弃下半脸。效果好了很多。
4.5 知识体系总览
下面这张图,是我自己梳理的关键点检测知识结构。你看一眼就能明白整个脉络:
4.6 实战中的选型建议
说了这么多,到底该用哪个?我根据实际项目经验,给你一个参考:
- 实时预览(30fps+): 68点 dlib 或 OpenCV LBF,CPU 就能跑
- 拍照美颜(非实时): 106点,精度够用,模型适中
- AR 贴纸/3D 特效: 468点 MediaPipe,但建议只在 GPU 设备上跑
- 极端角度/遮挡: 别指望单模型,建议多模型融合或加前置处理
我的经验之谈:不要迷信「点数越多越好」。468点虽然稠密,但很多点在实际美颜中根本用不上。我一般先上68点做快速原型,验证效果后,再根据瓶颈点决定是否升级到106或468。这样迭代效率最高。
好了,这一章的内容就到这里。关键点检测是美颜算法的「地基」,地基打牢了,后面的大眼瘦脸磨皮才能站得住脚。下一章我们会深入具体的美颜操作,到时候你就知道这些关键点是怎么「动起来」的了。
公众号:蓝海资料掘金营,微信deep3321