← 返回文章列表

从图像配对到相似度判断:孪生网络的训练与评估方法

孪生网络通过共享参数的双分支结构比较两幅图像,适合处理类别不断变化、样本标注有限的相似度任务。文章介绍样本配对、数据划分、损失函数、训练监控与部署评估,并说明如何在自有数据和授权测试环境中验证模型。

从图像配对到相似度判断:孪生网络的训练与评估方法

把分类问题换成相似度问题

很多图像任务看起来是在问“这是什么”,实际需求却是“这两张图是不是同一类对象”。例如商品去重、零件比对、相册查重和文档图块检索,系统不一定需要知道目标的具体名称,只需要判断两幅图是否足够相似。这类问题可以用孪生网络(Siamese Network)来建模。

孪生网络通常包含两个结构相同、参数共享的特征提取分支。两张图片分别进入网络,得到向量表示,再由距离函数计算它们的差异。若输入属于同一类别,训练目标是让两组向量靠近;若类别不同,则让向量之间保持一定间隔。共享参数意味着两边遵循同一套特征标准,避免一个分支偏向某类纹理、另一个分支偏向其他特征。

它和普通分类器的区别在于输出目标。分类器学习固定类别的决策边界,新类别往往需要补充标签并重新训练分类层;度量学习则学习一种可比较的表示方式。训练完成后,可以把新样本与图库中的向量逐一比较,按距离排序得到候选结果。需要注意,“能比较”不等于“天然泛化”:图像来源、背景、拍摄条件发生变化时,模型仍可能失准。

以自有产品图检索为例,训练样本可以是同一商品的不同角度照片,也可以是外观接近但型号不同的商品。模型真正学到的应是与业务判断相关的特征,而不是文件名、背景颜色或拍摄台面等偶然线索。数据集和评估方式是否合理,往往比网络层数更能决定最终效果。

样本配对与数据划分

孪生网络的数据单位不是单张图片,而是图片对及其关系标签。正样本对由同一目标或同一类别的两个实例构成,负样本对则来自不同目标。标签可以用0和1表示,但项目中应固定约定,例如1表示相似,并在数据读取、损失计算和指标统计中保持一致。

如果一个类别只有一张图片,可以通过轻微裁剪、亮度变化或小角度旋转生成不同视图,作为训练时的正样本输入。不过增强不能破坏目标本身:大幅旋转、遮挡关键部位或过度改变颜色,可能把正样本变成语义上不再相似的图像。更稳妥的做法是尽量采集真实场景中的多张样本,再用增强补足变化范围。

切图前应检查标注框是否覆盖完整目标,并保留少量上下文。框太紧容易切掉边缘,框太松则会把无关背景带进模型。不同尺寸的图像通常需要缩放到统一输入规格,但直接拉伸可能改变长宽比例。可选择等比例缩放后填充空白,或按任务特点进行裁剪,并在训练和推理阶段使用一致的处理规则。

数据划分时,不能先把所有图块随机打散,再分别抽取训练集和验证集。同一原图衍生出的裁剪图、增强图若同时进入两边,模型可能记住背景和拍摄特征,验证分数看起来很高,实际面对新来源图片却明显下降。应按原图、拍摄批次、商品实例或采集时间分组后划分,确保验证集真正代表未见数据。

正负样本数量也需要关注。负样本太少,模型可能倾向于把大多数输入判成相似;负样本太容易,则训练过程缺少有价值的边界案例。可以逐步增加外观相近的负样本,让网络学习区分细微差异。采样规则要固定并记录随机种子,方便比较不同实验结果。

网络结构与损失函数

初期实验不必追求复杂结构。可以使用卷积神经网络提取特征,将末端分类层替换为低维嵌入层,再对输出向量做归一化。归一化后,向量长度相同,距离比较更稳定。常见距离包括欧氏距离和余弦距离:前者衡量坐标差异,后者更关注方向是否接近。选择哪一种,应结合训练损失和实际检索表现验证。

对比损失(Contrastive Loss)是配对任务中常见的选择。它对正样本的距离施加收缩约束,对负样本则设置间隔,只有距离低于指定边界时才继续产生较强惩罚。间隔过小,模型可能无法拉开相似类别;间隔过大,训练又可能长期被难以区分的样本主导。实践中应观察验证集距离分布,而不是只依赖某个经验数值。

另一种做法是三元组损失(Triplet Loss),每次输入锚点、正样本和负样本,要求锚点与正样本的距离比与负样本的距离至少小一个间隔。它能直接表达排序目标,但训练效果高度依赖三元组采样。若负样本过于简单,损失很快归零,网络学不到边界;若全部选极难样本,梯度可能不稳定。因此可混合随机负样本与半难负样本,并定期检查样本质量。

对小规模数据集,使用预训练特征提取网络通常比从零训练更稳妥。可以先冻结底层,只训练嵌入层和高层模块;当验证集表现稳定后,再以较小学习率解冻部分网络。训练中需要记录损失、验证距离分布和业务指标。单看训练损失下降,并不能证明模型学到了可迁移的视觉特征。

训练流程与常见误区

数据读取模块应为一对图片返回两份张量和一个关系标签。训练时,两张图分别做随机增强,且增强参数独立采样;若两边总是同步改变,模型看到的变化会过于规律。验证时则关闭随机增强,只保留确定性的尺寸调整、颜色转换和归一化,以保证每次结果可复现。

一个基础训练循环包括前向计算、损失计算、梯度清零、反向传播和参数更新。若使用混合精度,可以降低显存占用并提高吞吐量,但需要确认硬件和框架版本支持。每个周期结束后,使用单独的验证集计算指标,并保存表现最好的检查点,而不是默认采用最后一个周期的权重。训练日志至少应包含随机种子、数据版本、输入规格、优化器参数和模型配置。

常见错误之一是把同一张图片和自身组成大量正样本对。这类样本几乎没有变化,模型很容易取得低损失,却未必能识别真实拍摄条件下的同类对象。另一类错误是负样本标签生成不准确,例如把同一实例的不同裁剪误标为负样本。少量标签噪声就可能持续推动模型学习错误的距离关系,数据抽查应贯穿训练准备阶段。

还要留意类别不平衡与重复样本。若某些类别图片数量远多于其他类别,随机配对会让它们在训练中占据主导。可按类别均衡采样,或者限制单个类别每轮产生的配对数。重复图片则会让模型反复看到相同内容,增加训练次数却没有带来有效信息。训练前可以对文件哈希、图像尺寸和近似重复图进行检查。

评估、阈值与实际检索

模型输出的是距离或相似度,不会自动给出适用于所有业务的判断阈值。阈值需要在代表实际应用的数据上校准:对大量正负样本分别计算距离,观察两类分布的重叠区间,再依据误报和漏报成本选择工作点。若误把不同商品判成同款代价较高,就应采用更保守的阈值,并为边界样本设计人工复核流程。

评估时可以计算ROC曲线、AUC、精确率、召回率和F1值,也应统计特定阈值下的误报率与漏报率。对检索系统,还要测量Top-K命中率:目标是否出现在距离最近的前K个候选中。测试集最好按业务来源分层,例如不同设备、背景、光照和采集批次分别统计,避免总体均值掩盖某一类场景的明显退化。

部署时可以把图像编码和向量检索拆开。图库向量离线计算并建立索引,查询图到来后只需进行一次特征提取,再在索引中查找近邻。数据量较小时,直接计算余弦相似度即可;规模扩大后,可以考虑近似最近邻索引,并额外评估召回率、查询延迟和索引更新成本。模型版本与图库向量版本必须对应,否则升级模型后沿用旧向量会造成距离不可比。

最后,模型需要持续监控。输入图像的尺寸、颜色分布或来源发生变化时,应检查向量分布和错误样本,判断是否需要补充训练数据。对敏感或受访问控制保护的业务,不应把模型用于绕过验证机制;测试应限定在自有系统、明确授权的数据和隔离环境中。若任务涉及验证码,应优先采用服务方提供的测试模式、无障碍替代流程或正式接口,而不是尝试规避其安全设计。