The Visionary Researcher

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

확인

Tracking Learning Detection(TPAMI 2012)이라는 논문에 대한 세팅을 기준으로 mex 설정 방법을 설명한다.

해당 논문의 코드는 (https://github.com/zk00006/OpenTLD)에서 다운 받을 수 있다.

이 코드는 MATLAB2010a (32bit) + OPENCV 2.2 (32bit) + VS2010 이라는 조합을 기반으로 구현되었다.

너무 과거의 설치파일들이 필요하지만, 오류없이 실행시키기위해서는 어쩔 수 없이 3개의 환경을 세팅할 수 밖에 없었다.

처음에는 32bit에서 실험을 수행하였고 다른 코드와도 조합시키기 위해서 64비트에서도 환경설정을 해 보았다.

그리고 최종적으로는 mex 파일을 만들기 위해서 해당 프로그램들이 필요할 뿐, mex파일과 해당 c파일의 opencv dll파일만 있다면

다른 matlab버전에서도 다른 VS에서도 이상없이 동작하는 것을 확인할 수 있었다.


우선 32bit에서 MATLAB2010a (32bit) + OPENCV 2.2 (32bit) + VS2010 조합에 의한 mex compile과정과 실행과정을 설명한다.


1. MATLAB2010a (32bit) 의 다운로드 및 설치

https://www.mathworks.com/downloads/web_downloads/ 에서 MATLAB 2010a (32bit)를 다운받는다.

Needed Matlab extensions은 Image Acquisition Toolbox, Image Processing Toolbox, Signal Processing Toolbox, Statistics Toolbox이라서 추가로 다운받는다.


2. VS 2010 pro 다운로드

학교 라이센스가 있어서 교내 홈페이지를 통해 다운받았다.


3. OPENCV2.2 다운로드 및 CMAKE를 통한 build환경 구축

opencv2.2를 다운받는다. 

https://opencv.org/releases.html에도 해당 버전은 존재하지 않아 구글링을 통해 다운받는다.

Cmake를 다운 및 설치한다.

Where is the source code 에는 해당 opencv폴더를

where to build the binaries에는 해동 opencv폴더에서 build32이라는 폴더로 설정한다. (새로 만든 폴더이다.)

configure -> generate 순서로 수행한다.

해당 build32에 생성된 ALL_BUILD라는 프로젝트를 VS2010를 통해 연다.

32bit인지 64bit인지 확인하고 debug 및 release에서 각각 빌드한다. (약 30개의 프로젝트가 빌드 성공된다.)


4. mex 파일 생성

MATLAB 2010a를 실행시킨다음 compile.m 파일을 선택한다.

mex를 하기 위해서 opencv를 선택해야 한다.

mex -setup을 통해서 해당 버전을 선택한다.

해당 opencv2010이 없거나 선택되지 않는 경우에는 

http://www.mathworks.com/support/solutions/en/data/1-D5W493/?solution=1-D5W493 에서

VS2010MEXSupport다운 받아서 MATLAB이 설치된 폴더의 bin에 해당 버전을 붙여넣기한다.

그렇게되면 mex -setup을 했을 경우 해당 VS 버전을 선택할 수 있다.

compile.m 에서 경로를 설정한다. 

    include = ' -Id:\OpenCV2.2\build32\include\opencv\ -Id:\OpenCV2.2\build32\include\';

    libpath = 'd:\OpenCV2.2\build32\lib\';

컴파일을 수행한다.

32bit의 mex파일이 생성된다.


5. 환경 설정

일반적으로 OPENCV 환경변수를 수정하듯이, PATH에서 해당 opencv2.2 build32의 bin 폴더를 선택한다.

컴퓨터를 한번 리셋한다.


6. 실행

runTLD파일을 실행한다.



여기까지 진행되기에 굉장히 간단해 보이지만 시행착오가 많았다.


* 64bit에서 수행하기 위해서는

MATLAB 2010a의 64버전을 다운로드한다.

opencv에서 build64폴더를 만들고(이름은 자유다) build할때 x64에서 수행한다. 

경로를 build64폴더로 변경하고 VS2010MEXSupport에서 64bit버전을 붙여넣는다.

컴파일을 수행하면 64bit의 mex파일이 생성된다.


* 추가로 알게된 점

사실 mex가 있는 코드를 돌리기 위해서는 해당 MATLAB버전과 OPENCV, VS 버전이 항상 설치되어 있어야 하는 줄 알았는데,

이는 mex 파일을 생성하기 위한 프로그램들이다.

즉, 적절한 mex파일과 dll파일이 코드에 주어진다면 opencv, vs, matlab 버전이 달라도 실행할 수 있다.

필자는 해당 TLD코드(32비트 opencv2.2)와 다른 코드(64비트 opencv2.4.2)를 융합시켜야 하는 문제가 있었는데, 

해당 TLD코드를 VS2010/opencv2.2(64bit)/MATLAB2010a(64bit) 에서 mex파일을 생성 및 opencv 2.2버전의 dll파일을 폴더에 붙여넣기하고

다른코드도 이와 마찬가지로 해당 설치 환경에서 mex파일을 만든 뒤에 dll파일을 붙어넣기 하고 MATLAB2017a에서 실행해보니 이상 없이 코드가 돌아갔다.



<Reference>

https://github.com/zk00006/OpenTLD/wiki/Installation

https://github.com/zk00006/OpenTLD/issues



Comment 1

Ransac family

분류없음2016.10.12 12:01

<Ransac의 기본>

Ransac은 least square method나 SVM같은 regression 모델이 아니다. 

일부분의 data를 이용하여 hypothesis를 발생시킨다음, inlier가 최대가 되도록 이를 반복적으로 수행한다.

Inlier가 커질수록, hypothesis를 만족해가는 것이다.


200개의 점이 있을 때, ax+by+c=0이라는 선으로 (a, b, c) 파라미터 추정을 한다면

수학적으로 200C2번의 경우의 수로 확인을 해야 가장 추정이 잘 된 선을 찾을 수 있다.

하지만 inlier ratio r와 실패 확률 a, 그리고 data수 m을 알고 있으면 

t = log(a) / log(1 - r^m) 을 수행하면 가장 추정이 잘 된 선을 찾을 수 있다.

하지만 inlier ratio인 r또한 추정하기위해 알고있는 경우가 드물기 때문에 지정을 해야 한다.


추정된 선이 얼마나 에러가 있는지 평가하기 위해서는 아래와 같은 식을 만족해야 한다.

D는 데이터이고, 모델과 데이터의 loss를 모두 더했을때 최소가 되는 모델을 구하는 것이다.

c는 threshold로써, 지정해야하는 파라미터이다.


<MSAC>

모델에 가까울수록 더 적은 loss, threshold 내부에 있어도 포물선 형태로 loss지정


<MLESAC>

모델을 평가하는 inlier와 outlier의 에러의 확률분포를 이용하는 방법이다.

inlier error는 unbiased gaussian 분포로, outlier는 uniform 분포를 적용한다.

이 확률분포는 에러의 분포이다. 모델에 가까운 에러는 상대적으로 높은 확률을 가지고있고, 멀수록 균일하다.

r은 inlier가 되는 prior probability(inlier ratio)

v는 이용가능한 error space의 크기

sigma는 가우시언 노이즈의 std(노이즈의 크기를 측정)


MLESAC은 주어진 data에서 likelihood를 최대화하는 모델을 추정한다.(inlier쪽에 오기 위해)

계산의 실효성을 위해 negative log likelihood를 사용하여 loss function은 아래와 같이 정의된다.

코드를 분석하면

기존 RANSAC과 동일하게 몇개의 점을 랜덤으로 뽑아서 LSM을 이용하여 파라미터를 추정한다.

추정된 파라미터로 각 점의 에러(e)를 계산한다. v는 최대 최소 파라미터 추정값의 갭이다.

이러한 에러를 보고 inlier인지 outlier인지 (inlier ratio) 알아내기 위해 r을 EM알고리즘으로 추정한다.

(p(inlier)/(p(inlier)+p(outlier))=r을 반복적으로 위의 식에 대입하여 추정한다.

추정된 r에 의하여 negative log likelihood을 이용하여 loss를 구한다. 





















Comment 0