Yours Ever, Data Chronicles

Python OpenCV (2) - 이미지에서 사람 얼굴 인식하기 본문

Data Science/Analysis Study

Python OpenCV (2) - 이미지에서 사람 얼굴 인식하기

Everly. 2022. 5. 12. 11:13

저번 포스팅에 이어, 이번 포스팅에서는 이미지 인식 모델을 활용합니다.

그래서 이미지 데이터로부터 사람의 얼굴을 인식해보고, 이를 하얀색 네모박스로 처리하여 제대로 인식했는지를 확인해보겠습니다.

 

✔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 색상표는 다음 링크를 참고하시면 유용합니다!

     

    256 color 색상표

    CC99FF R - 204 G - 153 B - 255

    www.n2n.pe.kr

     

    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가지의 얼굴 인식 모델을 사용해, 이미지에서 사람의 얼굴을 인식해보았습니다. 생각했던 것보다 어렵지는 않죠? :)

    이렇게 얼굴을 인식할 뿐만 아니라 이 얼굴이 어느 쪽 방향을 보고 있는지도 알아낼 수 있습니다. 다음 포스팅은 이와 관련한 내용입니다. 다음 포스팅에서 만나요!

    반응형