히스토그램으로 특정 사물을 감지하는 HOG를 배우다. (광주, 인공지능, 과학기술정보통신부, 광주광역시)
1. HOG(Histograms of Oriented Gradients) 개념
이미지의 주변 픽셀을 고려해서 색의 변화가 가장 큰쪽으로 화살표를 그리는 '그래디언트 벡터'를 픽셀마다 적용한다. 주변 픽셀과 비교했을 때 색의 변화가 별로 없는 곳은 검정색으로 칠해진다. 순간적으로 색의 변화가 생기는 곳은 연결점이 생겨서 테두리 부분만 칠해진다. 그래디언트 벡터의 크기의 행렬에서 해당 픽셀과 그 픽셀의 차이를 통해 화살표를 정의한다.
2. 얼굴 감지 실습
2 - 1. 이미지, 얼굴 감지기 불러오기
import dlib
image = cv2.imread('/content/drive/MyDrive/Colab Notebooks/Udemy/Images/people2.jpg')
# opencv를 활용할 때와 달리 파일을 보낼 필요가 없다
face_detector_hog = dlib.get_frontal_face_detector()
이미지를 OpenCV를 활용할 때처럼 cv2의 imread함수를 사용해서 이미지를 읽는다. 하지만 하르캐스케이드를 사용할 때와 달리 얼굴 감지기는 따로 파일을 불러올 필요가 없이 dlib 라이브러리에 존재한다. 따라서 dlib를 import 해줘야 한다.
2 - 2. 얼굴 감지하기
# 하르캐스캐이드를 사용할 때와 달리 이미지를 흑백으로 바꿀 필요가 없다.
# 캐스케이드 분류기보다 더 복잡한 알고리즘을 수행한다.
# (사진, 매개변수)
# 매개변수 값은 이미지의 크기를 나타낸다. OpneCV의 scaleFactor와 비슷하다.
# 높은 값일수록 작은 경계 상자가 나타난다.
detections = face_detector_hog(image, 1)
하르 캐스케이드를 사용할 때와 달리 이미지를 흑백화할 필요없이 바로 얼굴 감지기 함수에 매개변수로 이미지를 담은 변수를 대입한다. 두번째 매개변수로는 이미지의 크기? 확대 정도를 받는다. 하르 캐스케이드의 ScaleFactor와 비슷한데, 해당 매개변수값이 높을수록 크기가 작은 경계 상자가 나타난다. 그럼 사진이 확대 된다는 소리로 볼 수 있을 것 같다.
detections # rectangles는 경계상자를 의미한다. 비어있으면 감지 되지 않았단 소리
2 - 3. 감지한 얼굴 위치를 기반으로 이미지에 사각형 그리기
for face in detections:
# print(face.left())
# print(face.top())
# print(face.right())
# print(face.bottom())
l, t, r, b = face.left(), face.top(), face.right(), face.bottom()
# opneCV처럼 x축과 y축이 존재한다
# 왼쪽과 상단의 포인트를 나타낸다.
cv2.rectangle(image, (l, t), (r, b), (0, 255, 255), 2)
cv2_imshow(image)
# 하르 캐스케이드에서는 감지되지 않던 얼굴이 감지됨
감지된 모든 얼굴에 사각형을 그려주기 위해서 감지된 결과인 detections 배열에 for문을 적용한다. detections 값은 사각형의 왼쪽, 위, 오른쪽, 아래의 수치가 나오는데, 사진의 변을 기준으로 수치가 정해진다. 각 수치를 변수에 담아주기 위해서 위와 같은 과정을 거쳐서 값을 변수에 담아주고, 사각형을 그려주는 함수 retangle함수의 매개변수로 사용한다. 하르캐스케이드를 사용할 때와 비슷하다.