【MobileNetVLAD】hierarchical_loc 算法部署与测试

本文主要在官方README文件的基础上做一些部署解析和测试指南

官方的github仓库地址为:https://github.com/ethz-asl/hierarchical_loc

1、各文件夹功能

  • catkin_dependencies 存放运行此工程需要的所有第三方包

    • eigen_catkin
    • maplab
    • maplab_dependencies
    • protobuf_catkin
    • tensorflow_catkin
  • retrievalnet 是一个基于Python+Tensorflow的模块化包,允许在任何目标图像领域上训练MobileNetVLAD模型,并利用现有的任何教师网络进行监督训练。

    • downloading
      • download_google_landmarks.py
    • retrievalnet
      • configs 包含模型、训练或数据集的配置文件,用于指定不同方面的参数
      • datasets 包含数据集处理的代码或配置文件,用于加载和预处理训练数据
      • models
      • utils
      • init.py
      • evaluation.py
      • export_descriptors.py
      • export_model.py
      • train.py
    • makefile
    • requirement.txt
    • setup.py
    • setuo.sh
  • global_loc 是一个用C++编写的ROS、Catkin包,可以加载任何训练好的图像检索模型,并能够在GPU/CPU上高效运行。它能够对给定的地图进行索引,并将索引结果保存为protobuf格式,同时还可以根据查询图像检索出相应的关键帧。

    • app
      • build-index.cc
      • time-query.cc
    • data
      • images
      • lindenhof_afternoon_aligned_mobilenet-d0.35.pb
      • lindenhof_wet_aligned_mobilenet-d0.35.pb
    • include
      • kd-tree-index.h
      • pca-reduction.h
      • place-retrieval.h
      • tensorflow-net.h
    • models 存放训练好的MobileNetVLAD(使用tensorflow_catkin加载)
      • mobilenetvlad_depth-0.35
        -variables
        - variables.data-00000-of-00001
        - mobilenetvlad_depth-0.35/variables/variables.index
        • saved_model.pb
    • proto
      • global-loc
        • descriptor_index.proto
    • src
      • place-retrieval.cc
    • test
      • test_build_index.cc
      • test_inference.cc
      • test_opencv.cc
      • test_query_index.cc
      • test_tensorflow.cc
    • CMakeLists.txt
    • package.xml

2、作者测试环境

(1)机器人嵌入式平台:Jetson TX2

(2)MobileNetVLAD模型训练数据集:Google LandMarks
学生网络的训练:只包含100k图像的随机子集
评估检索系统:NCLT数据集
评估整个定位流程:使用Google Tango设备在Zurich记录的两个重叠的1公里长的visual-inertial(视觉-惯性)序列

3、模型训练

3.1 配置环境

用官方指南

1、先在hierarchical_loc文件夹下创建两个文件夹命名为DATA、EXPER作为README文档中提到的 DATA_PATH、EXPER_PATH所指代的实际文件

2、只需要在hierarchical_loc文件夹下进入终端,输入以下脚本:

cd retrievalnet && make install

它会根据makefile中写的指令执行相应操作,安装程序运行所需要的包。

运行脚本后会提示要输入两个地址,这里输入步骤1中创建的两个文件夹( D A T A P A T H 、 DATA_PATH、 DATAPATHEXPER_PATH)的地址即可。

3.2 准备包含数据集、预训练模型和实验模型的数据文件夹

1、在hierarchical_loc文件夹下创建DATA文件(即README文档中所提到的$DATA_PATH),DATA文件结构为:

  • DATA

    • weights
      2、在hierarchical_loc文件夹下创建EXPER文件(即README文档中所提到的$EXPER_PATH),EXPER文件结构为:
  • EXPER

    • mobilenetvlad

3.3 下载数据集/制作数据集

3.3.1. 下载

1、下载README中Exporting the target descriptors标题下的the index of images ,下载完成后是一个google_landmarks_index.csv 文件,将它放入 ~/Code/SceneRecognition/hierarchical_loc/retrievalnet/downloading 路径下

2、进入上面的路径打开终端,执行下面的脚本,下载数据集

python download_google_landmarks.py ~/Code/SceneRecognition/hierarchical_loc/retrievalnet/downloading/google_landmarks_index.csv --output_dir ./google_landmarks

其中~/Code/SceneRecognition/hierarchical_loc/retrievalnet/downloading/google_landmarks_index.csv为刚刚下载好的google_landmarks_index.csv文件的路径,如果和我的不一样的话请换成你自己的地址

脚本开始后就会按照google_landmarks_index.csv文件中的地址下载数据集。这个数据集很大,有1098461张图片,需要一点下载时间。仅用来测试的话,我们只需要下载大约1万张图片就够了,使用crtl+c可终端程序。

3.3.2 制作

1、拍摄一段视频,截取图片,然后直接将自己的数据集放入/home/user/Code/SceneRecognition/hierarchical_loc/DATA路径下

3.4 下载模型权重文件

点击README中的超链接netvlad_tf_open

4 Training MobileNetVLAD

4.1 提取MobileNetVLAD编码器

点击README文件中的pre-trained on ImageNet超链接,下载获得mobilenet_v2_0.35_224.tgz压缩包,然后放到$DATA_PATH/weights/路径下

4.2 训练模型

进入~/Code/SceneRecognition/hierarchical_loc/retrievalnet/retrievalnet文件夹。打开终端,执行以下脚本:

python export_descriptors.py configs/netvlad_export_distill.yaml google_landmarks/descriptors --as_dataset

python train.py configs/mobilenetvlad_train_distill.yaml mobilenetvlad

4.3 结果保存

模型训练结果指标(如损失和准确性,可视化模型图)和权重参数等都会被保存在$EXPER_PATH/mobilenetvlad/文件中

5 Exporting the model for deployment 导出模型以备部署

进入~/Code/SceneRecognition/hierarchical_loc/retrievalnet/retrievalnet文件夹。打开终端,执行以下脚本文件。

python export_model.py config/mobilenetvlad_train_distill.yaml mobilenetvlad

结果将会被保存在$EXPER_PATH/saved_models/mobilenetvlad/路径下

6 Evaluating on the NCLT dataset

下载 NCLT 序列和相应的姿态文件(使用 nclt_generate_poses.ipynb 生成)到 $DATA_PATH/nclt/ 中

导出 NCLT 描述符,例如用于 MobileNetVLAD 的描述符:

python export_descriptors.py configs/mobilenetvlad_export_nclt.yaml mobilenetvlad

这些描述符可用于评估和可视化检索(参见 nclt_evaluation.ipynb 和 nclt_visualize_retrieval.ipynb)

7 模型部署

7.1 安装maplab

1、Install ROS

export UBUNTU_VERSION=xenial #(Ubuntu 18.04: bioni;Ubuntu 16.04: xenial;Ubuntu 14.04: trusty)

export ROS_VERSION=kinetic #(Ubuntu 18.04: melodic;Ubuntu 16.04: kinetic, Ubuntu;14.04: indigo)

7.2 设置Catkin工作空间

export ROS_VERSION=kinetic #(Ubuntu 18.04: melodic;Ubuntu 16.04: kinetic, Ubuntu;14.04: indigo)
export CATKIN_WS=~/maplab_ws
mkdir -p $CATKIN_WS/src
cd $CATKIN_WS
catkin init
catkin config --merge-devel # Necessary for catkin_tools >= 0.4.
catkin config --extend /opt/ros/$ROS_VERSION
catkin config --cmake-args \
	-DCMAKE_BUILD_TYPE=Release \
	-DENABLE_TIMING=1 \
	-DENABLE_STATISTICS=1 \
	-DCMAKE_CXX_FLAGS="-fext-numeric-literals -msse3 -msse4.1 -msse4.2" \
	-DCMAKE_CXX_STANDARD=14
cd src

如果要在GPU上执行推理(请参阅tensorflow_catkin的要求),请添加:

catkin config --append-args --cmake-args -DUSE_GPU=ON

最后克隆存储库并构建:

git clone https://github.com/ethz-asl/hierarchical_loc.git --recursive
touch hierarchical_loc/catkin_dependencies/maplab_dependencies/3rd_party/eigen_catkin/CATKIN_IGNORE
touch hierarchical_loc/catkin_dependencies/maplab_dependencies/3rd_party/protobuf_catkin/CATKIN_IGNORE
cd $CATKIN_WS && catkin build global_loc

编译的时候疯狂报错,导致编译不下去了…

运行测试示例:

./devel/lib/global_loc/test_inference
./devel/lib/global_loc/test_query_index

8 Indexing 索引

global-loc/maps/中给定一个VI map, 全局描述子的索引被创建在global-loc/data/中:

./devel/lib/global_loc/build_index \
	--map_name <map_name> \
	--model_name mobilenetvlad_depth-0.35 \
	--proto_name <index_name.pb>

例子使用论文中提到的Zurich map数据集

global-loc/src/place-retrieval.cc中提供了多个索引选项,例如二次采样或任务选择

9 Retrieval 检索

global-loc/test/test_query_index.cc中提供了查询示例

Zurich世数据集的描述符索引包含在global-loc/data/中,可用于计时查询时间:

./devel/lib/global_loc/time_query \
	--map_name <map_name> \
	--model_name mobilenetvlad_depth-0.35 \
	--proto_name lindenhof_afternoon_aligned_mobilenet-d0.35.pb \
	--query_mission f6837cac0168580aa8a66be7bbb20805 \
	--use_pca --pca_dims 512 --max_num_queries 100

使用相同的索引来评估和可视化检索:安装retrievalnet,生成Python protobuf interface接口,并参考tango_evaluation.ipynbtango_visualize_retrieval.ipynb.

10 使用Docker

这部分还没有做更多深入的了解,后续会进行更新。

11 性能测试

1、模型大小 600MB

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值