[WearMask] E00.Capstone Project
2021-03-15 # WearMask

Capstone Software project



시작하기에 앞서


캡스톤소프트웨어프로젝트를 수강하며 졸업프로젝트를 진행하려고 한다.

캡스톤프로젝트는 학교에서 프로젝트 주제를 정해주고 마음에 드는 주제를 정하여 교수님과 컨택하여 정하는 방식으로 진행된다.

나는 그 중 마스크 착용 감지 알람 시스템을 선택하게 되었다.

선택하게된 가장 큰 이유는 방학 중 AAIS에서 노영균교수님의 지도하에 이미지분류 딥러닝 모델을 공부했었기 때문이다.

또한, 랩실 인턴을하면서 이미지를 가지고 활용할 수 있는 분야가 무궁무진하다 생각했기 때문이다.

[그림 1] PCA(위), t-SNE(아래)를 통해 이미지 분포 비교



위의 이미지는 Nature지에 실린 [Efficient neural network compression via transfer learning for machine
vision inspection]논문에서 발췌한 이미지이다.

비록, 분류하려는 이미지가 전이학습(Transfer Learning)할 모델의 학습데이터인 /imageNet과 분포가 다른데도 불구하고 전이학습을 해야만 한다는 것이다.

이미지 인식을 조금 더 배우고 적용시켜보고싶다는 생각에 위와같은 주제를 선택하였다.



마스크 착용 감지?


구글링을 해보면 마스크 착용을 구분하는 모델이 굉장히 많이 나와있다.

실제로 그를 적용시켜보면 학습이 잘되어 있는 것처럼보인다.

우선, webcam을 열고 cvlib에서 제공하는 detect_face를 사용하면 얼굴을 검출해주고 딥러닝 모델을 통해 마스크를 썼는지 안썼는지 판단해준다.

그럼 더이상 진행할 이유가 없지 않은가?

하지만 큰 문제가 있다.

그 문제를 지금부터 살펴볼까 한다.



Face Detection


[그림 2] 프로토타입



간단하게 만들어본 모델을 사용할 시 위와같은 결과가 나온다.

얼굴인식이 cvlib에서 제공하는 메서드를 사용할 경우 어느정도는 얼굴인식을 하지만 사람이 멀어질 수록 검출을 못한다.

또한, cvlib의 face detection은 마스크를 쓰지 않은 얼굴을 학습시킨 모델이라 마스크를 썼을 경우 구분을 못하는 경우도 존재한다.

따라서, 이부분을 먼저 수정해야한다.


  1. OpenCV Haar Training & Cascade Training

    Haar Cascad classifier은 ‘Rapid Object Detection using a Boosted Cascade of Simple Features’에서 제안된 효과적인 객체 검출 방법이다.

다수의 객체 이미지(positive /image)와 그 외의 객체가 아닌 이미지(negative /image)를 cascade함수로 트레이닝 시켜 객체 검출을 하는 머신러닝 기반의 접근 방법이다.

다수의 얼굴 이미지(우리의 목표를 위해 마스크를 쓴 이미지도 필요하다)와 억룽리 없는 이미지를 classifier에 학습시켜 얼굴의 특징들을 추출해서 저장한다.

학습을 시키기 이전의 cv2.CascadeClassifier(haarcascade_frontface.xml)을 사용할 경우 기존의 cvlib.detect_face보다 조금 더 잘찾는다.

하지만 눈에 띄게 잘 찾는 것이 아니므로 마스크를 쓴 이미지로 다시 학습을 시켜봐야할 것이다.



[그림 3] cascade classifer가 학습할 feature들




  1. MTCNN

    이 딥러닝 모델을 보았을 때 굉장히 놀랐다. 예시를 한 번 보게 된다면 다음과 같다.



[그림 4] MTCNN을 적용시켰을 때 face detection



굉장히 작은 얼굴들도 모두 검출해내는 것을 볼 수 있다.



[그림 5] MTCNN 학습 방법



위와 같이 P-net, R-net, O-net이라는 CNN을 차례로 통과하는 Cascade모델이다.



MTCNN Process /images

[그림 6] MTCNN 학습 방법 영상


한눈에 보기 쉽게 설명해놓은 유튜브 영상이다.



Recognize the Mask


[그림 7] 프로토타입



위의 결과를 보면 알 수 있듯이 아직은 정확히 검출하지 못하는 것을 볼 수 있다.

첫번째로 학습을 시켰을 때 피부가 하얀 남자나 여자들은 구분을 못시켰었는데 학습데이터가 내 얼굴이라 색도 모델이 보고있는 것인가생각하여서 다양한 인종의 사진들을 캐글에서 긁어와 학습시켰지만 여전히 구분을 못시키고 있음을 볼 수 있다.

이는 아직 데이터셋의 부족으로 일어난 현상이라 생각한다.

마스크를 썼다, 안썼다 두가지로만 분류하고 있었는데 tensorflow-keras로 학습을 시켰을 때 학습이 매우 잘되어 처음부터 99퍼센트의 accruacy를 보여주었었다.

그리고 단 3번의 epoch만으로도 99.999에 가까운 accuracy를 보여주는 것으로 보아 좀더 노이즈가 많은 데이터를 주고 학습을 시켜야겠단 생각이 들었다.



앞으로의 계획


딥러닝의 black-box특성을 살짝 엿볼 수 있게 하는 grad-CAM이라는 모듈을 사용해서 마스크를 잘 보고 있는지 확인해가며 학습을 시켜볼 예정이다.



grad-cam

[그림 8] Grad-CAM의 원리



그리고 face detection분야도 다양한 모듈을 사용하고 수정해가며 검출률을 높여보려고한다.

일년동안의 프로젝트가 잘 진핻되었으면 좋겠다는 생각을 하며 글을 마치도록 하겠다.



Reference


  1. http://www.arxiv-vanity.com/papers/1611.07450/
  2. https://m.blog.naver.com/PostView.nhn?blogId=dnjswns2280&logNo=222028246343&proxyReferer=https:%2F%2Fwww.google.com%2F
  3. https://www.youtube.com/watch?v=w4tigQn-7Jw
  4. https://yeomko.tistory.com/16
  5. https://www.kaggle.com/prasoonkottarathil/face-mask-lite-dataset?select=with_mask