TensorFlow Models 中的 DELF/DELG:面向图像检索与实例识别的深度局部与全局特征全指南
DELF(Deep Local and Global Image Features)是 TensorFlow Model Garden 中负责实例级识别与图像检索的完整代码库,涵盖局部特征提取与匹配(DELF)、区域聚合检索(Detect-to-Retrieve)、局部+全局统一特征(DELG)以及 Google Landmarks Dataset v2(GLDv2)数据集与评测基线。本文以 research/delf/README.md 为主线,结合仓库内的安装脚本、示例脚本、protobuf 配置与训练/导出源码,系统讲解从环境安装、预训练模型下载、特征提取/匹配、目标检测到检索评测、模型训练与导出的端到端全流程。
读完本文,你将掌握:如何在本仓库中跑通 DELF/DELG 的快速入门、如何用预训练模型在 Oxford/Paris 上复现论文检索结果、如何准备 GLDv2 数据并训练属于自己的局部/全局特征模型,以及如何读懂代码中每一层配置与模块的职责。
一、项目定位:一个仓库覆盖三代检索方法
本仓库根目录下的 research/delf 子项目提供的是“深度学习局部与全局图像特征”方法族的完整实现,适用于实例级识别(instance-level recognition)与图像检索(retrieval)。代码库覆盖了四篇代表性论文的方法与复现:
| 方法 | 论文 | 核心贡献 |
|---|---|---|
| DELF | H. Noh 等,《Large-Scale Image Retrieval with Attentive Deep Local Features》,ICCV'17 | 注意力式深度局部特征,先在特征图上选出高注意力位置,再借助注意力分数做特征选择 |
| Detect-to-Retrieve (D2R) | M. Teichmann*、A. Araujo* 等,《Detect-to-Retrieve: Efficient Regional Aggregation for Image Search》,CVPR'19 | 用目标检测框限定“区域”,再做高效的局部特征聚合(R-ASMK*)提升检索效率与精度 |
| DELG | B. Cao*、A. Araujo* 等,《Unifying Deep Local and Global Features for Image Search》,ECCV'20 | 把深度局部特征与全局特征统一到同一模型,联合输出两类描述子 |
| GLDv2 | T. Weyand* 等,《Google Landmarks Dataset v2 - A Large-Scale Benchmark for Instance-Level Recognition and Retrieval》,CVPR'20 | 发布新版地标数据集,同时给出基于 ArcFace 的全局特征基线(RN101-ArcFace) |
代码库既提供 TensorFlow 模型的构建与训练代码,也提供 Python 的图像检索与局部特征匹配代码,并且放出了面向“地标识别领域”的若干预训练模型。仓库的 发布历史 也印证了演进脉络:2017-10 发布 DELF-v1 提取与匹配示例,2019-04 发布 Detect-to-Retrieve 代码,2020-05 代码库全面转向 Python3 并发布 DELG 模型与 GLDv2 基线,2020-07 完成对 TensorFlow 2.2 的全量支持并重构训练代码。
相关论文按代码库引用规范,建议在研究中使用该代码库时引用以上论文;完整引用条目见 research/delf/README.md。
二、环境安装:两步走(一键脚本 / 手动分步)
DELF 库依赖 TensorFlow 2.x、TF-Slim、protobuf 编译器、若干 Python 包以及 TensorFlow Object Detection API。仓库给出了两种安装路径。
2.1 一键安装脚本
在 research/delf 目录下进入训练子目录并执行:
# From models/research/delf/delf/python/training
bash install_delf.sh
依据 research/delf/INSTALL_INSTRUCTIONS.md,该脚本会按序完成:安装 TensorFlow 2.2(含 GPU 版)→ 从源码安装 TF-Slim → 下载 protoc 并编译 DELF 的 Protocol Buffers → 安装 matplotlib / numpy / scikit-image / scipy / python3-tk → 从克隆的 TensorFlow Model Garden 中安装 Object Detection API → 安装 delf 包。
需要特别注意脚本的平台限制:由于它要自动下载预编译的 protoc 二进制,该脚本只在 64 位 Linux 架构上开箱即用;其他架构需要参考脚本内注释,把 protoc 下载地址替换为对应平台的 protobuf release 二进制。
2.2 手动分步安装
若一键脚本失败,可按下述步骤手动安装。
(1)TensorFlow:要求 TensorFlow ≥ 2.2 与 Python 3.6+。
# CPU:
pip3 install 'tensorflow>=2.2.0'
# GPU:
pip3 install 'tensorflow-gpu>=2.2.0'
(2)TF-Slim(须从源码安装):早期 PyPI 版本依赖已被废弃的 tf.contrib,因此必须安装最新源码版本:
git clone git@github.com:google-research/tf-slim.git
cd tf-slim
pip3 install .
(3)protobuf:DELF 使用 Python 版 protobuf 来配置特征提取并定义数据格式,需要 protoc 编译器 ≥ 3.3:
wget https://github.com/google/protobuf/releases/download/v3.3.0/protoc-3.3.0-linux-x86_64.zip
unzip protoc-3.3.0-linux-x86_64.zip
PATH_TO_PROTOC=`pwd`
(4)Python 依赖:
pip3 install matplotlib numpy scikit-image scipy
sudo apt-get install python3-tk
(5)克隆 tensorflow/models 并配置 Object Detection API(object_detection 库要求把 models/research/ 加入 PYTHONPATH):
# From tensorflow/models/research/
export PYTHONPATH=$PYTHONPATH:`pwd`
(6)编译 DELF 的 protobuf 并安装 delf 包:
# From tensorflow/models/research/delf/
${PATH_TO_PROTOC?}/bin/protoc delf/protos/*.proto --python_out=.
pip3 install -e . # 以 editable 模式安装 "delf" 包
安装完成后,执行 python3 -c 'import delf' 若无任何报错,即代表加载成功。
2.3 常见排障
pip3 install -e失败:可去掉-e直接安装;若权限受限,把命令前缀改为sudo pip3 install。- 克隆方式:仓库默认给出 SSH 克隆命令;走 HTTPS 时把
git@github.com:...换成https://github.com/...即可。
三、数据集:GLDv1 与 GLDv2
仓库相关文档中说明了两个版本的 Google Landmarks 数据集:
- 初版 v1:包含 Detect-to-Retrieve 论文所使用的 Google Landmark Boxes 标注。
- 第二版 v2:伴随两个 Kaggle 竞赛(Landmark Recognition 2019、Landmark Retrieval 2019)发布,可从 CVDF 获取,其设计与评测细节见 GLDv2 论文。
若在研究中使用了上述数据集,应按 research/delf/README.md 中的说明引用相应论文。此外,本地复现 DELG / Detect-to-Retrieve / GLDv2 基线结果时,需要自行下载 Revisited Oxford/Paris(roxford5k / rparis6k) 的图像与标注,下载命令分别记录在 research/delf/delf/python/delg/DELG_INSTRUCTIONS.md 与 research/delf/delf/python/detect_to_retrieve/DETECT_TO_RETRIEVE_INSTRUCTIONS.md 中。
四、快速开始之①:DELF 局部特征提取与图像匹配
这一节是从零跑通 DELF 的“最短路径”,完整命令来自 research/delf/EXTRACTION_MATCHING.md。核心脚本均位于 research/delf/delf/python/examples。
4.1 准备 Oxford 建筑数据集与图片清单
# From models/research/delf/delf/python/examples/
mkdir data && cd data
wget http://www.robots.ox.ac.uk/~vgg/data/oxbuildings/oxbuild_images.tgz
mkdir oxford5k_images oxford5k_features
tar -xvzf oxbuild_images.tgz -C oxford5k_images/
cd ../
echo data/oxford5k_images/hertford_000056.jpg >> list_images.txt
echo data/oxford5k_images/oxford_000317.jpg >> list_images.txt
4.2 下载预训练 DELF 模型
# From models/research/delf/delf/python/examples/
mkdir parameters && cd parameters
wget http://storage.googleapis.com/delf/delf_gld_20190411.tar.gz
tar -xvzf delf_gld_20190411.tar.gz
该模型在 Google-Landmarks v1 上预训练,由 Detect-to-Retrieve 论文 提出,相比 ICCV'17 版 DELF 模型有约 4% mAP 的提升(这一数字以 README 原述为准)。
4.3 执行 DELF 特征提取
# From models/research/delf/delf/python/examples/
python3 extract_features.py \
--config_path delf_config_example.pbtxt \
--list_images_path list_images.txt \
--output_dir data/oxford5k_features
4.4 基于 DELF 特征的图像匹配
python3 match_images.py \
--image_1_path data/oxford5k_images/hertford_000056.jpg \
--image_2_path data/oxford5k_images/oxford_000317.jpg \
--features_1_path data/oxford5k_features/hertford_000056.delf \
--features_2_path data/oxford5k_features/oxford_000317.delf \
--output_image matched_images.png
运行结束后会生成 matched_images.png,展示两幅图像间的局部特征匹配连线:
4.5 读懂 delf_config_example.pbtxt:DELF 提取配置
示例配置文件 research/delf/delf/python/examples/delf_config_example.pbtxt 是理解整条提取流水线的最佳入口:
model_path: "parameters/delf_gld_20190411/model/"
image_scales: .25
image_scales: .3536
image_scales: .5
image_scales: .7071
image_scales: 1.0
image_scales: 1.4142
image_scales: 2.0
delf_local_config {
use_pca: true
layer_name: "resnet_v1_50/block3"
iou_threshold: 1.0
max_feature_num: 1000
score_threshold: 100.0
pca_parameters {
mean_path: "parameters/delf_gld_20190411/pca/mean.datum"
projection_matrix_path: "parameters/delf_gld_20190411/pca/pca_proj_mat.datum"
pca_dim: 40
use_whitening: false
}
}
配置结构与 research/delf/delf/protos/delf_config.proto 中的消息一一对应,各字段语义如下:
- 顶层
DelfConfigmodel_path(必填):DELF 模型路径;is_tf2_exported:模型是否由 TF2+ 导出,默认false——训练 README 中强调,用训练流程导出的新模型必须显式置为true;image_scales:图像金字塔尺度列表,多尺度提取可显著提升匹配鲁棒性;use_local_features/use_global_features:是否提取局部 / 全局特征,两者至少其一为真(DELG 同时打开两者);max_image_size/min_image_size/use_square_images:图像缩放约束,默认-1表示不设上下限;缩放时局部特征坐标仍与原始输入图像一致;- 全局特征配置
DelfGlobalFeatureConfig支持image_scales_ind(只挑若干金字塔层做全局描述子,例如 scales 为[0.25,0.5,1.0]而image_scales_ind=[0,2]时,全局特征只用0.25与1.0两层,局部特征不受影响)。
DelfLocalFeatureConfig(局部特征)layer_name:参与注意力得分的 CNN 层名,用于推算感受野参数以把特征定位回输入图像;use_pca(默认true):是否对局部描述子做 PCA 降维;iou_threshold:NMS 的 IoU 阈值,介于0.0(几乎全被抑制)与1.0(不做 NMS)之间,两特征重叠不超过该值则都保留,否则保留注意力分更高者;max_feature_num(默认 1000):最多保留的特征数,按分数从高到低选取;score_threshold(默认 100.0):低于该分数阈值的特征一律丢弃;use_resized_coordinates:默认false,关键点坐标归一到原始输入图像;置true则归一到缩放后图像;pca_parameters:内含mean_path/projection_matrix_path(均值与投影矩阵的.datum文件)、pca_dim(降维后维度)与use_whitening(默认false,置真时还需提供pca_variances_path)。
示例注释里特别说明:随附导出模型中 layer_name 与 iou_threshold 已被固化进 checkpoint,因此改这两个字段对当前 extract_features.py 不生效——这些字段主要面向自行训练的模型。
4.6 排障
- matplotlib:无显示环境时可能报
no display name and no $DISPLAY environment variable,可在~/.config/matplotlib/matplotlibrc中加入backend : Agg解决; - scikit-image:按默认指引装出的 skimage 0.13.xx/0.14.1 可能引发问题,用
pip3 install -U scikit-image升到 0.14.1 以上即可。
五、快速开始之②:地标检测(Landmark Detection)
对应论文是 Detect-to-Retrieve,操作说明见 research/delf/DETECTION.md。作用是用检测器框出图像中的地标区域,为后续按区域聚合特征做准备。
# 下载 Oxford 数据集后,准备检测图片清单
# From models/research/delf/delf/python/examples/
echo data/oxford5k_images/all_souls_000002.jpg >> list_images_detector.txt
echo data/oxford5k_images/all_souls_000035.jpg >> list_images_detector.txt
# 下载预训练检测器(Faster-RCNN,基于 Google Landmark Boxes 训练)
mkdir parameters && cd parameters
wget http://storage.googleapis.com/delf/d2r_frcnn_20190411.tar.gz
tar -xvzf d2r_frcnn_20190411.tar.gz
# 运行检测(阈值 0.8,同时输出可视化)
cd ..
python3 extract_boxes.py \
--detector_path parameters/d2r_frcnn_20190411 \
--detector_thresh 0.8 \
--list_images_path list_images_detector.txt \
--output_dir data/oxford5k_boxes \
--output_viz_dir data/oxford5k_boxes_viz
除 Faster-RCNN 外,仓库还提供了基于 MobileNet-SSD 的地标框检测器,两者的运行方式一致,下载链接见 research/delf/README.md 的预训练模型清单。检测可视化结果如下所示:
六、统一局部+全局特征:DELG 检索全流程
DELG 的核心价值是用同一模型输出局部与全局特征。全局特征用于快速排序,局部特征配合几何校验做重排。以下命令与数值结果均出自 research/delf/delf/python/delg/DELG_INSTRUCTIONS.md,可在 Revisited Oxford/Paris 上复现论文结果。
6.1 准备 roxford5k / rparis6k
按文档下载 Oxford、Paris 图像并把 paris_1.tgz / paris_2.tgz 解包后合并到同一目录,再下载 gnd_roxford5k.mat、gnd_rparis6k.mat(Revisited 标注,CVPR 格式)以及对应的 .pkl 版本,具体命令见原文文档。本例以 roxford5k 为例,改到 rparis6k 只需替换 dataset_file_path 等参数。
6.2 下载 R50-DELG 模型
# From models/research/delf/delf/python/delg
mkdir parameters && cd parameters
wget http://storage.googleapis.com/delf/r50delg_gld_20200814.tar.gz
tar -xvzf r50delg_gld_20200814.tar.gz
delf/python/delg 目录下按“骨干网络 × 训练数据”提供了四种配置:r50delg_gld_config.pbtxt、r101delg_gld_config.pbtxt、r50delg_gldv2clean_config.pbtxt、r101delg_gldv2clean_config.pbtxt,运行特征提取时把 delf_config_path 指向对应文件即可。
6.3 提取 query 与 index 特征
按 Revisited 协议,query 使用裁剪后的查询图提取特征(在脚本中通过 image_set=query 实现):
python3 extract_features.py \
--delf_config_path r50delg_gld_config.pbtxt \
--dataset_file_path ~/delg/data/gnd_roxford5k.mat \
--images_dir ~/delg/data/oxford5k_images \
--image_set query \
--output_features_dir ~/delg/data/oxford5k_features/query
python3 extract_features.py \
--delf_config_path r50delg_gld_config.pbtxt \
--dataset_file_path ~/delg/data/gnd_roxford5k.mat \
--images_dir ~/delg/data/oxford5k_images \
--image_set index \
--output_features_dir ~/delg/data/oxford5k_features/index
6.4 执行检索并解读指标
python3 perform_retrieval.py \
--dataset_file_path ~/delg/data/gnd_roxford5k.mat \
--query_features_dir ~/delg/data/oxford5k_features/query \
--index_features_dir ~/delg/data/oxford5k_features/index \
--output_dir ~/delg/results/oxford5k
output_dir 下会生成 metrics.txt,无几何校验时大致如下(与论文 Table 3 一致):
hard
mAP=45.11
mP@k[ 1 5 10] [85.71 72.29 60.14]
mR@k[ 1 5 10] [19.15 29.72 36.32]
medium
mAP=69.71
mP@k[ 1 5 10] [95.71 92. 86.86]
mR@k[ 1 5 10] [10.17 25.94 33.83]
6.5 开启几何校验(Geometric Verification)
加入 --use_geometric_verification 后,检索会读取磁盘上的 DELF 局部特征做重排。文档明确提示其代价:一方面重排从磁盘反复加载局部特征较慢,另一方面 junk 图像会因各协议不同而需按协议分别重排。开启后 metrics.txt 会出现 hard_after_gv / medium_after_gv 两组提升后的指标(以 hard 为例,mAP 由 45.11 升到 53.72),完整数值对照见 DELG 指令文档。
七、区域聚合检索:Detect-to-Retrieve 完整链路
D2R 的流程是“检测框 → 区域特征 → 聚合 → 检索/重排”,比 DELG 更复杂,也是仓库中覆盖脚本最多的子目录。以下命令来自 research/delf/delf/python/detect_to_retrieve/DETECT_TO_RETRIEVE_INSTRUCTIONS.md。
7.1 数据与模型准备
同样准备 roxford5k / rparis6k 图像与 gnd_*.mat 标注,然后下载:
# From models/research/delf/delf/python/detect_to_retrieve
mkdir parameters && cd parameters
# DELF-GLD 模型 + Faster-RCNN 检测器
wget http://storage.googleapis.com/delf/delf_gld_20190411.tar.gz
tar -xvzf delf_gld_20190411.tar.gz
wget http://storage.googleapis.com/delf/d2r_frcnn_20190411.tar.gz
tar -xvzf d2r_frcnn_20190411.tar.gz
# 预训练码本(codebook):对 roxford5k 检索要用 rparis6k 码本,反之亦然
wget http://storage.googleapis.com/delf/rparis6k_codebook_65536.tar.gz
wget http://storage.googleapis.com/delf/roxford5k_codebook_65536.tar.gz
此外还提供 MobileNet-SSD 检测器与 1024 质心的轻量码本(rparis6k_codebook_1024 / roxford5k_codebook_1024)供复现更多实验。
7.2 提取 query 特征 / index 特征与检测框
# query:按 Revisited 协议使用裁剪后的查询图
python3 extract_query_features.py \
--delf_config_path delf_gld_config.pbtxt \
--dataset_file_path ~/detect_to_retrieve/data/gnd_roxford5k.mat \
--images_dir ~/detect_to_retrieve/data/oxford5k_images \
--output_features_dir ~/detect_to_retrieve/data/oxford5k_features/query
# index:同时做特征提取与检测框提取
python3 extract_index_boxes_and_features.py \
--delf_config_path delf_gld_config.pbtxt \
--detector_model_dir parameters/d2r_frcnn_20190411 \
--detector_thresh 0.1 \
--dataset_file_path ~/detect_to_retrieve/data/gnd_roxford5k.mat \
--images_dir ~/detect_to_retrieve/data/oxford5k_images \
--output_boxes_dir ~/detect_to_retrieve/data/oxford5k_boxes/index \
--output_features_dir ~/detect_to_retrieve/data/oxford5k_features/index_0.1 \
--output_index_mapping ~/detect_to_retrieve/data/oxford5k_features/index_mapping_0.1.csv
注意 index 侧检测阈值取 0.1(低阈值召回更多区域),这也是后续聚合检索的默认输入。
7.3 R-ASMK* 聚合特征提取
聚合配置在 query_aggregation_config.pbtxt 与 index_aggregation_config.pbtxt 中,分别指向对应码本:
# query 聚合
python3 extract_aggregation.py \
--use_query_images True \
--aggregation_config_path query_aggregation_config.pbtxt \
--dataset_file_path ~/detect_to_retrieve/data/gnd_roxford5k.mat \
--features_dir ~/detect_to_retrieve/data/oxford5k_features/query \
--output_aggregation_dir ~/detect_to_retrieve/data/oxford5k_aggregation/query
# index 聚合(需提供 index_mapping,把图像映射到区域)
python3 extract_aggregation.py \
--aggregation_config_path index_aggregation_config.pbtxt \
--dataset_file_path ~/detect_to_retrieve/data/gnd_roxford5k.mat \
--features_dir ~/detect_to_retrieve/data/oxford5k_features/index_0.1 \
--index_mapping_path ~/detect_to_retrieve/data/oxford5k_features/index_mapping_0.1.csv \
--output_aggregation_dir ~/detect_to_retrieve/data/oxford5k_aggregation/index_0.1
7.4 检索与几何校验重排
当前支持对聚合特征做暴力(brute-force)比较的检索:
python3 perform_retrieval.py \
--index_aggregation_config_path index_aggregation_config.pbtxt \
--query_aggregation_config_path query_aggregation_config.pbtxt \
--dataset_file_path ~/detect_to_retrieve/data/gnd_roxford5k.mat \
--index_aggregation_dir ~/detect_to_retrieve/data/oxford5k_aggregation/index_0.1 \
--query_aggregation_dir ~/detect_to_retrieve/data/oxford5k_aggregation/query \
--output_dir ~/detect_to_retrieve/results/oxford5k
metrics.txt 的参考输出(与论文 Table 2 大致一致):
hard
mAP=47.61
mP@k[ 1 5 10] [84.29 73.71 64.43]
mR@k[ 1 5 10] [18.84 29.44 36.82]
medium
mAP=73.3
mP@k[ 1 5 10] [97.14 94.57 90.14]
mR@k[ 1 5 10] [10.14 26.2 34.75]
开启几何校验则追加 --use_geometric_verification True,并额外传入 --index_features_dir / --query_features_dir,供重排阶段读取局部特征。
7.5 重新训练码本(Clustering)
如需自行重训码本,仓库提供了 cluster_delf_features.py。文档明确:当前 K-means 主算子未在 TensorFlow 中注册 GPU,因此该步骤目前只能在 CPU 上运行。
python3 cluster_delf_features.py \
--dataset_file_path ~/detect_to_retrieve/data/gnd_rparis6k.mat \
--features_dir ~/detect_to_retrieve/data/paris6k_features/index_0.1 \
--num_clusters 1024 \
--num_iterations 50 \
--output_cluster_dir ~/detect_to_retrieve/data/paris6k_clusters_1024
7.6 GLDv2 检索基线
若想复现 GLDv2 论文中的检索/识别结果,仓库还提供了 google_landmarks_dataset 子目录,内含 GLD 指标计算模块(metrics.py、compute_recognition_metrics.py、compute_retrieval_metrics.py)、GLD 文件读写(dataset_file_io.py)与 rn101_af_gldv2clean_config.pbtxt 基线配置,完整步骤见 research/delf/delf/python/datasets/google_landmarks_dataset/README.md。
八、训练自己的 DELF/DELG 模型(基于 GLDv2)
如果预训练模型不满足需求,research/delf/delf/python/training/README.md 给出了端到端训练流程:装库 → 下载 GLDv2 原始图像 → 生成训练数据 → 训练。
8.1 下载 GLDv2 数据
GLDv2 分为 TRAIN / INDEX / TEST 三组,分别打包为 500 / 100 / 20 个 *.tar 文件,并配 *.csv 记录元数据与许可。运行:
# From models/research/delf/delf/python/training
bash download_dataset.sh 500 100 20
三个参数分别是各组要下载的 tar 数量(上限 500/100/20)。脚本产出 gldv2_dataset/,内含 train/、index/、test/ 三个子目录,每个子目录包含 tar 文件、MD5 校验 .txt、解包图像(按文件名首字符分目录存储)与 CSV 元数据。
文档给出的关键提醒:受数据集规模影响,下载可能耗时最长 12 小时、占用最高约 1TB 磁盘;仅做训练可只下载 TRAIN(约 95GB,可省去 INDEX+TEST),解包后可删除 tar 以进一步省空间。
8.2 生成 TFRecord
训练数据由 build_image_dataset.py 从 GLDv2 的 clean 子集(定义见 GLDv2 论文)生成 TRAIN / VALIDATION 两个 split 的 TFRecord:
python3 build_image_dataset.py \
--train_csv_path=gldv2_dataset/train/train.csv \
--train_clean_csv_path=gldv2_dataset/train/train_clean.csv \
--train_directory=gldv2_dataset/train/*/*/*/ \
--output_directory=gldv2_dataset/tfrecord/ \
--num_shards=128 \
--generate_train_validation_splits \
--validation_split_size=0.2
输出文件前缀为 train-* 与 validation-*。追加 --test_csv_path=gldv2_dataset/train/test.csv --test_directory=gldv2_dataset/test/*/*/*/ 可额外生成 test-* 的 TEST split。每个参数的详细说明以脚本源码注释为准。TFRecord 生成同样可能耗时约 12 小时、占用约 500GB。
8.3 用 ImageNet 预训练权重初始化骨干
为加速收敛,可下载 ResNet50 的 ImageNet 预训练权重(resnet50_imagenet_weights.tar.gz)作为初始化。
8.4 启动训练
**纯局部特征(DELF 风格)**训练:
python3 train.py \
--train_file_pattern=gldv2_dataset/tfrecord/train* \
--validation_file_pattern=gldv2_dataset/tfrecord/validation* \
--imagenet_checkpoint=resnet50_weights_tf_dim_ordering_tf_kernels_notop.h5 \
--dataset_version=gld_v2_clean \
--logdir=gldv2_training/
**局部+全局特征(DELG 风格)**训练,追加 --delg_global_features(对应 DELG 论文改进的全局特征头):
python3 train.py \
--train_file_pattern=gldv2_dataset/tfrecord/train* \
--validation_file_pattern=gldv2_dataset/tfrecord/validation* \
--imagenet_checkpoint=resnet50_weights_tf_dim_ordering_tf_kernels_notop.h5 \
--dataset_version=gld_v2_clean \
--logdir=gldv2_training/ \
--delg_global_features
两种模式默认均开启 --use_autoencoder(即默认带自编码器训练)。模型定义在 research/delf/delf/python/training/model 下(resnet50.py 构建骨架、delf_model.py 定义整体结构)。
超参参考(其余 flag 取默认值,已在文档中经验证):
| 硬件 | batch_size | initial_lr |
|---|---|---|
| 8 × Tesla P100 | 256 | 0.01 |
| 4 × Tesla P100 | 128 | 0.005 |
8.5 导出训练好的模型
checkpoint 位于 gldv2_training/ 后,可按需导出三种规格:
# 仅局部特征模型
python3 model/export_local_model.py \
--ckpt_path=gldv2_training/delf_weights \
--export_path=gldv2_model_local
# 仅全局特征模型(DELG 全局头)
python3 model/export_global_model.py \
--ckpt_path=gldv2_training/delf_weights \
--export_path=gldv2_model_global \
--delg_global_features
# 局部+全局联合模型
python3 model/export_local_and_global_model.py \
--ckpt_path=gldv2_training/delf_weights \
--export_path=gldv2_model_local_and_global \
--delg_global_features
若目标是把模型直接用于 2020 Landmark Retrieval Kaggle 竞赛,可用多尺度 --input_scales_list=0.70710677,1.0,1.4142135、--multi_scale_pool_type=sum、--normalize_global_descriptor 导出“Kaggle 兼容格式”。注意:该格式与仓库内部 DELG 指令所需格式不同——若希望继续沿用 DELG 指令文档 中的命令,请使用上面的“仅全局特征模型”导出方式。
8.6 验证自训练模型
把 delf_config_example.pbtxt 复制后做三处修改即可接入自训练局部模型:
model_path指向导出目录(如gldv2_model_local);- 根层级新增
is_tf2_exported: true; delf_local_config内use_pca: false。
修改后配置形如:
model_path: "gldv2_model_local"
image_scales: .25
image_scales: .3536
image_scales: .5
image_scales: .7071
image_scales: 1.0
image_scales: 1.4142
image_scales: 2.0
is_tf2_exported: true
delf_local_config {
use_pca: false
max_feature_num: 1000
score_threshold: 100.0
}
随后用 Oxford 两张同地标图片跑提取与匹配(命令同第 4 节,脚本位于 examples 目录),可得到如下匹配验证图:
自训练全局(或全局+局部)模型的验证则沿用 DELG 指令文档,仅需把 delf_config_path 换成指向新模型,并按 delf_config.proto 正确设置 use_local_features / use_global_features,同时记得 is_tf2_exported: true。
九、代码总览:delf 目录的组织方式
依据 research/delf/README.md,DELF/D2R/DELG/GLD 相关代码都位于 research/delf/delf,其下分 protos 与 python 两大目录。
9.1 delf/protos:数据结构与配置定义
| proto 文件 | 职责 |
|---|---|
aggregation_config.proto |
局部特征聚合配置 |
box.proto |
检测框的序列化 |
datum.proto |
浮点张量的序列化 |
delf_config.proto |
DELF/DELG 提取配置(见第 4.5 节) |
feature.proto |
局部特征的序列化 |
9.2 delf/python:核心模块
- 读写工具:
box_io.py/datum_io.py/feature_io.py分别负责检测框、datum张量文件与局部特征文件的序列化读写,均有对应*_test.py验证。 - 聚合与相似度:
feature_aggregation_extractor.py(局部特征聚合抽取)、feature_aggregation_similarity.py(聚合特征相似度计算),配套whiten.py(特征白化)。 - 通用工具:
utils.py(图像/特征加载处理)、feature_extractor.py(提取封装)。 - examples:示例入口脚本——DELF 提取/匹配(
extractor.py、extract_features.py、match_images.py)与目标检测(detector.py、extract_boxes.py),以及示例配置delf_config_example.pbtxt。 - delg:
extract_features.py(局部+全局特征联合提取,配套r50delg_gld_config.pbtxt等配置)、perform_retrieval.py(检索/评分)、measure_latency.py(延迟测量)。 - detect_to_retrieve:特征/框提取与聚合/聚类脚本
boxes_and_features_extraction.py、aggregation_extraction.py、cluster_delf_features.py、extract_index_boxes_and_features.py、extract_query_features.py;检索/重排perform_retrieval.py、image_reranking.py;配套配置delf_gld_config.pbtxt、index_aggregation_config.pbtxt、query_aggregation_config.pbtxt;Revisited Oxford/Paris 解析与评测dataset.py。 - google_landmarks_dataset:GLD 指标与 IO(见第 7.6 节)。
- training:基于 ResNet50 的 DELF 模型训练(
train.py、model/resnet50.py、model/delf_model.py),模型导出(model/export_model.py、model/export_global_model.py、model/export_model_utils.py),以及数据下载与预处理(download_dataset.sh、build_image_dataset.py、datasets/googlelandmarks.py)。
各子目录中还散落着对应模块的单元测试文件,是理解内部契约的良好参考资料。
十、预训练模型速查表
仓库在 research/delf/README.md 中集中列出了以下预训练产物(均面向地标领域),按需取用:
| 模型 | 用途 | 来源论文 |
|---|---|---|
| DELF(GLD v1 预训练) | 局部特征提取/匹配(约 4% mAP 提升) | Detect-to-Retrieve |
| R101-DELG / R50-DELG(GLD v1 预训练) | 局部+全局统一特征 | DELG |
| R101-DELG / R50-DELG(GLDv2-clean 预训练) | 局部+全局统一特征 | DELG |
| RN101-ArcFace(GLDv2 train-clean 预训练) | 全局特征基线 | GLDv2 |
| DELF(Landmarks-Clean/Full 预训练) | ICCV'17 原版 DELF | DELF |
| Faster-RCNN 检测器(Google Landmark Boxes 训练) | 地标框检测 | Detect-to-Retrieve |
| MobileNet-SSD 检测器(Google Landmark Boxes 训练) | 轻量地标框检测 | Detect-to-Retrieve |
| 聚合码本(65536/1024 质心,roxford5k/rparis6k) | R-ASMK* 区域聚合 | Detect-to-Retrieve |
十一、维护与发布历史
DELF 代码库由 André Araujo 维护。从 research/delf/README.md 的 Release history 可以清晰看到项目演进:2017-10 首个 DELF-v1 版本;2019-04 加入 Detect-to-Retrieve 代码与 GLDv1 预训练 DELF;2020-04(v2.0)发布初始训练代码并兼容 TF 2.1;2020-05 全面 Python3 化并发布 DELG 与 GLDv2 基线;2020-07 完成 TF2 全量支持(仅剩一处 compat.v1 使用)并把文档要求统一到 TF2.2,同时重构训练代码并给出逐步详解的指引。
结语
以 research/delf/README.md 为总纲,向上可追溯到每篇论文与数据集,向下则能落到 protos 中的字段定义、examples 中的可执行脚本与 training 中完整的训练-导出-验证闭环。无论你只想要一个“装好就能跑”的局部特征匹配/检索工具箱,还是希望在 GLDv2 上从头训练并导出自己的 DELF/DELG 模型,本仓库都提供了从数据、训练、导出到评测的自洽路径——这也是它在实例级识别与检索领域被广泛作为起点的原因。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0627
Hy4-previewHy4 preview 是由腾讯混元团队研发的新一代混合专家(MoE)旗舰模型。模型总参数量 770B,每个 token 激活 49B,主干共包含78层,第一层采用标准 FFN,其余 77 层均为 MoE 结构,每层包含 256 个路由专家与 1 个共享专家,每个 token 激活 top-8 路由专家及共享专家。主干之外原生内置 1 层 MTP(总参数量 10B,激活 0.7B)以支持投机解码。Python00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
GLM-5.3-FlashGLM-5.3-Flash (320B-A18B),是GLM-5系列的首个原生多模态模型。320B总参数,能力超过GLM-5.2Jinja00
Spark-X2.5-4BSpark-X2.5-4B 旨在让强大的 AI 更实用、更高效、更易获得。在广泛日常任务中表现强劲,涵盖对话、写作、翻译、推理、编码、工具调用以及智能体工作流,并在同等规模的开源模型中取得领先成绩。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00


