首页
/ TensorFlow Models 中的 DELF/DELG:面向图像检索与实例识别的深度局部与全局特征全指南

TensorFlow Models 中的 DELF/DELG:面向图像检索与实例识别的深度局部与全局特征全指南

2026-09-06 18:19:03作者:昌雅子Ethen

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 APIobject_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.mdresearch/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,展示两幅图像间的局部特征匹配连线:

DELF 局部特征匹配结果示意

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 中的消息一一对应,各字段语义如下:

  • 顶层 DelfConfig
    • model_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.251.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_nameiou_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 的预训练模型清单。检测可视化结果如下所示:

地标检测可视化示例 1

六、统一局部+全局特征: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.matgnd_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.pbtxtr101delg_gld_config.pbtxtr50delg_gldv2clean_config.pbtxtr101delg_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.pbtxtindex_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.pycompute_recognition_metrics.pycompute_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 复制后做三处修改即可接入自训练局部模型:

  1. model_path 指向导出目录(如 gldv2_model_local);
  2. 根层级新增 is_tf2_exported: true
  3. delf_local_configuse_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,其下分 protospython 两大目录。

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.pyextract_features.pymatch_images.py)与目标检测(detector.pyextract_boxes.py),以及示例配置 delf_config_example.pbtxt
  • delgextract_features.py(局部+全局特征联合提取,配套 r50delg_gld_config.pbtxt 等配置)、perform_retrieval.py(检索/评分)、measure_latency.py(延迟测量)。
  • detect_to_retrieve:特征/框提取与聚合/聚类脚本 boxes_and_features_extraction.pyaggregation_extraction.pycluster_delf_features.pyextract_index_boxes_and_features.pyextract_query_features.py;检索/重排 perform_retrieval.pyimage_reranking.py;配套配置 delf_gld_config.pbtxtindex_aggregation_config.pbtxtquery_aggregation_config.pbtxt;Revisited Oxford/Paris 解析与评测 dataset.py
  • google_landmarks_dataset:GLD 指标与 IO(见第 7.6 节)。
  • training:基于 ResNet50 的 DELF 模型训练(train.pymodel/resnet50.pymodel/delf_model.py),模型导出(model/export_model.pymodel/export_global_model.pymodel/export_model_utils.py),以及数据下载与预处理(download_dataset.shbuild_image_dataset.pydatasets/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 模型,本仓库都提供了从数据、训练、导出到评测的自洽路径——这也是它在实例级识别与检索领域被广泛作为起点的原因。

登录后查看全文
热门项目推荐
相关项目推荐

项目优选

收起
kernelkernel
deepin linux kernel
C
33
18
ops-transformerops-transformer
本项目是CANN提供的transformer类大模型算子库,实现网络在NPU上加速计算。
C++
1.13 K
2.75 K
pytorchpytorch
作为 Ascend for PyTorch 社区的核心组件,TorchNPU 是昇腾专为 PyTorch 打造的深度学习适配插件,使 PyTorch 框架能够直接调用昇腾 NPU,为开发者提供昇腾 AI 处理器的超强算力。
Python
857
1.35 K
docsdocs
暂无描述
Markdown
897
5.8 K
kernelkernel
openEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。
C
529
593
ops-nnops-nn
本项目是CANN提供的神经网络类计算算子库,实现网络在NPU上加速计算。
C++
915
1.83 K
jiuwenswarmjiuwenswarm
JiuwenSwarm 是一款基于openJiuwen开发的智能AI Agent,它能够将大语言模型的强大能力,通过你日常使用的各类通讯应用,直接延伸至你的指尖。
Python
3.58 K
1.01 K
ops-mathops-math
本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。
C++
1.35 K
1.46 K
cann-learning-hubcann-learning-hub
CANN 学习中心仓,支持在线互动运行、边学边练,提供教程、示例与优化方案,一站式助力昇腾开发者快速上手。
Jupyter Notebook
1.01 K
515
AscendNPU-IRAscendNPU-IR
AscendNPU-IR是基于MLIR(Multi-Level Intermediate Representation)构建的,面向昇腾亲和算子编译时使用的中间表示,提供昇腾完备表达能力,通过编译优化提升昇腾AI处理器计算效率,支持通过生态框架使能昇腾AI处理器与深度调优
C++
547
388