☰
computervision-recipes 图像相似度 FAQ 解读:适用场景边界与目标检测的配合策略
2026/10/8 1:27:17 网站建设 项目流程
  • 计算机视觉
  • 深度学习

【免费下载链接】computervision-recipes

Best Practices, code samples, and documentation for Computer Vision.

项目地址:https://gitcode.com/gh_mirrors/co/computervision-recipes
点击查看免费下载

本篇文章基于 scenarios/similarity/FAQ.md 展开,聚焦两个开发者最常问的问题:图像相似度(Image Similarity)能解决哪些问题,以及什么时候该用图像相似度而不是其他方法。文中将结合仓库中图像相似度模块的源码与 Notebook 实现,给出可落地的工程判断准则,帮助读者在搭建图像检索(Image Retrieval)系统时正确选型,并理解小目标场景下与目标检测的配合方式。

图像相似度能解决什么问题:图像检索系统的核心

原 FAQ 明确指出,图像相似度最典型的应用是构建图像检索系统(Image Retrieval):给定一张query(查询)图像,系统需要在reference(参考)集合中找到所有与之相似的图像。

仓库 scenarios/similarity/README.md 给出了一个直观示例:查询图像位于左侧,右侧是按相似度排序后的最相似图像列表:

该类系统的典型落地场景包括:

  • 电商网站的商品推荐:用户上传或点击一张商品图(如 T 恤、冰箱内物品),系统推荐外观相似的商品;
  • 企业级图像数据集聚类:将海量图像按内容与外观分组归档,便于检索与管理;
  • 以图搜图、相似图片去重、内容库管理等需要"按图找图"的业务。

从技术原理看(见 utils_cv/similarity/model.py),图像相似度系统的核心不是直接比较像素,而是:

  1. 用深度神经网络(DNN)将每张图像编码为一个稠密向量(embedding / feature,例如 512 维浮点向量);
  2. 将特征向量归一化为单位长度(L2 范数为 1);
  3. 用余弦距离或 L2 距离度量两幅图像特征向量之间的差异。

该思路在 01_training_and_evaluation_introduction.ipynb 中有完整演示:对 ImageNet 预训练的 ResNet-18 做微调,取其倒数第二层输出(如learn.model[1][-2]对应的 BatchNorm1d 层)作为图像表示,再通过 utils_cv/similarity/metrics.py 中的vector_distance函数计算 L2 距离。

何时应该使用图像相似度:20% 阈值规则

原 FAQ 给出了一个非常具体、可操作的判断标准:

图像相似度适用于目标对象在图像中相对较大的场景,例如目标约占图像宽/高的 20% 以上;如果目标更小,则应先用目标检测方法定位并裁剪出感兴趣区域(ROI),再交给图像相似度模型处理。

这一"20%"经验法则与仓库中分类模块的 FAQ 完全一致(见 scenarios/classification/FAQ.md),说明它是本仓库在图像类任务选型上的统一准则。其背后的工程直觉是:

  • 图像相似度模型学到的特征表征的是整张图像的内容与外观。当目标占比较大时,特征向量能充分捕捉目标本身的语义,相似度度量才可靠;
  • 当目标只占图像很小比例时,特征向量会被背景"稀释",导致两张内容迥异但背景相似的图片被误判为相似,检索精度显著下降。

因此在选型时,可以先评估目标在典型输入图像中的占比:占比超过约 20% 时优先考虑图像相似度 / 图像分类类方案;占比过小或需要目标位置信息时,转向目标检测。

小目标场景:先检测、后检索的流水线策略

当对象小于 20% 宽高比时,FAQ 给出的建议是在预处理阶段引入目标检测:定位并裁剪(crop)出感兴趣区域,再对裁剪后的图像做相似度建模。

这对应一个经典的级联架构:

  1. 检测阶段:使用目标检测模型(如 Mask R-CNN,参见 scenarios/detection/README.md 及其 Notebook)在原始图像中定位目标包围框;
  2. 裁剪阶段:按包围框将目标区域裁剪出来,得到"以目标为主体"的局部图像;
  3. 相似度阶段:对裁剪结果执行 DNN 特征提取与距离度量(复用 utils_cv/similarity/model.py 的compute_feature/compute_features流程)。

这样既规避了背景干扰,又保留了图像相似度在"以图搜图"上的灵活性。需要注意的是,该流水线会引入检测模型的开销与误差(漏检、错位框),实际工程中应根据业务对精度与延迟的要求权衡。

仓库中的实现支撑:从特征提取到距离度量

FAQ 中"目标较大时才能用图像相似度"的判断,最终要落实到可运行的代码。仓库 utils_cv/similarity 模块提供了完整的实现链:

  • model.py:核心特征提取器
    • SaveFeatures:通过 PyTorch forward hook 截取模型中间层的输出,作为图像 embedding;
    • compute_feature:为单张图像计算 DNN 特征(接受图像对象或路径);
    • compute_features/compute_features_learner:批量计算特征,后者支持 mini-batching,并注意了DatasetType.Train下 FastAI 可能丢弃最后一个不完整 batch 的细节(源码注释中建议训练集改用DatasetType.Fix)。
  • metrics.py:相似度度量与评估
    • vector_distance:支持 L2、L1、cosine、correlation、hamming 等多种距离/相似度方法,默认l2_normalize=True先将向量归一化再计算距离;
    • compute_distances:计算查询图像与参考库中所有图像的距离;
    • recall_at_k:统计"正样本排名 ≤ k"的比例,是检索系统最常用的指标之一。
  • data.py:ComparativeSet与comparative_set_builder构造"1 张查询图 + 1 张正样本 + 多张负样本"的对比集,用于在无显式标注的场景下评估检索排序质量。
  • references/evaluate.py与references/re_ranking.py:实现基于查询集的评估(输出 Rank@1、Rank@5、mAP)以及 k-reciprocal 重排序后处理。

其中,距离度量的默认策略在 01_training_and_evaluation_introduction.ipynb 中有明确说明:默认使用 L2 距离并先将特征归一化为单位长度,公式为 $\sqrt{\sum_{i=1}^{n}{(F_q[i] - F_r[i])^2}}$($n=512$ 为特征维度),实践中效果良好;L1、余弦相似度等亦可作为备选。

如何评估一个图像检索系统是否"好用"

FAQ 回答的是"能不能用",而判断"用得好不好"需要量化指标。仓库提供的评估实现(references/evaluate.py)覆盖了检索领域的标准指标:

  • Rank@k(Recall@k):正样本出现在检索结果前 k 名中的比例,Rank@1 即"第一张返回的就是正确目标"的比例;
  • mAP(mean Average Precision):综合排序质量的平均精度;
  • 评估中会按 group 区分图像,确保查询图像不会与自身比较(源码注释还提到,对 Market-1501 这类数据集可通过 group id 排除同摄像机来源的图像)。

同时,12_fast_retrieval.ipynb 讨论了使用最近邻搜索加速大规模检索的工程手段,适合参考库规模较大的生产场景。

更进一步:提升检索精度的可选手段

如果单靠分类式特征训练的模型精度不够,仓库还提供了两条提升路径(详见 scenarios/similarity/README.md):

  1. 更先进的训练范式:默认方案用图像分类损失微调 DNN(简单且有效);如需更高精度,02_state_of_the_art.ipynb 实现了 BMVC 2019 论文Classification is a Strong Baseline for Deep Metric Learning(基于分类损失即可达到与 Triplet Learning 相当或更优的效果,同时更易训练收敛)。该 README 中同时列出了多个公开基准(CARS196、CUB200-2011、SOP)上报告的 Recall@1 数据,可作为论文复现时的参考基线。
  2. 重排序(Re-ranking)后处理:实现自 CVPR 2017 论文Re-ranking Person Re-identification with k-reciprocal Encoding(见 references/re_ranking.py)。该后处理完全自动、无监督,典型参数为k1=20、k2=6、lambda_value=0.3(evaluate函数默认值),可在不改变模型的前提下进一步提升检索精度。

动手实践:仓库提供的完整学习路径

FAQ 判断准则落地后,建议按以下顺序运行 scenarios/similarity 目录下的 Notebook 完整走一遍流程:

Notebook用途
00_webcam.ipynb快速上手:用单张图片或摄像头输入构建检索系统
01_training_and_evaluation_introduction.ipynb讲解基于分类 DNN 的训练与评估基本概念(512 维特征、L2 距离、Recall@k)
02_state_of_the_art.ipynb复现"分类作为深度度量学习强基线"的 SOTA 方法
11_exploring_hyperparameters.ipynb用网格搜索寻找最优超参数
12_fast_retrieval.ipynb基于最近邻搜索的快速检索

小结:一条清晰的选型决策线

将 FAQ 的两条结论与仓库实现结合,可以得到如下的选型决策路径:

  1. 评估目标在图像中的占比。目标约占图像宽/高 20% 以上,直接采用图像相似度(分类式 DNN 特征 + L2/余弦距离),按 01_training_and_evaluation_introduction.ipynb 的流程训练与评估;
  2. 目标过小或背景干扰严重,先用目标检测定位并裁剪 ROI(参见 scenarios/detection),再进入图像相似度流程;
  3. 精度不足时,按序尝试 SOTA 训练范式(02_state_of_the_art.ipynb)与重排序后处理(references/re_ranking.py);
  4. 参考库规模大时,结合 12_fast_retrieval.ipynb 的最近邻检索方案做工程化提速。

这样,FAQ 中看似简短的两句话,就能落地为一套从"能不能用"到"怎么用好"的完整工程方案。

  • 计算机视觉
  • 深度学习

【免费下载链接】computervision-recipes

Best Practices, code samples, and documentation for Computer Vision.

项目地址:https://gitcode.com/gh_mirrors/co/computervision-recipes
点击查看免费下载

相关推荐

上一篇:marked 有序列表数字对齐解析规则全解析:从 list_align_number 规范到源码实现
下一篇:三步让老 Mac 装上新版 macOS:OpenCore Legacy Patcher(OCLP)实操全记录

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询