사용 언어 : Python
Computer Vision : Tensorflow, Caffe2, OpenCV
Web Framework : FastAPI
웹 크롤링
, 직접 촬영
, image overlay를 통한 데이터 생성
웹 크롤링👨💻
- google images downloaded 라이브러리를 이용하여 원하는 키워드의 이미지를 크롤링하였습니다.
- https://google-images-download.readthedocs.io/en/latest/installation.html
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에 빠지지 않게 하기 위해 BatchNormalization과 Droupout 층을 추가
- 초반에 모델의 마지막 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가지 함수 구현
- client로부터 받아온 데이터를 decoding하는 함수
- 이미지에서 마스크 착용 유무를 판별하는 함수
- detect한 이미지를 encoding하는 함수
[code
] https://github.com/Slangoij/SideProj.-Mask_Detection/tree/main/Web/SaBuJak
- detect start 버튼을 누르면 detect를 시작
- 마스크 착용, 미착용의 비율에 따른 Danger rate 설정
ImageOverlay
- Alpha 채널을 무시하고 imageoverlay를 진행하여 마스크의 여백부분이 그대로 덧붙었습니다..
비트연산을 통해 문제해결! 👇👇
Web implement
- Web으로 구현하는 과정에서 Django의 Streaminghttpresponse을 이용해 opencv로 구현했을 당시 새로운 웹페이지가 틀어져 검은 바탕에 detection하는 화면만 나오는 문제 발생
- ajax의 비동기통신을 통해 새롭게 구현했지만 실시간 스트리밍을 구현하는데 실패
- 이를 해결하기 위해 websocket 연결을 통해 실시간 양방향 통신을 선택하게 되었습니다.
- SPA(Single Page Application)으로 django처럼 무거운 framework보다 가벼운 webframework로 교체하게 더 효율적이라고 판단하여 FastAPI로 변경.