文章

03 Siamese 网络(用于人脸识别)

03 Siamese 网络(用于人脸识别)

03 Siamese 网络(用于人脸识别)

一、核心思想

Siamese 网络是一种双分支结构的神经网络,用于衡量两个输入之间的相似度。在人脸识别任务中,其目标是:

若两张人脸属于同一人,则它们的编码应相近;若属于不同人,则编码应相距较远。


二、网络结构

  • 输入:两张人脸图像 $x^{(1)}$ 和 $x^{(2)}$
  • 使用同一个卷积神经网络(共享参数)分别处理两张图像
  • 输出:两个 128 维的特征向量(称为“编码”):

    \[f(x^{(1)}) \in \mathbb{R}^{128}, \quad f(x^{(2)}) \in \mathbb{R}^{128}\]

    其中 $f(\cdot)$ 表示由 CNN + 全连接层构成的编码函数。

💡 注意:两个分支权重完全共享,本质上是一个网络被调用两次。


三、相似度度量

定义两张图片的距离为它们编码的欧氏距离(L2 范数):

\[d(x^{(1)}, x^{(2)}) = \| f(x^{(1)}) - f(x^{(2)}) \|_2\]
  • 若 $x^{(1)}$ 和 $x^{(2)}$ 是同一个人 → 希望 $d$
  • 若是不同人 → 希望 $d$

四、训练目标

目标是学习编码函数 $f(\cdot)$(即 CNN 的参数),使得:

\[\begin{cases} \| f(x^{(i)}) - f(x^{(j)}) \|_2 \approx 0, & \text{若 } x^{(i)} \text{ 与 } x^{(j)} \text{ 是同一人} \\ \| f(x^{(i)}) - f(x^{(j)}) \|_2 \geq \text{某个阈值}, & \text{若不是同一人} \end{cases}\]

通过反向传播优化网络参数,使上述条件尽可能满足。


五、关键特点

特性说明
参数共享两个分支使用完全相同的 CNN 权重
无 Softmax不用于分类,而是输出紧凑的嵌入(embedding)
度量学习学习一个度量空间,使得语义相似的样本在空间中靠近
应用场景人脸识别、签名验证、图像检索等 one-shot learning 任务

六、相关工作

该方法受到 DeepFace(Taigman et al., 2014)的启发:

  • 论文:DeepFace: Closing the Gap to Human-Level Performance in Face Verification
  • 首次在大规模数据上使用 Siamese 架构实现高精度人脸验证

七、后续内容预告

  • 如何设计损失函数来实现上述目标?
  • 引入 三元组损失(Triplet Loss)

    • 使用 锚点(Anchor)正样本(Positive)负样本(Negative)
    • 强制:$|f(A) - f(P)|_2 < |f(A) - f(N)|_2$

这将在下一节详细讲解。


✅ 总结一句话

Siamese 网络通过共享权重的双通道 CNN 提取图像嵌入,并利用嵌入间的距离判断相似性,是度量学习的经典架构。

本文由作者按照 CC BY 4.0 进行授权