[CCTVWithAI] (2021.07.19) 개발 일지 | Dlib, face_recognition 라이브러리 설치, 얼굴 위치 찾기

Hotaek Han·2021년 7월 19일
1

CCTVWithAI

목록 보기
14/25
post-thumbnail

face_recognition 라이브러리 설치

본 라이브러리는 딥러닝 기반으로 제작된 dlib의 최첨단 얼굴 인식 기능을 사용하여 구축되었습니다. 이 모델은 Labeled Faces in the Wild 기준으로 99.38%의 정확도를 가집니다.
- Face Recognition Tutorial

dlib의 face_recognition 라이브러리를 활용하여 본 프로젝트를 진행하게 될 것 같다.

설치하는 과정이 순탄치만은 않았다. 설치 과정은 아래 링크를 참고했다.

윈도우 파이썬 dlib설치


이렇게 노란색 글씨의 경고가 무수히 많이 떴지만 참고한 블로그의 글쓴이도 결국 성공했다는 말을 듣고 안심했다. 그런데..


빨간색도 괜찮나..? 싶다가 결국 실패했다.

빨간색 부분 오류에 GifAsciiTable8x8 이 부분에서 에러가 계속 발생하는 것 같아서 구글링해보니, 잘 일치하는 검색 결과는 딱 한 개 나왔다.

Dlib install errors out : error C2734: 'GifAsciiTable8x8' : 'const' object must be initialized if not 'extern' #2358

답변자 말대로 conda install dlib 명령어 뒤에 --no DLIB_GIF_SUPPORT 이것을 덧붙이니 성공했다..! 👍👍👍

역시 필요한 프로그램, 라이브러리 등등을 세팅하는게 항상 은근히 까다롭다.



face_recognition으로 얼굴 검출해보기

프로젝트에 앞서 제시된 튜토리얼을 따라해보고 있다. 이번엔 주어진 사진에서 얼굴을 찾아내어 출력하는 프로그램이다. 튜토리얼 외에 이 글을 참고했다.

▦ face_recognition으로 이미지 불러오기

image = face_recognition.load_image_file('training/JisungPark.jpg')

print(type(image))
  • load_image_file() 메소드로 박지성의 이미지를 불러왔다.
  • 변수 image의 타입을 출력해보니 numpy.ndarray이다.

▦ face_locations() 메소드 return type 확인

# Returns an array of bounding boxes of human faces in a image
face_locations = face_recognition.face_locations(image)

인자로 주어진 사진에서 얼굴을 찾아내 이를 감싸는 박스에 대한 정보를 리스트로 반환한다.
리스트는 top, right, bottom, left 순으로 이루어진 튜플로 구성된다.

print(type(face_locations))

>>> [(140, 402, 247, 294)]

▦ 검출한 얼굴 이미지를 출력

for face_location in face_locations:
    top, right, bottom, left = face_location
    
    face_image = image[top:bottom, left:right]
    
    pil_image = Image.fromarray(face_image)
    pil_image.show()

이 코드의 맨 위의 두 줄이 이해가 잘 안됐다. 파이썬 문법이 익숙하지 않다. (변수 네 개가 등호 왼쪽에..?)
그래서 face_locations의 요소를 하나씩 분해해서 top, right, bottom, left 변수에 넣어줘보고 이해했다.

상하좌우의 값을 각각의 변수에 저장한 다음엔, 맨 처음 이미지에서 얼굴 위치만 잘라서 face_image에 저장한다.

이후엔 pillow의 규격에 맞게 변환해준 다음에 출력하면 된다.

출력 결과

얼굴을 잘 잡아냈다. openCV로 출력했으면 알씨로 실행시킬 일은 없는데 좀 아쉽다.


마주한 문제점, 어려웠던 점

  • face_recognition와 pillow 라이브러리의 이미지 처리 단위가 달라서 신경써야 했다.
    face_recognition으로 불러온 이미지의 타입은 ndarray이고 이것을 pillow로 출력하려면 fromarray() 메소드로 pillow의 규격에 맞게 변환해주어야 한다. 이렇게 성공했지만, face_recognition으로 불러온 이미지를 opencv의 imshow() 메소드로 호출하는데는 실패했다.

0개의 댓글