7주차 - Tistory

Download Report

Transcript 7주차 - Tistory

나민영
서경대학교 컴퓨
터공학과
CGVR Lab
2012. 07.
11
1.1 시작하기전에
공상영화에서나 나올 법한 얼굴 검출 및 인식기법들이 우리 일상생활에서도 이제
흔히 볼 수 있는 기술이 되었다.
아직 접하지 못해보았다면 디지털카메라로 사람을 찍어보아라.
만약 디지털 카메라가 없다면
페이스북에 접속해서 얼굴이 찍힌 사진을 한번 올려본다면 얼굴 검출이라는것이
얼마나 우리 생활속에 들어와있는지 알 수 있을것이다.
그렇다면 우리는 공학도로써 이러한 기술을 즐기기만 할 것이아니라
한번쯤은 이러한 고민을 해보아야 했을것이다.
“대체 어떻게 얼굴검출이 가능한걸까?”
“멍청한 컴퓨터가 대체 어떻게? 저 사진속에서 저 부분이 사람얼굴이라는걸 알았을까?”
만약 이러한 의문을 떠올린적이 없다면 지금 한번
어떻게 얼굴검출이 가능할까? 라는 생각을 잠시 해보고 다음장으로 넘기길 바란다.
http://ocllos.tistory.com
ocllos@nate.
com
1.1 시작하기전에
페이스북에서 제공하는 얼굴검출을 통한 페이스북 회원 링크 기능
http://ocllos.tistory.com
ocllos@nate.
com
1.2 컴퓨터는 어떻게 영상에서 얼굴을 찾아
낼까?
우선 먼저 이미지는 어떻게 구성되는지 알아보자.
Opencv 를 통해 이미지를 받아오게 되면 그 이미지는 모니터로 보기에는 하나의 사진으로 혹은
움직이는 동영상으로 보이지만 실제로는 아래와 같이 수천,수만개의 픽셀과 그 픽셀을 표현하는
숫자로 이루어진 데이터의 집합일 뿐이다.
2004년에 찍은 금계국.. 이때가 그립구만
http://ocllos.tistory.com
R: 100
G: 200
B: 200
R: 100
G: 100
B: 100
R: 100
G: 150
B: 180
R: 100
G: 100
B: 100
R: 100
G: 150
B: 150
R: 100
G: 200
B: 200
R: 100
G: 150
B: 150
R: 100
G: 150
B: 130
R: 100
G: 250
B: 230
R: 200
G: 250
B: 100
R: 100
G: 100
B: 100
R: 100
G: 110
B: 205
R: 130
G: 130
B: 130
R: 100
G: 130
B: 130
R: 100
G: 100
B: 100
R: 100
G: 100
B: 100
R: 200
G: 255
B: 100
R: 100
G: 100
B: 100
R: 100
G: 100
B: 100
R: 100
G: 233
B: 105
R: 100
G: 250
B: 255
R: 100
G: 100
B: 100
R: 150
G: 150
B: 100
R: 100
G: 240
B: 100
R: 105
G: 100
B: 200
R: 100
G: 100
B: 100
R: 100
G: 100
B: 100
R: 100
G: 200
B: 222
R: 000
G: 000
B: 100
R: 100
G: 100
B: 100
표 안의 숫자는 임의로 적은것임!
ocllos@nate.
com
1.2 컴퓨터는 어떻게 영상에서 얼굴을 찾아
낼까?
숫자 형태로 저장되어 있는 데이터안에서 우리는 얼굴이 존재하는지 존재한다면 어느 위치에
존재하고 있는지를 찾아내야 한다. 대체 어떻게? 여러가지 방법이 존재하겠지만
우리는 OpenCV 에서 제공하는 Haar Object Detector 를 이용하여 얼굴을 검출해보겠다.
하지만!!!!
살다보면 OpenCV 가 작동되지 않는 플랫폼에서 영상처리를 해야 할 수도 있고
기반지식이 있다면 더욱더 좋은 알고리즘이 나올 수 있기 때문에
(Haar Object Detector는 그다지 좋은 성능을 보이지 않는다)
직접적인 구현에 들어가기전에 Haar Object Detector 란 무엇이고 원리는 어떻게 되는지
한번 파해쳐보자.
http://ocllos.tistory.com
ocllos@nate.
com
2. Haar ? Haar object detector란?
OpenCV의 cvHaarDetectObjects() 함수에서 이용된 알고리즘은 2001년
Viola와 Jones 가 발표한 “Rapid Object Detection using a Boosted Cascade of Simple Features”
라는 논문에서 제안한 기법이 사용되었다.
Haar-like feature 라는 것은 저 논문에서 사용된 방식이 Haar Wavelet 에 기반하고 있기 때문인데
Haar-like feature 는 굳이 번역해보자면 유사 하르 특징 정도가 되겠다.
그렇다면 대체 Haar Object Detector 는 어떻게 돌아가는걸까?
아래와 같은 순서로 알아보자.
1.
2.
3.
4.
Haar-like feature
Integral image
Adaboost
Cascaded classifiler
http://ocllos.tistory.com
ocllos@nate.
com
2.1 모든 사물에는 패턴이 존재한다.
이야기에 들어가기 앞서 잠시 사람이 사물을 인식하는 과정에 대해 생각해보자.
사람이 어떠한 물체나 혹은 사람을 보았을 때 우리는 그것을 어떻게 인지하는가?
대충 아래와 같은 과정을 거칠 것이다.
1. 눈으로 본다.
2. 들어온 영상에서 객체들의 특징을 찾아낸다.
3. 특징을 통해 어떠한 객체인지를 뇌에 저장된(학습된) 정보를 바탕으로 판단을 내린다.
위의 내용을 컴퓨터로 바꾸어본다면
1. 웹캠으로 영상을 촬영한다.
2. 들어온 영상에서 객체들의 특징을 찾아낸다.
3. 특징과 미리 학습해놓은 데이터와 매칭을 통해 어떤 객체인지 판단을 내린다.
대충 이렇게 정의를 내릴 수 있지 않을까?
여기서 우리가 설계 해야하는 부분은 바로 2번과 3번이 되겠다.
http://ocllos.tistory.com
ocllos@nate.
com
2.1 사람의 얼굴에는 특정한 패턴이있다.
다시 본론으로 들어가서 앞에서 설명하기를 들어온 영상에서 객체의 특징을 찾는다고 하는데
그 특징은 대체 어떻게 찾는것일까?
이러한 고민을 통해 나온것이 바로 Haar-like feature 다.
(다시 한번 말하지만 특징을 찾는 기법은 Haar-like feature외에도 무수히 많다.)
아래 이미지에서 보이는 네모들이 바로 Haar-like feature(유사 하르 특징) 이라고 한다.
대체 저 사각형을 통해 어떻게 얼굴을 찾는걸까?
유사 하르 특징
http://ocllos.tistory.com
ocllos@nate.
com
2.1 사람의 얼굴에는 특정한 패턴이있다.
아래의 그림과 같이 사람의 얼굴위에 흑백의 사각형을 겹쳐 놓은 다음 밝은 영역에 속한 픽셀 값들의
평균에서 어두운 영역에 속한 픽셀값들의 평균의 차이를 구한 뒤, 그 차이가 어떤 경계값(threshold)
를 넘으면 사람 얼굴에 대해 유사 하르 특징이 있다고 판단을 내리게 된다.
흑백으로 이루어진 사각형의 크기는 A,B,C,D 와 같이 변하게 되고 그에 따라 밝은 영역에 속한 픽셀값
들의 평균과 어두운 영역에 속한 픽셀값들의 평균이 바뀌게 된다. 그렇기 때문에 사람의 얼굴은 다양
하지만 그 생김새의 패턴은 비슷하므로 임의의 얼굴 위에서의 특정위치, 그리고 특정 영역의 픽셀 값
들의 분포도 크게 차이 없을 것이라고 생각할 수 있다. 결국 그 값이 곧 경계값(threshold)가 된다.
유사 하르 특징
http://ocllos.tistory.com
ocllos@nate.
com
2.1 사람의 얼굴에는 특정한 패턴이있다.
이렇게 구한 feature 는 OpenCV 에서 haarcascade_frontalface_alt.xml 파일로 제공되고있다.
흑백 사각형의 좌표가 각각 다름을 알 수 있다.
13, 13, 1, 2, -1는 순서대로 사각형의
좌상단의 X,Y 좌표와 폭,높이를 나타내고
마지막에 있는 -1은 이득(gain)을 나타낸다.
일단 그렇게만 알고가자.
이건 대학교 1학년 초보자를 위한 강의다!
haarcascade_frontalface_alt.xml 25000줄이 넘는다..^^
http://ocllos.tistory.com
ocllos@nate.
com
2.2 시간 걸리는 계산은 먼저 해놓자.
앞에서 설명한대로 유사 하르 특징이 있는지 없는지를 판단하려면 이미지 위의 특정 영역에
속한 픽셀값들의 평균값을 계산해야하는데.. 문제는 앞에서 보다시피 xml 파일에 있는 수 많은
사각형들에 대한 feature 들에 대해서 매 번 평균값을 구하려면 기상청 컴퓨터를 대리고 와야할지도
모른다는게 문제. 그래서 약간의 꼼수를 써서 그 기본 연산을 이미지 전체에 대하여 먼저
해놓게 되는데 그 결과가 바로 Integral Image 다.
Integral Image란?
간단히 이야기하면 D부분의 넓이를 구한다고 가정하면
4번(A,B,C,D)네모에서 2번(A,B) 네모를 빼고 3번 (A,C)를 빼면 1번(A)가 두번 빠졌으니 다시 더해주는
방식으로 넓이를 구한다. 즉 미리 넓이를 계산해두면 빠르게 계산할 수 있다.
A
C
1
3
B
D
2
4
숫자2는
A와 B의 픽셀을 모두 더한 값이다
Integral Image 여기서 숫자1은 A의 모든 픽셀값을 더해놓은 값이 된다.
http://ocllos.tistory.com
ocllos@nate.
com
2.3 바보 하나보단 둘이 낫다. Adaboost
우리는 앞에서 어떤 이미지가 있고 그 이미지에 유사 하르 특징이 존재한다면(정해진 임계값을 넘으면)
얼굴로 인식하겠다는 것이 Haar Object Detector 의 핵심이라는것을 알 수 있었다.
그림으로 표현해보자면 아래와 같다.
Haar like feature
Input Image
얼굴 맞냐?
http://ocllos.tistory.com
ocllos@nate.
com
2.3 바보 하나보단 둘이 낫다. Adaboost
하지만 이와 같은 방법은 큰 문제가 있다. 그것은 바로 저러한 유사 하르 특징을 지닌것이 얼굴만
존재 할 리가 없다는 이야기이다. 무슨 이야기인가하면..
이런식으로
비슷한 특징을 지닌
엉뚱한곳도 얼굴이라고
인식 할 수 있다
쉽게 좀 가려고 하면 꼭 문제가 발생한다. -_-^ 지금은 한 군대만 오류가 났지
만 만약 개,원숭이,오랑우탄이 껴있다면?
ocllos@nate.
http://ocllos.tistory.com
com
2.3 바보 하나보단 둘이 낫다. Adaboost
앞장과 같은 문제를 해결하기 위해 다수의 약한 분류기(weak classifier)에게 물어본 뒤 그 결과의
합으 보고 얼굴인지 아닌지를 판단한다.
Haar like feature
Input Image
사각형 하나만으론 불안하니 다른 사각형에게도 물어본다.
http://ocllos.tistory.com
ocllos@nate.
com
2.3 바보 하나보단 둘이 낫다. Adaboost
위 수식에서 k_n은 하나의 분류기인데 이것들은 주어진 입력 x에 대하여 예(1) 혹은 아니오(-1)
라고 대답한다. a_n은 가중치를 나타낸다. 우리가 살고 있는 세상에도 멍청한애들(weak classifler)이
라도 모아놓으면 그 중에는 좀 나은애가 있고 그렇지 않은애가 있듯 가중치를 두어서 그중에 좀
나은애는 좀 더 비중을 두고 반영한다는 의미이다.
그래서 우리가 앞에서 살펴본 OpenCV 에서 제공하는 haarcascade_frontalface_alt.xml 파일에
Feature 가 수도 없이 많은것이다.
그렇다면 여기서 드는 의문.
대체 사람 얼굴과 비슷한 유사 하르 특징을 결정하는 사각형들의 형상(위치 및 크기)와 위에서 설명한
Adaboost 식의 가중치는 어떻게 결정되는 것일까?
답은 바로 진짜 사람 이미지와 사람이 아닌 이미지를 엄청나게 모아서 그 데이터를 분류기로 학습시켜
만들어 내게 된다. 학습과 관련된 내용은 Viola 와 Jones 의 논문을 참고.
http://ocllos.tistory.com
ocllos@nate.
com
2.4 바보들의 리그 Cascaded classifier
Cascaded classifier 는 앞에서 얻은 유사 하르 특징에 대한 그룹을 여러 개 놓고
그 그룹들의 대답이 모두 만장일치로 통과하지 않는다면 부결하는 방식이다.
Learning OpenCV 제대로 배우기 책에서 Cascaded calssifier 를 이렇게 서술하고 있다.
“Viola-Jones 분류기는 약한 분류기 노드를 이용하여 거절 케스케이드를 구성한다. 첫번째 분류기 집
단은 많은 실수를 포함하지만 물체를 포함하고 있는 영역을 가장 잘 찾아내는 것으로 선택된다. 다음
분류기 집단은 약한 거절을 갖는 두번째로 검출 성능이 좋은것으로 선택하고 이러한 방식을 반복한다.
실험 단계에서는 전체 캐스케이드를 다 통과한 경우에만 찾고자 하는 객체로 검출된다.”
http://ocllos.tistory.com
ocllos@nate.
com
2.4 이미지에서 얼굴 검출하기
이와 같은 과정을 통해 OpenCV의 cvHaarDetectObjects()는 아래 그림처럼 대상 이미지 전체를
사각형 영역을 줄여가면서 여러 번 스캔하여 얼굴을 검출 한다.
http://ocllos.tistory.com
ocllos@nate.
com
3. OpenCV 잠깐 알아가기
Opencv 에서 가장 기본이 되는 IplImage 구조체에 대해 알아보자
http://ocllos.tistory.com
ocllos@nate.
com
3. OpenCV 잠깐 알아가기
cvCreateImage 는 Iplimage 구조체의 메모리를 생성하여 그 포인터를 넘겨주는 역할을 한다.
첫번째 인자는 이미지의 크기를 나타낸다.
이미지의 가로, 세로 길이
두번째 인자는 Depth 값이다.
하나의 이미지를 표현하는 비트의 크기로 일반적으로 한 픽셀을 0~255의 값을 가진다.
1비트는 2의8승으로 255의 값을 표현 할 수 있기 때문에 (1비트는 8바이트)
보통 IPL_DEPTH_8U 로 표현한다. (U는 Unsigned)
세번째 인자는 chennal 을 나타낸다.
그레이 이미지는 1채널 RGB 컬러는 3채널이다.
그레이 이미지의 경우 0~255사이의 값으로만 표현이 가능하고
RGB 의 경우 R(0~255) G(0~255) B(0~255)의 조합으로 하나의 픽셀의 색상을 결정한다.
cvCreateImage 에 대해 알아보자
http://ocllos.tistory.com
ocllos@nate.
com
3. OpenCV 잠깐 알아가기
cvCvtColor 는 색상 영역을 다른 컬러 영역으로 변환한다.
첫번째 인자는 원본 이미지 데이터
두번째 인자는 변환한 이미지가 저장될 이미지 데이터
세번째 인자는 변환방식 (CV_RGB2GRAY = CV_ 원본영상색상 2 변환할색상)
cvCircle 는 영상에 원을 그린다.
첫번째 인자는 원본 이미지 데이터
두번째 인자는 원을 그릴 위치(원의 중심점)
세번째 인자는 원의 반지름
네번째 인자는 원의 색상
다섯번째 인자는 CV_FILLED 의 경우 원 안을 채우는 것이고
2,8,0 과 같이 숫자로 표현하면 채우지않는다. 여기서 2는 선의 굵기를 나타낸다.
알아두면 유용한 함수들
http://ocllos.tistory.com
ocllos@nate.
com
3. OpenCV 잠깐 알아가기
cvRectangle 는 영상에 사각형 박스를 그린다.
첫번째 인자는 출력할 이미지
두번째 인자는 사각형 좌상단
세번째 인자는 사각형 우하단
네번째 인자는 출력할 색상
다섯번째 인자는 사각형 선의
데이터
위치
위치
굵기
cvPutText 는 영상에 글자를 출력한다.
첫번째 인자는 출력할 이미지 데이터
두번째 인자는 출력할 글자
세번째 인자는 글자를 출력할 위치
네번째 인자는 폰트 형태(폰트,폰트크기)
다섯번째 인자는 글자 색상
알아두면 유용한 함수들
http://ocllos.tistory.com
ocllos@nate.
com
4. 코드 구현 - 영상 입력
웹캠에서 영상을 입력받아서 출력
http://ocllos.tistory.com
ocllos@nate.
com
4. 코드 구현 - 영상 입력
영상 입력 결과
http://ocllos.tistory.com
ocllos@nate.
com
4. 코드 구현 – 얼굴 검출
웹캠에서 영상을 입력받아서 출력
http://ocllos.tistory.com
ocllos@nate.
com
4. 코드 구현 – 얼굴 검출
cvGetSeqElem 함수를
거치게 되면 CvRect 형태의 데이터가 반환되는데
CvRect 는 어떻게 생긴 자료형일까?
스스로 찾아서 아래 검은박스의 비밀을 풀어보자
검은색으로 가려진 부분을 직접 생각해서
풀어보자. 사각형을 그리려면 CvPoint 형태의
변수가 두개가 필요하다. 그렇다면??
PPT 박스 지우면 답이 보임^^
웹캠에서 영상을 입력받아서 출력
http://ocllos.tistory.com
ocllos@nate.
com
4. 코드 구현 – 얼굴 검출
얼굴 검출 결과
http://ocllos.tistory.com
ocllos@nate.
com