저번 포스팅에 이어, 이번 포스팅에서는 이미지 인식 모델을 활용합니다.
그래서 이미지 데이터로부터 사람의 얼굴을 인식해보고, 이를 하얀색 네모박스로 처리하여 제대로 인식했는지를 확인해보겠습니다.
✔Table of Contents
Tech 84. 이미지 속에 사람이 어디 있는지 검출하자 (HOG - SVMDectector 모델)
이미지 속에 사람을 검출하는 것은 HOG 특징량으로 표현해서 검출할 수 있습니다. 앞선 포스팅에서 사용한 img01 이라는 이미지 파일로부터 검출해봅시다.
여기선 잘 만들어진 사람 인식 모델 SVMDetector를 사용하겠습니다.
[주요 메서드]
- hog = cv2.HOGDescriptor() : HOG 객체 만들기
- hog.setSVMDetector(HOGDescriptor_getDefaultPeopleDetector()) : SVMDetector 모델 지정하기
- hogParams = { } : 파라미터 지정하기
이미지에서 사람 검출하여 네모박스 처리하는 메서드
- cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) : 흑백으로 변환
- hog.detectMultiScale(객체, **hogParams) : 앞서 흑백으로 변환한 객체와 파라미터를 input으로 넣는다. 사람을 검출하고 그 위치정보를 반환한다.
- cv2.rectangle(img, pt1, pt2, color, thickness) : 검출한 사람 주위에 사각형을 그리는 메서드이다.
- pt1 : 시작점 좌표(x, y)
- pt2 : 종료점 좌표(x, y)
- color : 사각형의 색. BGR 형태로 입력한다.
- thickness : 사각형의 선 굵기.
참고
원래 색상은 RGB(Red, Green, Blue) 타입이 디폴트지만, opencv는 BGR(Blue, Green, Red)로 이미지를 로드한다.
따라서 빨간색의 경우 원래는 (255, 0, 0)으로 쓰지만 여기서는 BGR로 (0, 0, 255)로 써야 한다.
※ 참고 - RGB 색상표는 다음 링크를 참고하시면 유용합니다!
import cv2
#준비
hog = cv2.HOGDescriptor() #객체
hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector()) #모델지정
hogParams = {'winStride': (8,8), 'padding': (32,32), 'scale': 1.05, 'hitThreshold': 0, 'finalThreshold': 5} #파라미터 설정
#검출
img = cv2.imread('img/img01.jpg') #읽기
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #흑백변환
human, r = hog.detectMultiScale(gray, **hogParams) #사람 검출 - human에는 사람의 위치정보가 들어감
if (len(human)> 0): #사람으로 인식한게 1개 이상이라면
for (x, y, w, h) in human:
cv2.rectangle(img, (x, y), (x+w, y+h), (255, 255, 255), 3) #사각형을 그려! (여기서 255,255,255는 white 색)
cv2.imshow('img', img) #출력
cv2.waitKey(0)
결과를 살펴보면 SVMDectector 모델을 사용하여 사람을 인식하였고, 'human' 이라는 객체에 위치정보가 들어가 있습니다.
이 정보를 활용하여 cv2.rectangle 메서드를 활용해 사람으로 인식한 것 주위에 하얀 네모박스를 그렸습니다. (BGR 값이 (255, 255, 255)는 white 색입니다.)
사진을 보면 어떠신가요? 대체로 사람으로 잘 인식한 거 같긴 한데, 열차를 사람이라고 인식하기도 하고, 사람인데도 사람으로 인식하지 않은 경우도 있죠. 이 정도는 오차로 처리할 수 있습니다.
Tech 85. 이미지 속에 사람의 얼굴을 검출해보자 (CascadeClassifier 모델)
앞에서 살펴본 것은 '이 사진에서 사람이 어디에 있냐?' 였다면,
이번에는 '이 사진에서 사람의 얼굴만 쏙 뽑아보자' 입니다.
얼굴 검출에는 전통적으로 CascadeClassifier를 사용합니다. 이런 얼굴 검출&개인 인증과 관련한 이미지 인식 기술은 연구의 역사가 길고, 많은 라이브러리가 공개되어 있으니 참고하시면 좋을 듯 합니다!
[중요 메서드]
- cascade = cv2.CascadeClassifier(file) : CascadeClassifier 모델 지정
이미지에서 사람 얼굴 검출하기
- cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) : 흑백으로 변환하기
- cascade.detectMultiScale(객체, size) : 앞서 흑백으로 변환한 객체와 size를 input으로 넣는다. 사람의 얼굴을 검출하고 그 위치정보를 반환한다.
- cv2.rectangle(img, pt1, pt2, color, thickness) : Tech 84에서 설명한 것과 동일
여러 cv2 메서드들
- cv2.namedWindow('file', cv2.WINDOW_NORMAL_) : 'file' 이라는 이름으로 창을 생성함
- cv2.waitKey(숫자) : 직전 포스팅에서도 설명했지만, 숫자 밀리세컨(ms)초만큼 이미지 or 영상 파일을 띄운다.
- cv2.destroyAllWindows() : 모든 창 닫기
- cv2.destroyWindow('file') : 'file' 창만 닫기
import cv2
#준비
cascade_file = 'haarcascade_frontalface_alt.xml'
cascade = cv2.CascadeClassifier(cascade_file) # 정면 얼굴 인식 모델
#검출하기
img = cv2.imread('img/img02.jpg') #읽기
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #흑백변환
face_list = cascade.detectMultiScale(gray, minSize = (50,50)) #얼굴검출
for (x, y, w, h) in face_list:
color = (0, 0, 225) #색 - red
pen_w = 3 #선굵기
cv2.rectangle(img, (x, y), (x+w, y+h), color, thickness = pen_w) #정면얼굴에 사각형을 그려!
cv2.namedWindow('img', cv2.WINDOW_NORMAL)
cv2.imshow('img', img)
cv2.imwrite('temp.jpg', img) #img 에 사각형 얼굴인식 한것을 'temp' 라는 이름으로 이미지 저장
cv2.waitKey(1000)
cv2.destroyAllWindows()
Tech 84와 코드의 흐름은 비슷합니다. CascadeClassifier 모델을 사용하여 img02.jpg 이미지의 사람 얼굴을 검출합니다.
여기서 검출된 얼굴 위치정보는 'face_list'에 들어가 있으며, 이 값을 활용해 rectangle 메서드로 사각형을 그릴 수 있겠죠?
나온 결과를 imshow로 불러왔으니 큰 창으로 출력됩니다. imwrite를 사용해 이 이미지 파일을 'temp.jpg'로 저장했습니다. 저장한 결과를 보자면..
위와 같이 나오게 됩니다.
이렇게 해서 이번 포스팅에선 2가지의 얼굴 인식 모델을 사용해, 이미지에서 사람의 얼굴을 인식해보았습니다. 생각했던 것보다 어렵지는 않죠? :)
이렇게 얼굴을 인식할 뿐만 아니라 이 얼굴이 어느 쪽 방향을 보고 있는지도 알아낼 수 있습니다. 다음 포스팅은 이와 관련한 내용입니다. 다음 포스팅에서 만나요!
'Data Science > Analysis Study' 카테고리의 다른 글
Python OpenCV (4) - 동영상에서 사람 얼굴 인식하기, 타임랩스 만들기 (0) | 2022.05.14 |
---|---|
Python OpenCV (3) - 이미지에서 사람 얼굴 & 방향 인식하기 (python dlib, 안면 인식 기술) (1) | 2022.05.13 |
Python OpenCV (1) - 이미지, 동영상 데이터를 불러오고 저장하기 (0) | 2022.05.11 |
파이썬 시뮬레이션 - SNS 입소문 전파 예측하기 (4) / 파이썬 데이터 분석 실무 테크닉 100 (0) | 2022.05.05 |
파이썬 시뮬레이션 - SNS 입소문 전파 예측하기 (3) / 파이썬 데이터 분석 실무 테크닉 100 (0) | 2022.05.04 |