저는 Viola-Jones의 얼굴 감지 알고리즘을 적용했습니다 . 이 기술은 이미지 내에 24x24 픽셀의 서브 프레임을 배치 한 다음 가능한 모든 크기로 모든 위치에 직사각형 특징을 배치하는 데 의존합니다.
이러한 기능은 2 개, 3 개 또는 4 개의 직사각형으로 구성 될 수 있습니다. 다음 예가 표시됩니다.
그들은 완전한 세트가 180k 이상이라고 주장합니다 (섹션 2) :
감지기의 기본 해상도가 24x24라는 점을 감안할 때 전체 직사각형 기능 집합은 180,000 이상으로 상당히 큽니다. Haar 기반과 달리 직사각형 기능 세트가 과도하게 완성되었습니다.
다음 진술은 논문에 명시 적으로 언급되지 않았으므로 내 입장에서 가정 한 것입니다.
- 2 개의 직사각형 피처 2 개, 3 개의 직사각형 피처 2 개, 4 개 직사각형 피처 1 개만 있습니다. 이것의 논리는 명시 적으로 색상이나 휘도 또는 그런 종류의 어떤 것도 아닌 강조 표시된 사각형 사이 의 차이 를 관찰 한다는 것입니다.
- 특징 유형 A를 1x1 픽셀 블록으로 정의 할 수 없습니다. 최소 1x2 픽셀 이상이어야합니다. 또한 유형 D는 2x2 픽셀 이상이어야하며이 규칙은 다른 기능에 따라 적용됩니다.
- 중간 픽셀은 분할 할 수 없기 때문에 특성 유형 A를 1x3 픽셀 블록으로 정의 할 수 없으며 자체에서 빼는 것은 1x2 픽셀 블록과 동일합니다. 이 기능 유형은 짝수 너비에 대해서만 정의됩니다. 또한 피처 유형 C의 너비는 3으로 나눌 수 있어야하며이 규칙은 다른 피처에 따라 유지됩니다.
- 너비 및 / 또는 높이가 0 인 특성은 정의 할 수 없습니다. 따라서 x 와 y 를 24에서 특성 크기를 뺀 값으로 반복 합니다.
이러한 가정을 바탕으로 철저한 집합을 계산했습니다.
const int frameSize = 24;
const int features = 5;
// All five feature types:
const int feature[features][2] = {{2,1}, {1,2}, {3,1}, {1,3}, {2,2}};
int count = 0;
// Each feature:
for (int i = 0; i < features; i++) {
int sizeX = feature[i][0];
int sizeY = feature[i][1];
// Each position:
for (int x = 0; x <= frameSize-sizeX; x++) {
for (int y = 0; y <= frameSize-sizeY; y++) {
// Each size fitting within the frameSize:
for (int width = sizeX; width <= frameSize-x; width+=sizeX) {
for (int height = sizeY; height <= frameSize-y; height+=sizeY) {
count++;
}
}
}
}
}
결과는 162,336 입니다.
Viola & Jones가 말하는 "180,000 개 이상"을 근사화 할 수있는 유일한 방법은 가정 # 4를 삭제하고 코드에 버그를 도입하는 것입니다. 여기에는 네 줄을 각각 다음과 같이 변경하는 작업이 포함됩니다.
for (int width = 0; width < frameSize-x; width+=sizeX)
for (int height = 0; height < frameSize-y; height+=sizeY)
결과는 180,625 입니다. (이렇게하면 기능이 서브 프레임의 오른쪽 및 / 또는 하단에 닿지 않도록 효과적으로 방지 할 수 있습니다.)
당연히 질문 : 구현에서 실수를 했습니까? 표면이 0 인 피쳐를 고려하는 것이 합리적입니까? 아니면 잘못된 방향으로보고 있습니까?