参照Ubuntu 14.04.5系统上OpenPTrack V1版本安装配置(Kinect V2)配置安装完成后,是单台机器的方式。
如果场地比较大,则需要部署多个Kinect V2
。由于每台Kinect V2
看到同一个人的视角不同,因此需要校准,才能进行合并。
下面,我们用两台PC
+两个Kinect V2
(每台机器上连接一个Kinect V2
)来演示一下如何校准的操作。
参照Ubuntu 14.04.5系统上OpenPTrack V1版本安装配置(Kinect V2)配置安装完成后,是单台机器的方式。
如果场地比较大,则需要部署多个Kinect V2
。由于每台Kinect V2
看到同一个人的视角不同,因此需要校准,才能进行合并。
下面,我们用两台PC
+两个Kinect V2
(每台机器上连接一个Kinect V2
)来演示一下如何校准的操作。
目前在研究视觉跟踪人的事情,找到的比较好的参考项目就是OpenPTrack
了,截至目前(2017.8.14
)OpenPTrack
的V2
版本还没有释放出代码,因此我们只能依旧在V1
版本上进行测试,这个版本目前只能在Ubuntu 14.04.5
系统上运行,其他系统上(比如Ubuntu 16.04
)问题比较多,还是建议在Ubuntu 14.04.5
系统上进行安装。
1 2 3 |
$ sudo apt-get install git -y $ cd ~ $ git clone https://github.com/OpenPTrack/open_ptrack.git |
1 2 3 4 5 6 |
$ cd open_ptrack/scripts $ chmod +x *.sh $ ./ros_install.sh $ source /opt/ros/indigo/setup.bash $ ./ros_configure.sh |
OpenPTrack
1 |
$ ./openptrack_install.sh |
OpenPTrack
目录
1 |
$ ln -s ~/workspace/ros/catkin/src/open_ptrack ~/open_ptrack |
Kinect V2
驱动程序安装
1 2 3 4 5 6 7 8 |
$ sudo apt-get install nvidia-375-dev $ sudo apt-get install ocl-icd-opencl-dev $ cd ~/workspace/ros/catkin/src $ source ~/.profile $ roscd open_ptrack/../scripts $ chmod +x kinect2_install.sh $ ./kinect2_install.sh |
重启系统,然后执行如下命令:
1 2 |
$ cd ~/workspace/ros/catkin/devel/lib/kinect2_bridge $ sudo ./kinect2_bridge |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
import subprocess def execBashShellCommand(cmd): print cmd p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT,executable="/bin/bash") while True: buff = p.stdout.readline() if buff == '' and p.poll() != None: break print buff p.wait() def main(): execBashShellCommand("rm -rf ~/workspace") execBashShellCommand("rm -rf ~/.ros") execBashShellCommand("rm -rf ~/.rviz") execBashShellCommand("rm -rf ~/open_ptrack") execBashShellCommand("sudo apt-get install git -y") execBashShellCommand("cd ~ && git clone https://github.com/OpenPTrack/open_ptrack.git") execBashShellCommand("sed -i '/source ~\/workspace\/ros\/rosbuild\/setup.bash/d' ~/.bashrc") execBashShellCommand("sed -i '/export KINECT_DRIVER=openni/d' ~/.bashrc") execBashShellCommand("sed -i '/export LC_ALL=C/d' ~/.bashrc") execBashShellCommand("cd ~/open_ptrack/scripts && chmod +x *.sh && ./ros_install.sh") execBashShellCommand("cd ~/open_ptrack/scripts && source /opt/ros/indigo/setup.bash ; ./ros_configure.sh") execBashShellCommand("cd ~/open_ptrack/scripts && ./openptrack_install.sh") execBashShellCommand("ln -s ~/workspace/ros/catkin/src/open_ptrack ~/open_ptrack") execBashShellCommand("source ~/workspace/ros/rosbuild/setup.bash ; source ~/.profile ; export KINECT_DRIVER=openni && export LC_ALL=C && cd ~/workspace/ros/catkin && catkin_make --pkg calibration_msgs && catkin_make --pkg opt_msgs && catkin_make --force-cmake") execBashShellCommand("sudo apt-get -y install nvidia-375-dev") execBashShellCommand("sudo apt-get -y install ocl-icd-opencl-dev") execBashShellCommand("source ~/workspace/ros/rosbuild/setup.bash ; source ~/.profile ; export KINECT_DRIVER=openni && export LC_ALL=C && cd ~/workspace/ros/catkin/src && roscd open_ptrack/../scripts && chmod +x kinect2_install.sh && ./kinect2_install.sh") execBashShellCommand("cd ~/workspace/ros/catkin/devel/lib/kinect2_bridge && sudo ./kinect2_bridge") if __name__ == "__main__": main() |
可能需要重新插拔一下Kinect
的USB
数据线,然后执行如下命令
1 |
$ roslaunch kinect2_bridge kinect2_bridge.launch |
执行之后,等待十几秒,然后Ctrl+C
中断执行。
执行完成后,执行
1 |
$ roslaunch tracking detection_and_tracking_kinect2.launch |
之后,会弹出三个界面出来。
Microsoft Common Objects in Context
(简写COCO
)数据集是微软团队提供的一个可以用来进行图像识别,分割,注解等开发工作的数据集。
其官方说明网址:http://mscoco.org/。
继续阅读Ubuntu 16.04系统Microsoft Common Objects in Context(COCO)数据集在Python环境中的使用
val
是validation
的简称。training dataset
和validation dataset
都是在训练的时候起作用。validation
的数据集和training
没有交集,所以这部分数据对最终训练出的模型没有贡献。validation
的主要作用是来验证是否过拟合、以及用来调节训练参数等。
比如训练0-10000
次迭代过程中,train
和validation
的loss
都是不断降低,
但是从10000-20000
过程中train loss
不断降低,validation
的loss
不降反升。
那么就证明继续训练下去,模型只是对training dataset
这部分拟合的特别好,但是泛化能力很差。
所以与其选取20000
次的结果,不如选择10000
次的结果。
这个过程的名字叫做Early Stop
,validation
数据在此过程中必不可少。
如果跑caffe
自带的训练demo
,你会用到train_val.prototxt
,这里面的val
其实就是validation
。
而网络输入的TEST
层,其实就是validation
,而不是test
。你可以通过观察validation
的loss
和train
的loss
定下你需要的模型。
但是为什么现在很多人都不用validation
了呢?
我的理解是现在模型中防止过拟合的机制已经比较完善了,Dropout\BN
等做的很好了。
而且很多时候大家都用原来的模型进行fine tune
,也比从头开始更难过拟合。
所以大家一般都定一个训练迭代次数,直接取最后的模型来测试。
ImageNet
ImageNet是一个计算机视觉系统识别项目,是目前世界上图像识别最大的数据库。是美国斯坦福的计算机科学家李飞飞模拟人类的识别系统建立的。能够从图片识别物体。目前已经包含14197122张图像,是已知的最大的图像数据库。每年的ImageNet大赛更是魂萦梦牵着国内外各个名校和大型IT公司以及网络巨头的心。图像如下图所示,需要注册ImageNet帐号才可以下载,下载链接为http://www.image-net.org/
继续阅读“GrabCut” — Interactive Foreground Extraction using Iterated Gr aph Cuts
caffe
程序自带有一张小猫图片,存放路径为caffe
根目录下的examples/images/cat.jpg
, 如果我们想用一个训练好的caffemodel
来对这张图片进行分类,那该怎么办呢? 如果不用这张小猫图片,换一张别的图片,又该怎么办呢?如果学会了小猫图片的分类,那么换成其它图片,程序实际上是一样的。
开发caffe
的贾大牛团队,利用imagenet
图片和caffenet
模型训练好了一个caffemodel
,供大家下载。要进行图片的分类,这个caffemodel
是最好不过的了。所以,不管是用C++
来进行分类,还是用python
接口来分类,我们都应该准备这样三个文件:
1. caffemodel
文件
可以直接在浏览器里输入地址下载,也可以运行脚本文件下载。下载地址:http://dl.caffe.berkeleyvision.org/bvlc_reference_caffenet.caffemodel
文件名称为:bvlc_reference_caffenet.caffemodel
,文件大小为230M左右,为了代码的统一,将这个caffemodel
文件下载到caffe
根目录下的models/bvlc_reference_caffenet/
文件夹下面。也可以运行脚本文件进行下载:
1 |
$ ./scripts/download_model_binary.py models/bvlc_reference_caffenet |
2. 均值文件
有了caffemodel
文件,就需要对应的均值文件,在测试阶段,需要把测试数据减去均值。这个文件我们用脚本来下载,在caffe根目录下执行:
1 |
$ sh ./data/ilsvrc12/get_ilsvrc_aux.sh |
执行并下载后,均值文件放在 data/ilsvrc12/ 文件夹里。
3. synset_words.txt
文件
在调用脚本文件下载均值的时候,这个文件也一并下载好了。里面放的是1000个类的名称。
数据准备好了,我们就可以开始分类了,我们给大家提供两个版本的分类方法:
一. C++
方法
在caffe
根目录下的examples/cpp-classification/
文件夹下面,有个classification.cpp
文件,就是用来分类的。当然编译后,放在/build/examples/cpp_classification/
下面
我们就直接运行命令:
1 2 3 4 5 6 |
# sudo ./build/examples/cpp_classification/classification.bin \ models/bvlc_reference_caffenet/deploy.prototxt \ models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel \ data/ilsvrc12/imagenet_mean.binaryproto \ data/ilsvrc12/synset_words.txt \ examples/images/cat.jpg |
命令很长,用了很多的\符号来换行。可以看出,从第二行开始就是参数,每行一个,共需要4个参数
运行成功后,输出top-5
结果:
1 2 3 4 5 6 |
---------- Prediction for examples/images/cat.jpg ---------- 0.3134 - "n02123045 tabby, tabby cat" 0.2380 - "n02123159 tiger cat" 0.1235 - "n02124075 Egyptian cat" 0.1003 - "n02119022 red fox, Vulpes vulpes" 0.0715 - "n02127052 lynx, catamount" |
即有0.3134的概率为tabby cat, 有0.2380的概率为tiger cat ......
二. python
方法
python
接口可以使用jupyter notebook
来进行可视化操作,因此推荐使用这种方法。
在这里我就不用可视化了,编写一个py
文件,命名为py-classify.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
#coding=utf-8 #加载必要的库 import numpy as np import sys,os #设置当前目录 caffe_root = '/home/xxx/caffe/' sys.path.insert(0, caffe_root + 'python') import caffe os.chdir(caffe_root) net_file=caffe_root + 'models/bvlc_reference_caffenet/deploy.prototxt' caffe_model=caffe_root + 'models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel' mean_file=caffe_root + 'python/caffe/imagenet/ilsvrc_2012_mean.npy' net = caffe.Net(net_file,caffe_model,caffe.TEST) transformer = caffe.io.Transformer({'data': net.blobs['data'].data.shape}) transformer.set_transpose('data', (2,0,1)) transformer.set_mean('data', np.load(mean_file).mean(1).mean(1)) transformer.set_raw_scale('data', 255) transformer.set_channel_swap('data', (2,1,0)) im=caffe.io.load_image(caffe_root+'examples/images/cat.jpg') net.blobs['data'].data[...] = transformer.preprocess('data',im) out = net.forward() imagenet_labels_filename = caffe_root + 'data/ilsvrc12/synset_words.txt' labels = np.loadtxt(imagenet_labels_filename, str, delimiter='\t') top_k = net.blobs['prob'].data[0].flatten().argsort()[-1:-6:-1] for i in np.arange(top_k.size): print top_k[i], labels[top_k[i]] |
对于macOS Sierra (10.12.3)
来说,需要设置python
环境,(参考源代码中的python/requirements.txt
),如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
#切换到我们自己安装的python版本,系统自带版本会在安装插件时候由于权限问题而失败 $ brew install python #安装必要的python包 $ sudo pip install Cython $ sudo pip install numpy $ sudo pip install scipy #只能安装编译好的包,源代码安装失败 $ sudo pip install scikit-image $ sudo pip install matplotlib $ sudo pip install ipython $ sudo pip install h5py $ sudo pip install leveldb $ sudo pip install networkx $ sudo pip install nose $ sudo pip install pandas $ sudo pip install python-dateutil $ sudo pip install protobuf $ sudo pip install python-gflags $ sudo pip install pyyaml $ sudo pip install Pillow $ sudo pip install six |
执行这个文件,输出:
1 2 3 4 5 |
281 n02123045 tabby, tabby cat 282 n02123159 tiger cat 285 n02124075 Egyptian cat 277 n02119022 red fox, Vulpes vulpes 287 n02127052 lynx, catamount |
caffe开发团队实际上也编写了一个python版本的分类文件,路径为 python/classify.py
运行这个文件必需两个参数,一个输入图片文件,一个输出结果文件。而且运行必须在python
目录下。假设当前目录是caffe
根目录,则运行:
1 2 |
$ cd python $ sudo python classify.py ../examples/images/cat.jpg result.npy |
分类的结果保存为当前目录下的result.npy文件里面,是看不见的。而且这个文件有错误,运行的时候,会提示
1 |
Mean shape incompatible with input shape |
的错误。因此,要使用这个文件,我们还得进行修改:
1.修改均值计算:
定位到
1 |
mean = np.load(args.mean_file) |
这一行,在下面加上一行:
1 |
mean=mean.mean(1).mean(1) |
则可以解决报错的问题。
2.修改文件,使得结果显示在命令行下:
定位到
1 2 3 4 |
# Classify. start = time.time() predictions = classifier.predict(inputs, not args.center_only) print("Done in %.2f s." % (time.time() - start)) |
这个地方,在后面加上几行,如下所示:
1 2 3 4 5 6 7 8 9 |
# Classify. start = time.time() predictions = classifier.predict(inputs, not args.center_only) print("Done in %.2f s." % (time.time() - start)) imagenet_labels_filename = '../data/ilsvrc12/synset_words.txt' labels = np.loadtxt(imagenet_labels_filename, str, delimiter='\t') top_k = predictions.flatten().argsort()[-1:-6:-1] for i in np.arange(top_k.size): print top_k[i], labels[top_k[i]] |
就样就可以了。运行不会报错,而且结果会显示在命令行下面。