티스토리 뷰
종설을 가상 안경 피팅룸이라는 주제로 하게 되었는데 얼굴 검출과 눈 검출을 해야 합니다.
그래서 머신러닝과 관련된 다양한 알고리즘을 지원하고 있는 OpenCV를 사용하기로 했습니다.
OpenCV에 있는 것중 HOG, haar feature를 고민 했지만 HOG는 https://darkpgmr.tistory.com/116에 나오는 특징을 보면
HOG는 밝이에 덜 민감하고 물체의 실루엣 정보를 이용하며 물체의 형태변화가 심하지 않고 내부 패턴이 단순하며 물체의 윤곽선으로 물체를 식별할 수 있는 경우 적합
그러나 haar feature의 특징을 보면 명암을 토대로 분류를 하기 때문에 사람 얼굴 검출에 의미있는 feature라고 합니다.
그래서 haar feature을 사용한 캐스케이드를 사용하게 되었습니다.
캐스케이드 분류기
출처: https://blog.naver.com/dic1224/220989033563
- Viola - Jones 얼굴 검출기
- Haar-like(유사 하르) 특징 사용 https://en.wikipedia.org/wiki/Haar-like_feature
- 특정 위치에서 인접한 직사각형 영역을 고려하고 각 영역의 픽셀 강도를 합산하고 합계간의 차이를 계산
- => 사각형 필터(흰색 +검정색)를 이용해서 흰색 사각형 영역 픽셀 합 - 검정색 사각형 영역 픽셀 값(명암)을 파악하여 특징 인지하는 것
- AdaBoost(Adaptive + Boosting)라는 알고리즘(ML)을 사용합니다.
- Boosting: 예측 성능이 낮은 weak classifier(약한 분류기)들을 사용하여 좀 더 좋은 성능을 보이는 하나의 strong classifier(강한 분류기)를 만드는 법
- AdaBoost: weak classifier들이 상호보완 하도록 순차적으로 학습한 후 이들을 조합하여 strong classifier의 성능 향상 https://blog.naver.com/dic1224/220989033563
과정
https://www.youtube.com/watch?v=hPCTwxF0qf4
- 얼굴 영상 & 얼굴이 아닌 영상 학습
- 얼굴 아닌 것을 빠르게 걸러낸다 + 얼굴 검출(Haar-like) => 반복
Code
https://github.com/opencv/opencv/tree/master/data/haarcascades
여기 에서 xml 파일 다운받아야 합니다 :) + 경로 설정이 중요합니다.
import sys
import numpy as np
import cv2
cam = cv2.VideoCapture(0)
w = int(cam.get(cv2.CAP_PROP_FRAME_WIDTH)) #기본 카메라 넓이
h = int(cam.get(cv2.CAP_PROP_FRAME_HEIGHT)) #기본 카메라 높이
# 객체 생성 및 학습 데이터 불러오기
#얼굴 검출
face_classifier = cv2.CascadeClassifier('.\haarcascade_frontalface_alt2.xml')
#눈 검출
eye_classifier = cv2.CascadeClassifier('.\haarcascade_eye.xml')
while True:
#비디오의 한 프레임씩 읽는다.
#제대로 읽으면 ret는 True, frame에는 읽은 프레임이 나온다.
ret, frame = cam.read()
# 멀티 스케일 객체 검출 함수
faces = face_classifier.detectMultiScale(frame, minSize=(100, 100), maxSize=(400, 400))
# 영상 받아오기
for (x, y, w, h) in faces:
# 얼굴 빨간색 사각형 그리기
cv2.rectangle(frame, (x, y, w, h), (255, 0, 255), 2)
#눈 검출
face_half = frame[y:y + h // 2, x:x + w] #위 화면에서만 (빨리 찾기 위함)
eyes = eye_classifier.detectMultiScale(face_half)
for (ex, ey, ew, eh) in eyes:
# 눈 파란색 사각형 그리기
cv2.rectangle(face_half, (ex, ey, ew, eh), (255, 0, 0), 2)
cv2.imshow('IT42', frame)
if cv2.waitKey(1) == 27:
break
cam.release()
cv2.destroyAllWindows()
반응형
'활동 > ETC' 카테고리의 다른 글
우테코 Cypress 맛보기, 계산기 미션 (0) | 2021.10.16 |
---|---|
우테코 프리코스 하면서.. (0) | 2021.09.06 |
얼마나 공부하고 있니 ?? (0) | 2020.11.15 |
DSC Core member (2) | 2020.09.30 |
kakao Coding Test (0) | 2020.09.17 |
공지사항
최근에 올라온 글