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



댓글 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를 구한다. 





















댓글 0

"Direct Prediction of 3D Body Poses from Motion Compensated Sequences"

2016 CVPR

author : Bugra Tekin et al.

논문 : Click


<Key Point>

1. 연속적인 Video에서 3D pose 추정

2. 기존 방법들 : 각 프레임마다 포즈 주정하고, 후처리과정으로 그들을 잇는다

3. 제안하는 방법 : bounding box의 spatial temporal volume으로부터 한번에 3D pose를 regression한다.

4. 연속적인 프레임에서 motion compensation을 수행한다.


<Introduction>

1. 3D pose estimation의 중요성, 흥미

- Depth 카메라를 이용해서 비디오에서 3D 정보를 얻는 방법은 쉽게 가능하지만, 뎁스카메라 없이 하는 것은 힘들지만 흥미로운 일이다.

2. 3D pose estimation의 최신 연구 동향

- Monocular 3D pose tracking(frame to frame tracking 포함) -> distraction과 occlusion때문에 힘듬[1]

- tracking by detection(연속 frame 말고, across the frame) -> 더 나음[2] [3]

- 효과적인 single frame 접근방법 -> 2D HOG features를 3D pose로 kernel embedding하여 regressor 학습하는 방법[4]

- Neural Net 이용한 방법[5]

3. 한계점

- 3D에서 2D로 projection하는 것에서 내제된 모호성(self occlusion, mirroring)은 여전히 힘들게 한다.

- 연속적인 프레임에서 호환이 되는 후보자를 선택하면서 문제가 있는 프레임을 제거하는 결과에 의해서 원인을 분석(귀납적)하는 방법인 연결정보를 이용함으로써 이러한 어느정도의 모호성을 바로세울 수 있다.

- 그러나 이러한 문제가 있는 프레임이 자주 발생할 때, 시간적인 일치성을 나중에 강조하는것은(귀납적으로 분석하는 것은) 충분하지 않다. 

 4. 제안하는 방법 소개

- 귀납적이 아닌 시작할때 모션 정보를 이용한다.

- spatio temporal volume으로부터 한번에 3D pose를 예측하고, regression을 학습한다.

- 이 volume은 연속적인 프레임에서 사람을 둘러싸고 있는 bounding box로 구성된다.

- 이 방법은 첫 추정치를 귀납적으로 분석하는 것보다 훨씬 효과적이라는 것을 말해준다.

- image volume에 spatio temporal feature[6][7]를 추출하여 Deep network를 적용한 것과 다른 regression 스킴을 비교한다.

- 사람이 volume에 중심이 되는 것이 필수적이라는 것을 보여준다.

- 2개의 CNN(1개는 연속적은 프레임 사이에서 몸이 움직이는 것을 예측해주는것, 다른 1개는 refine하는 것)을 학습한다.

- 이러한 motion compensation은 기존의 것을 능가하고, 3D human pose estimation의 accuracy를 증가시켜주는 것을 보여준다.
(Human3.6, HumanEva, KTH Multivuew Foot ball 3D human pose estimation benchmarks)

- 3D body pose에서 차별적인 태도를 예측하기 위해 appearance와 motion단서를 결합한다.

- 무엇이 motion compensation을 실용적이고 효과적으로 만드는지 증명한다.


<Related Works>

1. Single image에서 3D pose 추정

- generative model 




2. 비디오에서 3D pose 추정





<References>

[1] R. Urtasun, D. Fleet, A. Hertzman, and P. Fua. Priors for People Tracking from Small Training Sets. In ICCV, 2005.

[2] D. Ramanan, A. Forsyth, and A. Zisserman. Strike a Pose: Tracking People by Finding Stylized Poses. In CVPR, 2005.

[3] M. Andriluka, S. Roth, and B. Schiele. Monocular 3D Pose Estimation and Tracking by Detection. In CVPR, 2010.

[4] C. Ionescu, I. Papava, V. Olaru, and C. Sminchisescu. Human3.6M: Large Scale Datasets and Predictive Methods for 3D Human Sensing in Natural Environments. PAMI, 2014.

[5] S. Li and A. B. Chan. 3D Human Pose Estimation from Monocular Images with Deep Convolutional Network. In ACCV, 2014.

[6] A. Kl¨aser, M. Marszałek, and C. Schmid. A Spatio-Temporal Descriptor Based on 3D-Gradients. In BMVC, 2008.

[7] D.Weinland, M. Ozuysal, and P. Fua. Making Action Recognition Robust to Occlusions and Viewpoint Changes. In ECCV, 2010.


댓글 0

논문 : Click


"Deep pose: Human Pose Estimation via Deep Neural Networks"

2014 CVPR

Author : Alexander Toshev et al.

<Key Point>

1. 모든관절이 보이는 것은 아니다, 따라서 전체적인 추론(holistic reasoning)이 필요하다.

2. DNN regressor를 이용하면 해결될 것이다.


<Introduction>

1. Pose estimation의 정의, 방법, 어려움(한계점)

(정의 : 사람의 관절 위치를 찾는 것)

(방법 : part-based model, ..)

(한계점 : local detector는 모든 관절의 상호과정 속에서 일부분만 모델링함으로써 local한 part를 추론하는 것이다. 하지만 실제 사진에서는 모든 joint를 확인할 수도 없고 안보이는 부분은 추측을 해야 한다. 따라서 local detector는 안보이는 부분을 찾을 수 없다. 즉 전체적인 추론(holistic reason)을 해야하는데 이를 사용한 방법도 아직 성능이 그리 좋지 않다.) 

2. DNN의 정의, 이는 pose estimation의 문제점 해결할 것이다.

3. 제안하는 방법과 DNN의 장점

(7 layer generic convolution DNN)

(장점1 : 각 관절의 전체 맥락을 고려한다) <- 아까 말한 local descriptor와 상반

(장점2 : graphical model로 간단히 구현) <- deep leaning의 장점, feature 표현할 필요 없음, joint 사이의 상호관계 정의하지 않아도됌(문제가 될거같은데..)

(joint regression, pose predictor 제안 : 처음에 pose estimate한 다음, 고화질 sub image를 이용하여 각 관절 예측값을 조정하는 DNN-based regressor 적용)

4. 성능 좋다 언급


<Related Work>

1. Pictorial Strictures(PSs) [1] 발전(다루기 쉽고 실용적) -> 문제점 : 이미지 data가 아닌 간단한 binary potential을 가진 tree-based pose 모델이라는 것

2. Richer part detectors [2]

3. mixture model of parts (mixture of PSs) [3]

4. hierarchical model [4]

5. Image-dependent PS models(global classifier) [5]

6. holistic manner 어렵다.

7. semi-global classifier [6]

8. 3D pose regression [7]

9. Convolution NNs + Neighborhood Component Analysis [8] (not cascade)

10. casecade DNN regressor (used for facial points) [9]


<Deep Learning Model for Pose Estimation>

1. Notation

- joint 개수 : k

- pose vector : y (x, y 좌표)

- 이미지 : x

2. Normalization 

- c는 중심, w는 폭, h는 높이, 세 파라미터에 의해서 정규화

- 같은 x에 있는 모든 k에 대해서 동일하게 적용



<Pose Estimation as DNN-based Regression>

1. Notation

- input x (이미지)

- function (x가 들어왔을때 파라미터 theat에 의하여 k개 관절당 2개씩 좌표, 2k의 원소 생성)

- 정규화된 x에 함수를 통과한 뒤 다시 이미지에 투영하기 위해 역정규화

- 함수를 DNN으로 인해 구현한다.

2. 아키텍쳐

- 처음 x들어오면 미리 지정해준 사이즈로 resize한 다음에 여러 layer를 거쳐서 최종적으로 2k개의 좌표를 얻는다.

- 기본 아키텍쳐는 Alex net[10], 또한 이 아키텍쳐는 localization에서도 좋은 성능 [11]

- 총 7 layers

- C : conv(learnable), P : pooling, F : fully(learnable), LRN : local response normalization

- C(55,55,96, filter : 11x11)-LRN-P-C(27,27,256, filter : 5x5)-LRN-P-C(13,13,384, filter : 3x3)-C(13,13,384, filter : 3x3)-C(13,13,384, filter : 3x3)-P-F(4096)-F(4096)

- 총 파라미터 수 40M

- Generic DNN 아키텍쳐 사용(좋은 성능 증명되어서), holistic하게 한번에 full image를 비선형 변환해서 관절들을 찾는다.

- 7개의 hidden layer가 sharing하기 때문에 특정한 pose model 혹은 loss를 수정하지 않아도 된다.(....)

3.학습

- 기존 Alex net의 classification softmax loss가 아닌, 각 관절의 예측값과 GT값의 L2 distance를 이용하여 loss를 정한다. (linear regression)

- 정규화를 하지 않는다면 L2 loss가 이상하게 될 것이므로, 정규화 필수

- 이미지 x에 대하여 모든 관절 k개와 x, y 좌표에 대한 loss

- 이 loss는 back propagation에 의해서 최소화된다(deeplearning 기본)

- mini batch size : 128

- ada-grad

- Lr : 0.0005

- F에서 dropout(0.6)

- data augmentation을 위해 LRflip, random crop 이용


<Cascade of Pose Regressors>

- 초기 DNN한 번만 적용할 경우 인풋사이즈가 220,220으로 고정되어있기 때문에, network는 자세하게 보는 능력을 갖기 어렵다.

- 따라서 cascade of pose regressor를 제안한다.

- 처음에 초기 관절 위치를 추정한 다음 이전 stage보다 더 좋은 위치를 추적하기 위하여 추가적인 DNN regressor를 학습한다.

- 즉, 반복적으로 refinement를 하는 과정이다.

- 이때, full image가 아닌 crop 이미지를 넣음으로써 high resolution 영상을 얻게되고, 더 정교하게 관절을 추정할 수 있게된다.

- 우리는 모든 stage에 동일한 아키텍쳐를 사용한다. 

- 총 S개의 스테이지에서 S배만큼의 파라미터가 필요하다(각 stage는 같은 아키텍쳐이지만, 다른 파라미터 이용)

- crop을 하는 방법은, y_i 를 중심으로 두고, b_i 박스를 선택한다. 이때 길이는 sigma*diameter(y)로 정의된다.

- diameter(y)는 human torso에서 반대방향 관절을 의미한다.(예를 들면, 왼쪽 어깨와 오른쪽 엉덩이) 이 값은 dataset의 구체적인 포즈 정의에 의존한다.

- 처음에는 모든 관절에 대해서 한번에 수행, 그 후 stage에서는 i가 1~k로써 모든 관절에 대해서 각각 수행

- 각 스테이지마다 다른 파라미터를 사용하기 때문에 각 스테이지마다 동일한 학습을 해야한다.

- 각 스테이지의 각 관절은 각기 다른 bounding 박스에 의해 정규화된다. 이때, 바로 bounding box의 위치는 전 단계의 추정치에 영향을 받는다.

- 각 이미지의 각 조인트에 multiple 정규화를 사용한다. 

- 단지 이전 스테이지 추정치에 영향을 받는 것이 아닌 simulated(모조의) 예측값을 이용한다. 

- 각 스테이지, 각 관절에 대해서, 모든 학습 데이터의 displacement(차분데이터) 의 mean과 variance를 계산하여 2차 정규분포함수를 만든다.

- 즉, 해당 정규분포함수에 의해서 각 스테이지, 각 관절데이터는 정규화될 수 있다.


<Empirical Evaluation>

1. Dataset

- Frames Labeled In Cinema(FLIC) [12] : 4000 학습이미지, 1000 테스트이미지, Hollywood movies, 다양한옷, 10개이상 관절이 label

- Leeds Sports Dataset(LSP) [13,14] : 11000 학습이미지, 1000 테스트 이미지, 스포츠, 다양한 포즈, 모든 사람 full body 그리고 14 관절

- diameter(y)는 모두 어깨와 반대편 엉덩이 사이의 거리, skeleton은 tree kinematic

2. Metric

- Percentage of Correct Parts(PCP) : 팔다리 감지율, 실제와 추정치의 distance가 limb length의 절반 이하면 감지(짧은 팔다리나, 어깨가 낮으면 감지하기 힘든 단점)

- Percent of Detected Joints (PDJ) : 단점 보완 위해 새로운 metric, distance가 torso 지름에 특정비율 이하인 경우, 특정비율 다르게하면서 감지율 계산, 모든 관절이 같은 거리 threshold에 영향을 받으므로 장점

3. Experimental Detail

- FLIC으로 초기 stage 학습, 

- 30개의 이미지로 hyperparameter 결정

- PDJ는 0.2 이용(모든 관절 다)

- 시그마는 FLIC은 1.0, LSP는 2.0, 총 stage수인 S는 3

- LSP에서 11000이미지 학습, 40개 랜덤 크롭, 2개 좌표, 14개 관절 총 12M개의 트레이닝셋(이정도는 필수다, parameter 많아서..)

- 12core CPU에서 이미지당 0.1s (다른 방법보다 빠르다, 하지만 training complexity는 더 크다)

- 초기 stage는 3일 소요, 각 refinement stage는 7일 소요(40개 랜덤크롭해서 40배 크기 때문에 더 크다)


<Result and Discussion>

1. Comparison

- PDJ에서 모두 좋은 결과를 가져온다.

- appearance가 다양한 movie나 다양한 포즈가 있는 sport 모두 잘된다.

2. Effect of cascade-based refinement

- stage가 증가할수록 좋은 결과를 가져온다

- 초기 단계에서 잘 snap했지만 scale이 안맞는경우 발생, stage넘어가면 이상적으로 refine

3. Cross-dataset Generalization

- 일반화 위해, LSP와 FLIC 모두로 학습, 새로운 Image Parse dataset[15]으로 테스트

- 이때는 PDJ 작으면 다른것이 성능 더 좋은경우도, PDJ 크면 Deep pose가 이김

4. 특별한 pose들

- 흔한 실패의 예는 등이 보이게 사진을 직을 경우 left와 right에 혼동이 온다.


<References>

[1] M. A. Fischler and R. A. Elschlager. The representation and matching of pictorial structures. Computers, IEEE Transactions on, 100(1):67–92, 1973.

[2] M. Andriluka, S. Roth, and B. Schiele. Pictorial structures revisited: People detection and articulated pose estimation. In CVPR, 2009.

[3] S. Johnson and M. Everingham. Learning effective human pose estimation from inaccurate annotation. In CVPR, 2011.

[4] G. W. Taylor, R. Fergus, G. Williams, I. Spiro, and C. Bregler. Pose-sensitive embedding by nonlinear nca regression. In NIPS, 2010.

[5] Y. Tian, C. L. Zitnick, and S. G. Narasimhan. Exploring the spatial hierarchy of mixture models for human pose estimation. In ECCV, 2012.

[6] G. Gkioxari, P. Arbel´aez, L. Bourdev, and J. Malik. Articulated pose estimation using discriminative armlet classifiers. In CVPR, 2013.

[7] C. Ionescu, F. Li, and C. Sminchisescu. Latent structured models for human pose estimation. In ICCV, 2011.

[8] C. Szegedy, A. Toshev, and D. Erhan. Object detection via deep neural networks. In NIPS 26, 2013.

[9] G. Shakhnarovich, P. Viola, and T. Darrell. Fast pose estimation with parameter-sensitive hashing. In CVPR, 2003.

[10] A. Krizhevsky, I. Sutskever, and G. Hinton. Imagenet classification with deep convolutional neural networks. In NIPS, 2012.

[11] Y. Sun, X. Wang, and X. Tang. Deep convolutional network cascade for facial point detection. In Computer Vision and Pattern Recognition (CVPR), 2013 IEEE Conference on, pages 3476–3483. IEEE, 2013.

[12] B. Sapp and B. Taskar. Modec: Multimodal decomposable models for human pose estimation. In CVPR, 2013.

[13] S. Johnson and M. Everingham. Clustered pose and nonlinear appearance models for human pose estimation. In BMVC, 2010.

[14] S. Johnson and M. Everingham. Learning effective human pose estimation from inaccurate annotation. In CVPR, 2011.

[15] D. Ramanan. Learning to parse images of articulated bodies. In NIPS, 2006.

댓글 0

논문 : Click


"DTW-Based Kernel and Rank-Level Fusion for 3D Gait Recognition Using Kinect"

2015 The Visual Computer

Author : Faisal Ahmed

댓글 0

논문 : Click


"DTW-Based Gait Recognition from Recovered 3-D Joint Angles and Inter-ankle Distance"

2014 Computer Vision and Graphics

Author : Tomasz Krzeszowski et al.

(Model based approach)


<Key Point>

1. markerless 3D motion tracking algorithm을 이용해서 motion을 추정

(Vicon motion capture system에 의하여 성능 정검)

[Vicon社에서 모션 캡쳐 카메라 판매, 해당카메라를 이용한 database 여럿 존재] [1] [2]

2. 3D joint angle과 inter ankle distance이라는 metric을 이용하여 각 관절의 cost를 구한다.

3. 그 cost가 최대로 되도록 하는 DTW를 이용하여 identification을 수행한다.

(총 cost가 큰 것으로 하는지? NN?)

4. motion을 추정해서 identification을 하기 때문에 view invariant


<Introduction>

1. Biometric feature로써 gait의 장점

2. Gait recognition의 종류

2-1. Appearence : 전체적인 패턴(실루엣, 컨투어) 이용, 단 view에 많은 의존(특정한 view에서 성능이 좋다)

2-2. Model : Kinematic 특성에 의해 Gait를 특징짓은 parameter 추정, high complexity

3. 3D gait 연구의 진화(biomechanics의 지원), view에 저항적 

[3] Joint angle에서 DTW, 유클리디언 distance, nearest neighbor

[4] 3D motion parameter matching, tracking, restoring

[5] multi camera method, non frontal pose 극복

4. 연구가 활발하게 진행되고 있지만, 아직 발전되어야 될 것이 많다.

(한계점 : View point, camera setup, lightning, walking surface, different clothing 등)

5. 이러한 한계점 극복하기 위해서는 background subtraction 능력이 필요하다

6. 따라서 제안하는 연구는 markerless motion tracking algorithm(GT:vicon camera)을 이용하여 3D 관절의 각도,위치를 추정한다.

7. 그리고 3D 관절의 각도와 거리를 이용하여 각 관절 사이의 cost를 구하고 DTW를 이용하여 총 cost를 구한다.

8. 이 과정에서 두 개의 euler angle 사이에서 euclidean distance를 계산하는 metric을 제안하고, quaternion distance metric과 비교한다. (둘다 DTW사용해서 classification accuracy 이용)

9. 마지막으로 rotation distance와 inter-ankle distance를 합침으로써 accuracy가 증가하는 것을 제시한다.

6~9까지 제안하는 논문 내용


<Articulated Motion Tracking>

1. Motion capture system의 목적은 움직임에서 관절과 관절 사이를 분할하여 뼈대를 찾는 것이다.

2. Vicon社의 적외선 카메라와 몸에 직접 부착하는 marker(빛 방출)를 이용하여 3D 좌표를 구한다.(C3D format, xyz좌표계, 19분할 segment) -> Ground truth

3. markerless 3D motion tracking을 위하여 pose estimation을 한다.

4. 이때 3D motion을 추정하기 위하여 a modified particle swarm optimization(APSO) 알고리즘을 사용한다. [6]


<DTW on Joint Rotations and Geometric Relations>

DTW내용

1. 두개의 sequence(1*N, 1*M)를 비교하기 위해 temporal sequence를 비교하기 위해 DTW사용

2. DTW는 cost matrix(N*M)에서 동적 프로그래밍을 이용하여 nonlinear하게 warping하면서 최적의 path를 찾는 방법 [시간 O(NM)]

3. 한 사람이 다른사람보다 빠르다고 할 지라도 nonlinear warping을 하기 때문에 최적의 path를 찾을 수 있다.

Metric내용

1. DTW를 적용할때 주로 Quaternion-based pose distance [7]를 사용(따라서 이 방법과 제안한 metric 비교)

2. [7]의 단점은 원점에 대한 rotation만 고려한다.

3. 이를 대안하기 위하여, joint rotation에 대응하는 각각의 거리와 geometric 관계를 이용한다. (??)

4. Euler angle differences를 제안(joint rotation의 거리 측정)

5. local cost는 B관절(root에 직접연결) 근처의 Euler angle difference의 합으로 계산된다.

6. local cost와 높이, inter ankle distance, 2개의 weight를 이용하여 total cost(objective function)을 계산할 수 있다.

7. 이러한 total cost는 두 프레임(pose)간의 점수를 말하며 cost matrix의 하나의 원소에 해당된다.


<Experimental Results>

1. markerless motion tracking system 평가 : 22명, 각각 2번 걸음(straight, diagonal)

2. 300개의 particle과 프레임당 APSO를 20번 반복을 적용하여 결과를 얻을 수 있다.

3. 평가표는 평균 euclidean distance 이용

4. 다음으로 markerless / marker dataset에 대하여 각각의 metric을 이요하여 accuracy 비교

4.1 quaternion geodesic distance

4.2 angle distance metric(유클리드, 맨하탄) 

4.3 angle distance + inter ankle distance + height(유클리드, 맨하탄) : 가장 성능 좋다

5. rank 1, 2, 3까지 비교하였으며 10-fold cross validation과 test/validation set 나눠서 적용

6. confusion matrix또한 angle distance + inter ankle distance + height의 경우 깔끔

7. DTW그림도 비교하면서 angle distance + inter ankle distance + height의 성능 강조



<Reference>

[1] https://www.vicon.com/

[2] http://mocap.cs.cmu.edu/

[3] Tanawongsuwan, R., Bobick, A.: Gait recognition from time-normalized joint-angle trajectories in the walking plane. In: CVPR, vol. 2, pp. 726–731 (2001)

[4] Urtasun, R., Fua, P.: 3D tracking for gait characterization and recognition. In: Proc. of IEEE Int. Conf. on Automatic Face and Gesture Rec., pp. 17–22 (2004)

[5] Gu, J., Ding, X., Wang, S., Wu, Y.: Action and gait recognition from recovered 3-D human joints. IEEE Trans. Sys. Man Cyber. Part B 40(4), 1021–1033 (2010)

[6] Krzeszowski, T., Kwolek, B., Michalczuk, A., Swito´ ´ nski, A., Josi´nski, H.: View independent human gait recognition using markerless 3D human motion capture. In: Bolc, L., Tadeusiewicz, R., Chmielewski, L.J., Wojciechowski, K. (eds.) ICCVG 2012. LNCS, vol. 7594, pp. 491–500. Springer, Heidelberg (2012)

[7]  Switonski, A., Polanski, A., Wojciechowski, K.: Human identification based on the reduced kinematic data of the gait. Int. Sym. Sig. Pr. Anal., 650–655 (2011)

댓글 0

논문 : Click


"Classification of Gait Types Based on The Duty-Factor"

Author : Preben Fihl et al.

(Appearance based approach)


<Key point> 

1. Duty Factor라는 것을 이용해서 걸음걸이의 종류(Walk, Jog, Run)를 분류한다. [1]

(Duty Factor : the fraction of the duration of a stride for which each foot remains on the ground)

(발이 땅에 얼마나 오래동안 붙어있는지 비율을 이용)

(달리는 속도와 Camera setup에 independent, 달리는 속도로 걸음걸이 종류를 분류하는 것이 아님)

2. 실루엣은 Codebook Method에 의해서 추출되고, Shape Contexts에 의해서 표현된다.

3. 실루엣 매칭을 위해서 Hungarian method가 사용된다.


<Introduction 논리 전개>

1. Video Surveilance 분야의 성장과 중요성

2. 주어진 환경에서 Gait Recognition의 연구진행, 여러움 제기

3. 속도가 걸음걸이는 분류하는 기준이 아니다

(달리는 것은 단순히 걷는 것의 속도가 빠른 버전이 아니다)

4. 걸음걸이를 분류하기 위한 Descriptor가 필요하다(Duty factor의 필요성)

5. Duty factor의 정의

6. 실험 database 설명

7. Duty factor의 성능과 장점 명시

8. model based approach 설명(pose estimation 필요, model 추정)

9. 정확한 pose estimation 필요없다. (model free, appearance based)

10. database에서 비슷한 실루엣을 찾고 해당 정보를 이용한다.


<Silhouette Database>

1. 하나의 DB에서 각 걸음걸이 종류 1개씩 생성한다.

2. 애니메이션을 이용하여 생성

3. 총 90개의 실루엣

4. 3대의 카메라 앵글(30도씩 움직이며, 애니메이션으로)


<Silhouette Extraction>

1. Codebook background substraction 사용 [2] [3]


<Silhouette Description>

1. 다리부분만 사용

2. Scale과 translation에 invariant한 descriptor이용

3. Shape Contexts [4] 에 거리로 정규화 적용

4. 실루엣에서 n개의 점과, K개의 bin 존재, 따라서 실루엣당 n * (K+1) matrix 생성


<Silhouette Comparison>

1. 두 실루엣을 x^2 test statistics을 이용하여 매칭점수 계산

2. 두 실루엣에서 각 점간의 cost를 계산(n * n matrix)

3. cost는 n * (K+1) matrix 두개를 이용하여 계산

4. cost matrix에서 총 cost가 최소가 되도록 하는 hungarian matching method 이용


<Duty-Factor Calculation>

1. 발이 땅바닥에 얼마나 오래동안 붙어있는지 비율을 이용

2. 이를 통해서 걸음걸이 분류가 가능

3. Label이라고 생각하면 될듯


<Results>

1. 총 131 seqeunces, 카메라 방향, 움직이는 방향, 해상도 변함, 22명의 사람, 다양한 실루엣 높이 변화

2. n은 100, K는 60, 3종류 분류결과 81.7%


<Discussion>

1. Jog와 run의 모호성

2. 안좋은 성능의 background subtraction, 안좋은 성능의 DB로 인한 오류



Reference

[1] R. Alexander. Energetics and Optimization of Human Walking and Running: The 2000 Raymond Pearl Memorial Lecture. American Journal of Human Biology, 14, 2002.

[2] P. Fihl, R. Corlin, S. Park, T. Moeslund, and M. Trivedi. Tracking of Individuals in Very Long Video Sequences. In Int. Symposium on Visual Computing, Lake Tahoe, Nevada, USA, November 6-8 2006.

[3]  K. Kim, T. Chalidabhongse, D. Harwood, and L. Davis. Real-time Foreground-Background Segmentation using Codebook Model. Real-time Imaging, 11(3):167–256, 2005.

[4] S. Belongie, J. Malik, and J. Puzicha. Shape matching and object recognition using shape contexts. PAMI, 24(4), 2002.

댓글 0

IMAGE_DIM = 256;
mean_im = zeros(IMAGE_DIM, IMAGE_DIM, 3);
num = 0;
for nNumFolder = 0:42
    loadFolder = num2str(nNumFolder, '%05d');
    imgs = dir([loadFolder, '\*.ppm']);
    num_imgs = length(imgs);
    for i = 1 : num_imgs
        im = imread([loadFolder, '\', imgs(i).name]);
        im = im(:, :, [3, 2, 1]);  % permute channels from RGB to BGR
        im = permute(im, [2, 1, 3]);  % flip width and height
        im = single(im);  % convert from uint8 to single
        im = imresize(im, [IMAGE_DIM IMAGE_DIM], 'bilinear');  % resize im_data
        mean_im = mean_im + im;
    end
    num = num + num_imgs;
end
mean_im = mean_im / num;


'임시 저장' 카테고리의 다른 글

matcaffe 코드 임시  (0) 2016.05.11

댓글 0

기본 틀 구성 및 DB 다운로드

1. 새로운 폴더 생성

2. Traffic sign dataset 주소 : http://benchmark.ini.rub.de/?section=gtsrb&subsection=dataset

3. Training, Test dataset download 후 압축 풀어서 폴더로 이동


The training data set contains 39,209 training images in 43 classes.

The test dataset contains 12,630 test images or the corresponding pre-calculated features in random order.

  • Extended annotations including class ids: Download (98 kB)

4. imagenet example 파일

cp 새로운폴더주소 caffe-dir/example/imagenet/

(create_imagenet.sh, create_imagenet_mean.sh, readme.md, resume_training.sh, train_caffenet.sh)

5. bvlc reference 파일

cp 새로운폴더주소 caffe-dir/models/bvlc_reference_caffenet/train_val.prototxt

cp 새로운폴더주소 caffe-dir/models/bvlc_reference_caffenet/solver.prototxt



LMDB를 이용하여 DB 구성

이유 : caffe에서 data format 3가지

(LMDB, LevelDB, hdf5->matlab사용가능)

LMDB 구성방법 : http://stackoverflow.com/questions/31427094/guide-to-use-convert-imageset-cpp

[create_imagenet.sh 변경]

1. 폴더, 이미지, label txt파일 구성

>새로운 폴더

>>위에에서 다운받은 imagen일et, blvc 총 7개 파일

>>database

>>>images

>>>>train_images

>>>>>train 이미지들

(폴더 안에 보통 여러개의 세부폴더로 클래스가 나뉘면서 존재)

[train db를 옮겨줍니다.]

>>>>test_images

>>>>>test 이미지들

(폴더 안에 일정한 포맷으로 존재)

[test db를 옮겨줍니다.]

>>>labels

>>>>train_labels.txt

(00000.ppm 16 와 같은 포맷으로 구성)

[matlab을 이용하여 txt파일을 구성합니다]

>>>>test_labels.txt

(00000/00000_00000.ppm 0 와 같은 포맷으로 구성)

[matlab을 이용하여 txt파일을 구성합니다]

>>>lmdb

>>>>train_lmdb(절대 만들어 놓지 말 것-오류발생)

>>>>test_lmdb(절대 만들어 놓지 말 것-오류발생)


*.label txt파일 구하는 매틀랩 코드

clear, close all
%%make test DB

%%make train DB
train_dir = dir('./database/images/train_images/');
train_dir(1:2) = [];
train_txt = fopen('train.txt', 'w+');

for i = 1 : length(train_dir)
    temp = train_dir(i).name;
    train_dir1 = dir(['./database/images/train_images/',temp, '/*.ppm']);
    for j = 1 : length(train_dir1)
        fprintf(train_txt, '%s%c%s %d\n', temp,'/',train_dir1(j).name, i-1);
    end
end

fclose(train_txt);

test db는 label과 같이 존재하는 csv파일을 이용하여 바로 구성


2. create_imagenet.sh 수정

#!/usr/bin/env sh
# Create the imagenet lmdb inputs
# N.B. set the path to the imagenet train + val data dirs

EXAMPLE=./database/lmdb
DATA=./database/labels
TOOLS=../caffe-master/build/tools

TRAIN_DATA_ROOT=./database/images/train_images/
VAL_DATA_ROOT=./database/images/test_images/

# Set RESIZE=true to resize the images to 256x256. Leave as false if images have
# already been resized using another tool.
RESIZE=true
if $RESIZE; then
  RESIZE_HEIGHT=256
  RESIZE_WIDTH=256
else
  RESIZE_HEIGHT=0
  RESIZE_WIDTH=0
fi

if [ ! -d "$TRAIN_DATA_ROOT" ]; then
  echo "Error: TRAIN_DATA_ROOT is not a path to a directory: $TRAIN_DATA_ROOT"
  echo "Set the TRAIN_DATA_ROOT variable in create_imagenet.sh to the path" \
       "where the ImageNet training data is stored."
  exit 1
fi

if [ ! -d "$VAL_DATA_ROOT" ]; then
  echo "Error: VAL_DATA_ROOT is not a path to a directory: $VAL_DATA_ROOT"
  echo "Set the VAL_DATA_ROOT variable in create_imagenet.sh to the path" \
       "where the ImageNet validation data is stored."
  exit 1
fi

echo "Creating train lmdb..."

GLOG_logtostderr=1 $TOOLS/convert_imageset \
    --resize_height=$RESIZE_HEIGHT \
    --resize_width=$RESIZE_WIDTH \
    --shuffle \
    $TRAIN_DATA_ROOT \
    $DATA/train_labels.txt \
    $EXAMPLE/train_lmdb/

echo "Creating val lmdb..."

GLOG_logtostderr=1 $TOOLS/convert_imageset \
    --resize_height=$RESIZE_HEIGHT \
    --resize_width=$RESIZE_WIDTH \
    --shuffle \
    $VAL_DATA_ROOT \
    $DATA/test_labels.txt \
    $EXAMPLE/test_lmdb/

echo "Done."

주의 할 점은 RESIZE=true로 바꿀 것(나중에 make_imagenet_mean.sh할 때 오류)

example의 위치는 lmdb 위치(lmdb 내부에 폴더 생성하지 말것)

data의 위치는 label txt파일이 있는 위치

tools의 위치는 원래 caffe-dir로 설정(이 곳에 convert_imageset함수 존재)

모든 이미지를 LMDB형태로 구성합니다.


3. ./create_imagenet.sh 수행




Generate mean file

1. make_imagenet_mean.sh 수정

#!/usr/bin/env sh
# Compute the mean image from the imagenet training lmdb
# N.B. this is available in data/ilsvrc12

EXAMPLE=./database/lmdb
DATA=./database/labels
TOOLS=../caffe-master/build/tools

$TOOLS/compute_image_mean $EXAMPLE/train_lmdb \
  $DATA/imagenet_mean.binaryproto

echo "Done."

주의 할 점은 lmdb폴더 내부를 지울 것

또한 이 과정이 지나면 imagenet_mean.binaryproto 파일이 생성된다.


2. ./make_imagenet_mean.sh 수행




Train and Test

1. train_caffenet.sh 수정

#!/usr/bin/env sh

../caffe-master/build/tools/caffe train \
    --solver=./solver.prototxt


2. train_val.prototxt 수정

crop size : 227로 수정

mean_file : 주소 수정

source_file : 주소 수정

num_output : 1000->43(fc8 layer)

(class 43개이므로)

batch_size : 20으로 조정

(nvidia-smi 이용하여 테스트 할 때 gpu memory check하면서

batch size 올릴 수 있으면 올린다)

[한번에 읽어오는 이미지 수]


3. solver.prototxt 수정

base_lr : 0.001 (수렴 안되면 더 낮출걸)

snapshot_prefix : 주소 수정(snapshot 저장)

solver_mode : GPU (CPU로 할거면 CPU)


4. ./train_caffenet.sh



로그 저장하는 방법

./train_caffenet.sh 2>&1 | tee -a path/to/text/log/file.txt



Matcaffe 이용한 Test class accuracy

1. compile matcaffe wrapper

cd caffe-dir

sudo gedit Makefile.config

-> MATLAB_DIR := /home/seokeon/MATLAB/R2015b

mat all matcaffe

make mattest

matlab

2. 데모 실행

caffe-master/matlab/demo/classification_demo.m 이용하여 수정

function [scores, maxlabel] = classification_demo(im, use_gpu)
% [scores, maxlabel] = classification_demo(im, use_gpu)
%
% Image classification demo using BVLC CaffeNet.
%
% IMPORTANT: before you run this demo, you should download BVLC CaffeNet
% from Model Zoo (http://caffe.berkeleyvision.org/model_zoo.html)
%
% ****************************************************************************
% For detailed documentation and usage on Caffe's Matlab interface, please
% refer to Caffe Interface Tutorial at
% http://caffe.berkeleyvision.org/tutorial/interfaces.html#matlab
% ****************************************************************************
%
% input
%   im       color image as uint8 HxWx3
%   use_gpu  1 to use the GPU, 0 to use the CPU
%
% output
%   scores   1000-dimensional ILSVRC score vector
%   maxlabel the label of the highest score
%
% You may need to do the following before you start matlab:
%  $ export LD_LIBRARY_PATH=/opt/intel/mkl/lib/intel64:/usr/local/cuda-5.5/lib64
%  $ export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libstdc++.so.6
% Or the equivalent based on where things are installed on your system
%
% Usage:
%  im = imread('../../examples/images/cat.jpg');
%  scores = classification_demo(im, 1);
%  [score, class] = max(scores);
% Five things to be aware of:
%   caffe uses row-major order
%   matlab uses column-major order
%   caffe uses BGR color channel order
%   matlab uses RGB color channel order
%   images need to have the data mean subtracted

% Data coming in from matlab needs to be in the order
%   [width, height, channels, images]
% where width is the fastest dimension.
% Here is the rough matlab for putting image data into the correct
% format in W x H x C with BGR channels:
%   % permute channels from RGB to BGR
%   im_data = im(:, :, [3, 2, 1]);
%   % flip width and height to make width the fastest dimension
%   im_data = permute(im_data, [2, 1, 3]);
%   % convert from uint8 to single
%   im_data = single(im_data);
%   % reshape to a fixed size (e.g., 227x227).
%   im_data = imresize(im_data, [IMAGE_DIM IMAGE_DIM], 'bilinear');
%   % subtract mean_data (already in W x H x C with BGR channels)
%   im_data = im_data - mean_data;

% If you have multiple images, cat them with cat(4, ...)

% Add caffe/matlab to you Matlab search PATH to use matcaffe
if exist('../+caffe', 'dir')
  addpath('..');
else
  error('Please run this demo from caffe/matlab/demo');
end

% Set caffe mode
if exist('use_gpu', 'var') && use_gpu
  caffe.set_mode_gpu();
  gpu_id = 0;  % we will use the first gpu in this demo
  caffe.set_device(gpu_id);
else
  caffe.set_mode_cpu();
end

% Initialize the network using BVLC CaffeNet for image classification
% Weights (parameter) file needs to be downloaded from Model Zoo.
model_dir = '../../models/bvlc_reference_caffenet/';
net_model = [model_dir 'deploy.prototxt'];
net_weights = [model_dir 'bvlc_reference_caffenet.caffemodel'];
phase = 'test'; % run with phase test (so that dropout isn't applied)
if ~exist(net_weights, 'file')
  error('Please download CaffeNet from Model Zoo before you run this demo');
end

% Initialize a network
net = caffe.Net(net_model, net_weights, phase);

if nargin < 1
  % For demo purposes we will use the cat image
  fprintf('using caffe/examples/images/cat.jpg as input image\n');
  im = imread('../../examples/images/cat.jpg');
end

% prepare oversampled input
% input_data is Height x Width x Channel x Num
tic;
input_data = {prepare_image(im)};
toc;

% do forward pass to get scores
% scores are now Channels x Num, where Channels == 1000
tic;
% The net forward function. It takes in a cell array of N-D arrays
% (where N == 4 here) containing data of input blob(s) and outputs a cell
% array containing data from output blob(s)
scores = net.forward(input_data);
toc;

scores = scores{1};
scores = mean(scores, 2);  % take average scores over 10 crops

[~, maxlabel] = max(scores);

% call caffe.reset_all() to reset caffe
caffe.reset_all();

% ------------------------------------------------------------------------
function crops_data = prepare_image(im)
% ------------------------------------------------------------------------
% caffe/matlab/+caffe/imagenet/ilsvrc_2012_mean.mat contains mean_data that
% is already in W x H x C with BGR channels
d = load('../+caffe/imagenet/ilsvrc_2012_mean.mat');
mean_data = d.mean_data;
IMAGE_DIM = 256;
CROPPED_DIM = 227;

% Convert an image returned by Matlab's imread to im_data in caffe's data
% format: W x H x C with BGR channels
im_data = im(:, :, [3, 2, 1]);  % permute channels from RGB to BGR
im_data = permute(im_data, [2, 1, 3]);  % flip width and height
im_data = single(im_data);  % convert from uint8 to single
im_data = imresize(im_data, [IMAGE_DIM IMAGE_DIM], 'bilinear');  % resize im_data
im_data = im_data - mean_data;  % subtract mean_data (already in W x H x C, BGR)

% oversample (4 corners, center, and their x-axis flips)
crops_data = zeros(CROPPED_DIM, CROPPED_DIM, 3, 10, 'single');
indices = [0 IMAGE_DIM-CROPPED_DIM] + 1;
n = 1;
for i = indices
  for j = indices
    crops_data(:, :, :, n) = im_data(i:i+CROPPED_DIM-1, j:j+CROPPED_DIM-1, :);
    crops_data(:, :, :, n+5) = crops_data(end:-1:1, :, :, n);
    n = n + 1;
  end
end
center = floor(indices(2) / 2) + 1;
crops_data(:,:,:,5) = ...
  im_data(center:center+CROPPED_DIM-1,center:center+CROPPED_DIM-1,:);
crops_data(:,:,:,10) = crops_data(end:-1:1, :, :, 5);


수정해야 할 것

+caffe가 있는 dir

addpath dir

model_dir

net_model

net_weights

d

mean_data

cropped_dim




mean_im.mat

compute_mean.m




댓글 0