deep-image-retrieval

GitHub
681 102 简单 1 次阅读 4天前BSD-3-Clause图像其他
AI 解读 由 AI 自动生成,仅供参考

deep-image-retrieval 是一个专注于图像检索任务的开源深度学习项目,旨在通过端到端的学习方式,让计算机更精准地理解并查找相似图片。它主要解决了传统方法在海量图片库中难以快速、准确匹配目标图像的难题,能够将任意图片压缩成一个紧凑的特征向量,从而高效计算图片间的相似度。

该项目特别适合计算机视觉领域的研究人员和开发者使用,尤其是那些需要构建以图搜图系统、进行特征表示学习或复现前沿学术成果的技术人员。其核心亮点在于网络的全程可微性:从卷积神经网络提取特征,到利用广义平均池化(GeM)进行全局聚合,再到最终的向量归一化,所有环节均可联合训练。此外,项目不仅支持经典的三元组损失函数,还创新性地引入了直接优化平均精度(Average Precision)的列表级损失函数,显著提升了检索排序的质量。代码基于 PyTorch 构建,提供了多种在牛津和巴黎等权威数据集上表现优异的预训练模型,方便用户直接评估或作为基线进行二次开发。

使用场景

某大型在线艺术品交易平台的技术团队正致力于升级其“以图搜图”功能,以便买家能通过上传局部细节图快速找到同款或相似风格的画作。

没有 deep-image-retrieval 时

  • 检索精度低:传统特征提取方法难以理解艺术品的深层语义,导致搜索“印象派笔触”时返回大量无关的写实风格图片。
  • 细粒度识别差:无法有效区分构图相似但细节不同的作品,用户很难通过局部截图找到原画的全貌。
  • 优化目标偏差:模型训练使用通用的分类损失函数,未直接优化检索核心指标(如平均精度 mAP),导致排序结果不符合业务需求。
  • 迭代成本高:特征提取与聚合模块分离,无法端到端联合调优,每次调整都需要繁琐的多阶段训练。

使用 deep-image-retrieval 后

  • 语义匹配精准:利用端到端学习的深度视觉表示,模型能准确捕捉艺术风格,搜索结果与查询意图高度契合。
  • 局部定位能力强:借助 GeM 全局聚合层,即使输入仅为画作的一角,也能高效召回包含该特征的完整高分辨率图像。
  • 排序效果显著提升:采用直接优化平均精度(Average Precision)的列表级损失函数,在 Oxford5K 等基准测试中将 mAP 提升至 90% 以上,大幅改善用户体验。
  • 训练流程简化:整个网络(包括聚合层)均可微分,支持端到端训练,团队能快速针对特定数据集进行微调并部署。

deep-image-retrieval 通过将检索指标直接融入端到端训练,彻底解决了传统方法在细粒度图像搜索中“查不准、排不好”的核心难题。

运行环境要求

操作系统
  • 未说明
GPU

非必需(支持 CPU,通过 --gpu -1 指定),若使用 GPU 需兼容 PyTorch 的 NVIDIA 显卡,具体型号和显存未说明

内存

未说明

依赖
notes该工具基于 PyTorch 1.4+ 和 Python 3.7.3 测试。可通过 conda 安装主要依赖。支持自动下载 Oxford5K、Paris6K 等基准数据集。若处理大规模数据或使用 Kapture 格式,需额外安装 kapture 库。模型训练和推理均支持端到端微分,包含 GeM 池化层及多种损失函数(如 Triplet Loss, AP Loss)。
python3.7+
torch>=1.4
numpy
matplotlib
tqdm
scikit-learn
torchvision
kapture (可选)
deep-image-retrieval hero image

快速开始

深度图像检索

本仓库包含以下论文中的模型及评估脚本(基于 Python3 和 PyTorch 1.0+):

[1] 面向图像检索的深度视觉表征端到端学习
Albert Gordo, Jon Almazan, Jerome Revaud, Diane Larlus,IJCV 2017 [PDF]

[2] 基于平均精度的学习:使用列表级损失训练图像检索
Jerome Revaud, Jon Almazan, Rafael S. Rezende, Cesar de Souza,ICCV 2019 [PDF]

这两篇论文均针对图像检索问题,探讨了为该任务学习深度视觉表征的不同方法。在两种情况下,都使用卷积神经网络提取特征图,并通过全局聚合层将其聚合为紧凑的固定长度表示*。随后,该表示先经过全连接层投影,再进行 L2 归一化,以便能够高效地利用点积来比较图像。

dir_network

该网络中的所有组件,包括聚合层,均可微分,因此可以针对最终任务进行端到端训练。在 [1] 中,提出了一种结合三条流并采用三元组损失的暹罗架构来训练该网络。而在 [2] 中,这项工作被进一步扩展,用一种直接优化平均精度的新损失函数取代了三元组损失。

Losses

* 最初,[1] 使用 R-MAC 池化 [3] 作为全局聚合层。然而,由于其效率更高且性能更优,我们已将 R-MAC 池化层替换为 [4] 中提出的广义均值池化层 (GeM)。您可以通过此链接找到 [1] 的原始 Caffe 实现:链接

新闻

  • (6/9/2019) 添加了 AP 损失、考虑并列情况的 AP 损失、三元组边界损失和三元组 LogExp 损失,供参考
  • (5/9/2019) 更新了所有基准测试的评估结果及 AP 指标
  • (22/7/2019) 论文 基于平均精度的学习:使用列表级损失训练图像检索 被 ICCV 2019 接受

先决条件

为了运行本工具箱,您需要:

  • Python3(经测试版本为 3.7.3)
  • PyTorch(经测试版本为 1.4)
  • 以下软件包:numpy、matplotlib、tqdm、scikit-learn

使用 conda 时,您可以运行以下命令:

conda install numpy matplotlib tqdm scikit-learn
conda install pytorch torchvision -c pytorch

安装

# 下载代码
git clone https://github.com/naver/deep-image-retrieval.git

# 设置环境变量
cd deep-image-retrieval
export DIR_ROOT=$PWD
export DB_ROOT=/PATH/TO/YOUR/DATASETS
# 例如:export DB_ROOT=$PWD/dirtorch/data/datasets

评估

预训练模型

下表包含了我们随本库提供的预训练模型及其在一些最著名的图像检索基准上的 mAP 性能:Oxford5KParis6K,以及它们的重访版本(ROxford5K 和 RParis6K)。

| 模型 | Oxford5K | Paris6K | ROxford5K (中/难) | RParis6K (中/难) | |--- |:-:|:-:|:-:|:-:| | Resnet101-TL-MAC | 85.6 | 90.1 | 63.3 / 35.7 | 76.6 / 55.5 | | Resnet101-TL-GeM | 85.7 | 93.4 | 64.5 / 40.9 | 78.8 / 59.2 | | Resnet50-AP-GeM | 87.7 | 91.9 | 65.5 / 41.0 | 77.6 / 57.1 | | Resnet101-AP-GeM | 89.1 | 93.0 | 67.1 / 42.3 | 80.3/60.9 | | Resnet101-AP-GeM-LM18** | 88.1 | 93.1 | 66.3 / 42.5 | 80.2 / 60.8 |

模型名称编码了网络的主干架构以及用于训练它的损失类型(TL 表示三元组损失,AP 表示平均精度损失)。除第一行的模型使用 MAC [3](即最大池化)外,所有模型均采用 广义均值池化 (GeM) [3] 作为全局池化机制,并且均在 Landmarks-clean [1] 数据集上训练(Landmarks 数据集的干净版本),直接从 ImageNet 进行 微调。这些指标是在使用 单一分辨率并对输出特征应用 白化处理后获得的(白化参数同样是在 Landmarks-clean 上学习得到的)。有关所有超参数的详细说明,请参阅分别针对三元组损失和 AP 损失模型的 [1] 和 [2]。

** 为完整起见,我们还添加了一个额外的模型 Resnet101-AP-LM18,该模型是在 Google-Landmarks 数据集上训练的,这是一个包含超过 100 万张图像和 1.5 万个类别的大型数据集。

复现结果

脚本 test_dir.py 可用于评估提供的预训练模型并复现上述结果:

python -m dirtorch.test_dir --dataset DATASET --checkpoint PATH_TO_MODEL \
		[--whiten DATASET] [--whitenp POWER] [--aqe ALPHA-QEXP] \
		[--trfs TRANSFORMS] [--gpu ID] [...]
  • --dataset: 选择数据集(例如:Oxford5K、Paris6K、ROxford5K、RParis6K)[必填]
  • --checkpoint: 模型权重路径 [必填]
  • --whiten: 对输出特征应用白化处理 [默认为 'Landmarks_clean']
  • --whitenp: 白化强度 [默认为 0.25]
  • --aqe: alpha-query 扩展参数 [默认为 None]
  • --trfs: 输入图像变换(可用于多尺度处理)[默认为 None]
  • --gpu: 选择 GPU ID(-1 表示使用 CPU)

例如,要复现 Resnet101-AP_loss 模型在 RParis6K 数据集上的结果,请从 此处下载模型 Resnet-101-AP-GeM.pt,然后执行:

cd $DIR_ROOT
export DB_ROOT=/PATH/TO/YOUR/DATASETS

python -m dirtorch.test_dir --dataset RParis6K \
		--checkpoint dirtorch/data/Resnet101-AP-GeM.pt \
		--whiten Landmarks_clean --whitenp 0.25 --gpu 0

您应该会看到如下输出:

>> 评估...
 * mAP-易 = 0.907568
 * mAP-中 = 0.803098
 * mAP-难 = 0.608556

注意: 此脚本集成了 Oxford5K、Paris6K、ROxford5K 和 RParis6K 数据集的自动下载功能(感谢 Filip Radenovic ;))。数据集将保存在 $DB_ROOT 目录下。

特征提取器

你也可以使用预训练模型从自己的数据集或图像集合中提取特征。为此,我们提供了脚本 feature_extractor.py

python -m dirtorch.extract_features --dataset DATASET --checkpoint PATH_TO_MODEL \
		--output PATH_TO_FILE [--whiten DATASET] [--whitenp POWER] \
		[--trfs TRANSFORMS] [--gpu ID] [...]

其中 --output 用于指定特征将保存的目标路径。其余参数与上述相同。

例如,以下是如何使用该脚本通过 Resnet-101-AP-GeM.pt 模型为 RParis6K 数据集中每张图像提取特征表示,并将其存储在 rparis6k_features.npy 中:

cd $DIR_ROOT
export DB_ROOT=/PATH/TO/YOUR/DATASETS

python -m dirtorch.extract_features --dataset RParis6K \
		--checkpoint dirtorch/data/Resnet101-AP-GeM.pt \
		--output rparis6k_features.npy \
		--whiten Landmarks_clean --whitenp 0.25 --gpu 0

该库还提供了一个通用数据集类ImageList),允许通过提供一个简单的文本文件来指定图像列表。

--dataset 'ImageList("PATH_TO_TEXTFILE" [, "IMAGES_ROOT"])'

文本文件的每一行应包含单个图像的路径:

/PATH/TO/YOUR/DATASET/images/image1.jpg
/PATH/TO/YOUR/DATASET/images/image2.jpg
/PATH/TO/YOUR/DATASET/images/image3.jpg
/PATH/TO/YOUR/DATASET/images/image4.jpg
/PATH/TO/YOUR/DATASET/images/image5.jpg

或者,你也可以使用相对路径,并通过 IMAGES_ROOT 指定根目录。

使用 kapture 数据集进行特征提取

Kapture 是一种基于文本和二进制文件的枢纽文件格式,用于描述 SFM(运动恢复结构)以及更广泛意义上的传感器采集数据。

它可在 https://github.com/naver/kapture 上获取。该库包含常用格式的转换工具,并且多个流行的数据集可以直接以 kapture 格式提供。

可以通过以下命令安装:

pip install kapture

数据集可以使用以下命令下载:

kapture_download_dataset.py update
kapture_download_dataset.py list
# 例如:安装 Extended-CMU-Seasons_slice22 的映射和查询数据
kapture_download_dataset.py install "Extended-CMU-Seasons_slice22_*"

如果你想将自己的数据集转换为 kapture 格式,请参阅 此处 的示例。

安装完成后,你可以使用以下命令为你的 kapture 数据集提取全局特征:

cd $DIR_ROOT
python -m dirtorch.extract_kapture --kapture-root pathto/yourkapturedataset --checkpoint dirtorch/data/Resnet101-AP-GeM-LM18.pt --gpu 0

运行 python -m dirtorch.extract_kapture --help 可以获取更多关于提取参数的信息。

引用

如果你的研究受益于本项目,请在你的出版物中引用以下论文:

@article{GARL17,
 title = {端到端学习用于图像检索的深度视觉表示},
 author = {Gordo, A. 和 Almazan, J. 和 Revaud, J. 和 Larlus, D.}
 journal = {IJCV},
 year = {2017}
}

@inproceedings{RARS19,
 title = {基于平均精度的学习:使用列表损失训练图像检索},
 author = {Revaud, J. 和 Almazan, J. 和 Rezende, R.S. 和 de Souza, C.R.}
 booktitle = {ICCV},
 year = {2019}
}

贡献者

本库由 Jerome Revaud、Rafael de Rezende、Cesar de Souza、Diane Larlus 和 Jon Almazan 在 Naver Labs Europe 开发。

特别感谢 Filip Radenovic 在本库中,我们使用了来自他优秀的 CNN-imageretrieval 仓库 的 ROxford5K 和 RParis6K 下载工具。如果你想训练自己的图像检索模型,不妨去看看这个仓库!

参考文献

[1] Gordo, A., Almazan, J., Revaud, J., Larlus, D.,《端到端学习用于图像检索的深度视觉表示》(https://arxiv.org/abs/1610.07940)。IJCV 2017

[2] Revaud, J., Almazan, J., Rezende, R.S., de Souza, C.,《基于平均精度的学习:使用列表损失训练图像检索》(https://arxiv.org/abs/1906.07589)。ICCV 2019

[3] Tolias, G., Sicre, R., Jegou, H.,《利用 CNN 激活的积分最大池化进行特定目标检索》(https://arxiv.org/abs/1511.05879)。ICLR 2016

[4] Radenovic, F., Tolias, G., Chum, O.,《无需人工标注的 CNN 图像检索微调》(https://arxiv.org/pdf/1711.02512)。TPAMI 2018

常见问题

相似工具推荐

openclaw

OpenClaw 是一款专为个人打造的本地化 AI 助手,旨在让你在自己的设备上拥有完全可控的智能伙伴。它打破了传统 AI 助手局限于特定网页或应用的束缚,能够直接接入你日常使用的各类通讯渠道,包括微信、WhatsApp、Telegram、Discord、iMessage 等数十种平台。无论你在哪个聊天软件中发送消息,OpenClaw 都能即时响应,甚至支持在 macOS、iOS 和 Android 设备上进行语音交互,并提供实时的画布渲染功能供你操控。 这款工具主要解决了用户对数据隐私、响应速度以及“始终在线”体验的需求。通过将 AI 部署在本地,用户无需依赖云端服务即可享受快速、私密的智能辅助,真正实现了“你的数据,你做主”。其独特的技术亮点在于强大的网关架构,将控制平面与核心助手分离,确保跨平台通信的流畅性与扩展性。 OpenClaw 非常适合希望构建个性化工作流的技术爱好者、开发者,以及注重隐私保护且不愿被单一生态绑定的普通用户。只要具备基础的终端操作能力(支持 macOS、Linux 及 Windows WSL2),即可通过简单的命令行引导完成部署。如果你渴望拥有一个懂你

349.3k|★★★☆☆|1周前
Agent开发框架图像

stable-diffusion-webui

stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面,旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点,将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。 无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师,还是想要深入探索模型潜力的开发者与研究人员,都能从中获益。其核心亮点在于极高的功能丰富度:不仅支持文生图、图生图、局部重绘(Inpainting)和外绘(Outpainting)等基础模式,还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外,它内置了 GFPGAN 和 CodeFormer 等人脸修复工具,支持多种神经网络放大算法,并允许用户通过插件系统无限扩展能力。即使是显存有限的设备,stable-diffusion-webui 也提供了相应的优化选项,让高质量的 AI 艺术创作变得触手可及。

162.1k|★★★☆☆|1周前
开发框架图像Agent

ComfyUI

ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎,专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式,采用直观的节点式流程图界面,让用户通过连接不同的功能模块即可构建个性化的生成管线。 这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景,也能自由组合模型、调整参数并实时预览效果,轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性,不仅支持 Windows、macOS 和 Linux 全平台,还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构,并率先支持 SDXL、Flux、SD3 等前沿模型。 无论是希望深入探索算法潜力的研究人员和开发者,还是追求极致创作自由度的设计师与资深 AI 绘画爱好者,ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能,使其成为当前最灵活、生态最丰富的开源扩散模型工具之一,帮助用户将创意高效转化为现实。

108.3k|★★☆☆☆|5天前
开发框架图像Agent

gemini-cli

gemini-cli 是一款由谷歌推出的开源 AI 命令行工具,它将强大的 Gemini 大模型能力直接集成到用户的终端环境中。对于习惯在命令行工作的开发者而言,它提供了一条从输入提示词到获取模型响应的最短路径,无需切换窗口即可享受智能辅助。 这款工具主要解决了开发过程中频繁上下文切换的痛点,让用户能在熟悉的终端界面内直接完成代码理解、生成、调试以及自动化运维任务。无论是查询大型代码库、根据草图生成应用,还是执行复杂的 Git 操作,gemini-cli 都能通过自然语言指令高效处理。 它特别适合广大软件工程师、DevOps 人员及技术研究人员使用。其核心亮点包括支持高达 100 万 token 的超长上下文窗口,具备出色的逻辑推理能力;内置 Google 搜索、文件操作及 Shell 命令执行等实用工具;更独特的是,它支持 MCP(模型上下文协议),允许用户灵活扩展自定义集成,连接如图像生成等外部能力。此外,个人谷歌账号即可享受免费的额度支持,且项目基于 Apache 2.0 协议完全开源,是提升终端工作效率的理想助手。

100.8k|★★☆☆☆|6天前
插件Agent图像

LLMs-from-scratch

LLMs-from-scratch 是一个基于 PyTorch 的开源教育项目,旨在引导用户从零开始一步步构建一个类似 ChatGPT 的大型语言模型(LLM)。它不仅是同名技术著作的官方代码库,更提供了一套完整的实践方案,涵盖模型开发、预训练及微调的全过程。 该项目主要解决了大模型领域“黑盒化”的学习痛点。许多开发者虽能调用现成模型,却难以深入理解其内部架构与训练机制。通过亲手编写每一行核心代码,用户能够透彻掌握 Transformer 架构、注意力机制等关键原理,从而真正理解大模型是如何“思考”的。此外,项目还包含了加载大型预训练权重进行微调的代码,帮助用户将理论知识延伸至实际应用。 LLMs-from-scratch 特别适合希望深入底层原理的 AI 开发者、研究人员以及计算机专业的学生。对于不满足于仅使用 API,而是渴望探究模型构建细节的技术人员而言,这是极佳的学习资源。其独特的技术亮点在于“循序渐进”的教学设计:将复杂的系统工程拆解为清晰的步骤,配合详细的图表与示例,让构建一个虽小但功能完备的大模型变得触手可及。无论你是想夯实理论基础,还是为未来研发更大规模的模型做准备

90.1k|★★★☆☆|1周前
语言模型图像Agent

Deep-Live-Cam

Deep-Live-Cam 是一款专注于实时换脸与视频生成的开源工具,用户仅需一张静态照片,即可通过“一键操作”实现摄像头画面的即时变脸或制作深度伪造视频。它有效解决了传统换脸技术流程繁琐、对硬件配置要求极高以及难以实时预览的痛点,让高质量的数字内容创作变得触手可及。 这款工具不仅适合开发者和技术研究人员探索算法边界,更因其极简的操作逻辑(仅需三步:选脸、选摄像头、启动),广泛适用于普通用户、内容创作者、设计师及直播主播。无论是为了动画角色定制、服装展示模特替换,还是制作趣味短视频和直播互动,Deep-Live-Cam 都能提供流畅的支持。 其核心技术亮点在于强大的实时处理能力,支持口型遮罩(Mouth Mask)以保留使用者原始的嘴部动作,确保表情自然精准;同时具备“人脸映射”功能,可同时对画面中的多个主体应用不同面孔。此外,项目内置了严格的内容安全过滤机制,自动拦截涉及裸露、暴力等不当素材,并倡导用户在获得授权及明确标注的前提下合规使用,体现了技术发展与伦理责任的平衡。

88.9k|★★★☆☆|1周前
开发框架图像Agent