YOLOv3를 이용한 턱스크찾기 프로젝트
마스크 / 턱스크 / 마스크를 쓰지않은사람을 찾아내고 분류하기
소개
실시간으로 마스크 쓴 사람과 쓰지 않은 사람을 구분할 수 없을까하는 생각에 이 프로젝트를 진행하고 되었고, 마스크를 제대로 쓰지 않은 사람까지 구별해 보자가 이 프로젝트의 목표입니다. 방법은 이미지에서 사람의 얼굴이 어디 있는지 탐지하고 그 다음에 분류를 하면 될 거라고 생각했습니다.
저는 마스크를 쓴 사람을 0
마스크를 제대로 쓰지 않은 사람을 1
마스크를 쓰지 않은 사람은 2로 분류했습니다.
그리고 이 분류가 초당 30장씩 가능하다면 실시간으로 가능하겠죠
사용한 알고리즘과 환경
그래서 객체탐지에서 매우 빠르고 정확하다는 욜로라는 알고리즘을 사용했고, 코랩 기반으로 진행했습니다.
기존에 학습된 네트워크를 가져와서 전이학습 형태로 썼는데 이 네트워크는 80개로 분류하는
코코데이터을 통해서 훈련되었고, 네트워크 구조 등에 대한 설명은 제가 이전에 작성해놓은 포스트를 참조하시면 좋습니다.
DATASET
데이터셋을 구하는 것이 가장 힘들었던 부분이었습니다. 라벨링된 데이터를 찾기 힘들었는데, VitorLin께서 본인 깃헙에 구글드라이브를 통해 제공하셨습니다. 분류되는 클래스는 다음과 같이 정했습니다.
- no mask - No mask at all.
- improperly - Partially covered face.
- mask - Mask covers the essential parts.
따라서 모델 cfg를 classes=80에서 classes=3으로 바꾸어주었고, filter도 255에서 24로 변경하였습니다.
Evaluation
객체를 얼마나 잘 검출하는가를 평가하는 recall값이 0.95로 굉장히 잘 검출한다는 것을 알 수 있습니다. 마스크를 썼는지 안썼는지 유무를 파악하기위해 먼저 사람의 얼굴을 탐지하는 것이 첫번째입니다. 예측한 박스가 정말 사람얼굴을 예측했는지 묻는 precision보다는, 이미지 or 영상 내에있는 사람의 얼굴을 얼마나 잘 찾았는지에대한 재현률(recall)값이 중요하다고 생각했습니다. 그리고 결과는 만족스러웠습니다.
예측한 박스와 실제 얼굴이 얼마나 겹치는지 말해주는 IoU도 평균적으로 70%가 겹친다고하니, 사람의 눈으로 식별하는데는 무리없을 것 같이 보입니다.
Average Precision은 각각의 클래스에 대해서 IoU를 0.05간격으로 Precision과 Recall이 차트에 그리고, 그 그래프의 아래면적인 AUC를 구하는 방법입니다.(오른쪽의 max값으로 그린 curve의 아래면적을 구하는 방법입니다. 성능지표는 이 후 포스트에서 다루도록 하겠습니다.). 그리고 구해진 Average Precision을 평균낸 것이, 객체검출에서 자주 쓰이는 Mean Average Precision입니다. 준수한 성능을 보이고 있습니다.
Real Time
실시간으로 탐지하는 것이 이 프로젝트의 목표 중 하나였고, 로컬에서는 다크넷에서 제공하는 demo를 통해 구현할 수 있습니다. 저는 추가적으로 제가 사용했던 구글 코랩상에서 구현하고자 하였고, theAIGuys님의 코드를 참조하여 추가하였습니다. 실시간으로 마스크를 쓰지않은 상태에서, 제대로 쓰지않은 상태, 제대로 쓴 상태로 순차적으로 넘어가는 것을 촬영한 영상입니다. 정확하게 인지하는 것을 알 수 있습니다.
Github
아래는 이 프로젝트를 담은 Repository입니다. 누구나 쉽게 따라할 수 있도록 만들어 놓았습니다.
'인공지능 > CV' 카테고리의 다른 글
인공지능이 만드는 폰트 [ HAN2HAN : Hangul Font Generation] (0) | 2021.11.13 |
---|---|
GAN에서의 미분 (Pytorch) (0) | 2021.10.13 |
객체탐지 (Object Detection) 2. YOLO !! (v1~v3) (2) | 2021.05.01 |
객체탐지 (Object Detection) 1. YOLO 이전 까지 흐름 (0) | 2021.05.01 |
MASK RCNN 실행시 버전오류 (0) | 2021.04.20 |
댓글