如何将106个人脸关键点转换为dlib的68个关键点?含子集关系与转换索引
106维面部关键点到68维关键点转换方案
通用实现路径
- 硬索引映射法:当两套关键点集的标注拓扑存在固定语义对应关系时,直接通过提前校准的索引表完成点对点匹配,无额外计算开销,转换精度最高。
- 几何近似映射法:两套点集无直接对应索引时,先将原始106点按面部语义划分为外轮廓、眉毛、眼睛、鼻子、嘴巴5个独立分区,在每个分区内通过邻点拟合、位置均值计算的方式,匹配到68点对应的语义位置。比如106点集中细分的眼睑、内唇冗余点,可通过相邻点平均的方式,得到和68点语义一致的坐标值。
简单的硬映射实现逻辑可参考如下结构:
# 输入:标准JD挑战赛106点坐标数组 landmarks_106 = load_106_point_data() # 预定义映射规则:dlib 68点每个索引对应的106点索引值 index_mapping = [i for i in 预定义的映射列表] # 输出:对齐dlib规范的68点坐标 landmarks_68 = [landmarks_106[pos] for pos in index_mapping]
dlib 68点与JD挑战赛106点的从属关系
核心结论:dlib采用的标准68点集,属于JD挑战赛106点标注体系的语义子集,两套标注的核心语义分区完全兼容,不存在结构性的位置错位。
两类关键点的索引映射规则
基于公开标注语义的分区对应关系,可直接构建固定索引映射,具体规则如下:
- 外轮廓区域:dlib的17个外轮廓点(索引0-16),对应JD106点33个外轮廓点(索引0-32)的等距采样锚点,沿面部轮廓走向依次匹配间隔为2的位置点
- 眉毛区域:dlib的10个眉毛点(索引17-26),分别对应106点集中左右眉毛各5个细分锚点:左眉对应106点33-37的连续点,右眉对应106点43-47的连续点
- 鼻子区域:dlib的9个鼻子点(索引27-35),依次匹配106点集中73(鼻根)、74(鼻梁上段)、75(鼻梁下段)、78(鼻尖)、79-83(鼻翼轮廓)的对应位置点
- 眼睛区域:dlib的12个眼睛外轮廓点(索引36-47),匹配106点集中每只眼睛外轮廓的6个核心锚点,跳过106点集里新增的眼睑细分点
- 嘴唇区域:dlib的20个嘴唇点(索引48-67),分别匹配106点集中12个外唇轮廓点(84-95)、8个内唇轮廓点(96-103)的连续位置点
实际开发中可以提前用公开的标注样例校准1-2个偏移位置,106点集比68点集多出的38个点全部是各语义区域的细分冗余点,不影响核心68点的匹配精度,整体转换的坐标偏差通常可以控制在1-2个像素内,完全满足人脸对齐、关键点检测等下游任务的精度要求。
内容的提问来源于stack exchange,提问作者genawas
相关产品推荐
相关产品推荐

