Mask Detection Project

Woosang·2021년 8월 24일
0

Project

목록 보기
1/3

🙋‍♂️Project 소개 및 목적


  • 사회적인 문제를 해결하는 현존 서비스 직접 구현
  • face detection 모델과 mask recognition 모델 두 개를 사용하여 마스크를 썼는지 안 썼는지 판별하는 프로젝트

Project 진행 방식


  • 팀원 모두 프로젝트의 경험이 전무하여 Project의 흐름을 알아가기 위해 모든 과정을 같이 진행하였습니다.
  • 모르는 부분과 문제를 직면하게 되면 스터디를 진행하여 문제를 해결해 나가는 방식으로 진행하였습니다.

기술 스택


사용 언어 : Python
Computer Vision : Tensorflow, Caffe2, OpenCV
Web Framework : FastAPI

진행 과정


📦학습 데이터 수집

웹 크롤링, 직접 촬영, image overlay를 통한 데이터 생성

  • 마스크 착용 이미지 : 600, 미착용 이미지 600 수집
  • 흰색, 하늘색, 검은색 마스크 데이터를 생성(각각 200개씩)

    웹 크롤링👨‍💻

    googleimagesdownload --keywords "black mask, COVID life" --limit 1000 --chromedriver

    직접 촬영📸

    • OpenCV의 videoCaputure 통해 5초의 한번씩 이미지를 저장하여 데이터 생성

    image overlay를 통한 데이터 생성🎭

    • OpenCV 라이브러리비트 연산을 통한 image overlay로 마스크 안 쓴 사람들의 사진 위에 배경이 투명한 마스크 png파일을 덧붙여 데이터를 생성하였습니다.
    • Dlib 라이브러리를 통해 사람 얼굴의 랜드마크를 뽑아내어 얼굴에 맞게 마스크 크기와 기울임 정도를 보정하였습니다.
    • 비트 연산 함수얼굴의 각도에 따라 연산을 수행하는 함수 구현
    • 참고
      [code] https://github.com/Slangoij/SideProj.-Mask_Detection/blob/main/dataset/code/Generate_Mask_data_method2.md

📚모델링 및 학습

  • face detection 모델은 완성된 모델을 사용
  • mask regonition 모델은 fine-tuning 및 구축
  • 학습 데이터는 train, validation, test 순서대로 800, 200, 200로 나누어 진행
  • 학습이 잘 되도록 keras의 ImageDataGenerator를 활용하여 이미지 증강과 변형
  • 경량화를 위해 Back-bone 모델로 MobileNetV2를 사용
  • local minimum에 빠지지 않게 하기 위해 BatchNormalizationDroupout 층을 추가
  • 초반에 모델의 마지막 layer의 활성함수를 sigmoid를 사용하였지만 실제 프로그램 상에서 2가지 class에 대한 각각의 확률 값으로 위험도 계산을 위해 softmax로 활성함수를 변경
    [code] https://github.com/Slangoij/SideProj.-Mask_Detection/blob/main/model/yws/process_.md

📄웹 서비스 구현

  • 웹소켓을 통한 실시간 양방향 소통
  • 가벼운 WebFramework인 FastAPI를 사용하여 back단을 개발하였습니다.
  • JavaScript와 웹소켓 통신을 연결하고 client page에서 webcam을 제어

3가지 함수 구현

🔑문제 해결


ImageOverlay

  • Alpha 채널을 무시하고 imageoverlay를 진행하여 마스크의 여백부분이 그대로 덧붙었습니다..

    비트연산을 통해 문제해결! 👇👇

Web implement

  • Web으로 구현하는 과정에서 Django의 Streaminghttpresponse을 이용해 opencv로 구현했을 당시 새로운 웹페이지가 틀어져 검은 바탕에 detection하는 화면만 나오는 문제 발생
  • ajax의 비동기통신을 통해 새롭게 구현했지만 실시간 스트리밍을 구현하는데 실패
  • 이를 해결하기 위해 websocket 연결을 통해 실시간 양방향 통신을 선택하게 되었습니다.
  • SPA(Single Page Application)으로 django처럼 무거운 framework보다 가벼운 webframework로 교체하게 더 효율적이라고 판단하여 FastAPI로 변경.

📍느낀점


  • 처음 프로젝트를 진행하며 미숙하고 부족했던 부분이 많았지만 계획했던 기능들을 구현할 수 있어 재미있었으며, 부족하지만 많은 것을 느끼고 배울 수 있던 프로젝트가 되었습니다.
  • 레포지토리 관리와 분업을 못 했던 것이 아쉬웠다.
  • 영어는 선택이 아닌 필수!
  • 두 가지 모델을 같이 사용하여 구현은 쉬웠지만 시간적 여유가 된다면 직접 annotation file까지 만들어 하나의 object detection model로 구현한다면 더 빠른 성능의 모델이 만들어질 것으로 예상

Mask detection github

0개의 댓글