目录
DELG描述
DELG模型是一个图像检索模型,它利用了一个全卷积神经网络和两个不同的头:一个用于全局特征,另一个用于局部特征。利用深度网络层的特征图进行聚合,得到全局特征,有效地总结了输入图像的显著特征,使模型对输入的细微变化具有更强的鲁棒性。局部特征分支利用中间特征图来检测重要的图像区域,在注意力模块的帮助下,产生描述符,通过让描述符具有可区分性的方式来表示相关的局部内容。
论文:Cao B, Araujo A, Sim J. Unifying deep local and global features for image search[C]//European Conference on Computer Vision. Springer, Cham, 2020.
模型架构
DELG模型主要分为两部分:全局特征提取、局部特征提取。
全局特征提取:通过使用经过分类损失训练的CNN的特征提取层,构建一个全卷积网络(FCN),从图像中提取密集特征。具体来说,DELG使用在ImageNet上完成训练的ResNet50模型进行迁移学习,对地标数据集进行微调,使用ArcFace损失训练网络进行图像分类训练。通过这种方式,模型可以有效地选择最相似的图像。
局部特征提取:利用中间特征图来检测重要的图像区域,在注意力模块的帮助下,产生描述符,通过让描述符具有可区分性的方式来表示相关的包括关于特定图像区域的描述和几何信息的局部内容。
数据集
训练数据集:Google Landmarks Dataset v2
评估数据集:
-
Oxford5k
数据集大小:1.84G,共11个类、5062张彩色图像
-
Paris6k
数据集大小:2.43G,共11个类、6412张彩色图像
环境要求
- 硬件(Ascend)
- 框架
- 如需查看详情,请参见如下资源:
快速入门
通过官方网站安装MindSpore后,您可以按照如下步骤进行训练和评估:
-
数据集下载和预处理
# Google Landmarks Dataset v2 训练集下载
bash scripts/download_gldv2.sh train 499
# 获取clean子集索引
wget https://s3.amazonaws.com/google-landmark/metadata/train_clean.csv
# Oxford5k和Paris6k以及它们对应的ground truth文件下载
bash scripts/download_oxf.sh ./eval_dataset
bash scripts/download_paris.sh ./eval_dataset
-
Ascend处理器环境运行
# 在delg_config.yaml中修改配置
# 添加预训练权重、训练数据集、Clean子集索引、权重保存路径,例子:
origin_data_root_url: "/home/group1/lmx/GLDv2/train/"
pretraind_resnet50_url: "/home/group1/lmx/ckpt/resnet50_ascend_v130_imagenet2012_official_cv_bs32_acc77.06.ckpt"
GLDv2_Clean_Info_url: "/home/group1/lmx/train_clean.csv"
saved_ckpt_url: "/home/group1/lmx/output/"
# 运行训练示例,模型为端到端训练
# 训练阶段:
python train_delg.py --yaml_path="./delg_config.yaml" > train.log 2>&1 &
# 运行分布式训练示例
# 训练阶段
bash scripts/run_8p_train.sh [RANK_TABLE_FILE]
# example: bash scripts/run_8p_train.sh ./hccl_8p_01234567_192.168.88.13.json
# 运行评估示例,参数DATASET_NAME为评估数据集名称,可填"oxford"或"paris"
# 评估方式:针对Oxford5k或Paris6k进行Global或Local部分的图像检索。检索结果保存为mAP.txt
# Global部分
# 提取global特征并计算mAP
python eval.py [DEVICE_TYPE] [EVAL_DATASET]
# example: python eval.py --device_type="910" --eval_dataset="oxford"
# Local部分
# 提取local特征
python src/exactor_local.py [DEVICE_TYPE] [EVAL_DATASET]
# example: python src/exactor_local.py --device_type="910" --eval_dataset=["oxford"或"paris"]
# 计算mAP
python python eval_local.py [EVAL_DATASET]
# example: python python eval_local.py --eval_dataset=["oxford"或"paris"]
# 导出MindIR模型到当前目录,文件名为delg.mindir,示例
python export.py --device_id=0 --ckpt_path=./output/...
# 运行推理示例
# 评估方式:图片检索, 检索结果保存为mAP.txt
# 参数IMAGES_PATH为评估数据集路径,MINDIR_PATH为导出的MindIR文件路径,DEViCE_ID使用的310设备id
# Global部分
bash scripts/run_infer_310_global.sh [IMAGES_PATH] [MINDIR_PATH] [DEViCE_ID]
# Local部分
bash scripts/run_infer_310_local.sh [IMAGES_PATH] [MINDIR_PATH] [DEViCE_ID]
[注]以上参数所使用的路径均需为绝对路径
对于分布式训练,需要提前创建JSON格式的hccl配置文件。
请遵循以下链接中的说明:
https://gitee.com/mindspore/models/tree/master/utils/hccl_tools.
脚本说明
脚本及样例代码
.
└─ delg
├── ascend310_infer # 310推理源代码
├── ckpt # 预训练权重目录
├── scripts
│ ├── download_gldv2.sh # 下载 Google Landmarks Dataset v2 的shell脚本
│ ├── download_oxf.sh # 下载 Oxford5k 的shell脚本
│ ├── download_paris.sh # 下载 Paris6k 的shell脚本
│ ├── run_8p_train.sh # 分布式训练的shell脚本
│ ├── run_infer_310_global.sh # 310推理Global部分图像检索的shell脚本
│ └── run_infer_310_local.sh # 310推理Local部分图像检索的shell脚本
├── src
│ ├── delg.py # delg网络定义
│ ├── delg_utils.py # 提取局部特征工具类
│ ├── exactor_local.py # 提取local部分特征
│ ├── get_dataset.py # 从mindrecord读取数据
│ ├── get_dataset_from_origin.py # 从原数据集读取数据
│ ├── Imgpreprocess.py # 图像检索评估的预处理
│ ├── preprocess.py # 310推理预处理脚本
│ ├── read_ground_truth.py # 读取gt文件
│ ├── resnet.py # delg主干网络
│ └── transforms.py # 图像增强策略
├── txt_data # 推理文件索引目录
├── train_delg.py # 训练脚本
├── delg_config.yaml # 训练配置文件
├── eval.py # mAP评估脚本
├── eval_local.py # Local部分mAP评估脚本
├── export.py # MINDIR模型导出脚本
└── README_CN.md # delg的文件描述
脚本参数
-
在delg_config.yaml中可以配置训练参数。
# openi setting
use_openi: False # 是否在openi平台进行训练
# url setting
pretraind_resnet50_url: "/home/group1/lmx/ckpt/resnet50_ascend_v130_imagenet2012_official_cv_bs32_acc77.06.ckpt" # Resnet50预训练权重
origin_data_root_url: "/home/group1/lmx/GLDv2/train/" # GLDv2数据集路径
GLDv2_Clean_Info_url: "/home/group1/lmx/train_clean.csv" # GLDv2_Clean索引
saved_ckpt_url: "/home/group1/lmx/output/" # 保存checkpoint路径
# training setting
device_target: "Ascend" # 使用的训练设备
device_num: 8 # 使用显卡数量
seed: 0 # 随机数种子
batch_size: 64 # 训练批次大小
lr: 0.001 # 学习率初始化值
save_checkpoint_steps: 100 # checkpoint保存间隔(单位:训练步数)
keep_checkpoint_max: 5 # checkpoint最大保存数
epoch_size: 100 # 训练最大epoch
state: "train" # 网络状态(训练:"train",测试:"test")
更多配置细节请参考脚本delg_config.yaml
。
数据集下载
使用以下命令可以下载Google Landmarks Dataset v2
数据集的训练集,代码会根据索引自动提取它的clean子集(具体定义参考数据集中数据集对应的论文):
# Google Landmarks Dataset v2 训练集下载
bash scripts/download_gldv2.sh train 499
# 获取clean子集索引
wget https://s3.amazonaws.com/google-landmark/metadata/train_clean.csv
请准备至少1.1TB的存储空间。
目录以及说明:
.
└─ gldv2
├── train
│ ├── 0 # 图片存放的文件夹,共15个
│ ├── 1
│ ├── ...
│ ├── f
│ ├── md5.images_000.txt # md5校验文件,共500个
│ ├── md5.images_001.txt
│ ├── ...
│ ├── md5.images_499.txt
│ ├── images_000.tar # 图像压缩包,共500个
│ ├── images_001.tar
│ ├── ...
│ └── images_499.tar
└────── train_clean.csv
使用以下命令可以下载Oxford5k和Paris6k的数据集:
bash scripts/download_oxf.sh ./eval_dataset
bash scripts/download_paris.sh ./eval_dataset
目录以及说明:
.
└─ eval_dataset
├── oxbuild_images # Oxford5k图像文件夹
├── gt_files_170407 # Oxford5k的gt文件夹
├── paris6k_images # Paris6k图像文件夹
└── paris_120310 # Paris6k的gt文件夹
训练过程
训练
-
Ascend处理器环境运行
在delg_config.yaml中配置好预训练权重路径以及其它参数,路径要写为绝对路径。模型为端到端训练,只需指定配置好的yaml路径即可,默认为train_delg.py同级目录下:
python train_delg.py --yaml_path="./delg_config.yaml" > train.log 2>&1 &
上述python命令将在后台运行,您可以通过train.log文件查看结果。
训练结束后,您可在默认脚本文件夹的ckpt
目录下找到检查点文件。
可以通过log文件查看损失值:
epoch: 1 step: 2877, loss is 32.375
epoch: 2 step: 2877, loss is 32.25
...
分布式训练
评估过程
评估
评估方式为图像特征匹配和计算图像检索mAP。以下评估过程均需在Ascend环境下完成。
-
计算图像检索mAP
图像检索是在Oxford5k和Paris6k这两个数据集上做的,数据集把图片划分成了查询集和检索集,并且提供了查询集中图片对应的ground truth图片,利用这些文件可以计算出DELG模型“以图的内容检索相关图片”能力的评价指标mAP。DELG的评价标准分别有Global和Local部分。
整个过程分为三步:提取特征,利用特征进行检索,计算mAP。这三个过程被整合在一个脚本中。
在运行以下命令之前,请将路径设置为绝对全路径。
# Global部分
# 提取global特征并计算mAP
python eval.py --device_type="910" --eval_dataset=["oxford"或"paris"]
# Local部分
# 提取local特征
python src/exactor_local.py --device_type="910" --eval_dataset=["oxford"或"paris"]
# 计算mAP
python python eval_local.py --eval_dataset=["oxford"或"paris"]
上述python命令将在打印计算进度,计算得到的mAP结果会在脚本运行完成后打印在终端,也会保存到默认脚本目录下的mAP.txt文件中:
# cat mAP.txt
easy
mAP=54.02
mP@k[10 20 30 40 50 60 70 80 90] [54.77 43.23 36.9 33.03 30.31 28.32 26.73 25.47 24.15]
mR@k[10 20 30 40 50 60 70 80 90] [37.97 46.64 51.72 55.44 58.48 61.98 64.75 67.36 69.06]
hard
mAP=26.79
mP@k[10 20 30 40 50 60 70 80 90] [30.55 24.84 22.6 20.58 19.31 18.12 17.33 16.62 15.85]
mR@k[10 20 30 40 50 60 70 80 90] [22.34 28.33 32.14 34.96 37.41 38.88 40.43 41.91 45.7 ]
medium
mAP=43.97
mP@k[10 20 30 40 50 60 70 80 90] [58.91 46.84 40.25 35.65 32.6 30.16 28.41 26.88 25.66]
mR@k[10 20 30 40 50 60 70 80 90] [26.3 33.98 38.63 41.84 45.03 47.37 49.83 51.51 53.6 ]
根据不同的标准设置了三种mAP指标。除此之外,mP表示平均准确率,mR表示平均召回率,每行左边中括号内的是检索次数,右边中括号内的是对应的精确率或召回率。
## 导出过程
### 导出
导出MindIR模型到当前目录,文件名为delg.mindir:
```shell
python export.py --device_id=0 --ckpt_path=./output/...
推理过程
推理
在进行推理之前我们需要先导出mindir模型。
-
在昇腾310上进行推理
这里与评估相似,同样提供了图像特征匹配和计算图像检索mAP的两个脚本。推理结果查看方式与评估类似。
# 计算图像检索mAP
# Global部分
bash scripts/run_infer_310_global.sh [IMAGES_PATH] [MINDIR_PATH] [DEViCE_ID]
# Local部分
bash scripts/run_infer_310_local.sh [IMAGES_PATH] [MINDIR_PATH] [DEViCE_ID]