Machine Learning

Machine Learning - SVM 마스크 착용 여부 검사하기

electronicprogrammer 2020. 10. 6. 07:34

데이터 출처 : www.kaggle.com/dhruvmak/face-mask-detection

 

Face Mask Classification

Classify between Face with mask and no mask

www.kaggle.com

ipynb file : github.com/sangHa0411/DataScience/blob/main/mask_Classification_SVM.ipynb

 

sangHa0411/DataScience

Contribute to sangHa0411/DataScience development by creating an account on GitHub.

github.com

 

저번에는 화장을 하였는가 하지 않았는가를 적은 수의 데이터를 데이터 증식을 통해서 CNN을 학습시키고 이를 이용해서 판별을 하였습니다.

 

이번에는 Machine Learning의 SVM을 이용해서 적은 수의 데이터에서 Image Classification 문제를 해결해보도록 해보겠습니다.

 

과정은 다음과 같습니다.

 

1) opencv를 이용해서 이미지 불러오기

2) 얼굴 검출을 통해서 얼굴 사진만을 데이터로 사용하기

3) ImageNet (ResNet50)을 이용해서 이미지에서 특성을 추출하기

4) 추출된 특성에서 주성분 분석을 통해서 Vector 만들기

5) 해당 Vector를 이용해서 SVM 만들고 학습시키기

 

 

먼저 opencv를 이용해서 이미지를 불러옵니다. 자세한 과정은 위의 github 주소에 가시면 확인하실 수 있습니다

GrayScale 이미지를 구하는 이유는 이를 이용해서 얼굴 검출에 사용하기 위해서 입니다.

 

이제 이 이미지에서 얼굴검출을 합니다.

아래는 예시 사진을 이용해서 얼굴검출을 하는 과정입니다.

얼굴을 검출하면 numpy array가 반환이 되는데 이는 왼쪽 위 X좌표 , 왼쪽 위 Y좌표 , X 길이 , Y길이로 구성이 되어있습니다.

이제 이 과정을 통해서 마스크를 착요한 사진 착용하지 않은 사진 들에 대해서 얼굴 사진을 검출합니다.

검출하는 과정에서 이미지의 크기를 (320 , 320)으로 조정합니다.

 

 

다음은 마스크를 착용한 사진입니다.

주의 할 점은 얼굴 검출하는 과정에서 마스크를 착용한 경우 얼굴 검출이 제대로 되지 않은 경우가 많았고 그 결과 이미지 데이터 갯수가 66개 밖에 되지 않았습니다.

 

 

이제 이 사진들의 특성을 추출하기 앞서서 훈련 데이터와 테스트 데이터로 분할해서 저장합니다.

 

SVM을 이용할 것이기 때문에 마스크를 착요한 사진은 1 , 마스크를 착용하지 않은 사진은 -1로 label을 설정합니다.

 

 

위 분할하는 과정에서 훈련 데이터가 마스크를 착용한 사진 a개 , 마스크를 착용하지 않은 사진 b개로 저장되어 있으니 이를 셔플해서 순서를 무작위로 재선정합니다.

 

keras에서 ResNet50을 불러옵니다. 그리고 훈련 및 테스트 데이터를 모두 numpy array로 변경합니다.

훈련 데이터 , 테스트 데이터에서 특성을 추출한 결과 아래와 같이 (320 ,320, 3) 이미지 데이터가 (10 , 10 , 2048) 이 된 것을 확인할 수 있습니다. 이를 주성분 분석을 위해서 1차원으로 변경해줍니다.

 

주성분 분석하기 위한 라이브러리를 불러옵니다.

먼저 StandardScaler를 이용해서 추출된 특성들을 전처리해줍니다.

그 이후에 조정된 특성들을 주성분 분석을 하여서 길이가 32로 된 Vector가 반환되도록 합니다.

 

이제 여기서 주성분 분석이 된 훈련 데이터로 SVM을 학습시키고 테스트 데이터에 대한 분류 결과를 구합니다.

이를 실제 정답과 비교함으로써 성능을 측정합니다.

 

전체 정확도가 98%로 매우 좋게 된 것을 확인할 수 있었습니다.

그리고 True Postive Rate 즉 마스크를 착용한 사람을 마스크 착용하였다고 판단할 확률이 97%가 되고 

False Postive Rate , 마스크를 착용하지 않았는데 마스크를 착용했다고 할 확률이 7%가 됩니다.

 

얼핏 보면 성능이 좋아보이지만 여기서는 큰 단점들이 있습니다.

 

1. 먼저 마스크를 쓴 경우 얼굴 검출이 잘 되지 않습니다.

2. 그리고 SVM에 입력하기 이전에 많은 과정이 필요합니다.

 

이러한 단점들을 상기키면서 SVM을 활용한 Image Classification 을 마쳐보겠습니다.

 

참고자료1 : gaussian37.github.io/dl-concept-One-Class-Classification-for-Images-with-Deep-features/

 

이미지 One Class Classification with Deep features

gaussian37's blog

gaussian37.github.io

참고자료2 : www.yes24.com/Product/Goods/70969329

 

파이썬 라이브러리를 활용한 머신러닝

사이킷런 핵심 개발자에게 배우는 머신러닝 이론과 구현 현업에서 머신러닝을 연구하고 인공지능 서비스를 개발하기 위해 꼭 학위를 받을 필요는 없습니다. 사이킷런(scikit-learn)과 같은 훌륭한

www.yes24.com