안녕, 세상!

CNN모델을 활용한 마스크 인식 모델 본문

Project

CNN모델을 활용한 마스크 인식 모델

dev_Lumin 2020. 12. 18. 19:50

대학교 2학년 2학기 실습수업 자유주제 프로젝트로 마스크 인식 모델을 만들었습니다.

 

(1) 주제 

카메라를 활용하여 인물의 마스크 착용 여부를 판단하는 모델을 구현

 

(2) 선정 배경

현재 코로나 팬데믹 사태로 인해서 마스크 착용이 의무화 되고 있습니다.

어디를 가든 마스크 미착용 시 출입 불가하며, 이를 사람이 일일이 확인하기에는 번거롭고 효율적이지 못하다고 생각하여 사람들이 마스크를 착용하였는지 안하였는지 판단하는 마스크 식별 모델을 만들어서 카메라로 자동으로 인식하는 시스템을 만들게 되었습니다.

공공장소에서 사람들이 마스크를 착용하였는지 안하였는지 사람이 직접 감시하기에는 비효율적이라고 판단하여 이를 판단해주는 프로그램이 있었으면 해서 만들었습니다.

 

(3) 개발 환경

 Operating system : Window 10 edu

 Language : Python

Development Tools : Pycharm Community Edition 2020.2.1

 Library : opencv, tensorflow, keras, pillow, os ....

 

 

(4) 구현 내용

◾ 카메라로 얼굴을 비추면 해당 인물이 마스크를 썼는지 쓰지 않았는지 화면을 보여줌.

◾ 마스크 착용시 녹색 상자와 착용확률이 나오며, 마스크 미착용시 적색 상자와 미착용 확률이 나옴.

◾ 흰색, 검은색 마스크 모두 지원.

◾ 특정 조명의 환경이 아닌 General한 환경에 대해서 구현하는 것을 목표로 설계함.

◾ 마스크 학습은 흑백이 아닌 RGB 정보를 포함시켜 학습을 시킴.

 

(5) 설계 내용

① Data Collection (데이터 수집)

해당 프로젝트를 구현하기 위해서 마스크를 쓴 사진과 쓰지 않은 사진들이 필요한데 마스크를 쓰지 않은 사진은 일반 얼굴 사진들이기 때문에 어렵지 않게 구할 수 있지만 마스크를 착용한 사진들은 직접 촬영하거나 수집하기 어렵다고 판단하였습니다.

따라서 마스크 png파일을 이용해서 사람의 얼굴 사진에 맞게 마스크를 부착시켜서 인위적으로 이미지 데이터를 만들었습니다. 

 

마스크 데이터 만들기

Facial landmark인  shape_predictor_68_face_landmark를 이용해서 얼굴 부위별 좌표를 파악합니다.

얼굴의 부위를 68개로 수치화 한 후 수치 중 마스크 착용 부위에 제일 적합한 핵심 수치를 결정합니다.

위의 사진에서 핵심 결정 부위를 빨강색으로 표현했습니다.

3번 : 왼쪽  턱

8번 : 밑 턱

13번 : 오른쪽 턱

29번 : 코 중앙

 

핵심 번호를 결정 한 후 해당 번호들의 좌표를 도출하여 마스크이미지의 길이를 조절하는데 사용합니다.

마스크 이미지는 다음과 같은 png파일로 준비했습니다.

해당 이미지를 그냥 사용하여 이미지에 붙히면 얼굴에 맞게 하기 어렵다고 판단하여 마스크를 반으로 쪼개어 얼굴의 반쪽 별로 길이를 설정하여 얼굴에 맞게 마스크가 부착되도록 설정하였습니다.

 

마스크의 높이는 8번과 29번 사이의 거리에 특정 비율을 곱해서 높이를 설정하였으며, 왼쪽의 얼굴부분은 8번과 29번을 연결하는 직선과 3번점 사이의 거리를 이용해 마스크의 넓이를 설정하고 오른쪽의 얼굴부분도 마찬가지로 직선과 13번 사이의 거리를 이용해 넓이를 설정하였습니다.

  

반으로 쪼갠 마스크는 다시 합친 후 8번과 29번의 x, y 좌표를 이용하여 ArcTan 값을 도출하여 인물 얼굴의 기울어짐을 각도로 구하여 합친 마스크를 회전시켜 얼굴에 부착시켰습니다.

 

이를 통해 최대한 사람의 얼굴에 이미지에 맞게 마스크를 부착시켰습니다.

 

다음과 같이 마스크 데이터를 수집하였습니다.

 

이제 흰색 마스크에 대한 데이터를 모았으니 검은색 마스크에 대한 데이터를 수집해야 합니다.

검은색 마스크도 마찬가지로 위의 과정과 같이 해서 데이터들을 수집합니다.

 

하지만 위와 같이 (0,0,0) 의 완전 검은색 색상의 마스크로 학습을 시킨다면 나중에 실제로 카메라로 실험을 할 때 인식을 잘 못합니다.

검은색 마스크를 착용하게 되면 검은색 마스크가 빛에 의해 어느 정도 빛의 반사가 일어나서 검은 색이 아닌 빛 부분이 카메라에 담기게 되기 때문입니다.

이를 어느정도 고려하여 검은 마스크의 색상을 검은색에서 살짝 투명도를 낮춰서 마스크 이미지를 준비했습니다.

위의 검은색 투명도를 낮춘 마스크로 검은색 마스크에 대한 데이터를 수집하였습니다.

최종 마스크착용 데이터는 다음과 같습니다.

 

준비한 Train_data 수는 마스크 착용사진(흰,검포함) 400장, 마스크 미착용사진 400장으로 총 800장을 준비하였고 Test_data수는 마스크착용,미착용 합쳐서 200장을 준비하였습니다.

Train_data를 준비하는 과정에서 Supervised learning을 하였으므로 정답 데이터가 필요합니다.

정답 레이블은 One-hot-encoding 기법을 사용하였고 행렬과 반복문을 이용해서 직접 만들었습니다.

마스크를 착용한 사진이라면 정답이 [1,0] , 착용하지 않은 사진이라면 정답이 [0,1]

 

② Data Preprocessing

데이터를 수집하였지만 위의 사진을 그대로 사용해서 학습하는 것보다 얼굴부분만을 도출하여 모델에 학습시키는 것이 더 낫다고 생각해서 얼굴부분만 도려내에 이미지들을 저장하는 과정이 필요합니다.

models/res10_300x300_ssd_iter_140000.caffemodel 얼굴 인식 모델을 사용하여 얼굴 부분만을 추출하는 과정을 거쳤습니다.

다음과 같은 과정에 의해 얼굴 부분만 추출한 데이터들을 얻을 수 있습니다.

 

③ Machine Learning

이제 모은 데이터들로 학습을 시켜야 합니다.

하고자 하는 것이 얼굴 이미지로 부터 해당 인물의 마스크 착용여부를 분류하는 것이므로 Supervised learning의 Classification 기법으로 모델을 설계하였습니다.

 

모델은 기본적인 CNN 계층으로 층을 구축하였고 다음과 같이 설계하였습니다.

 

그림으로 표현하면 다음과 같습니다.

 

 

Convolution Base 영역에서는 Convolution, Activation function, Maxpooling을 이용하여 네트워크를 형성하였습니다.

Activation function은 기본적으로 ReLU를 사용하였고 Maxpooling은 모두 크기를 절반으로 줄이는 방식을 사용하였습니다.

Dropout은 모두 0.25비율로 하였습니다.

 

Classifier 계층은 Convolution Base의 특징들을 종합하여 학습하는 영역이므로 일단 Convolution Base 계층의 마지막 데이터를 1차원으로 바꿔준 후 Fully-Connected로 연결시켰습니다.

이 후 마지막 출력은 인물의 마스크를 착용한 확률과 착용하지 않은 확률을 나타내기 위해서 Activation function을 Softmax로 사용하였습니다.

 

Training

학습은 다음과 같은 조건으로 학습시켰습니다.

Loss function : binary_crossentropy

Optimizer : adam

Epoch : 20 

Batch : 40

(Batch size는 보통 2의 제곱근 형태로 학습을 시키는 것이 좋습니다.

그 이유는 메모리 크기에 맞게 학습을 시키면 메모리 낭비가 되지 않기 때문입니다.

이 부분을 나중에 알게 되어 당시에 적용하지 못하였습니다.)

 

Test

Test_data에 대한 결과도 대부분 잘 나온 것을 확인할 수 있습니다.

 

 

 

④ Performance

이제 실제 노트북 웹캠을 OpenCV로 접근하여 테스를 하면 다음과 같이 결과가 잘 나오는 것을 확인 할 수 있습니다.

흰색 마스크와 검은색 마스크 모두 인식이 잘되며 마스크를 쓰지 않은 인물도 잘 인식하는 것을 확인할 수 있습니다.

 

 

(6) 느낀점

다른 학업과목 공부도 해야하기 때문에 시간이 넉넉하지 못했고 결과를 내야했기 때문에 이미지 데이터 수를 충분히 모으지 못한 부분이 아쉬웠다.

이미지 데이터를 충분히 모으지 못해서 적은 이미지 데이터로 고효율을 뽑기 위해서 모델을 학습시킬 때 마스크의 형태 중심으로 학습시키지 않고 색상에 대한 정보(RGB)도 모델한테 학습시켰기 때문에 적은 데이터로 잘 학습시킬 수 있었지만 모델이 색상에 어느 정도 의존해서 학습되었을 것이다.

그러므로 모델이 색상에 민감하게 되어 조명과 빛의 영향을 많이 받게 된다.

색상 정보로 모델을 학습시킬 경우에 빛의 영향을 고려하여 모델을 설계하는 것이 쉽지 않다는 것을 몸소 느꼈다.

좀 더 데이터를 수집해서 사진을 흑백으로 만들어 모델에게 색상정보를 주지않고 형태적으로 학습하도록 유도하면 모델을 직접 시현할 때 빛의 영향을 덜 받을 것 같다고 생각이 들었다.

아쉬운 부분도 있었지만 공부한 딥러닝을 직접 실습하는 첫 프로젝트라서 배운점도 많았고 다른 딥러닝 프로젝트를 만드는데 도움이 많이 될 것 같다.

 

 

 

해당 프로젝트의 GitHub 주소는 다음과 같습니다.

github.com/SeongMin2/COVID-19-Face-mask-detector

 

'Project' 카테고리의 다른 글

MLOps를 시작한 이유  (0) 2022.03.20
youtube api를 이용하여 남자아이돌과 여자아이돌 비교  (0) 2021.02.06
Comments