Semi-Automatic 3D Annotation3D源码编译过程记录

论文来自Oberweger的cvpr16论文Semi-Automatic 3D Annotation

https://cvarlab.icg.tugraz.at/projects/hand_detection/

最近研究3D手势识别,下载了Oberweger的半自动手势样本标注的源码,在编译的过程中踩了无数的坑,但同时也熟悉了linux,python等,现做如下总结。

1.官网下载程序源码包SemiAutoAnno_v0.zip并解压。

2.源码基于python,其中的sift_flow功能需要去sift_flow官网下载,然后将下载包解压到SemiAutoAnno/src/etc/sift_flow中。‘

3.安装依赖的Python包numpy,scipy,matplotlib,sklearn,theano,progressbar,PyQT4。(参见上一篇博客)

4.由于sift_flow是c/matlab混合编译的,源码中只提供了在64位win7和mac下编好的mexw64和mexmaci64文件,但在64位linux下需要自行编译。因为是在linux服务器上搭建的实验环境,故遇到了很多坑。

4.1根据sift_flow作者源码中的说明,在linux下编译.cpp文件需要修改mexDenseSIFT和mexDiscreteSIFT目录下的project.h文件,将其中的第五行的注释去掉,即改为

#define _LINUX_MAC

4.2 修改源码错误:mexDenseSIFT/Matrix.h中的第五行存在大小写错误,改为

#include "Vector.h"

4.3进入matlab,使用mex命令编译时爆出错误:当前版本支持的gcc版本是gcc-4.3.4,而系统中找不到。而服务器系统上装的是gcc-4.8.2,不明所以的我以为只能支持低版本的gcc,于是开始下gcc进行安装。由于服务器不能连外网,故需要下好所需的包包括
gcc-4.3.4.tar.gz、 gmp-5.0.1.tar.gz、 mpfr-3.1.2.tar.gz、 mpc-1.0.2.tar.gz。gcc依赖这三个包,故安装顺序为gmp-mpfr-mpc-gcc。具体安装流程参见博客http://blog.chinaunix.net/uid-26000296-id-4930263.html,总之过程既漫长又坑爹。然而。。。在服务器上最后安装gcc时,编译中总是有错误,网上搜了一下大概是该版本gcc太老,系统已经不支持。。。

4.4既然没法安装gcc-4.3.4,故只能转而去寻找其他方法。幸亏看到了这篇博客http://blog.sciencenet.cn/blog-623402-710896.html,才将我从gcc深坑中解救出来。其实之前曾经试过修改matlab安装路径下的mexopts.sh文件,当时将gcc-4.3.4改成了gcc-4.8.2,但系统还是提示命令找不到。后来想到,其实系统调用gcc的时候的命令就是gcc,而不带版本号,故将mexopts.sh配置文件中的所有gcc-4.3.4/g++-4.3.4等改成gcc/g++,保存文件,重启matlab。再次mex编译时,只是警告当前gcc的版本与匹配的4.3.4不符,但不会有错误,成功编译了.mexa64文件。

5.SemiAutoAnno源码中存在问题,修改data/importers.py中的第584行,该函数的调用与声明参数不符,去掉中间两个参数,改为

hd = HandDetector(dpt, self.fx, self.fy, importer=self)

process.m中缺少dense_sift函数的声明以及对输入图像的预处理,具体可能需要写信给作者询问,我这里只是根据自己理解做了些修改,修改etc/sift_flow中的process.m,增加几行(带星号的行为增加的内容)

**function []=process(procid)**

load(sprintf('input_%d.mat', procid))


im1=im2double(in1);
im2=im2double(in2);

% Step 2. Compute the dense SIFT image

% patchsize is half of the window size for computing SIFT
% gridspacing is the sampling precision

patchsize=8;
gridspacing=1;

**addpath(fullfile(pwd, 'mexDenseSIFT'));**
**addpath(fullfile(pwd, 'mexDiscreteFlow'));**

**im1_ = im1(patchsize/2:end-patchsize/2+1,patchsize/2:end-patchsize/2+1,:) ;**
**im2_ = im2(patchsize/2:end-patchsize/2+1,patchsize/2:end-patchsize/2+1,:) ;**

%Sift1=dense_sift(im1,patchsize,gridspacing);
%Sift2=dense_sift(im2,patchsize,gridspacing);

**Sift1=mexDenseSIFT(im1_,patchsize,gridspacing);**
**Sift2=mexDenseSIFT(im2_,patchsize,gridspacing);**

% Step 3. SIFT flow matching

% prepare the parameters
SIFTflowpara.alpha=2;
SIFTflowpara.d=40;
SIFTflowpara.gamma=0.005;
SIFTflowpara.nlevels=3;
SIFTflowpara.wsize=5;
SIFTflowpara.topwsize=20;
SIFTflowpara.nIterations=60;

tic;[vx,vy,energylist]=SIFTflowc2f(Sift1,Sift2,SIFTflowpara);toc



clear flow;
flow=zeros(size(im1,1), size(im1,2), 2);

flow(patchsize/2:end-patchsize/2+1,patchsize/2:end-patchsize/2+1,1)=vx;
flow(patchsize/2:end-patchsize/2+1,patchsize/2:end-patchsize/2+1,2)=vy;


% Step 4.  Visualize the matching results

Im2=im2(patchsize/2:end-patchsize/2+1,patchsize/2:end-patchsize/2+1,:);
warpI2=ones(size(im2));
warpI2(patchsize/2:end-patchsize/2+1,patchsize/2:end-patchsize/2+1,:)=warpImage(Im2,vx,vy);

save(sprintf('output_%d.mat', procid), 'flow', 'warpI2')
**end**

修改semiautoanno.py的第2105行,启动matlab和调用process的方式,改为

cmd = "-nojvm -nodisplay -nosplash -r \"cd ./etc/sift_flow/; procid={}; try, process(procid);  
     end; quit \" ".format(os.getpid())
call(["/data1/qspace/matlab2011/bin/matlab","-c","/data1/qspace/matlab2011/lic_standalone.dat"
     , cmd])

根据所使用的cv2的版本不同,可能需要修改一些cv2函数的调用方式。

6.在没有任何语法错误后运行,然而在运行到process.m中的cpp编译成的mexDenseSIFT函数时爆出错误
Invalid MEX-file ‘xxx/mexDenseSIFT.mexa64’:
/usr/local/MATLAB/R2011b/bin/glnxa64/
`GLIBCXX_3.4.11’ not found (required by xxx/mexDenseSIFT.mexa64),参考博客
http://www.cnblogs.com/xfzhang/archive/2011/10/14/2212486.html,将/usr/lib/libstdc++.so.6软连接到matlab安装目录下的glnxa64目录下,得以成功解决

参考内容
1: https://cvarlab.icg.tugraz.at/projects/hand_detection/
2:http://python.usyiyi.cn/python_278/library/subprocess.html
3:http://www.cnblogs.com/xfzhang/archive/2011/10/14/2212486.html
4:http://blog.sciencenet.cn/blog-623402-710896.html

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值