Machine Learning - AdaBoost를 이용한 얼굴 검출하기 Part2
데이터 출처 : research.google/tools/datasets/google-facial-expression/
Google facial expression comparison dataset – Google Research
This dataset is a large-scale facial expression dataset consisting of face image triplets along with human annotations that specify which two faces in each triplet form the most similar pair in terms of facial expression. Each triplet in this dataset was a
research.google
github 주소 : github.com/sangHa0411/DataScience/blob/main/face_detection.ipynb
sangHa0411/DataScience
Contribute to sangHa0411/DataScience development by creating an account on GitHub.
github.com
Part1 주소 : eletronicprogrammer.tistory.com/46
Machine Learning - AdaBoost를 이용한 얼굴 검출하기 Part1
데이터 출처 : research.google/tools/datasets/google-facial-expression/ Google facial expression comparison dataset – Google Research This dataset is a large-scale facial expression dataset consisti..
electronicprogrammers.com
이전 포스팅에서 크기가 (24 , 24)인 사진에서 대략 2만개의 Haar Features를 추출하였습니다.
아래는 그 결과입니다.
이제 여기서 AdaBoost를 이용해서 얼굴 사진인가 아닌가를 구별할 특징을 추출해보도록 하겠습니다.
adaboost 에 대해서는 아래의 참고자료에 잘 설명이 되어있습니다.
참고자료 : towardsdatascience.com/boosting-and-adaboost-clearly-explained-856e21152d3e
Boosting and AdaBoost clearly explained
A Visual Explanation
towardsdatascience.com
간단히 정리하자면 오직 특징 1개만을 이용하는 weak classifier를 여러개 결합해서 strong classifier를 만드는 것입니다.
이에 대해서는 다음에 다시 자세하게 정리하도록 하겠습니다.
weak classifier 10개를 사용하였을 때 테스트 데이터를 이용해서 분류한 결과 정확도가 76%정도 입니다.
weak classifier 50개를 사용하였을 때 테스트 데이터를 이용해서 분류한 결과 정확도가 81%정도 입니다.
weak classifier 100개를 사용하였을 때 테스트 데이터를 이용해서 분류한 결과 정확도가 81.2%정도 입니다.
weak classifier 500개를 사용하였을 때 테스트 데이터를 이용해서 분류한 결과 정확도가 84.2%정도 입니다.
이렇게 여러개의 adaboost 모델을 만드는 이유는 다음과 같습니다.
adaboost 모델을 cascade함으로써 최종적인 모델을 만듭니다.
크기가 (24 ,24) 인 이미지가 입력되어서 첫 번째 adaboost모델에서 얼굴이 아니다 라고 판정이 되면 이 후 모델에 입력될 필요없이 바로 기각됩니다. 이런 방식이 아니라 처음 부터 많은 특징수를 선택해서 사용하면 모든 이미지가 그 많은 특징들을 하나하나 다 검사해야 하므로 시간이 많이 소모가 됩니다. 그에 비해서 이렇게 cascade를 하게 되면 모든 특징을 매번 검사할 필요 없이 순차적으로 이용이 됨으로써 대부분의 사진들은 10개의 weak classifier만을 사용하고 기각이 됩니다,
얼굴 사진에 조금 더 가깝다고 여겨지면 다음 adaboost 모델에서 테스트해보고 이와 같은 방식이 반복이 됩니다.
이제 앞서 만든 모델을 하나의 리스트에 저장하고 순차적으로 모든 모델에 대해서 얼굴이다 라고 판정이 되어야지만 최종적으로 얼굴이다 라고 판정이 되도록 classify 함수를 정의합니다.
이제 이 함수를 이용해서 얼굴을 검출해보도록 하겠습니다.
입력으로 받은 이미지의 크기가 (24 ,24)인 서브 윈도우를 하나하나 돌면서 얼굴인지 아닌지를 판별합니다.
그리고 얼굴이라고 파악이 된다면 해당 행부터 3줄 아래의 행까지만 조사하도록 합니다.
테스트에 사용될 배우 김고은님의 사진입니다.
위 사진을 흑백으로 바꾸고 크기를 줄여보도록 하겠습니다.
이번에는 완벽하게 프로그램을 만드는 것이 아니라 원리를 파악하기 위해서 얼굴 크기가 대략 (24 ,24) 가 되도록 이미지의 크기를 조정하였습니다.
여기서 이미지를 전처리해줍니다.
이제 앞서 만든 함수로 위 흑백사진에서 얼굴을 검출해보겠습니다.
예상 외로 얼굴 검출이 잘 된 것을 확인할 수 있습니다.
위는 잘 된 예시를 한 것이고 다른 사진으로는 얼굴 검출이 잘 안될 때도 많았습니다. 얼굴의 일부분 만 있는데도 얼굴이라고 인식하는 경우도 많았습니다.
이는 처음에 2만개의 특징으로 시작을 한 이유도 있고 그리고 모델을 cascade할 때 5개만을 연결지었기 때문이라고 판단이 됩니다.
더 정확하게는 아래의 참고자료를 확인하시면 될 것 같습니다.
courses.cs.washington.edu/courses/cse455/16wi/notes/15_FaceDetection.pdf
이로써 얼굴 검출 알고리즘을 하나하나 구현해보면서 그 과정과 원리를 파악해보았습니다. 원리를 파악하기 위해서 원래 자료보다는 훨씬 더 가볍게 구현을 해보았으나 은근 얼굴 검출이 잘 된 것을 확인할 수 있었습니다.
이제 이를 이 원리를 바탕으로 해서 얼굴 이외에도 차 , 신호판 등등과 같은 것을 탐질할 수 있는 Machine Learning 모델을 만들 수 있다는 자신감을 얻을 수 있게 되었습니다.