딥러닝 공부하면서 개인 프로젝트 주제를 생각해봤습니다. 딥러닝 공부 후 첫 프로젝트인 만큼 단순하면서도 현실에서 쓰일만한게 뭐가 있을까 고민을 했습니다.
요즘 다시 독감, 코로나 환자가 많이 발생하고 미세먼지도 심해서 마스크 착용 유무를 판단하는 모델을 만든다면 현실에서 유용하지 않을까 생각이 들어 이 주제로 선택했습니다.
1. 추론 프로그램 환경
추론용 프로그램은 C#의 WPF 프레임워크를 통해 개발합니다. 컴퓨터 사양은 크게 필요하지 않으며 웹캠이 하나 필요합니다. 노트북의 경우 내장된 웹캠을 이용하시면 됩니다. 혹은 이미지 파일을 불러와서 결과를 확인 할 수도 있습니다.
C#의 NuGet 패키지로 아래와 같이 OpenCV 관련 패키지들을 추가해주었습니다. OpenCvSharp4 하위의 패키지들은 추가를 안하면 오류가 발생하더라구요. 오류가 발생하지 않는다면 굳이 추가해주지 않아도 좋습니다.
<PackageReference Include="OpenCvSharp4" Version="4.10.0.20241108" />
<PackageReference Include="OpenCvSharp4.Extensions" Version="4.10.0.20241108" />
<PackageReference Include="OpenCvSharp4.runtime.win" Version="4.10.0.20241108" />
<PackageReference Include="OpenCvSharp4.Windows" Version="4.10.0.20241108" />
<PackageReference Include="OpenCvSharp4.WpfExtensions" Version="4.10.0.20241108" />
MFC나 자바 등 다른 언어 및 프레임 워크에서 개발하시더라도 값을 UI로 표현하는 부분만 각기 다를 뿐, 딥러닝 모델을 불러오고 추론하는 주요 부분들은 OpenCV의 함수를 사용하므로 약간의 수정을 거친 후 사용하시면 됩니다.
2. 학습 프로그램 환경
학습 PC 환경은 CPU i7-12700, GPU RTX 3080, RAM 64GB가 달린 윈도우 데스크탑을 사용합니다. WSL(Window Subsystem Linux)를 통해 pytorch 1.13, pytorch-cuda 11.6 버전을 설치하여 GPU로 학습했습니다. 학습 프로그램에서 최종 결과물을 onnx 포맷의 파일로 변환하는 것까지 수행합니다. 이후 추론 프로그램에서 앞서 생성한 onnx 파일을 읽어와서 추론을 수행합니다. 다음과 같은 패키지를 사전에 받아주면 좋습니다.
패키지 명 | 버전 |
python | 3.10.14 |
pytorch | 1.13.0 |
pytorch-cuda | 11.6 |
matplotlib | 3.8.4 |
numpy | 1.24.3 |
onnx | 1.14.0 |
onnxruntime | 1.17.1 |
tqdm | 4.66.4 |
모델은 ResNet만 사용했습니다. ResNet 중에서도 레이어가 가장 얕은, ResNet-18을 중점으로 테스트했습니다. 데이터셋이 그렇게 크지도 않고 레이어도 얕은데 생각보다 학습이 생각보다 오래 걸리더군요.. 사장님 4090 사주세요...
3. 데이터 셋 준비하기
이제 데이터셋을 준비해봅시다. Kaggle에서 mask를 검색했더니 우리가 흔히 아는 마스크가 아닌, 마스킹과 관련있는 데이터들이 나오더군요. 그래서 'face mask'를 키워드로 검색해보니 이제서야 제대로 된 데이터셋들이 나옵니다. 다음 링크에 있는 데이터셋으로 선택했습니다.
Face Mask Detection ~12K Images Dataset
12K Images divided in training testing and validation directories.
www.kaggle.com
아래와 같이 Download 버튼을 눌러 받을 수 있습니다만 로그인을 해야 다운로드 가능합니다. Kaggle에 데이터셋이 다양하고 여러 대회들도 있으며 남들이 짠 코드도 볼 수 있어서 편하므로 가입을 권장드립니다.
이 데이터셋으로 선정한 이유는.. 여러 마스크 데이터셋을 봤지만 다른 데이터셋은 합성을 한 경우가 많았고, 영상 해상도가 너무 높거나 데이터수가 적은 케이스도 많았습니다. 이 데이터셋은 사이즈도 작고 파일도 1.2만개나 있고 대부분 합성이 아닌 실제 마스크를 쓴 사람의 사진 위주라 선택하게 되었습니다.
이 데이터셋을 제 프로젝트에서 사용하려면 압축해제 후에 약간 수정이 필요합니다. 업로더가 친절하게 Train, Valid, Test마다 폴더를 구분해 데이터를 나눠주었습니다. 하지만 여기서는 마스크 낀 사람/마스크 안 낀 사람으로만 구분된 데이터셋을 만들고 매 학습마다 랜덤하게 Train, Valid, Test를 나누도록 하겠습니다.
아래 사진과 같이, Validation\WithMask, Train\WithMask, Test\WithMask의 사진들을 WithMask 폴더 한 곳에, Validation\WithoutMask, Train\WithoutMask, Test\WithoutMask의 사진들을 WithoutMask 폴더 한 곳에 모아두겠습니다.
간단한 프로젝트이므로 영상에 사람 얼굴이 하나인 케이스만을 고려하고자 합니다. 여유가 된다면 사람이 여러명인 영상을 처리하는 것도 해보려고 합니다. OpenCV의 Cascade Classifier나 DeepFace 라이브러리 등을 이용해서 얼굴만 따로 떼내면 각 얼굴마다 마스크 착용 유무를 판단할 수 있을 것 같습니다.
4. 결과물 (초안)
현재까지 완성된 아웃풋입니다.
마스크를 쓰면 Great! You're wearing a mask! (확률(%))가 출력되고, 마스크를 안쓰면 Put on your mask quickly! (확률(%))가 출력됩니다. 고작 18개의 레이어로 구성된 모델일 뿐인데도 생각보다 꽤 정확했습니다. 거기다 손으로 가려도, 턱스크를 써도 마스크 착용이 아닌걸 잘 인식하네요. 시중에서 사용하기에는 더 다듬을 필요가 있겠지만 간단히 재미 용도로는 충분히 쓸만해 보였습니다.
만들고보니 아무리 첫 프로젝트라 해도 너무 허접하고 별게 없어서 WPF 공부 할 겸 UI 기능이라도 더 추가할까 고민 중 입니다;;
5. 포스팅 안내
포스팅 순서는 다음과 같이 진행됩니다.
[1] 소개 및 환경 세팅 (현재 포스팅)
[2] 학습 코드
[3] GUI 코드
[4] 결과 및 끄적끄적
다음엔 pytorch 모델 코드에 대해 포스팅하겠습니다.
'Deep Learning > 프로젝트' 카테고리의 다른 글
[3] C# WPF + Pytorch - 마스크 인식 딥러닝 프로젝트: GUI 코드 (0) | 2025.01.06 |
---|---|
[2] C# WPF + Pytorch - 마스크 인식 딥러닝 프로젝트: 학습 코드 (1) | 2025.01.06 |