PoseNet简介
PoseNet是剑桥大学做的一个视觉定位模型,能够通过一张彩色图像定位你的位姿信息。在一个大的城市环境下,它只需要花费5ms来获取你的位姿信息,精度比GPS更高。并且相较于GPS,它能够确定你的方向且能够在室内运行。
我们将卷积神经网络应用于相机的姿态回归中。因为我们训练了一个端到端的网络用于计算相机的位姿,所以我们的系统十分简单。与其他的系统不同,我们的不需要一个大的数据集或者地标。相反,它学习了具有鲁棒性的高级特征,能够处理多种不同类型的相机,运行模糊,天气,行人以及其他干扰。它高度可扩展,只需要MB的存储空间并且能够以5ms一张图像的速度在大型的城市环境中进行定位。
PoseNet是用剑桥地标数据集进行训练的。它是一个大型的城市环境定位数据集,有这超过12000张剑桥周围的6类场景图像,每张图像都对应着6自由度的相机位姿信息。
Getting Started:
1.下载资源
下载源码:code
下载dataset及weights
2.安装
按照安装caffe的过程安装:
cp Makefile.config.example Makefile.config
修改Makefile.config,注意将WITH_PYTHON_LAYER := 1前的注释去掉。
make -j4
make pycaffe
3.测试
根据目前的了解,大概知道PoseNet的输入是一张图像,然后输出是对应相机的位姿。那么下面就介绍如何测试这一模型实现PoseNet根据图像定位的功能。
(1)得到lmdb文件
建立如下的文件目录
- Cambridge
- king1.png
- king2.png
- king3.png
- …
- king8.png
- kingdataset_test.txt
这里的8张图片我是从他们的官网直接保存的。kingdataset_test.txt的内容如下:
# creat by GPH
#
#
1.png 0 0 0 0 0 0 0
2.png 0 0 0 0 0 0 0
3.png 0 0 0 0 0 0 0
4.png 0 0 0 0 0 0 0
5.png 0 0 0 0 0 0 0
6.png 0 0 0 0 0 0 0
7.png 0 0 0 0 0 0 0
8.png 0 0 0 0 0 0 0
之后修改caffe-posenet/posenet/scripts/create_posenet_lmdb_dataset.py的1,11,12行依次如下(根据自己的具体情况修改):
第1行caffe_root = '/home/gph/Desktop/caffe-posenet-master' # Change to your directory to caffe-posenet
;
第11行directory = '/home/gph/Desktop/cambridge/king'
;
第12行dataset = 'dataset_test.txt'
。
注意第11行的king必须有,虽然没有相应的文件夹,其中道理想想大家应该会明白的。
在某个目录下运行这个.py文件,就会在该目录下生成posenet_dataset_lmdb文件夹,得到lmdb数据。运行的命令python <path to>/create_posenet_lmdb_dataset.py
(2)得到均值文件
一般情况下均值文件应该为训练模型时的数据的均值文件,但是作者并没有提供,想要跑同测试,又必须有。训练数据集有5G大,我不想下,所以就用上面生成的lmdb数据得到一个临时的均值文件,这会让模型计算的结果是错误的,但是能跑通。所以没关系吧。。。
直接利用caffe提供的均值文件计算程序即可得到均值文件mean.binaryproto
gph@gph-pc:~/Desktop/caffe-posenet-master$ ./build/tools/compute_image_mean ~/Desktop/cambridge/posenet_dataset_lmdb/ ~/Desktop/cambridge/mean.binaryproto
(3)运行
修改test_kingcollege.prototxt
修改其中name为data,phase为TEST的层的source和mean_file的路径,如下:
layers {
top: "data"
top: "label"
name: "data"
type: DATA
data_param {
source: "/home/gph/Desktop/cambridge/posenet_dataset_lmdb"
batch_size: 1
backend: LMDB
}
include {
phase: TEST
}
transform_param {
mirror: false
crop_size: 224
mean_file: "/home/gph/Desktop/cambridge/mean.binaryproto"
}
}
即可运行,命令为:python posenet/scripts/test_posenet.py --model PoseNet/train_kingscollege.prototxt --weights PoseNet/weights_kingscollege.caffemodel --iter 8
结果为:
I1218 11:02:30.216797 7509 net.cpp:283] Network initialization done.
posenet/scripts/test_posenet.py:49: RuntimeWarning: invalid value encountered in divide
q1 = pose_q / np.linalg.norm(pose_q)
Iteration: 0 Error XYZ (m): 21.2534 Error Q (degrees): nan
Iteration: 1 Error XYZ (m): 21.9898 Error Q (degrees): nan
Iteration: 2 Error XYZ (m): 21.8565 Error Q (degrees): nan
Iteration: 3 Error XYZ (m): 19.3715 Error Q (degrees): nan
Iteration: 4 Error XYZ (m): 18.4185 Error Q (degrees): nan
Iteration: 5 Error XYZ (m): 34.0538 Error Q (degrees): nan
Iteration: 6 Error XYZ (m): 29.4733 Error Q (degrees): nan
Iteration: 7 Error XYZ (m): 19.9967 Error Q (degrees): nan
/usr/local/lib/python2.7/dist-packages/numpy/lib/function_base.py:3578: RuntimeWarning: Invalid value encountered in median for 1 results
RuntimeWarning)
Median error 21.5549297333 m and nan degrees.
Success!
可见运行成功了!
问题记录
1.No module named lmdb
错误如下:
Traceback (most recent call last):
File "../caffe-posenet-master/posenet/scripts/create_posenet_lmdb_dataset.py", line 6, in <module>
import lmdb
ImportError: No module named lmdb
安装lmdb工具包:
sudo pip install lmdb
2.No module named sklearn.preprocessing
Traceback (most recent call last):
File "posenet/scripts/test_posenet.py", line 9, in <module>
from sklearn.preprocessing import normalize
ImportError: No module named sklearn.preprocessing
安装机器学习库scikit-learn
sudo pip install scikit-learn