尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

基于 GLDv2 数据集的 DELF/DELG 图像特征模型完整训练指南

基于 GLDv2 数据集的 DELF/DELG 图像特征模型完整训练指南 基于 GLDv2 数据集的 DELF/DELG 图像特征模型完整训练指南【免费下载链接】modelsModels and examples built with TensorFlow项目地址: https://gitcode.com/GitHub_Trending/mode/models导读本文完整讲解 TensorFlow 官方模型仓库中 DELFDeep Local Features/DELGDeep Local and Global Features图像检索模型的训练流程涵盖环境安装、GLDv2 数据集下载、TFRecord 数据准备、分布式训练、模型导出与端到端验证的每一个环节。读完本文你将能够从零训练出用于图像检索的局部特征DELF或局部 全局特征DELG模型并把它接入本仓库的特征提取与图像匹配管线完成实战验证。本文全部操作与结论均以 training/README.md 为骨架并对照 training 目录下的真实脚本与模型实现展开所有命令均可直接复制执行。概览完整训练流水线训练一个 DELF/DELG 模型需要依次完成以下四个阶段安装 DELF Python 库下载 Google Landmarks Dataset v2GLDv2原始图片将原始图片打包为 TFRecord 训练/验证数据启动分布式训练。接下来各小节将逐步展开说明。前置条件训练代码位于本仓库models/research/delf/delf/python/training目录。克隆 TensorFlow Models 仓库并进入该目录即可git clone https://github.com/tensorflow/models.git cd models/research/delf/delf/python/training注意本文所有命令默认在该training目录下执行下文引用的train.py、build_image_dataset.py、download_dataset.sh等都位于此目录即 research/delf/delf/python/training。安装 DELF 库请严格按照 INSTALL_INSTRUCTIONS.md 完成 DELF Python 库的安装。该文档会指导你完成依赖安装TensorFlow、TensorFlow Probability、absl、numpy、pandas、matplotlib 等、delf包的路径配置以及本地算子编译等步骤。训练/数据准备脚本还会用到两个关键依赖TensorFlow Probabilitytfp训练脚本中用于计算注意力分数的百分位统计见 train.py 中的_attention_summariespandasbuild_image_dataset.py读取 GLDv2 的 CSV 元数据时依赖它。此外仓库还提供了一键安装脚本 install_delf.sh可用于自动完成环境准备。下载 GLDv2 训练数据GLDv2 的图片被划分为TRAIN、INDEX、TEST三个子数据集。每个子数据集的图片以*.tar压缩包组织并由*.csv文件记录对应的训练元数据与版权信息。各子数据集对应的 tar 文件数量如下TRAIN500 个文件INDEX100 个文件TEST20 个文件。使用脚本下载运行 download_dataset.sh 即可下载bash download_dataset.sh 500 100 20脚本按顺序接收三个参数参数含义上限第 1 个从 TRAIN 数据集下载的图片文件数量500第 2 个从 INDEX 数据集下载的图片文件数量100第 3 个从 TEST 数据集下载的图片文件数量20下载目录结构图片会按如下结构存放gldv2_dataset/ ├── train/ # TRAIN 数据集的原始图片 ├── index/ # INDEX 数据集的原始图片 └── test/ # TEST 数据集的原始图片每个子文件夹train/、index/、test/中都会包含下载好的*.tar图片压缩包对应的 MD5 校验文件*.txt解压后的图片内容图片按文件名第 1、2、3 个字符组织到多级子目录中与已下载图片对应的训练/版权元数据 CSV 文件。从 download_dataset.sh 源码可以看到脚本的具体行为所有文件从https://s3.amazonaws.com/google-landmark图片 tar 包、.../md5sum校验和、.../metadata与.../ground_truthCSV 元数据拉取每个download_image_file会下载images_XXX.tar编号为 3 位数字及其 md5 文件并用md5sumLinux/md5 -rmacOS校验通过后才解压脚本以 6 个并发进程批量下载并解压中途校验失败会直接exit 1终止避免留下损坏数据。存储与带宽提示由于 GLDv2 体量巨大完整下载可能耗时长达 12 小时、占用近 1TB 磁盘空间。为节省带宽与磁盘建议只下载训练必需的 TRAIN 子集——INDEX 与 TEST 合计约 95GB可以全部跳过。进一步地下载并解压后可删除*.tar压缩包以释放空间。准备训练数据数据准备阶段的目标是把 GLDv2 原始图片转换为TFRecord文件并划分出 TRAIN 与 VALIDATION 两个 split。注意训练集只保留 GLDv2 数据集中的 clean 子集——clean 子集过滤掉了识别/检索歧义与标注噪声过大的图片其详细定义见引入 GLDv2 的 CVPR20 论文。运行 build_image_dataset.py生成 clean 子集的 TRAIN/VALIDATION TFRecord 文件需运行 build_image_dataset.pypython3 build_image_dataset.py \ --train_csv_pathgldv2_dataset/train/train.csv \ --train_clean_csv_pathgldv2_dataset/train/train_clean.csv \ --train_directorygldv2_dataset/train/*/*/*/ \ --output_directorygldv2_dataset/tfrecord/ \ --num_shards128 \ --generate_train_validation_splits \ --validation_split_size0.2参数含义如下源自脚本中的 flags 定义详见 build_image_dataset.py 源码参数说明--train_csv_path训练集全量元数据 CSVtrain.csv包含id与landmark_id列--train_clean_csv_pathclean 子集 CSVtrain_clean.csv表头为landmark_id;images提供后将只保留本文件列出的图片--train_directory解压后 TRAIN 图片所在目录通配符覆盖按文件名分层的多级子目录--output_directoryTFRecord 输出目录--num_shards输出分片数默认 128--generate_train_validation_splits是否将训练集划分为 TRAIN 与 VALIDATION 两个 splitbool--validation_split_sizeVALIDATION split 占训练集的比例默认 0.2取值须在 (0, 1) 开区间内--seed划分 split 时洗牌用的随机种子便于结果可复现生成的 TFRecord 文件前缀如下TRAIN splittrain-*VALIDATION splitvalidation-*clean 子集处理与重标注从源码可以看清 clean 子集的转换逻辑_get_clean_train_image_files_and_labels读取train_clean.csv该文件按landmark_id分组列出图片 idimages列以空格分隔与train_directory下实际存在的图片做交集匹配跳过 CSV 中存在但未下载的图片将原始 landmark id重映射为从 0 开始的连续标签relabeling {label: index ...}因为分类头num_classes需要的是密集整数标签重映射规则会被写入输出目录下的relabeling.csv表头new_label,old_label供后续评估对照。在未启用 clean 过滤的情况下不传--train_clean_csv_path脚本走_get_all_image_files_and_labels直接读取train.csv中每个图片 id 的landmark_id。Train/Validation 划分的均衡策略启用--generate_train_validation_splits后脚本按 label分层划分_build_train_and_validation_splits先把每个 landmark 下的图片各自洗牌再按validation_split_size比例切分出验证子集最后把所有子集拼接并再次全局洗牌。这样能保证验证集与训练集在类别构成上尽量一致避免小类别全部落入某一侧。TEST split 的生成可选同一脚本也可为训练后评估生成 TEST split 的 TFRecord只需追加两个参数--test_csv_pathgldv2_dataset/train/test.csv \ --test_directorygldv2_dataset/test/*/*/*/ \此时 TEST split 的 TFRecord 文件名符合test-*模式。源码中 TEST split 的图片不包含image/class/label字段测试集无公开标签_convert_to_example仅在label非空时才写入该特征。TFRecord 内部结构每个 TFRecord 记录是一个序列化的Exampleproto包含的字段来自_convert_to_example即 build_image_dataset.pyimage/height、image/width图片像素尺寸image/colorspace恒为RGBimage/channels恒为 3image/format恒为JPEGimage/id图片唯一 id如97c0a12e07ae8dd5image/encodedJPEG 编码的图片字节串image/class/label整数地标标签仅训练数据包含。耗时与空间提示同样由于 GLDv2 规模庞大TFRecord 生成阶段最长可能耗时 12 小时、占用约 500GB 磁盘空间。建议预留足够的临时磁盘并可在生成完成后删除原始图片以回收空间。运行训练为了让模型更快收敛可以先用 ImageNet 预训练权重初始化 ResNet 主干。ImageNet checkpoint 从http://storage.googleapis.com/delf/resnet50_imagenet_weights.tar.gz获取在 Linux 上解压curl -Os http://storage.googleapis.com/delf/resnet50_imagenet_weights.tar.gz tar -xzvf resnet50_imagenet_weights.tar.gz训练入口脚本的总体设计训练主脚本为 train.py。从源码看其核心设计是使用tf.distribute.MirroredStrategy支持多 GPU 同步训练脚本 docstring 明确说明使用分类损失 MirroredStrategy模型为ResNet50 主干 注意力模块Attention 可选自动编码器按 GLD 数据集版本确定分类头类别数googlelandmarks.py 中num_classes {gld_v1: 14951, gld_v2: 203094, gld_v2_clean: 81313}数据集由 googlelandmarks.py 的CreateDataset构建读 TFRecord → 解码 JPEG →(像素 - 128) / 128归一化 → 训练时做 ImageNet 风格随机裁剪sample_distorted_bounding_box面积占原图 0.08~1.0、宽高比 3/4~4/3并 resize 到 321×321学习率采用线性衰减调度lr initial_lr * (1 - global_step / max_iters)优化器为带 momentum 0.9 的 SGD全局梯度范数裁剪到 10.0每 1000 步做一次验证与 checkpoint 保存CheckpointManager保留最近 10 份、每 3 小时至少一份并把 loss/accuracy/attention 统计写入 TensorBoard。训练 DELF 局部特征模型假设 TFRecord 已生成到gldv2_dataset/tfrecord/目录执行如下命令训练并在gldv2_training目录输出结果python3 train.py \ --train_file_patterngldv2_dataset/tfrecord/train* \ --validation_file_patterngldv2_dataset/tfrecord/validation* \ --imagenet_checkpointresnet50_weights_tf_dim_ordering_tf_kernels_notop.h5 \ --dataset_versiongld_v2_clean \ --logdirgldv2_training/注意--use_autoencoder默认值为True因此默认将启用自动编码器联合训练。自动编码器把 block3 特征图压缩到低维默认 128 维autoencoder_dimensions再扩展回去其重建损失默认权重 10.0reconstruction_loss_weight参与总损失具体逻辑见 train.py 的train_step。训练 DELG 局部 全局特征模型如需训练 DELG 论文中改进的全局特征头在启动命令中追加--delg_global_features参数python3 train.py \ --train_file_patterngldv2_dataset/tfrecord/train* \ --validation_file_patterngldv2_dataset/tfrecord/validation* \ --imagenet_checkpointresnet50_weights_tf_dim_ordering_tf_kernels_notop.h5 \ --dataset_versiongld_v2_clean \ --logdirgldv2_training/ \ --delg_global_featuresdelg_global_features置真后train.py 的create_model会实例化 delg_model.py 中的Delg模型而非纯 DELF。从 delg_model.py 源码可见其与 DELF 的差异GeM Pooling全局特征采用 Generalized Mean pooling--delg_gem_power默认 3.0替代 DELF 的简单平均池化FC 白化/Embedding 层GeM 输出后接一层 2048 维的全连接白化层--delg_embedding_layer_dim默认 2048ArcFace 余弦分类器backbone 的全局分类头不再用普通Dense而是对 L2 归一化后的 embedding 与归一化类别权重计算余弦相似度再乘可学习/固定的缩放因子--delg_scale_factor_init默认 45.25 ≈ sqrt(2048)并在训练时对正确类别施加 ArcFace margin--delg_arcface_margin默认 0.1见cosine_classifier_logits与apply_arcface_margin在训练时 backbone 的 block3 输出会被tf.stop_gradient截断梯度防止全局分支梯度干扰局部注意力分支这一处理在 delf_model.py 的global_and_local_forward_pass中有明确注释其依据即 DELG 论文。训练参数速查下表汇总了 train.py 中定义的、除数据路径外值得关注的核心 flags默认值均取自源码Flag默认值说明--debugFalse调试模式单机 eager 执行batch_size4、max_iters100、每步保存--logdir/tmp/delfTensorBoard 日志与 checkpoint 输出目录--dataset_versiongld_v1枚举 gld_v1 / gld_v2 / gld_v2_clean决定类别数--seed0训练数据集洗牌种子--initial_lr0.01初始学习率线性衰减--batch_size32全局 batch size--max_iters500000最大迭代步数--block3_stridesTrue是否在 block3 输出增加 stride影响特征图分辨率--use_augmentationTrue是否使用 ImageNet 风格数据增强--imagenet_checkpointNoneResNet 主干 ImageNet 预训练权重None 则不加载--attention_loss_weight1.0注意力损失在总损失中的权重--delg_global_featuresFalse是否训练 DELG全局 局部模型--image_size321输入图片边长--use_autoencoderTrue是否联合训练自动编码器做降维--reconstruction_loss_weight10.0自动编码器重建损失权重--autoencoder_dimensions128自动编码器压缩后的通道数--local_feature_map_channels1024局部特征来源层block3的通道数损失函数方面源码显示总损失 desc_loss attention_loss_weight * attn_loss reconstruction_loss_weight * reconstruction_loss其中全局分支的desc_loss使用SparseCategoricalCrossentropy(from_logitsTrue)DELG 模式为 ArcFace 余弦 logits注意力分支使用独立的Dense(num_classes)分类器计算。超参数建议为提升收敛速度以下超参数组合已在一组测试验证过的硬件环境中取得良好效果其余 flags 保持默认值8 张 Tesla P100 GPU--batch_size256 --initial_lr0.014 张 Tesla P100 GPU--batch_size128 --initial_lr0.005即 batch size 减半时初始学习率也应减半以维持等效的梯度统计特性。导出训练好的模型假设训练产物TensorFlow checkpoint位于gldv2_training目录训练脚本会同时保存两种产物CheckpointManager管理的delf_tf2-ckpt检查点以及可直接load_weights的权重文件gldv2_training/delf_weightssave_formattf。导出命令中的--ckpt_pathgldv2_training/delf_weights指向后者。仅 DELF 局部特征模型适用于只需要局部特征模型的场景python3 model/export_local_model.py \ --ckpt_pathgldv2_training/delf_weights \ --export_pathgldv2_model_local仅 DELG 全局特征模型适用于只需要全局特征模型的场景python3 model/export_global_model.py \ --ckpt_pathgldv2_training/delf_weights \ --export_pathgldv2_model_global \ --delg_global_featuresDELG 局部 全局联合模型适用于需要同时提取局部与全局特征的场景python3 model/export_local_and_global_model.py \ --ckpt_pathgldv2_training/delf_weights \ --export_pathgldv2_model_local_and_global \ --delg_global_features从 export_global_model.py 的实现可以看到导出的本质以tf.Module包装重建的模型结构delg_model.Delg或delf_model.Delf调用load_weights(checkpoint_path)载入权重后用tf.saved_model.save导出serving_default签名提供ExtractFeatures/ExtractFeaturesFixedScales两个前向函数。导出过程关键点导出时block3_stridesFalse与训练配置解耦模型输入为uint8的[None, None, 3]图像可在服务端灵活处理任意分辨率并通过input_scales支持多尺度金字塔。Kaggle 兼容的全局特征模型特殊格式如需导出符合 2020 Landmark Retrieval 挑战赛要求的全局特征模型可执行python3 model/export_global_model.py \ --ckpt_pathgldv2_training/delf_weights \ --export_pathgldv2_model_global \ --input_scales_list0.70710677,1.0,1.4142135 \ --multi_scale_pool_typesum \ --normalize_global_descriptor注意该命令对参赛很有帮助但它导出的是 Kaggle 所需格式与本代码库内部使用的格式不同——按此方式导出的模型无法直接用于 DELG 指令文档 中的命令。若要导出与代码库兼容的格式请使用上文仅 DELG 全局特征模型一节中的命令。此处三个参数的作用依据 export_global_model.py 源码--input_scales_list把多尺度输入缩放列表1/√2 ≈ 0.7071、1.0、√2 ≈ 1.4142硬编码进模型导出ExtractFeaturesFixedScales签名无需运行时动态传入尺度--multi_scale_pool_type取值None/average/sum。None时每个尺度分别输出global_descriptors设为sum或average时对各尺度描述子池化输出单一 1D 向量global_descriptor--normalize_global_descriptor是否对最终全局描述子做 L2 归一化。测试训练好的模型测试训练好的局部特征模型导出模型后可用同一地标的两张图片做提取特征 → 匹配验证的冒烟测试确认模型确实学到了可判别的地标特征。第一步下载 Oxford buildings 数据集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第二步改写 DELF 提取配置复制 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 }配置项语义对照源码delf_config.proto 与原始 delf_config_example.pbtxtmodel_path导出模型SavedModel目录image_scales图像金字塔多尺度列表逐尺度提取特征可提升尺度鲁棒性is_tf2_exported: true声明加载的是 TF2 导出模型delf_local_config.max_feature_num每张图最多保留的特征点数量默认 1000delf_local_config.score_threshold特征点注意力分数阈值默认 100.0低于阈值的点被过滤use_pca: false新训练的模型不做 PCA 降维故需关闭该开关。第三步提取两幅图的 DELF 特征python3 ../examples/extract_features.py \ --config_path delf_config_example.pbtxt \ --list_images_path list_images.txt \ --output_dir data/oxford5k_features第四步特征匹配python3 ../examples/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效果应与下图类似两幅展示同一地标牛津 Hertford 学院的图像通过训练后模型提取的局部特征找到匹配点对并用连线标出从而直观验证特征的正确性。测试训练好的全局或全局 局部特征模型请遵循 DELG 指令文档 完成全局特征模型的检索测试唯一需要修改的是在特征提取时传入指向新训练模型的delf_config_path。按照 delf_config.proto 中的定义你需要根据实际使用哪种特征模态正确设置use_local_features与use_global_features同时记得将is_tf2_exported设为true。关于纯全局特征GeM DELG 头的训练与评估仓库还提供了一套不依赖 GLDv2 分类监督的备选流程可参考 global_features/README.md其中覆盖了 Siamese/Triplet 式训练、多分辨率评估、Revisited Oxford/Paris 指标评测等进阶内容。补充说明DELF 与 DELG 的论文依据DELF 模型对应论文Large-Scale Image Retrieval with Attentive Deep Local Features核心思路是用注意力对局部特征加权、丢弃背景区域DELG 模型对应论文Unifying Deep Local and Global Features for Image Search在同一网络中以 GeM Pooling 白化层 ArcFace 训练全局头、以注意力机制训练局部头从而统一两类特征。两篇论文的 arxiv 编号分别见 delf_model.py 与 delg_model.py 的 docstring。目录导航本目录下的其他说明文档包括数据下载与转换细节 datasets/google_landmarks_dataset/README.md、训练后的实际检索流程 DELG_INSTRUCTIONS.md、以及特征提取/匹配最小示例脚本 examples/extract_features.py 与 examples/match_images.py。【免费下载链接】modelsModels and examples built with TensorFlow项目地址: https://gitcode.com/GitHub_Trending/mode/models创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表