160919_Installing-Ubuntu-alongside-other-pre-installed-OS.pdf


Windows와 Mac OS X에서 듀얼 부팅으로 Ubuntu를 설치하는 가이드입니다.



Posted by 헬벨

Supervised neural network의 exercise를 끝내고, Convolutional neural network의 exercise를 해보았다.
Neural network, 특히 CNN에 관심이 있다면 매우 훌륭한 tutorial이라고 생각된다.
Linear regression부터 차근차근 MATLAB으로 실습하면서 배울 수 있다.



여기서부터는 구현하면서 잡설

MNIST input -> Convolution -> Pooling -> Softmax 의 구성.
Softmax layer의 delta와 gradient를 구하는 것은 기존의 supervised neural network에서와 동일.
Pooling layer와 conv layer에 error를 전파하는 것을 개념적으로 이해하는것이 중요.
delta_pool = (Wd' * delta_softmax); % no activate function (pooling layer)
Pooling layer는 activation function이 없기 때문에 f’(z^L) 은 항상 1이다. (identical function)
Conv. layer는 아래와 같이 구한다.
delta_conv = delta_pool2 .* (activations .* (1 - activations));

이전의 supervised nn 실습에서는 W를 앞에 곱해주었는데, 여기서 delta_conv를 구할때는 W를 곱하지 않는다.
Conv layer의 filter는 fully connected layer의 W와 다르게 특정 neuron들에 묶여 있기 때문에, 
Conv. filter와 pooling error와의 연산은 filter gradient를 구할 때 한번에 다음과 같이 계산해준다. 
        Wc_grad(:,:,filterIdx) = Wc_grad(:,:,filterIdx) + ...
            conv2(images(:,:,imageIdx), ...
            rot90(delta_conv(:,:,filterIdx, imageIdx), 2), 'valid');
위에서도 말했듯이, convolution의 weight는 fully connected와 다르게 특정 뉴런들에 묶여 있으므로 fully connected와 계산이 다르게 된다.
정답 코드를 보면 conv_delta error와 이미지를 convolution해서 gradient를 구한다.
결국 미분해보면 같은 식으로 나올지 ?? (fully connected 는 미분식이 W^T * delta 인데..)

Tutorial의 exercise에서 시키는대로 구현해보았더니 iteration을 돌다가 발산해 버려서 할 수 없이 솔루션코드를 보고 문제점을 찾았더니, 
문제는 learning rate를 주는 부분에서 각 weight parameter별로 gradient의 2norm을 분모로 alpha를 나눈 값을 learning rate로 사용한다.
        if isempty(sum_gradients)
            sum_gradients = grad .^ 2;
        else
            sum_gradients = sum_gradients + grad .^ 2;
        end
        learning_rate = alpha ./ sqrt(1 + sum_gradients);
즉, 어떤 parameter의 gradient 값을 그대로 update에 사용하는 것이 아니라, normalization을 하여 사용하겠다는 것으로 생각된다.
(어떤 weight가 작은 값의 gradient 들이 나오다가 큰 값이 나오는 경우, 큰 값이 계속 나오던 경우보다 weight에 많이 반영하게 될 듯.)



결과: 


동일한 learning rate alpha를 준 경우 (발산한다)

        velocity = mom * velocity + alpha * grad;
        theta = theta - velocity;

>> cnnTrain
Epoch 1: Cost on iteration 1 is 638.789275
Epoch 1: Cost on iteration 2 is Inf
Epoch 1: Cost on iteration 3 is 1457.666470
Epoch 1: Cost on iteration 4 is 1581.362140
Epoch 1: Cost on iteration 5 is 1467.729831
Epoch 1: Cost on iteration 6 is 1894.806809
Epoch 1: Cost on iteration 7 is 1695.544653
Epoch 1: Cost on iteration 8 is 1877.625576
Epoch 1: Cost on iteration 9 is 1737.336655
Epoch 1: Cost on iteration 10 is 1739.594208
Epoch 1: Cost on iteration 11 is 1589.624996
Epoch 1: Cost on iteration 12 is 1731.826654
Epoch 1: Cost on iteration 13 is Inf
Epoch 1: Cost on iteration 14 is 2671.770646
Epoch 1: Cost on iteration 15 is 2860.173187
Epoch 1: Cost on iteration 16 is 3144.917557
Epoch 1: Cost on iteration 17 is 3525.974768
Epoch 1: Cost on iteration 18 is 2933.235133
Epoch 1: Cost on iteration 19 is 2893.149310
Epoch 1: Cost on iteration 20 is 3454.369426
Epoch 1: Cost on iteration 21 is 2851.723443
Epoch 1: Cost on iteration 22 is Inf
Epoch 1: Cost on iteration 23 is NaN
Epoch 1: Cost on iteration 24 is NaN
Epoch 1: Cost on iteration 25 is NaN
Epoch 1: Cost on iteration 26 is NaN
...



각 parameter마다 다르게 learning rate를 주는 경우

        velocity = mom * velocity + learning_rate .* grad;
        theta = theta - velocity;

>> cnnTrain
Epoch 1: Cost on iteration 1 is 609.508667
Epoch 1: Cost on iteration 2 is 25406.446805
Epoch 1: Cost on iteration 3 is 20452.159696
Epoch 1: Cost on iteration 4 is 8794.225061
Epoch 1: Cost on iteration 5 is 8655.889132
Epoch 1: Cost on iteration 6 is 3925.461289
Epoch 1: Cost on iteration 7 is 2139.816842
Epoch 1: Cost on iteration 8 is 1805.844468
Epoch 1: Cost on iteration 9 is 1275.379768
Epoch 1: Cost on iteration 10 is 1151.133646
Epoch 1: Cost on iteration 11 is 859.827331
Epoch 1: Cost on iteration 12 is 617.373896
Epoch 1: Cost on iteration 13 is 509.149070
Epoch 1: Cost on iteration 14 is 404.800826
Epoch 1: Cost on iteration 15 is 365.095783
Epoch 1: Cost on iteration 16 is 308.166993
Epoch 1: Cost on iteration 17 is 324.043019
Epoch 1: Cost on iteration 18 is 302.039560
Epoch 1: Cost on iteration 19 is 328.277577
Epoch 1: Cost on iteration 20 is 292.860982
...






결과
Accuracy is 0.980100


Posted by 헬벨

Windows 사용자는 여기로: http://hellbell.tistory.com/entry/Sublime-Text-3-Latex-Plugin-설치-in-Windows-7

OS X El Capitan을 사용함.


가정: MacTex은 이미 설치됨

MacTex: https://tug.org/mactex/ 에서 다운로드


1. Sublime text 3 를 설치한다. (http://www.sublimetext.com/3)

2. Sublime text 3 를 켜고, Package Control 을 설치한다. (패키지 컨트롤은 plugin들을 쉽게 설치할 수 있게 도와주는 애드온임)

설치 방법 : ctrl + ` 눌러서 console 창 띄우고 아래 링크에 있는 내용 복사하여 붙여넣고 엔터.

(https://packagecontrol.io/installation)

3. 이제 command+shift+p 를 누르고 “install ” 입력하고 엔터 -> latextools 입력하고 선택하여 설치.

4. 메뉴의 preferences -> package settings -> latextools -> reconfigure latextools and migrate settings. 으로 설정 완료.

5. 메뉴의 tools -> build system -> LaTex 선택하여 빌드 세팅 완료. 시험삼아 아무 tex파일이나 켜서 command + b (빌드 단축키)로 빌드해보자.

(여기까지는 Windows의 방법과 똑같다.)

6. Skim PDF viewer 설치 (http://skim-app.sourceforge.net)

6-1. 다운로드된 파일이라고 Skim이 열리지 않을 경우, finder에서 skim앱을 control + click하여 drop down 메뉴를 띄우고, 열기를 눌러 실행한다.

7. Skim을 실행하고, Preference -> sync tab으로 이동.

  • Check for file changes을 체크해제
  • Preset type은 Custom을 선택
  • Command에 /Applications/Sublime Text.app/Contents/SharedSupport/bin/subl 를 입력
  • Arguments에  "%file":%line 를 입력
8. 끝.
9. Forward search는 Sublime text에서 command+b 명령으로 빌드하면, skim viewer가 뜨면서 자동으로 현재 line이 강조 표시된다.
Inverse search는 skim앱에서 되돌아가 가고픈 부분을 command+shift+click하면 Sublime text로 돌아간다. 


Posted by 헬벨
publication 탭에서 리뷰를 살펴보니, NIPS 2015에 제출된(아마도 rejected) 논문인 듯 하다.
Darknet이라는 묘한 C++기반의 deep learning framework를 사용한다.

논문의 요지--
기존의 deep learning을 사용하는 object detection 방법들(R-CNN 등)은 기존의 object proposal 방법들(EdgeBoxes와 같은)을 사용하여 물체일 가능성이 높은 patch들을 가지고, deep network에 input으로 사용하여 object classification task로 문제를 풀었다.
이러한 방법은 object proposal의 높은 recall 성능과 DNN의 높은 classification 성능과 맞물려서 전체적으로 outperforming하는 결과를 낸다.
물론 object proposal 방식의 속도가 빠르고 (edgeboxes: < 1 sec),  DNN의 feedforward 과정 또한 꽤 빠르다고는 하나, 
object proposal을 생성하는 과정과 후보 image patch들을 여러번 deep network에 돌려야 하는 과정은 꽤나 redundant해 보인다.

제안하는 논문은, input image를 CNN 모델에 한번 feed forward 과정을 거치는 통합된 object detection알고리즘을 제안한다.
Main contribuion: 
     1) 간단한 framework으로 한번에 이미지 전체에 해당하는 detection을 매우 빠르게 수행. (real-time)
     2) Global reasoning: 각각 patch들의 classification결과로서의 detection이 아닌, 전체 이미지를 고려한(global view) 탐지 결과를 얻을 수 있다.
실험 결과로는, PASCAL VOC 데이터셋에서는 DPM보다는 높은 성능, R-CNN 보다는 낮은 성능을 보인다.
이러한 단점을 보완?하기 위해 그림이나, natural 이미지들의 데이터셋에서의 탐지 결과를 보여주는데, 이러한 natural dataset에서 성능이 더 좋은 이유를 YOLO의 global reasoning을 그 이유로 들고 있다.  


논문 내용 --


입력 이미지를 제안하는 CNN 모델에 통과시킨 후 output으로 (S * S) grid의 결과값을 얻는다. (S=7)
각 grid는 
1) C(=20)개의 class에 대한 label과
2) 이 grid가 가르기는 object의 confidence와
2) B(=2)개의 bounding box를 predict한다.
즉, 이미지당 output으로 7*7*(20+(4+1)*2)짜리 tensor를 얻게 된다.

CNN 모델은 GoogLeNet을 변형시켜, 24 conv. layer + 2 fully connected layer로 구성된다.

논문에서 정의하고 있는 Loss function은 다음과 같다.

논문에는 loss function에 대해 설명이 자세히 안되어 있고 notation에 대한 설명 또한 없어서 대략 추측해본 바는 다음과 같다.

첫 번째 term 은 predicted box 와 ground truth의 center 거리, 즉, bounding box location error.
두 번째는, predicted box 와 ground truth box의 aspect ratio error.
세 번째와 네 번째는 grid의 detection의 confidence에 따른 loss term인 듯 하다. 각각 ground truth object가 있을 경우 (C=1), 없을 경우 (C=0)로 나누어서 다른 weight를 적용하는 식으로 보인다.
마지막 term은 grid에서 predicted ‘class label’에 따른 probability에 의한 error term이다.  YOLO는 각 grid에서 물체가 탐지되었다고 할 때의 20개의 class에 대한 확률 값을 prediction한다. 이 값을 ground truth (true class=1, else =0) 와 비교하여 error를 계산한다.






Posted by 헬벨
참고 자료들: 


뉴럴 network를 학습하는 방법으로 쓰이는 backpropagation algorithm을알아보자.


주어진 input layer로부터 각 neurun의 parameter(weight, bias)에 의해 연산 결과(\$z_i^l\$)를 activation function (ex: sigmoid, ReLU)을 통과시킨 후 (\$a_i^l = \sigma (z_i^l)\$ )
다음 layer로 넘기는 식으로 forward propagation을 수행하여, 최종 output의 결과를 얻는다.

각 뉴런의 parameter를 학습하는 것은,
보통 parameter의 initial 값 (ex: random)을 준 후, gradient descent 과정을 통해 training data의 cost function C를 줄이는 방향으로 학습하게 된다.
(cost function은 non-convex이므로 gradient descent 방식으로 parameter를 학습한다.)
Gradient descent는 cost function에 대한 parameter들(\$w^l_{ij}, b^l_j\$) 의 편미분값을 이전 parameter값에서 iterative하게 빼준다.
Gradient descent update 식은 다음과 같다.

$$w_{ij}^{(l)} = w_{ij}^{(l)} - \alpha \frac{\partial}{\partial w_{ij}^{(l)}} J(w,b)$$

$$b_{i}^{(l)} = b_{i}^{(l)} - \alpha \frac{\partial}{\partial b_{i}^{(l)}} J(w,b)$$

효율적으로 partial derivative를 계산하는 backpropagation 방법을 소개한다.
*Error term delta의 정의
$$\delta^{(L)}_i= \frac{\partial}{\partial z^{(L)}_i} \frac{1}{2} \left\|y - a^{(L)}_i\right\|^2 = - (y_i - a^{(L)}_i) \cdot f'(z^{(L)}_i)$$

1. feedforward로 각 뉴런의 activation 값을 계산
2. output layer의 error (\$\delta^L\$)를 계산한다.
3. L-1, L-2 레이어로 넘기면서 error \$\delta^{L-1}_i\$ ,...를 계산한다.
\$\delta^l = ({w^l}^T \delta^{l+1})*f'(z^l)\$
4. delta를 이용한 partial derivative 식.
\$\delta_w^l J(w;x,y) = \delta^{l+1} a^l \$


큰 그림으로 보면,


위 그림과 같이  \$w^2_{21}\$ 의 값이 \$\Delta w^2_{21}\$ 만큼 변할 때, layer 2 의 1번째 뉴런의 activation은 \$\Delta a^2_1\$만큼 변하고, 이 변화는 최종 layer까지 전해져 cost를 \$\Delta C\$만큼 변화시킨다.
이는 cost C에 대해 어떤 parameter \$w^l_{jk}\$ 로 미분한 값은 아래 식과 같이 chain rule로 표현될 수 있는 것을 의미하며,
중간에 존재하는 \$\partial a^l/ \partial a^{l-1}\$ 의 의미는 layer의 edge 사이에 곱해지는 weight를 의미한다.
다시 말해보면 3번 step에서 layer 사이의 weight matrix w를 에러 \$\delta^{l+1}\$ 곱하여 전해지는 것은 이러한 chain rule의 의미와 같다고 볼 수 있다. 





Posted by 헬벨
ICCV 2015에 발표될 논문으로 caltech pedestrian benchmark 성능을 11%대까지 끌어올림.
전체적인 컨셉:
Adaboost와 같이 boosting 기반으로 weak learner를 cascading할 때 'classifier accuracy' vs 'computation complexity'의 trade-off를 최적화하는 framework를 제안.

<Adaboost>
weak learner f_i 들로 구성된 predictor F에 iterative하게 new weak learner g를 추가하기 위한 일련의 과정들..
(수식 설명은 패스)
epsilon을 이용한 미분식이 명확하게 이해가 되지 않는다.
weak classifier는 feature의 binary decision을 이용한다.

<Complexity-aware cascading>
각 weak learner의 time Complexity를 의미하는 complexity risk term이 추가된다.


Complexity risk term에는 Omega function이 존재한다.
단일 feature를 사용하여 boosting을 하는 경우, 이 Omega function은 step 순서에 상관없이 constant한 값을 갖게 된다. 
논문에서는 여러 feature들 (ACF, HOG, SS, CB, LDA, CNN 논문참고)을 사용하기 때문에,
Classifier의 miss-classification에 의한 risk와 시간이 오래걸리는 feature가 갖는 time complexity risk의 합 (전체 Loss)을 최소화하는 방향으로 weak learner를 선택하게 된다.
즉 complexity 를 고려하지 않는 경우에 비해, 시간이 오래걸리는 feature는 가벼운 feature에 비해 cascade의 뒷단에 위치하게 된다. 

<성능>
단일 feature 대상으로 boosting을 할 경우 complexity term이 의미가 없어지므로 기존 boosting과 차이가 없음.
multi feature로 제안된 방법을 수행할 경우: 수행속도와 detection 성능의 향상을 보임. 하지만 state-of-the-art 보다는 낮은 성능
Large-CNN 모델에의 적용: Large-CNN에의 적용이란, 제안된 방법으로 detect해낸 pedestrain candidate들을 VGGnet 같은 framework의 input으로 넣고 최종 결과를 얻는 것을 의미한다.
즉 R-CNN에서의 region proposal부분을 complexity aware boosting으로 구하겠다는 것이다. 
이렇게 하면 성능이 11%대로 양자쩜프가 일어난다. -0-

<결론>
complexity term을 정의하고 boosting optimization 에 넣은 부분은 참신함.
miss rate 11% 대의 성능이 나오려면, 결국 R-CNN과 같이 Deep learning framework를 사용해야 한다.




Posted by 헬벨
ICCV 2015에 발표될 논문으로 benchmark 성능을 큰 폭으로 향상시킨 논문.
특히 part based detector를 학습시켰다길래 흥미를 갖고 읽어봄.




목적: 보행자 탐지 (pedestrian detection)
특징: Deep learning 이용 (CNN), occlusion handling에 중점을 둠.

기존 연구와의 차별점: 
1) 기존 part-based 연구 (DPM등) 에 비해 단순한 configuration (썩 공감이 되지는 않음).  또한 part annotation이 필요없는 part-based detector 라는 장점이 있음.
2) 기존 occlusion handling 하는 논문과 달리 occlusion pattern을 pre-define하지 않음. extensive part pool로부터 자동 생성한다. 
3) 기존 deep model (중 occlusion을 다루는 연구들) 은 최상위 layer에서 occlusion을 학습하기 때문에 제대로 occlusion 과 visibility가 학습되지 않는다.


<Training Part Detector>
사람 모델을 6 by 3의 cell로 구성하며, part detector의 최소 2 by 2 부터 6 by 3 까지 45개의 part pool을 생성한다. (위 그림 참고)


학습으로는 caltech pedestrian dataset을 사용.
사람 영역을 나타내는 human bounding box 뿐만 아니라, 
보이는 영역을 의미하는 visible region의 bounding box 도 annotation된 정보로 사용한다. (dataset에서 제공되는지는 잘모름)

이를 이용하여 45개의 part detector를 학습하는 방법은 간단하다.
(위 그림 참고)
1) Part patch들을 mining하는 방법
Training data의 ground truth human patch 중, part template에 해당하는 영역(패치)을 positive sample로 사용. 
당연히 grount truth의 visible region이 part template 영역을 포함하고 있어야 한다.
Negative sample은 LDCF[[각주:1]] 라는 성능이 좋은 channel filter 기반으로 탐지된 false positive들을 사용한다. (분석: 자연스럽게 hard negative mining 의 효과를 얻을 수 있다.)

2) Part detector 학습
그 유명한 R-CNN[[각주:2]] framework를 사용.
Pre-training: (i) no pre-training, (ii) use full images, (iii) use cropped images 의 세 가지 방법으로 수행 하고 비교. 당연히 (iii)의 방법이 가장 좋은 성능.
Fine-tuning: R-CNN의 n(=1000) class의 output을 내는 마지막 layer를 2 class (0=not human, 1=human)의 classifier로 바꾼 후 재학습.

이 방법으로 45개의 R-CNN 기반의 part detector가 생성된다. 

3) IOU를 높이기 위한 shifting handling.. 은 생략..



<학습된 45개의 part detector로 최종 결과를 내려면?>
논문에서는 complementarity 라고 최종 과정을 언급함. (각 part detector들의 결합? 이라는 의미?)
//part detector의 outputs (45개) 위에 SVM 과 같은 classifier 를 스택하여 final decision을 찾는 방법을 사용하지 않고, 
45개의 part detector의 complementarity 를 학습하기 위해 45 detector scores 를 입력으로 하는 linear SVM을 학습하고,
SVM weights의 top 6 weight 를 갖는 part detector를 선별하여 (아래 그림 참고)

이 파트들의 ensemble SVM으로 학습하여 최종 결과를 낸다고 한다. 
허나 이부분이 clear하게 설명되어있지 않음. ensemble classifier인 bagging이나 boosting을 의미하는 것 같지는 않음.

실험 결과부분에서, 6개 part detector의 simple combining에 비해 학습된 complementarity를 이용한 것이 성능이 좋다고 표현한 것으로 보아
추측하건데, complementarity는 linear SVM의 weight를 의미하며, complementarity를 고려한 combination은 weighted sum이 아닐까 생각해본다..


<내 결론>
큰 성능의 향상 가져옴. 
기술적으로는 wow 할만큼 새로운 것은 없는 듯.
코드가 공개되면 학습된 모델을 part detector로 사용하여 crowded scene에서 적용해보는 것이 목표.










  1. http://vision.ucsd.edu/~pdollar/files/papers/NamNIPS14ldcf.pdf [본문으로]
  2. http://arxiv.org/abs/1311.2524 [본문으로]
Posted by 헬벨

OpenCV를 Visual studio 환경에서 debugging할 때는 ImageWatch라는 tool을 사용하면 편리하다.

파이썬에는 ImageWatch가 없어 아쉽지만,,

프로그램 중간 중간의 결과물을 logging해서 볼 수 있는 visual-logging 이라는 툴이 있어 설치해보았다.


예제 코드

from logging import FileHandler

from vlogging import VisualRecord


import cv2

import logging


cv_image = cv2.imread('lenna.jpg')

logger = logging.getLogger("demo")

fh = FileHandler('test.html', mode="w")


logger.setLevel(logging.DEBUG)

logger.addHandler(fh)


logger.debug(VisualRecord(

    "Hello from OpenCV", cv_image, "This is openCV image", fmt="png"))


lenna.jpg를 읽어온 후, logger에 글과 image를 추가하면 html 형식으로 저장이 된다.




Posted by 헬벨

요즘 개발 언어로 주로 MATLAB과 C++(OpenCV)를 사용하는데 

아무래도 MATLAB의 편의성때문에 MATLAB을 이용한 개발을 더 선호한다. 

하지만 MATLAB은 성능 한계가 있고 강력한 OpenCV 라이브러리를 사용할 수 없다는 아쉬움이 있다.

그러던 중 Python은 스크립트 언어로 컴파일의 애로사항이 적으며 OpenCV 라이브러리가 제공된다고 하여 이 기회에 설치하고 익혀보려고한다.


파이썬과 OpenCV 라이브러리를 사용하는 방법은 여러가지가 있다. 

여기서는 Windows 환경과 Visual studio를 IDE로 사용하는 방법을 정리해보겠다. (Python + Sublime Text 의 조합도 좋다고 한다.)

(내 환경: Windows 8.1 64bit, Visual studio 2013)

(OpenCV를 사용해야하므로 Python은 2.7버전을 사용함) 




(이하 설치 방법에 대한 설명. 설치 과정에서 삽질을 좀 하는 바람에 기억이 정확하지 않을 수 있음..)


파이썬 설치방법은 두 가지가 있는 듯 하다.


첫째로, python (https://www.python.org/download/releases/2.7/)에서 설치 파일을 다운 받아 설치하는 방법이 있다.

이 방법은 python의 필수 패키지 (여기서는 pip, numpy, opencv 등)을 직접 설치해줘야 한다.

처음엔 나도 이 방법으로 시도했는데 numpy 를 설치할 때 build 에러가 나서 포기하고 두번째 방법으로 넘어갔다.



두번째 방법은 python + pre-built packages의 통합팩인 python distribution을 설치하는 것이다.

이러한 distribution은 WinPython, Anaconda, Enthought Canopy 등이 있는데, 주변에서 canopy (1.5.2 버전)를 추천받아 설치하였다. 

Enthought Canopy는 매우 쉽고 편리하다는 장점이 있는데, 무료 버전과 유료 버전이 존재한다.

Numpy나 SciPy 같은 기본 package(100+개)는 무료 버전에서도 이용할 수 있으나

OpenCV 같은 package들은 유료 버전(200+개 패키지 제공)에서만 사용할 수 있다.

하지만 잘 읽어보니 학생 계정(@*.ac.kr과 같은)으로 로그인하면 유료 버전을 사용할 수 있는 licence를 제공한다.!

따라서 회원 가입을 학교 메일 계정으로 한 후 설치를 진행하였다.

다른 distribution들은 설치를 안해봐서 모르겠는데, Canopy는 GUI로 패키지를 설치할 수 있어 편리했다. 

NumPy와 OpenCV를 설치하였다. (OpenCV는 2.4.9 버전)



이제 파이썬 설치가 끝났으니 Visual Studio를 켜보자.

Visual Studio에서 Python을 사용할 수 있게 해주는 PTVS에 대한 설명은 https://pytools.codeplex.com/ 에서 참고하도록 하자.

File -> New project -> Python Application 을 선택하여 Python 프로젝트를 생성한다.

Tool -> Option -> Python tools -> Environment options 을 열고, Enthought Canopy 2.7이 default environment로 되어있음을 확인한다.

Tool -> Python Tools -> Python Environment 를 선택하여 Refresh DB를 눌러준다. 



Refreshing DB가 끝나면 설치도 대강 마무리되었다고 할 수 있다.



OpenCV 예제를 돌려보자.


import cv2

from matplotlib import pyplot as plt


img = cv2.imread('img.jpg')


plt.imshow(img)

plt.title('Image')

plt.show()






Posted by 헬벨

MATLAB code: 

toy_example_intersection_area.m


Object detection과 같은 과제를 수행할 때 algorithm의 성능을 평가하기 위해 IOU (intersection over union)이라는 지표를 사용한다.

일반적으로 2D image에서 사용되는 IOU는 다음과 같이 구한다.


붉은색 상자(A1): 실제 물체의 bounding box (ground truth) 

파란색 상자(A2): object detection 결과 bounding box

노란색 점선: overlapped area


A1 = [x1  y1  x2  y2] % [xmin, ymin, xmax, ymax]

A2 = [x1' y1' x2' y2']

S(A1) = area of red box = (x2-x1) * (y2-y1)

S(A2) = area of blue box = (x2'-x1') * (y2'-y1')

A_Inter = intersection area of two boxes = ( min(x2,x2') - max(x1,x1') ) * ( min(y2,y2') - max(y1,y1') ) 

A_Union = union area of two boxes = A1 + A2 - A_inter


IOU = (A_Inter) / (A_Union)


PASCAL VOC 기준으로 IOU > 0.5 인 경우에 detection이 성공했다고 할 수 있다.

% 사족으로 IOU > 0.5 라는 것은 두 박스의 크기가 동일하다고 할 때, intersection area가 2/3 이상이 겹쳐야 한다는 뜻으로, 꽤 엄격한 기준이다.



위 방법은 사각형의 rotation을 고려하지 않는다. 

좀 더 일반적인 경우로, 사각형의 rotation이 존재할 때 겹치는 영역의 면적을 구하는 방법을 알아보자.


ㅇㅇ            

(A) Two overlapping boxes                                                 (B) Intersecting Edge Points


            

(C)  Inside Box points                                                            (D) Intersection Polygon


(B) Intersecting Edge Points 구하기 (marker: o)

두 사각형의 변(edge)들의 intersecting point를 구한다.

[xi, zi] = polyxpoly(gt_x, gt_z, this_x, this_z);


(C) Inside Box Points 구하기 (marker: *)

in_gt   = inpolygon(gt_x(1:4),gt_z(1:4), this_x,this_z);

in_this = inpolygon(this_x(1:4),this_z(1:4), gt_x,gt_z);

xi = [xi; gt_x(in_gt)'; this_x(in_this)'];

zi = [zi; gt_z(in_gt)'; this_z(in_this)'];


(D) (B)~(C)에서 구한 points 의 convex hull을 구하고, 내부 area를 구한다. (intersection area: inside green lines)

cv = convhull(double(xi), double(zi));

xi = xi(cv);

zi = zi(cv);

xz_area = polyarea(xi, zi);



Posted by 헬벨