2009-06-11 3 views
6

OpenCV의 haar cascade 파일에서 "left"및 "right"값은 무엇이며 "threshold"값은 어떻게 나타 납니까? 감사!haar cascade xml 파일에서 "left"및 "right"값의 의미는 무엇입니까?

그냥 참조를 위해, 여기에 파일의 구조입니다 : "오른쪽"

<haarcascade_frontalface_alt type_id="opencv-haar-classifier"> 
    <size>20 20</size> 
    <stages> 
    <_> 
     <!-- stage 0 --> 
     <trees> 
     <_> 
      <!-- tree 0 --> 
      <_> 
      <!-- root node --> 
      <feature> 
       <rects> 
       <_>3 7 14 4 -1.</_> 
       <_>3 9 14 2 2.</_></rects> 
       <tilted>0</tilted></feature> 
      <threshold>4.0141958743333817e-003</threshold> 
      <left_val>0.0337941907346249</left_val> 
      <right_val>0.8378106951713562</right_val></_></_> 
     <_> 
+0

? 나는 인터넷에서 다운로드 한 많은 분류자를 보았지만 그 의미가 무엇인지 이해할 수 없다. –

답변

2

은 "왼쪽"특정 형태의 기울기 값을 참조하십시오. 이러한 특정 모양은 특별히 왼쪽 직사각형과 오른쪽 직사각형이 아닙니다. 대신 특정 구성의 섹션을 참조하기 만합니다 (2 개 이상인 경우 섹션이 두 개 이상인 경우도 있음). 데이빗 하얼 (David Haar) 지에는 이것을 설명하는 다이어그램이 있습니다. 여기

은 (=이 충전 - 잔여) ASCII 표시이다

==== ==-- =--= 
==== ==-- =--= 
---- ==-- =--= 
---- ==-- =--= 

전체적으로 네이밍 컨벤션 불량하다. 대신 "그라디언트 상단", "그라데이션 하단"(2), "그라디언트 왼쪽", "그라디언트 오른쪽"(2), "그라데이션 왼쪽", "그라디언트 중심", "그라디언트 하단"(3) 각기. 단면을 고유하게 식별하기 위해 회전, 모서리 및 다른 모양의 이름을 지정해야합니다.

0

필자의 이해를 돕기 위해 Paul Viola와 Michael Jones의 단순한 기능의 부스트 된 케스케이드을 사용한 신속한 물체 감지가 원래의 기사 인 입니다. Haar와 같은 기능을 기반으로하므로 이름을 사용합니다. IEEE website에서 가져 오는 것이 좋습니다. (당신은 Google Scholar의 다른 버전을 확인, 계정이없는 경우.)

분류기는 하르 분류 (윌슨, 페르난데스)를 사용하여 얼굴 특징 검출에 설명되어 있습니다. ACM website 또는 CSA website에서 찾을 수 있습니다.

2

OpenCV 소스 코드에서 Haar 캐스케이드 작동 방식에 대한 통찰력을 제공하는 cvhaar.cpp을 찾을 수 있습니다. 불행하게도 이것은 본질적으로 주석이 아니며 설명서가 많은 도움이되지는 않습니다. 그것이 어떻게 작동하는지에 대한 나의 이해가있다.

icvEvalHidHaarClassifier() 함수에서 합계는 CvHidHaarTreeNode 단일 피처에 대해 계산됩니다.

이 합계가 임계 값보다 작 으면 "왼쪽"노드가 이어지고 프로세스가 반복됩니다. 그렇지 않으면 "올바른"노드가 뒤따라지며 다시 반복됩니다. 이것은 다음 문장에 의해 반영됩니다 :

idx = sum < t ? node->left : node->right; 

"왼쪽"또는 "오른쪽"노드가 음수 일 때 루프가 깨집니다. 이 경우 합계는 더 이상이 지형지 물에 대해 계산되지 않지만 해당 지형지 물의 임계 값은 분류 자의 결과로 반환됩니다.

"왼쪽"과 "오른쪽"을 따옴표로 묶습니다. 왜냐하면 말처럼, 그들은 기능 위치와 관련이 없기 때문입니다. 대신, 계단식이 어느 방향으로 떨어지는지를 반영합니다. 임계 값 아래 계단식 폭포는 으로 왼쪽으로이고, 임계 값보다 높으면 의 우열은입니다.

이제이 노드의 표현으로 돌아가겠습니다.XML에서, 당신은하지 인덱스로서가 아니라 값으로 노드의 표현을 볼 수 있습니다 :

<left_val>0.0337941907346249</left_val> 
<right_val>0.8378106951713562</right_val> 

이 숫자는 사실 노드에 cvGetFileNodeByName()를 사용하여 조회됩니다 이름 있습니다. OpenCV에서 이것이 어떻게 작동하는지 정확히 알지 못하지만, 이제 캐스케이드가 어떻게 작동하는지 더 잘 알기를 바랍니다.

2

폴?

나는 생각한다, 그 left_val/right_val으로 사용 :

/left_node 및 right_node1/right_node 수단을 left_node1 무엇
sum_stage += (sum_feature < feature_threshold*stddev)?(left_val):(right_val) 
+0

그들은 내 대답부터 몇 가지를 리팩터링했습니다. 그러나 사실 동일합니다. 기능의 합계가 임계 값 아래로 떨어지면 왼쪽으로, 그렇지 않으면 오른쪽으로 떨어집니다. –

관련 문제