본문 바로가기

ImageProccing Library/OpenCV

openCV 를 이용한 Adaboost 알고리즘으로 xml파일 만들기


가장 popular 한 Boosting algorithm으로 단순하고 효율적이라는 Adaboost 알고리즘을 이용한 xml만들기 이다. 빠른 속도와 단순성 및 프로그램의 용이성과 적용할 라운드의 수를 제외하고 튜닝할 인자가 없기때문에 매우 간편하다.

1 . 샘플 이미지들을 준비

샘플 이미지는 훈련 시킬 이미지와 훈련시킬 이미지가 아닌 다른 이미지들을 모두 통틀어서 말한다. 만일 얼굴 사진을 훈련 시킬려면 얼굴 사진만 잔뜩, 손 이미지는 손사진만 잔뜩, 그리고 이와 반대되는 이미지 잔뜩 있으면 된다.

1-1 Positive와 Negative라는 폴더에 이미지를 각각 넣는다. 여기서 Positive는 역시 정답인 이미지를 넣고, Negative는 Positive와는 반대되는 정답이 아닌 이미지를 넣는것이다.

여기서 중요한건 두 Image Set, 즉, Positive : Negative의 비율은 1 : 3이 좋다고 한다.

나는 손을 양손을 다 Detection하기 위하여 오른손 100장 왼손 100장 으로 총 200장, 그리고 얼굴이 겹쳐있거나 노이즈가 심한사진 600장을 준비하였다.

각각의 폴더에 Image들을 넣고 Text 파일을 하나씩 생성한다.
이름이야 어떻게 하든 상관없지만 나는 Positive에 있는 textfile 을 train.txt , Negative에 있는 파일은 exception.txt라고 하였다.

우선 train.txt 에는...

img1.jpg 1 0 0 50 60
img2.jpg 1 0 0 50 60
img3.jpg 1 0 0 50 60
img4.jpg 1 0 0 50 60
img5.jpg 1 0 0 50 60
img6.jpg 1 0 0 50 60
img7.jpg 1 0 0 50 60
img8.jpg 1 0 0 50 60
img9.jpg 1 0 0 50 60
.
.
.
.

라고 적는다.
의미는 img1.jpg는 이미지 이름이다.
1은 그 이미지에서 훈련시킬 부분의 개수이다. (손이 하나이기 때문에 1로 한다. 만일 Image에 양손이 다 있다면 2로 하면된다.) 난 손을 각각따로 캡쳐 하였기 때문에 1로 하였다.

0 0 50 60 은 좌표가 된다.
각각의 좌표는 LeftTop 과 bottomRright 인 왼쪽위와 오른쪽 아래를 뜻한다.

Negative 폴더의 exception.txt에는

img1.jpg 
img2.jpg 
img3.jpg 
img4.jpg 
img5.jpg 
.
.
.
라고만 하면된다.

2. createsamples를 이용하여 vec파일 만들기

여기가 중요하다 이 부분은 opencv의 createsamples를 사용하여 vec파일을 생성하는 부분이다.

명령 프롬프트를 연다

그리고 c:\program files\opencv\bin 폴더로 경로를 이동한다.
creastesamples를 치면 명령어 사용방법이 나오는데 -_- 아직 이해하지 못함...

명령어를 다음과 같이 친다.
createsamples -info c:\Train\positive\train.txt -vec c:\Traing\vec\myobject.vec - num 200 -w 24 -h 24

-info 는 train.txt가 있는 폴더를 말하고 -vec은 생성될 vec파일이 들어갈 폴더의 경로를 쓰면된다.

num은 Image의 개수 즉, train.txt.의 라인수가 된다(나는 200개 Positive Image이기 때문에 20)그리고  w와 h 는 무조건 24로 셋팅한다.

오류가 난다면? 무조건 오타다....아니면 경로 설정이 올바르지 않은거다.


3. haartraining을 이용하여 classifier생성

2번과 유사하다. 이건 생각보다 오래 걸린다. (시스템에 따라 차이를 보인다. )

haartraining -data c:\Traing\final -vec c:\Traing\vec\myobject.vec -bg c:\Traing\negative\exception.txt -npos 200 -nneg 600 -nstage 14 -nsplits 1 -mem 1400 -w 24 -h 24


-data : vec을 이용하여 텍스트 파일들이 생성될 폴더를 가리킴.
-vec : 2번의 vec파일경로
-bg : Negative 파일들이 있는 폴더이다. exception이 존재하는 곳이다.
-npos : Positive Image의 개수
-nneg : Negative Image의 개수
마지막들은 모두 디폴트 값이니 동일하여야 한다.

4.haarconv를 이용하여 최종적인 xml생성

위 과정을 무사히 마치면 final이란 폴더에 0 부터 몇까지 암튼 몇개의 폴더가 생기며, 그안에 텍스트 파일이 하나씩 있다.
이 텍스트 파일을 하나의 xml로 합쳐야 하는데 이때 쓰이는게 haarconv파일이다. (첨부하였음)


이 파일을 Traing폴더에 넣고 압축을 푼다.
실행시키면 haarconv.exe라는게 생기는데

명령 프롬프트에서 haarconv.exe를 실행시킨다.


haarconv fianl test.xml 50 60

포스팅을 보면서 따라한 방식이다. 50과 60은 이미지 사이즈를 말한다고 한다. 

마지막은 확실치 않다고 하는군요.ㅎㅎㅎㅎㅎ