简介:本文从特征向量与距离度量出发,系统解析人脸识别为何更依赖密度聚类而非划分聚类,深入讲解HDBSCAN的核心机制、关键参数与工程优化策略,帮助开发者构建可扩展、高可用的自动人脸归档系统。
很多开发者第一次构建人脸归档系统时,都会遇到一个反直觉的问题:AI 看起来在“认脸”,但它实际上从未记住任何一张面孔。它做的全部事情,是在高维空间里比较向量之间的距离。理解这一点,是理解整个人脸识别技术栈的起点。
而当照片规模从几百张增长到几万张、几十万张时,真正的技术挑战就从“比较”转移到了“聚类”。本文将从底层原理出发,拆解人脸识别的核心算法链路,并重点解释为什么密度聚类比传统的划分聚类更适合这一场景。
一张原始照片进入系统后,第一步并不是识别,而是检测。检测模型负责在画面中定位人脸区域,输出边界框与关键点(眼睛、鼻尖、嘴角等)。随后进行对齐操作:根据关键点做仿射变换,将人脸旋转、缩放到统一姿态。这一步非常关键——后续特征提取网络对姿态非常敏感,未对齐的人脸会导致同一人的向量距离被人为拉大。
对齐后的人脸图像被送入深度卷积网络,输出一个固定长度的特征向量(Embedding),常见维度为 128、256 或 512 维。这个向量就是人脸的“数字指纹”。
训练这类网络通常使用度量学习目标,例如基于角间隔的损失函数或三元组损失。其核心思想是:在特征空间中,让同一个人的向量尽量聚集,不同人的向量尽量分离。训练完成后,网络对未见过的人脸也具备泛化能力,可以直接输出可比较的向量。
有了向量,识别就变成了数学问题。常用的距离度量包括:
一个典型的判断逻辑如下:
import numpy as npdef cosine_similarity(a, b):a = a / np.linalg.norm(a)b = b / np.linalg.norm(b)return float(np.dot(a, b))# 同一人通常高于阈值,不同人低于阈值sim = cosine_similarity(embedding_a, embedding_b)is_same_person = sim > 0.6
阈值 0.6 只是示例,实际取值需要在业务数据集上通过 ROC 曲线权衡误识率与拒识率后确定。
假设本地存储了 50,000 张照片,涉及 300 多个人物,且没有任何标签。系统需要自动把属于同一个人的照片归入同一集合。注意,这里的目标不是“识别出这是谁”,而是“把相似的放在一起”——这就是聚类。
聚类结果的质量直接决定了用户体验:如果同一个人被拆成多个组,用户需要手动合并;如果不同的人被混在一起,则会产生错误归档。
以 K-Means 为代表的划分聚类方法,要求预先指定类别数量 K。但在人脸归档场景中:
K-Means 还存在几个固有问题:它假设簇是球形的且大小相近,通过迭代计算质心来划分样本;每个样本都必须归属某个簇,噪声无法被隔离;初始质心随机,结果不稳定,需要多次运行取最优。当 K 设置过大时,同一个人会被拆散;K 过小时,不同的人会被强行合并。这两种情况在人脸管理产品中都是不可接受的。
密度聚类的基本假设是:簇是高密度区域,被低密度区域分隔。这类算法不需要预先指定簇数量,能够发现任意形状的簇,并且天然支持噪声识别。
以 HDBSCAN 为例,它相比基础密度聚类做了多项改进:
用伪代码表示其调用方式大致如下:
# 假设 embeddings 是 N x 512 的归一化特征矩阵clusterer = HDBSCAN(min_cluster_size=5, # 一个簇至少包含的样本数min_samples=3, # 核心点的邻域样本数metric="euclidean",cluster_selection_method="eom")labels = clusterer.fit_predict(embeddings)# labels 中 -1 表示噪声点
min_cluster_size 决定了多小的集合还能被称为一个“人物簇”,min_samples 影响噪声的敏感度。这两个参数需要结合业务数据规模调优。
聚类只是中间步骤。一个可上线的系统还需要大量工程优化,这些优化往往比模型本身更影响最终体验。
密度聚类可能把同一个人的照片拆成几个小簇,例如因为光照差异或年龄跨度。常见做法是计算簇间原型向量的相似度,若超过阈值则合并。
对每个簇内的样本进行二次校验,剔除明显离群的成员。可以使用簇内平均相似度或与原型向量的距离作为判据。
视频抽帧会产生大量高度相似的照片。需要在入库前做去重,否则会稀释簇的密度结构,影响聚类效果。
被标记为噪声的照片不应直接丢弃。可以尝试与已有簇的原型向量比对,若相似度足够高则回收,否则留待后续处理。
每个簇维护一个或多个原型向量。新照片加入后,原型应增量更新,以反映该人物最新的特征分布。常用策略包括滑动平均或定期重算簇中心。
每个簇需要选出一张代表照片作为封面。选择标准通常包括:人脸质量分(清晰度、正脸程度)、向量与簇中心的距离、分辨率等。
在实际系统中,建议关注以下几点:
特征归一化:在聚类前对向量做 L2 归一化,使距离度量更稳定。
降维预处理:512 维空间在高密度场景下可能稀疏。可以先用主成分分析降到 128 维左右,既能加速计算,又可能提升密度聚类的效果,但需验证信息损失是否可接受。
增量处理:全量重聚类代价高。可以采用“先匹配已有簇,再对未匹配样本增量聚类”的策略,定期做全量校正。
参数调优:min_cluster_size 不宜过小,否则会产生大量无意义的微簇;也不宜过大,否则小人物会被归为噪声。建议从业务中“最少照片数的人物”出发设定下限。
评估指标:无标签场景下难以直接计算准确率。可以构造小规模标注集,使用调整兰德指数或归一化互信息评估聚类质量,并持续监控线上合并/拆分操作的比例。
人脸识别的技术链路可以概括为:检测对齐 → 特征提取 → 向量比较 → 聚类归档 → 工程优化。其中,特征提取网络决定了向量的判别力,而聚类算法决定了系统在无标签场景下的自动化能力。
K-Means 因需要预设簇数量、无法处理噪声和密度差异,并不适合人脸归档。HDBSCAN 等密度聚类方法凭借自适应密度、自动确定簇数量和噪声识别能力,成为这一场景的主流选择。但真正决定产品体验的,是聚类之后的合并、校验、去重、回收与原型更新等一系列工程环节。理解这条完整链路,才能构建出稳定、可扩展的人脸管理系统。