本文主要在官方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
- downloading
-
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
- mobilenetvlad_depth-0.35
- proto
- global-loc
- descriptor_index.proto
- global-loc
- 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
- app
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、 DATAPATH、EXPER_PATH)的地址即可。
3.2 准备包含数据集、预训练模型和实验模型的数据文件夹
1、在hierarchical_loc文件夹下创建DATA文件(即README文档中所提到的$DATA_PATH),DATA文件结构为:
-
DATA
- weights
2、在hierarchical_loc文件夹下创建EXPER文件(即README文档中所提到的$EXPER_PATH),EXPER文件结构为:
- weights
-
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.ipynb 和tango_visualize_retrieval.ipynb.
10 使用Docker
这部分还没有做更多深入的了解,后续会进行更新。
11 性能测试
1、模型大小 600MB