Vision – 객체 검출 (Object Detection)

객체 검출입력 영상에서 사용자가 원하는 객체를 찾고 객체의 위치와 바운딩 박스를 구하는 것입니다.

참고로 이전에 소개한 ‘템플릿 매칭’과 ‘디스크립터를 이용한 매칭’도 객체 검출에 속합니다.
이것은 템플릿이 존재할 때의 객체 검출 방법입니다.

또한 R-CNN, YOLO, SSD 등 머신러닝을 이용해서 객체 검출을 할 수도 있습니다.
이것은 학습 데이터가 존재할 때의 객체 검출 방법입니다.
학습 데이터란 ( 입력 영상에 담긴 객체(들)의 클래스와 박스 좌표(x,y,w,h)) 모음이라고 생각하면 됩니다.

머신러닝을 이용하면 바운딩 박스를 구하는 것과 더불어 해당 박스에 담긴 객체가 무슨 클래스인지도 알 수 있습니다!
따라서 머신러닝으로 객체 검출을 할 때는,
입력 영상에서 사용자가 원하는 객체를 찾고 바운딩 박스와 클래스를 구하는 것이라고도 말합니다.

머신러닝 방법은 ‘one_stage_method’, ‘two_stage_method’가 존재하는데 R-CNN이 two-stage, 나머지가 one-stage입니다.

one_stage_method: 바운딩 박스와 클래스를 한 번에 찾음 (속도가 빠르지만 정확도가 낮음)
two_stage_method: 바운딩 박스와 클래스를 순차적으로 찾음 (정확도가 높지만 속도가 느림)

– 바운딩 박스 찾기: 오브젝트가 될 만한 후보 박스 찾기
– 클래스 찾기: 바운딩 박스에 있는 객체가 어떤 클래스인지 찾기

이번에는 템플릿이 없을 때의 객체 검출을 해보겠습니다.
대표적으로 차선 검출, 얼굴 검출을 알아 보겠습니다.


차선 검출

‘차선 유지 보조 시스템’에 적용되는 차선 검출입니다.

차선 검출에 적용되는 기술은 ‘에지 검출’‘직선 검출’입니다.

Canny Edge detector를 이용해서 에지를 검출하고 이 에지를 Hough transform에 적용해서 직선을 찾게 됩니다.

(영상 처리 입문 III)에서 간단하게 설명한 Hough Transform에 대해 좀 더 살펴 보겠습니다.

1. Canny Edge Detector로 에지를 구했으면 이 에지 픽셀들이 x-y평면에서 일직선 상에 배열되어 있는지를 확인합니다.

2. x-y 평면의 일직선에 위치한 점들이 a-b평면에서는 직선들이 됩니다.
(x,y가 각각 기울기, 절편이 되기 때문)

(b) 그림에서 교차하는 점(a0,b0)가 바로 우리가 구하려는 직선의 기울기와 절편이 됩니다.

하지만 이 방법으로는 (수평선,수직선)을 구할 수가 없습니다.

따라서 직선의 식(y=ax+b)를 세타(각도)와 로우(중점에서 떨어진 거리)로 변경하고 극 좌표계에 나타내서 교차점을 구하는 것입니다.

이렇게 할 시, 원하는 직선의 형태를 구할 수 있게 됩니다.


캐스케이드 분류기를 이용한 얼굴 검출

얼굴 검출을 위해서는 ‘유사-하르 필터’가 필요합니다.

유사-하르 필터는 필터의 검은 색 부분은 빼고 흰 색 부분은 더하는 방식으로
(밝기 값의 합)의 차이를 구하는 역할을 합니다.

위의 필터를 얼굴에 포개어 보겠습니다.

포개서 나온 필터 값(feature 값)은 클 것입니다.
왜냐하면 영상에서 검은 색 부분은 어두워서 픽셀 값들이 작고 흰색 부분은 밝아서 픽셀 값들이 크기 때문입니다.

이 필터를 ‘이마’부분에 포개면 어떻게 될까요?
그럼 필터 값(feature 값)은 작을 것입니다.
왜냐하면 영상에서 검은 색 부분은 밝아서 픽셀 값들이 크고 흰색 부분도 밝아서 픽셀 값들이 크기 때문입니다.

이 필터를 이마에 포개면 값이 작고 눈에 포개면 값이 크니까
결국 이 필터는 눈과 이마를 검출하는 역할을 합니다.

이렇게 필터의 역할을 알아보기 위해 각각의 필터에 대해 ‘슬라이딩 윈도우’를 진행합니다.
슬라이딩 윈도우를 하면서 각 영역에 존재하는 픽셀들의 밝기 합을 계산하는데, 이 과정에서 중복이 너무 많이 일어 납니다.

따라서 적분 영상을 이용해서 이 문제를 해결합니다.

얼굴 검출에 적합한 필터를 찾기 위해 총 18만개의 필터를 생성하고
그 중 6000개를 선별합니다.

이렇게 선별된 필터들을 케스케이드 분류기에 적용합니다.

1단계에서는 얼굴 검출에 가장 유용한 유사-하르 필터 하나를 사용합니다.
이 때 얼굴이 아니라고 판단되면 이후의 유사-하르 필터 계산은 수행하지 않습니다.

1단계를 통과하면 2단계에서 필터 다섯 개를 사용하여 얼굴이 아닌지를 검사합니다.
얼굴이 아니라고 판단되면 이후 단계의 검사는 수행하지 않습니다.

반복해서 모든 필터를 통과하면 ‘얼굴’이라고 판별하게 됩니다.

이 알고리즘은 얼굴이 아닌 영상을 빠르게 제거함으로써 매우 좋은 성능을 보여 준다고 합니다.


GitHub에 파이썬 코드를 제공하겠습니다.
필자의 GitHu
b는 메인 화면 배너에 있습니다.

Leave a Reply

Your email address will not be published. Required fields are marked *