데이터분석/Vision Recognition

기계학습, HAAR 훈련을 통한 캐릭터 파인더

늘근이 2015. 11. 14. 08:02

사람얼굴 검출기는 시중에 너무 좋은것들이 많이 풀려있다. 그건 페이스북에 문의하도록 한다. 여기서는 사람이 아닌 다른것에 대해서도 검출하고 싶다는 것이다.

 

http://coding-robin.de/2013/07/22/train-your-own-opencv-haar-classifier.html

 

위의 글에서는 바나나를 학습시키는데, 그냥 웃기려고 바나나를 선택한것은 아닐듯 싶다.바나나는 형태가 특이하며 다른 과일들과 구분하기 쉽기 때문에 학습시키기 참 좋으며 크고 굵고 노란 바나나는 포스팅에 올리기에도 참 맛있게 생겼다.

 

그렇다면 캐릭터를 한번 훈련시켜보면 어떨까? 적당한 캐릭터를 찾고 싶었는데, 마침 볼펜 꼭다리에 캐릭터가 달려있다. 이걸 한번 찾아보고 싶다.

 

물론 학습시키는 데이터는 적어도 캐릭터가 포함된 이미지 500개정도는 훈련해줘야하며, 부정적인 이미지는 저 캐릭터가 포함되지 않은 이미지 몇천장은 필요로 할 수 있다.

 

다만 OpenCV에서는 이미지 한장만을 가지고도 내부적으로 이미지를 마구 변형시키며 훈련을 할 수 있다. 물론 검출기의 성능이 그만큼 떨어질것이다.

 

사진은 아래와같이 우리집 침대에서 찍은 캐릭터의 사진이며, 수작업으로 캐릭터 경계선을 땄으며 그림자 따위는 제거하지 않았다.

 

 

이 단한개의 이미지를 가지고 openCV에서는 열심히 내부적으로 변형시키며 학습에 사용될 이미지를 만들어낸다.

 

 

위와같은 이미지가 약 500개가 생기는데, 잘 살펴보면 openCV는 설정해놓은 세팅을 잘 따라서 원본이미지를 왜곡시키며, 때에 따라서는 배경을 바꾸기도 하며 광원을 바꾸기도 한다.

 

다만 단 한장의 사진에서 학습하다 보니 흰색 침대보자체도 학습하여야 하는 경계선으로 인식했다는 것이다.

 

저런 학습이미지 약 천개정도로 보통 가정용피시 (i5-쿼드코어) 에서는 삼십분에서 한시간이 걸렸고, 차라리 AMD 옥타코어로 오버클럭 빵빵하게 놓고 하면 어떨까라는 생각과, openCV와 CUDA 프로세서를 결합한 API를 이용하는 편을 어떨까라는 생각이 든다.

 

학습결과로 튀어나온 xml을 가지고 사진들을 넣어서 검출을 시도해 볼수 있다.

 

cascade.xml

 

학습결과로 튀어나온 xml을 가지고 (전 포스팅 참조) 이제 실제로 사진에서 나온 캐릭터들을 검출할수 있는데 학습한 이미지가 단 한개인것을 생각하면, 검출기의 성능은 크게 떨어질수 있다는 생각이 든다.

 

첫번째 사진은 학습을 시켰던 오리지널 사진이다. 물론 그럴듯하게 찾아내야지 이것도 못찾아내면 소용도 없다.

 

 

 

침대보가 아닌 책상에서의 검출은 상당히 허접하다. 배경이 난잡하기 때문에며 책상의 결 때문에 컴퓨터의 정신이 혼미해질수 있다고 생각한다. 학습데이터가 구린 덕분이다. 사진 하나만 보여주고 찾으래니, 일단 쓰잘데기 없는것도 찾기는 했는데 찾기는 찾아서 다행이다.  

 

 

 

 

아래와 같은 사진에서는, 빨갱이 캐릭터를가 아닌 다른 캐릭터들도 찾아내고 있으며, 이는 형태와 크기가 비슷비슷하기때문일 것이다. 보통의 학습이미지들은 항상 그레이스케일로 바꾸어서 학습하게 되며, 색깔을 인식할수 있는 능력이 없으므로 아래와 같이 비스무리한 짝퉁들도 모두 한놈이라고 인식하게 된다.

 

 

 

 

한장을 학습한것 치고는 꽤나 비스무리한 놈들을 잘 검출해 낸다.

 

더이상의 테스트 이미지들은 없다. 나는 잘 모르겠지만 저 캐릭터들이 아직은 큰 인기를 끌지는 못한것같이 보인다. 하지만 귀엽다.

 

귀여움으로 끝내기는 좀 뭐하므로 마무리로는 한번 생각을 해보자 이딴걸로 뭘 할수 있는지. 비루한 노총각의 주말컴질로 끝나서는 너무 허무하므로 어떻게든 의미를 찾아본다.

 

IoT기기에다 해당하는 클라이언트 프로그램을 넣고 사진을 수집하게 하여 상당한 수준의 컴퓨팅이 가능한 무시무시한 서버 컴퓨터로 전송을 한 후 데이터를 학습시킨다.

학습된 결과인 xml만을 클라이언트 IoT기기들에 전송을 해준다.

 

빅브라더 서버와 연결된 IoT기기는들은 자신이 전송하지 않은 사진에 대해서도 여러 학습 결과를 내려받을수 있으며, 검출에는 그다지 많은 시간이 걸리지 않으므로 바로바로 기기가 보고있는 화면을 판별해낼수 있다.

 

그렇다면 무슨 이미지를 학습시킬것인가? 하잘데없는 냉장고 안에 음식부터 시작해서 사람얼굴을 인식해 홈 어플라이언스로 이용해볼수도 있을것이며 아니면 로봇에다가 전송을 하여 사람을 구별할수 있게 만들어 서비스를 제공하든지 아니면 맘에안드는 사람을 졸졸 따라다니며 핵꿀밤을 날리든지 뭐 어떻게 사용하든 많은 용도가 있을 것이다.