영상 feature 비교 (SIFT, HOG, Haar, Ferns, LBP, MCT)

영상처리 2014.01.09 18:02

이번 글에서는 영상인식에 사용되는 대표적인 몇몇 영상 feature들을 비교 정리해 볼까 합니다. 여기서 다룰 영상 feature들은 SIFT, HOG, Haar, Ferns, LBP, MCT 입니다. 주로 HOG, Haar, LBP 등 성격이 다른 여러 영상 feature의 특성을 파악하는데 초점이 맞추어져 있고 invariant local feature와의 비교를 위해 가장 대표적인 SIFT도 포함하였습니다. SURF, BRIEF, ORB 등 기타 invariant local feature들에 대해서는 나중에 별도 글로 다뤄볼 예정입니다.


이 글은 각각의 영상 feature의 세부 구현이나 특징을 열거하기보다는 전체적인 관점에서 각각의 위치와 특성을 파악하는 것이 목적이며 글은 최대한 간결하게 쓰고자 합니다.



1. SIFT(Scale Invariant Feature Transform)

[Lowe04] Lowe, D. G., “Distinctive Image Features from Scale-Invariant Keypoints”, IJCV 2004.


SIFT는 영상에서 코너점 등 식별이 용이한 특징점들을 선택한 후에 각 특징점을 중심으로 한 로컬 패치(local patch)에 대해 아래 그림과 같은 특징 벡터를 추출한 것을 말한다.

<그림 1>


SIFT 특징벡터는 특징점 주변의 영상패치를 4 x 4 블록으로 나누고 각 블록에 속한 픽셀들의 gradient 방향과 크기에 대한 히스토그램을 구한 후 이 히스토그램 bin 값들을 일렬로 쭉 연결한 128차원 벡터이다.


SIFT는 기본적으로 특징점 주변의 로컬한 gradient 분포특성(밝기 변화의 방향 및 밝기 변화의 급격한 정도)을 표현하는 feature이다. SIFT를 포함한 SURF, ORB 등의 local feature들은 대상의 크기변화, 형태변화, 방향(회전)변화에 강인하면서도 구분력이 뛰어난 어찌보면 서로 상충되는 목표를 동시에 만족시키고자 개발된 것들로서 통상적으로 원래 물체의 기하학적 정보는 무시하고 특징점 단위로 혹은 코드북(code book) 단위로 매칭을 수행한다. 이러한 local feature들은 스케일, 회전, 밝기변화에 대한 불변 특징을 위해 어느정도 구분력을 희생하기 때문에 하나의 특징점에 대해 수많은 특징점들이 매칭될 수 있으며 feature 자체의 성능보다는 어떤 매칭 방법을 사용했으냐에 따라서 최종 성능이 크게 좌우될 수 있다.



2. HOG(Histogram of Oriented Gradient)

[Dalal05] N. Dalal and B. Triggs, "Histograms of oriented gradients for human detection," CVPR 2005.


HOG는 대상 영역을 일정 크기의 셀로 분할하고, 각 셀마다 edge 픽셀(gradient magnitude가 일정 값 이상인 픽셀)들의 방향에 대한 히스토그램을 구한 후 이들 히스토그램 bin 값들을 일렬로 연결한 벡터이다. 즉, HOG는 edge의 방향 히스토그램 템플릿으로 볼 수 있다.


<그림 2>


템플릿 매칭(template matching)의 경우에는 원래 영상의 기하학적 정보를 그대로 유지하며 매칭을 할 수 있지만 대상의 형태나 위치가 조금만 바뀌어도 매칭이 잘 안되는 문제가 있다. 반면에 히스토그램 매칭은 대상의 형태가 변해도 매칭을 할 수 있지만 대상의 기하학적 정보를 잃어버리고 단지 분포(구성비) 정보만을 기억하기 때문에 잘못된 대상과도 매칭이 되는 문제가 있다.


HOG는 템플릿 매칭과 히스토그램 매칭의 중간 단계에 있는 매칭 방법으로 볼 수 있으며 블록 단위로는 기하학적 정보를 유지하되, 각 블록 내부에서는 히스토그램을 사용함으로써 로컬한 변화에는 어느정도 강인한 특성을 가지고 있다.


또한 HOG는 edge의 방향정보를 이용하기 때문에 일종의 edge기반 템플릿 매칭 방법으로도 볼 수 있다. Edge는 기본적으로 영상의 밝기 변화, 조명 변화 등에 덜 민감하므로 HOG 또한 유사한 특성을 갖는다고 생각할 수 있다. 또한 HOG는 물체의 실루엣(윤곽선) 정보를 이용하므로 사람, 자동차 등과 같이 내부 패턴이 복잡하지 않으면서도 고유의 독특한 윤곽선 정보를 갖는 물체를 식별하는데 적합한 영상 feature이다.


HOG를 local feature인 SIFT와 비교해 보면 HOG는 일종의 템플릿 매칭이기 때문에 물체가 회전된 경우나 형태변화가 심한 경우에는 검출이 힘들지만 SIFT는 모델의 특징점과 입력 영상의 특징점에 대해 특징점 단위로 매칭이 이루어지기 때문에 물체의 형태변화, 크기변화, 회전 등에 무관하게 매칭이 이루어질 수 있다. 이러한 특성에 비추어 보았을 때, HOG는 물체의 형태변화가 심하지 않고 내부 패턴이 단순하며 물체의 윤곽선으로 물체를 식별할 수 있을 경우에 적합하고 SIFT는 액자 그림과 같이 내부 패턴이 복잡하여 특징점이 풍부한 경우에 적합한 방법이다.



3. Haar feature

[Viola01] P. Viola and M. J. Jones, "Rapid Object Detection using a Boosted Cascade of Simple Features," CVPR 2001.


Haar feature는 기본적으로 영상에서의 영역과 영역의 밝기차를 이용한 feature로서 아래 왼쪽 그림과 같이 다양한 형태의 elementary feature들이 존재하며 이들 elementary feature들을 다수(수백, 수천개) 조합하여(다양한 위치와 크기로) 물체에 대한 특징을 추출하는 방법이다.



<그림 3>


각 elementary feature에 대한 특징값은 feature의 흰색 부분에 해당하는 영상 픽셀들의 밝기합에서 검은색 부분의 밝기 합을 뺀 차로 계산된다. 그리고 feature를 이용한 대상의 식별은 계산된 영역의 밝기차가 feature에 부여된 임계값(threshold)보다 큰지 작은지 여부를 이용한다. 물론 하나의 feature를 사용하는 것이 아니라 다수의 feature를 조합하여 사용하게 되며 예를 들어 사용한 feature가 f1, f2, ..., fn이라면 f1<t1이고 f2<t2이고 f3>t3, ... fn<tn을 만족하면 대상물체이고 만족하지 않으면 배경이라고 판단하는 식이다.


같은 종류의 feature라 할지라도 물체 내에서의 위치 및 크기(scale)에 따라 서로 다른 feature로 간주하기 때문에 거의 무한대에 가까운 feature 조합이 가능하다. 이들 중 의미있는 feature들을 선정하는 것이 중요한데 여기서 의미있는 feature란 인식하고자 하는 대상들에서는 비슷한 값을 나타내면서 대상이 아닌 경우에는 랜덤한 값을 내는 feature들로 볼 수 있다. 예를 들어, 위 그림 3의 오른쪽 그림과 같이 사람의 눈 영역에 대해 feature를 잡으면 눈 영역은 대체로 주변보다 어둡기 때문에 사람 얼굴 검출을 위한 의미있는 feature가 된다. 물론 이러한 의미있는 feature의 선정은 수작업이 아닌 boosting 알고리즘 등과 같이 자동화된 학습 알고리즘을 통해 이루어진다.


이와 같이 Haar feature는 영역간의 밝기차를 이용하기 때문에 Haar feature를 적용하기 위해서는 검출하고자 하는 대상 물체가 이러한 특성에 잘 부합되는지를 따져 보아야 한다. 사람의 얼굴의 경우에는 눈썹, 눈동자, 입술, 머리카락 등이 특징적인 밝기 차를 가지기 때문에 Haar feature를 적용하기에 비교적 적합한 대상으로 볼 수 있다. 또한 체스판의 경우에도 Haar feature를 적용하기 매우 적합한 대상으로 볼 수 있다. 하지만 장기판이나 바둑판의 경우에는 영역에 따른 밝기차가 거의 없기 때문에 일반 벽 등과 구분할 수 없으며 Haar feature를 적용하기 힘든 예로 볼 수 있다.


Haar feature는 기본적으로 물체의 기하학적 정보를 유지하며 영역 단위의 밝기차를 이용하기 때문에 영역 내부에서의 물체의 형태변화 및 약간의 위치변화를 어느정도 커버할 수 있는 특성을 갖는다. 하지만 영상의 contrast 변화, 광원의 방향 변화에 따른 영상 밝기 변화에 영향을 받으며 물체가 회전된 경우에는 검출이 힘들다.



4. Ferns

[Ozuysal10] M. Ozuysal, M. Calonder, V. Lepetit, P. Fua, "Fast Keypoint Recognition using Random Ferns", PAMI 2010.


Ferns는 영상에서 먼저 특징점들을 뽑고 각 특징점을 중심으로 한 로컬 패치(local patch)에 대해 계산된다는 점에서 SIFT와 유사한 점이 있다 (ferns에 대한 상세 내용은 Ferns를 이용한 영상 Object Detection 글 참조).


이후 patch 내에서 임의의 두 점을 잡고 두 점의 픽셀 밝기차가 +인지 -인지를 feature로 사용한다. Haar feature와 비교해 보면 Haar feature가 영역 단위의 밝기차를 이용하는 반면 ferns는 픽셀 단위의 밝기차를 이용하고 또한 값이 아닌 부호만을 사용한다는 점에서 차이가 있다.


<그림 4>


하나의 ferns feature는 patch 내에서의 한쌍의 좌표로 표현되며 하나의 feature에 대한 결과는 0 또는 1의 값을 갖는다. 패치 내에서 여러 개의 feature가 사용될 경우 그 결과는 각 feature의 결과를 이진수로 연결한 값을 사용한다. 예를 들어 위 그림 4의 두번째 경우와 같이 3개의 feature를 사용하면 그 결과값은 000, 001, 010, 011, ..., 111까지 총 8가지 값이 가능하다.


정리해 보면 ferns는 패치(patch) 단위의 매칭을 위한 영상 feature로서, 로컬한 영상 패치의 밝기 패턴을 표현하는 feature이다. 밝기값을 그대로 이용하는 것이 아닌 밝기차의 부호 정보만을 이용하기 때문에 영상의 contrast 변화, 밝기 변화 등에 강인할 것으로 생각된다.


SIFT와 비교해 보면 둘다 로컬한 영상 패치에 대한 feature라는 점에서는 유사하지만 SIFT는 히스토그램이라는 측면이 강하고 ferns는 템플릿이라는 측면이 강하다. 따라서 ferns가 SIFT 보다 구분력은 높지만 패치의 형태가 변하거나 회전된 경우에는 매칭이 힘든 측면이 있다. 이를 보완하기 위해 ferns에서는 대상을 학습시킬 때 패치에 회전, 이그러짐 등의 변형을 가하여 학습 데이터를 확장하여 이용하는 방법을 사용한다.


Ferns와 SIFT는 feature 자체는 다르지만 로컬 패치에 대한 feature라는 점과 패치 단위의 매칭을 이용한다는 점에서 유사하며 응용에 있어서는 상호 대체적으로 사용될 수 있다. 개인적인 경험에 의하면 성능은 fern이  훨씬 뛰어난 편이다(인식 성능은 약간 더 뛰어나며 속도는 훨씬 빠름). 하지만 SIFT는 별도의 학습 과정이 필요 없는 대신에 ferns는 파라미터 설정에 따라서 수십분 이상의 offline 학습 과정이 필요한 단점이 있다.



5. LBP(Local Binary Pattern)

[Ojala96] Ojala, T., Pietikäinen, M. and Harwood, D., A Comparative Study of Texture Measures with Classification Based on Feature Distributions. Pattern Recognition 29(1):51-59, 1996.

[Ahonen06] T. Ahonen, A. Hadid, and M. Pietikinen, "Face description with local binary patterns: Application to face recognition," PAMI 2006.

[Liao07] S. Liao, X. Zhu, Z. Lei, L. Zhang and S. Z. Li, "Learning Multi-scale Block Local Binary Patterns for Face Recognition," ICB 2007.


LBP는 원래 영상의 텍스쳐(texture)를 분류하기 위한 용도로 개발된 feature인데 이후 얼굴인식(face recognition)과 같은 다른 영상인식 응용에도 활용되고 있다.


LBP(Local Binary Pattern)는 영상의 모든 픽셀에 대해 계산되는 값으로서 각 픽셀의 주변 3 x 3 영역의 상대적인 밝기 변화를 2진수로 코딩한 인덱스 값이다 (중앙 픽셀보다 밝으면 1, 어두우면 0으로 코딩한 후 이 값들을 연결한 이진수를 로컬 텍스쳐에 대한 인덱스로 활용)


<그림 5> 출처: [Ahonen06]


이와 같이 각 픽셀들에 대해 계산된 인덱스 값에 대해 히스토그램을 구한 후 이 히스토그램을 해당 영상 영역에 대한 텍스쳐 모델로 활용하는 것이 원래의 LBP 응용이다(잔디밭인지, 숲인지, 땅인지, 벽인지 등 텍스쳐를 분류하는 용도).


이후 LBP를 얼굴인식에 활용한 한 예[Ahonen06]를 보면 얼굴 영역을 일정한 크기의 셀로 분할한 후 각 셀(cell)마다 LBP에 대한 히스토그램을 구하고(해당 셀에 속하는 LBP 인덱스 값들에 대한 히스토그램) 이렇게 구한 히스토그램들을 일렬로 연결한 벡터를 최종 feature로 사용하는 방법 등이 있다 (이 방법은 일종의 텍스쳐 템플릿 매칭 방법으로 볼 수 있는데 셀 단위로는 대상의 기하학적 정보를 유지하되 셀 내에서는 텍스쳐 정보만을 추출하는 형태이다).


<그림 6> 출처: http://www.scholarpedia.org/article/Local_Binary_Patterns


이후 2007년도에는 MB-LBP라는 Mult-scale Block LBP 방법[Liao07]이 발표되었는데, 이 방법은 원래의 LBP가 3x3 픽셀을 이용함으로써 너무 local 특성을 추출하기 때문에 이를 블록으로 확장하여 블록 단위로 LBP를 계산하고자 하는 것으로서 OpenCV에 있는 LBP는 MB-LBP를 기반으로 하고 있다.



<그림 7> 출처: [Liao07]


즉, MB-LBP는 임의의 크기의 영상 영역을 3 x 3 블록으로 분할한 후 각 블록평균에 대해 LBP 인덱스를 계산하는 방법이다. 이와 같이 픽셀 단위가 아닌 블록 단위의 LBP를 사용하면 큰 스케일의 텍스쳐 정보를 추출할 수 있으며 서로 다른 여러 스케일 및 영상 위치에 대해 MB-LBP를 계산하면 하나의 대상에 대해 다양한 feature를 추출할 수 있다는 것이다. 이와 같이 하면 하나의 대상에 대해 무수하(거의 무한대) 많은 LBP feature를 추출할 수 있는데, 이들 중 의미있는(식별력이 높은) LBP feature들을 자동으로 선정하기 위해 AdaBoost와 같은 학습 알고리즘이 적용된다.


LBP 특징에 대해 살펴보면 LBP는 기본적으로 circular texture 정보로서 영상의 밝기 변화에 무관한 영상 feature로 볼 수 있다. 기존의 대부분의 LBP 응용은 검출(detection)이 아닌 인식(recognition) 용이었지만 detection 관점에서 봤을 때 LBP의 활용을 생각해 보면 어느정도 내부 패턴이 존재하는 물체를 검출하는데 적합해 보인다. 기본적인 특성은 Haar feature와 큰 차이가 없으나 다만 Haar보다는 좀더 복잡한(세밀한) 패턴 변화를 표현할 수 있다. 따라서, Haar와 LBP는 서로 대체적으로 사용될 수 있으며 성능상의 큰 차이는 없을 것으로 생각되지만 실제 대상의 내부 패턴 분포가 어떤 feature와 좀더 적합한지 따져보고 선택하는 것이 좋겠다.


참고로, LBP는 1996년 Ojala 논문(Ojala, T., Pietikäinen, M. and Harwood, D., A Comparative Study of Texture Measures with Classification Based on Feature Distributions. Pattern Recognition 29(1):51-59, 1999 )이 최초 originality를 인정받고 있으며 이후 Ojala는 2002년에 기존의 3 x 3 LBP를 임의의 크기의 circular 형태로 계산 가능하도록 확장한 방법을 발표하였다(Ojala, T., Pietikäinen, M. and Mäenpää, T., Multiresolution Gray-scale and Rotation Invariant Texture Classification with Local Binary Patterns. IEEE Trans. Pattern Analysis and Machine Intelligence 24(7): 971-987, 2002).



6. MCT(Modified Census Transform)

[Zabih96] Ramin Zabih and John Woodfill, "Non-parametric Local Transforms for Computing Visual Correspondence," ECCV 1994.

[Froba04] Bernhard Froba and Andreas Ernst, “Face Detection with the Modified Census Transform”, FG 2004.


MCT는 현재 얼굴 검출(Face Detection) 분야에서 가장 대표적인 방법으로서 사용되고 있으며 뛰어난 검출 성능을 보이고 있다.


MCT는 Modified Census Transform의 약자로서 Census Transform(CT)을 약간 수정한 것이다. Census Transform(CT)은 1994년 Zabih와 Woodfill에 의해 제안된 방법으로서 영상에서 한 픽셀에 대한 CT는 그 픽셀 주변영역의 밝기 변화를 중심픽셀보다 밝으면 0, 어두우면 1로 인코딩하고 그 결과를 비트 스트링(bit string)으로 연결한 값이다. 따라서, 만일 주변 영역을 3 x 3 영역으로 잡는다면 어떤 픽셀에 대한 Census Transform(CT) 결과는 앞서 설명한 LBP(Local Binary Pattern)와 동일하다고 봐도 무방하다.


사실 Census Transform(CT)는 LBP(Local Binary Pattern)와 이름만 다를 뿐 내용상으로는 전혀 차이가 없다. 재미있는 사실은 LBP는 1996년 Ojala가 제안하였고[Ojala96] Census Transform(CT)도 같은 해인 1996년 Zabih가 제안하였으니[Zabih96] 똑같은 개념이 같은 년도에 서로 다른 이름으로 발표된 셈이다.


굳이 차이를 찾자면 두 feature가 사용된 컨텍스트(context)의 차이인데 LBP의 경우에는 영상의 텍스쳐(texture)를 표현하기 위한 feature로서 접근한 것으로서 LBP 결과값들에 대한 히스토그램을 영상 영역에 대한 텍스쳐 feature로서 활용하였고, Census Transform(CT)에서는 입력 영상을 주변 밝기 변화에 대한 영향이 제거된 영상으로 변환하기 위한 용도로 사용되었다. 매칭 방법에 있어서도 차이가 있는데, LBP에서는 히스토그램간의 유사도를 측정하였고 Census Transform(CT)에서는 대응되는 픽셀들 사이의 CT 비트 스트링(bit string)의 Hamming distance를 이용하였다.


Census Transform(CT)은 2004년 Froba에 의해 MCT(Modified Census Transform)[Froba04]로 확장되었는데, MCT는 중심 픽셀과의 밝기차를 인코딩하는 대신에 로컬 영역의 평균과의 밝기차를 인코딩함으로써 중심 픽셀에도 0 또는 1의 값을 부여할 수 있도록 한 것이다 (결과적으로 중심 픽셀에 대응하는 비트가 하나 더 늘어난 셈). 이렇게 함으로서 기존의 CT보다는 훤씬 풍부한 local binary pattern을 표현할 수 있도록 한 것이다. 참고로, LBP의 경우에도 동일한 해인 2004년에 평균과의 차를 이용한 형태로 확장된 ILBP(Improved LBP)(H. Jin, Q. Liu, H. Lu and X. Tong, “Face detection using improved LBP under bayesian framework”, International Conference on Image and Graphics 2004)가 독립적으로 발표되었는데 우연치고는 참 대단한 우연이다.


<그림 8>출처: [Froba04]


위 그림은 입력 영상을 MCT로 변환한 예를 보여주는데, 원본 영상들 사이에는 조명에 따른 심각한 차이가 있지만 MCT 결과 영상에서는 이러한 차이가 제거되고 순수한 물체의 패턴 정보만이 남은 것을 볼 수 있다 (MCT 영상은 각 픽셀에서 계산되는 local binary pattern에 대한 이진 비트 스트링을 gray scale로 해석하여 영상화한 것). 이와 같이 MCT로 변환한 영상에 대해 인식 또는 검출 알고리즘을 적용하면 원본 영상에서보다 성능이 나아질 것이라는게 저변에 깔린 기본 아이디어이다.


사실 MCT는 LBP와 동일한 feature이기 때문에 그 응용이나 특성도 모두 동일하다고 보면 된다. 다만 face detection 분야에서 MCT가 활용되는 방식을 좀더 살펴보면 [Froba04]에서는 얼굴내 한 픽셀 위치에 대하여 face 학습 이미지들로부터 계산된 MCT 인덱스들의 히스토그램 H1과 non face 학습 데이터들로부터 계산된 MCT 인덱스들의 히스토그램 H2를 구한 후 입력 영상의 해당 픽셀 위치에서 계산된 MCT 인덱스에 대응하는 bin값이 H1이 큰지, H2가 큰지에 따라서 해당 픽셀이 face 픽셀인지 non face 픽셀인지를 분류한다. 각 픽셀 위치에서 계산된 두 히스토그램간의 overlap(intersection)이 적을수록 구분력이 뛰어나기 때문에 overlap 정도에 따라서 각 픽셀 위치에 대한 가중치(weight)를 다르게 줄 수 있다.



7. 마무리하며..


세부 구현은 조금씩 차이가 있지만 Ferns, Haar, LBP, MCT는 서로 유사한 계열로 모두 영역간의 밝기차를 이용한다. 반면 HOG, SIFT는 기본적으로 edge 정보를 이용한다는 점에서 차이가 있으며 서로 상보적인 관계에 있다고 볼 수 있다. 어떤 문제에는 어떤 feature를 써야한다라고 한마디로 단정지을 수는 없지만 어떤 문제가 주어졌을 때 대상 물체의 특성을 잘 살펴보고 또 여러 후보 feature들의 특성과 잘 비교해 보면 feature를 선택하는데 많은 도움이 되리라 생각한다.



☞ 글의 내용은 주로 저의 주관적인 생각, 판단을 정리한 것이기 때문에 틀린 부분이 있을 수 있음을 참고하시기 바랍니다.


by 다크 프로그래머


  • 이전 댓글 더보기
  • HY 2014.08.12 16:37 신고 ADDR 수정/삭제 답글

    안녕하세요. 어쩌다 영상처리를 공부하게 되었고, 운이 좋게도 다크님의 블로그를 찾게되어 매일매일 참고하며 공부하고 있는 학생입니다. 포스팅을 읽던 중 한 가지 궁금한 점이 생기어 처음으로 댓글을 달아봅니다.

    Haar Feature에서 의미 있는 feature 선정은 Boosting 알고리즘 등의 자동학습 알고리즘으로 자동으로 선정된다고 하셨는데, 감이 잘 오지 않습니다.. 얼굴 데이터를 처음 학습시키려 할때(?) 어떻게 의미있는 feature를 선정하게 되나요..?(얼굴을 잘 나타내는 이미지 여러장의 특징들의 공통점 정도 되려나요..?)

    좋은 글, 늘 감사합니다~

    • BlogIcon 다크pgmr 2014.08.12 23:22 신고 수정/삭제

      안녕하세요. 공부에 도움이 된다니 다행입니다 ^^
      feature 선정은 가능한 여러 feature들 중에서 학습데이터(positive, negative)에 적용을 했을 때 구분력이 좋은 feature를 뽑는 방식으로 이루어집니다. 예를 들어, 어떤 feature에 대해 계산된 특징값이 positive 샘플들에 대해서는 높은 값을 나타내고, negative 샘플들에 대해선 낮은 값을 나타내면 이 feature는 좋은 feature가 됩니다.

  • 2014.08.18 08:46 ADDR 수정/삭제 답글

    비밀댓글입니다

  • BlogIcon 수제자 2014.10.09 23:28 신고 ADDR 수정/삭제 답글

    다시 봐도 명글입니다. 감사합니다. ^^

  • lbp 2014.10.30 22:16 신고 ADDR 수정/삭제 답글

    lbp 의 경우 중심값 <= 주변값 일때 1 그렇지 않으면 0으로 정의하고 있습니다.
    그렇다면 반대의 경우 <= 와 >는 코드가 완전 반전이 되기 때문에
    ex) <=경우가 1001 이면 >경우는 0110
    결과 또한 히스토그램의 빈을 세는 것이기 때문에 반전되었을뿐 결과는 완전 똑같아야 될 것같습니다.
    실험을 해보니 결과 자체는 반전이 되지만
    NN 으로 최적의 값 (거리가가장가까운것) 을 찾으면 <=의 경우와 >의 경우가 인식률에 있어서
    차이가 나게 됩니다. 혹시 lbp 실험해보시고 계신분 이유 아시면 답변부탁해요
    분명히 코드자체가 반전되어서 결과도 같아야 할것 같은데.. 인식률은 반전시켯을때 조금씩 차이를 보이네요

  • 제삼라운드 2015.02.15 20:29 신고 ADDR 수정/삭제 답글

    서로 다른 카메라로 같은 대상을 찍은 영상을 sift매칭 했는데 0매칭 입니다.
    어떤 작업을 해야 매칭점을 얻을 까요 ???
    물론 동일 카메라고 찍은 영상은 매칭점이 잘 나옵니다.

    • BlogIcon 다크pgmr 2015.02.16 09:41 신고 수정/삭제

      어려운 문제네요.. 매칭이 안되는 이유에 대해 두 카메라의 차이점을 분석하신 후 적절한 feature를 선택하시면 좋을 것 같습니다. PTAMM 논문을 보면 FAST 특징점을 이용하여 서로 다른 카메라로 매칭했다는 말이 언급되어 있습니다.

  • 질문1 2015.03.20 00:37 신고 ADDR 수정/삭제 답글

    이 블로그발견은 길가다가 운석을 주운기분!!!
    그런데 "Quadratic Distinction Feature" 이런거 아시나요?
    누가 물어보던데 아무리찾아두 없네요.
    혹시 아시면 한수 가르쳐주세요.

  • 질문있습니다 2015.07.07 09:51 신고 ADDR 수정/삭제 답글

    안녕하세요 haar를 공부다가 궁금한점이 있어 이렇게 글을 올립니다.
    의미있는 feature선정을 하는 boosting 알고리즘에서 epsilon_t=min_f,p,θ ∑w_i |h(x_i,f,p,θ|-y_i에서 θ의 값을 e = min(Sp + (Tn - Sn), Sn + (Tp - Sp)를 통해서 구하는 것인지와 error for a threshold라고 논문에 나와있는데 그럼 threshold는 어떻게 구해야하는지 잘 모르겠습니다. threshold는 초기값을 아얘 설정을 안해놔도 되는지도 궁금합니다

    • BlogIcon 다크pgmr 2015.07.07 14:01 신고 수정/삭제

      어떤 걸 질문하신 건지.. 특정 논문에 대한 해석은 제가 답변드리기 어렵습니다.

  • MLBP 2015.07.07 10:53 신고 ADDR 수정/삭제 답글

    안녕하세요? 상세히 작성해 주신 글 들 덕분에 도움 많이 받고 있습니다. 감사합니다.
    지금 Multi scale LBP (MLBP) 를 사용하기 위해 공부하고 있는데요.
    LBP(P,R)라는 operator 가 있을때, (P,R)을 (8,1) 뿐만 아니라 (16,2), (24,3).. 등을 같이 표현하는 방법 이라고 하더라구요.
    제가 궁금한 것은, (8,1), (16,2), (24,3) 세 개의 (P, R) 값이 있을때, 이걸 어떻게 histogram으로 나타내는지 입니다.
    한 개의 (P,R) 값이 있으면 각 영역에 histogram을 구해서 concatenation 하면 된다고 알고 있습니다. 세개의 (P,R)값 이 있다고 했을때는, 어떻게 histogram으로 표현 하는지 알 수 있을까요?

    • BlogIcon 다크pgmr 2015.07.07 14:14 신고 수정/삭제

      안녕하세요. 수식이나 구현방법 등 논문의 구체적인 내용은 저도 논문을 자세히 읽어봐야 하는 것이라서 답변이 어렵습니다. 해당 논문의 자세한 내용은 잘 모르지만 일반적으로 LBP feature는 각 픽셀마다 계산이 되는 값이고 어떤 블록 영역 내에서 각 픽셀들로부터 계산한 LBP 값들에 대해 히스토그램을 구하고 그 히스토그램의 bin 값들을 연결하면 새로운 feature가 되는게 아닌가 싶습니다.

  • 아도나일 2015.10.22 10:24 신고 ADDR 수정/삭제 답글

    오랜만에 이렇게 또 글을 올립니다.
    건강히 잘 지내시는 지요?^^
    어쩌다 보니 또 이렇게 귀찮게 해드리게 된 것 같아 너무 죄송합니다. 하지만 궁금증을 참을 수 없어서 실례인줄 알지만 또 한번 질문을 합니다.
    지금 현재 opencv 와 같은 LBP를 구현하기 위한 방법을 모색 중입니다. 이 때 다크님의 글을 보고 MBLBP에 관한 논문을 보았습니다. 그리고 opencv 내부 함수를 분석해 보았는데.. 약간 이상한 부분이 있어서 이렇게 글을 올립니다.

    MBLBP의 경우 구역을 나누어서 Multiscale하여 feature들의 값을 구합니다. 예를 들어 9bin일 경우 각각의 bin들의 평균을 구하여서 중심 bin의 평균값을 threshold로 하여 binary 를 만들어 십진수로 변환한 값이 featrue라 생각이 되어 집니다.

    첫 번째 질문은 opencv 내부 LBP 분석 결과 평균을 하지 않고 단순히 bin 내부 elements를 더하여서 중앙bin을 threshold로 하였습니다. 기존 MBLBP와는 조금 차이가 있는것이 아닐까요?

    두번째로는 저도 이전 덧글에 질문하신 것 처럼 Histogram에 대한 부분이 논문이 나와있으나 이해가 잘 되지 않았습니다. 더군다나 조금전에 말씀드린 opencv 학습을 분석해 보면 cascadetraining으로 학습할 때 feature들은 Muliscale 로 얻어진 feature들의 각자 다른 좌표에 있는 모두를 cascade training에 feature로 사용하는게 아닌가 하는 것입니다.
    그렇다면 histogram은 과연 어디에 사용되는지 궁금합니다.
    감사합니다.

    • BlogIcon 다크pgmr 2015.10.23 11:48 신고 수정/삭제

      네 안녕하세요 ^^ 첫번째 질문은 주변 셀들도 똑같이 평균이 아닌 합을 이용하면 관계없지 않을까 싶습니다 (opencv 코드를 본 것은 아니라서 정확히는 모릅니다). 두번째는 opencv에서 히스토그램을 이용한다고 한 적은 없는 것 같은데요.. 사용할 수도 사용하지 않을수도 있겠지만 제가 본 것은 아니니 아마도 확인하신 내용이 맞겠지요..

    • 아도나일 2015.10.23 13:17 신고 수정/삭제

      아.. 답변 감사합니다.ㅋ

      히스토 그램은 제가 이해한 바로는 경향을 보는 거로 사용되는 것 같아요..^^ 언제나 감사합니다.

      여러분들이 질문올린 분들이 많이 계시던데..
      답은 다크님 혼자 답변 하시는 걸 보니.. 저도 알고있는 내용에 대해서
      답변을 드려야 할 것 같아요..
      조금이라도 도움이 되 드리고 싶네요.
      ^^ 오늘도 행복한 하루 되세요.^^

  • INT 2015.11.12 17:41 신고 ADDR 수정/삭제 답글

    안녕하세요 다크프로그래머님,
    님이 쓰신 여러 게시물을 보며 공부를 하고있는 학생입니다.
    제가 최근에 영상처리에 관심이 생기고 HOG에 관심이 생겨서 질문이 생겨 이렇게 글을쓰게 됩니다.

    1. HOG특징을 잡아 SVM분류기로 학습을 시키는방법을 잘 모르겠습니다.
    이 방법은 opencv에 있는 CascadeTrain랑 다른건가요?

    2. 제가 예를 들어 컵을 HOG로 해서 검출하고자 하면 HOG랑 SVM을 어떻게 사용해야 하는지
    대략이라도 알려주시면 감사하겠습니다.


    • BlogIcon 다크pgmr 2015.11.12 18:36 신고 수정/삭제

      안녕하세요. SVM와 cascade classifier는 모두 분류기(classifier)들로서 그 분류 방법은 서로 다릅니다.
      각각의 분류 방법의 차이에 대해서는 인터넷 검색 등을 활용하시면 좋을 것 같습니다.
      어떤 영상 영역에 대한 HOG 특징은 하나의 고차원 벡터로 표현이 됩니다.
      먼저 검출하고자 하는 물체에 대한 positive sample과 negative sample 영상들이 필요하고, 각각의 샘플들에 대해서 HOG 특징을 추출합니다. 그리고 추출된 특징벡터들에 대해 SVM을 적용하시면 됩니다.
      SVM 사용법은 opencv document를 참조하시면 좋을 것 같습니다 (http://docs.opencv.org/3.0-beta/doc/tutorials/ml/introduction_to_svm/introduction_to_svm.html)
      영상 영역에 대한 HOG 특징 추출 방법에 대해서는 opencv의 apps\traincascade에 있는 HOGfeatures.cpp 소스코드나 objectdetect 모듈에 들어있는 hog.cpp 소스코드를 참조하시면 좋을 것 같습니다.

  • INT 2015.11.12 21:04 신고 ADDR 수정/삭제 답글

    다크프로그래머님 친절한 답변 감사합니다 한번 시도해볼게요
    좋은 저녁 되세요!

  • BlogIcon int 2015.11.14 00:25 신고 ADDR 수정/삭제 답글

    안녕하세요 다크프로그래머님

    답변 보고 이것저것 시도해보다가 막혀서 염치에도 불구하고 한번 더 질문드립니다
    Svm으로 xml파일까지 무사히 추출했는데요

    이것을 이용해서 실시간 검출 하는 법을 잘 모르겠습니다.hog.setSVMDetector( HOGDescriptor::getDefaultPeopleDetector() );에서 저getDefaultPeopleDetector가 아닌 제가 학습시킨 xml을 넣고 싶은데 그 방법을 모르겠어서 질문드립니다

    글과 크게 상관 없는글인데 구글링도 해보고 물어볼곳이 없어서 올립니다 정말 죄송하고 혹시 답변 해주실수 있다면 정말 감사합니다 ㅠㅠ

    • BlogIcon 다크pgmr 2015.11.18 09:21 신고 수정/삭제

      일단 먼저 svm에 대해 공부해 보시면 어떨까 싶습니다.

  • BlogIcon 길똥고 2016.04.22 18:04 신고 ADDR 수정/삭제 답글

    잘 보았습니다.

    혹시 두 초음파영상 유사도 측정에도
    SIFT 가 잘 작동할까요?

    • BlogIcon 다크pgmr 2016.04.22 18:53 신고 수정/삭제

      전 해보지 않아서 잘 모르겠지만 어려운 일이 아니니 직접 한번 테스트해 보시면 좋을 것 같습니다.

  • BlogIcon 길똥고 2016.04.22 18:05 신고 ADDR 수정/삭제 답글

    잘 정리 되었네요
    혹시 제 카페로 좀 퍼가도 될까요?
    http://cafe.naver.com/iphonediy

    미리 감사드리며~

  • 이해가 2016.06.29 16:07 신고 ADDR 수정/삭제 답글

    안녕하세요. 영상처리 공부를 하면서 다크님의 글을 보며 많은 도움을 받고 있습니다.
    그런데 특징점 공부를 하던중에 128차원 벡터라는 표현이 있는데 128차원이라는 벡터라는게 개념상 이해가 안가서 질문드립니다. 정확히 어떻게 구해지는 값인지 정말 궁금합니다. 개념이 이해가 안가서 ..ㅠㅠ
    그리고 surf 알고리즘에서 하르웨이블렛 필터로 특징점의 방향성을 결정한다는게 있는데 하르 필터를 어떻게 적용하고 나오는 값이 어떻게 나오길래 방향성을 결정할수 있을까요? 질문이 무턱대고 크게 말한거 같지만...정말 크게 이해가 안되서 질문드립니다. 부탁드립니다.

    • BlogIcon 다크pgmr 2016.06.30 09:43 신고 수정/삭제

      SIFT 특징이 128차원 벡터로 표현되는데, 이 벡터는 영상 패치(patch)의 특징을 숫자로 인코딩(encoding)한 것입니다. 즉, 각각의 특징점을 중심으로 정사각형 형태의 부분영상 패치를 잡은 후 각 영상패치의 영상특징을 128개의 숫자로 표현한 것입니다. 영상특징을 숫자로 변환하는 구체적인 과정은 SIFT, SURF 등 특징 방법마다 상이하기 때문에 해당 논문을 자세히 보셔야 합니다. 어쨌든 중요한 점은 유사한 영상 패치는 유사한 특징벡터로 인코딩되고 상이한 영상 패치는 상이한 특징벡터로 인코딩될수록 좋은 특징 추출 방법이 됩니다. 여기서, 유사한 영상 패치라 함은 동일한 물체에 대해 영상을 찍더라도 카메라의 시점에 따라서 영상에서는 크기변화, 회전변화, 원근변화, 밝기변화 등이 나타나게 되는데 이러한 영상의 변화에도 불구하고 인코딩된 특징벡터가 유사한 값이 되도록 만들 수 있다면 좋은 방법이 되는 것입니다. SIFT에서는 영상패치내 존재하는 edge들의 방향(각도값)에 대해 히스토그램을 만든 후 이 히스토그램의 bin 값들을 벡터로 만듭니다. 역시 구체적인 방법은 논문을 보셔야 합니다.
      SURF에서 방향성을 결정하는 것은 gradient를 이용해서 edge의 방향을 결정하는 것과 원리가 동일합니다. 영상에서 아랫픽셀에서 윗픽셀을 빼면 dx = I(x+1,y)-I(x,y)가 되고 오른쪽 픽셀에서 왼쪽 픽셀을 빼면 dy(y축 방향으로의 미분)가 됩니다. 그리고 이 두 값을 합치면 gradient 벡터 = (dx, dy)가 되는데 해당 픽셀 지점에서의 edge의 수직방향 즉, 픽셀의 밝기가 가장 급격하게 변하는 방향벡터가 됩니다. SURF에서는 이와 동일한 원리를 block 단위로 적용해서 영상패치의 방향을 결정합니다. 즉, 아랫블럭 픽셀합에서 윗블럭 픽셀합을 뺀 것과 오른쪽 block 픽셀합에서 왼쪽 block 픽셀합을 뺀 것을 합쳐서 패치의 방향을 결정합니다.

  • 총무 2016.07.07 15:03 신고 ADDR 수정/삭제 답글

    안녕하세요. openCV를 통해 Haar 학습을 하는데 여기서 많은 자료를 참고하여 잘 배워갔습니다. 제가 여기서 공부한 자료들을 팀원과 만든 카페에 자료를 부분 부분 가져가서 정리를 하고 싶은데요. 물론 출처를 밝히겠습니다만, 제가 필요한대로 정리해서 올려도 될까요?

  • UKCoolGuy 2016.08.19 11:19 신고 ADDR 수정/삭제 답글

    안녕하세요 좋은글 정말 잘 봤습니다.
    제가 HOG를 공부하다가 궁금한 점이 생겼는데요
    사람들이 HOG를 사용하면서 Block을 움직일 때 일정 픽셀만큼 켭쳐서 움직이던데 특별한 이유가 있나요?

    • BlogIcon 다크pgmr 2016.08.19 13:35 신고 수정/삭제

      질문하신 내용이 윈도우 내에서 hog feature를 뽑을 때인가요 아니면 윈도우를 이동시킬 때 인가요? 윈도우 내에서라면 물체의 형태변화(deformation)에 대응하기 위해서입니다.

  • 깐초 2016.12.15 08:33 신고 ADDR 수정/삭제 답글

    안녕하세요, 다크프로그래머님. 항상 글 잘 보고 있습니다. 궁금한 점이 생겨서 질문드립니다. 저는 Matlab의 SVM으로 여러가지 도형, 패턴이 섞인 이미지들을 분류하는 작업을 하고 있습니다. HOG나 SIFT를 SVM의 feature로 사용 가능할까요?

    • BlogIcon 다크pgmr 2016.12.15 13:13 신고 수정/삭제

      Matlab에서 사용가능한지를 여쭤보신 건가요? 네 당연히 사용 가능하리라 생각합니다.

    • 깐초 2016.12.15 14:04 신고 수정/삭제

      아 질문이 좀 불명확했네요.. Matlab이긴한데,
      결국 SVM에서 feature로서 Hog와 SIFT를 사용할수 있는지 여쭤본 것이었습니다.
      그리고 한가지 더 의견을 여쭙자면, 이것들이 여러가지 패턴이나 도형을 분류하는 SVM에서 유효한 feature가 될 수 있을까요?^^

    • BlogIcon 다크pgmr 2016.12.15 17:25 신고 수정/삭제

      네 사용 가능합니다. 어떤 데이터이든 벡터 형태로 표현될 수만 있으면 SVM에서 사용할 수 있습니다. SVM은 서로 다른 두 데이터 집합 사이의 최적의 경계평면을 찾아주는 학습기법입니다. 따라서, SVM을 적용하기 위해서는 서로 다른 두 클래스의 데이터 샘플들이 필요합니다 (A, B 클래스). 또는 B 클래스가 따로 없고 어떤 특정의 A라는 클래스의 대상을 인식하고 싶을 경우에는 A 클래스의 데이터 샘플들과 A 클래스가 아닌 임의의 데이터 샘플들(보통 negative sample이라 불리는)이 필요합니다. 물체를 SVM으로 구분하기 위해 HOG feature를 사용하는 것은 타당한 방법이나 SIFT를 사용하는 것은 그다지 좋은 생각이 아닙니다. SIFT는 물체 단위로 뽑히는 feature가 아니라 점 단위로 뽑히는 feature로서 특징점 주변의 작은 패치 영역(보통 16 x 16 픽셀 크기)에 대해서 계산되는 feature이기 때문에 이러한 특징점 feature들을 SVM으로 분류하는 것은 이치에 맞지 않습니다. 왜냐하면 물체마다 고유의 서로다른 특징점들이 존재한다기 보다는 특징점들이 어떻게 조합되고 배치되는지에 따라서 물체가 구분된다고 보는 것이 보다 합당하기 때문입니다. 반면에 HOG 특징은 점 단위가 아니라 물체 전체 영역에 대해 계산될 수 있기 때문에 SVM의 feature로 유효하게 사용될 수 있습니다.

  • 깐초 2017.02.09 09:01 신고 ADDR 수정/삭제 답글

    친절하고 상세한 설명 감사드립니다. 항상 보면서 많이 배우고 있습니다. 정말로 감사드립니다^^

  • aliswells 2017.03.14 18:54 신고 ADDR 수정/삭제 답글

    안녕하세요, 게시글에서 궁금한 점이 있어 질문 남기고 갑니다.
    HoG 설명 해주시는 부분에서 '히스토그램을 구한 후 이들 히스토그램 bin 값들을 일렬로 연결한 벡터이다.' 내용 중 bin 은 어떤 것을 의미하는지 알 수 있을까요?

    • BlogIcon 다크pgmr 2017.03.15 12:27 신고 수정/삭제

      히스토그램은 연속된 값의 범위를 일정한 구간으로 나누어 처리하는데 그 각각의 구간을 bin이라 부릅니다.