얼굴인식 (MS Azure Face)


아이폰 광고에서 보았던 face 인식 기술을 MS 파이썬 예제를 참조해 만들어 보았습니다.

먼저 Azure나 Machine learning 에 대해 궁금한 전반적인 사항은 이전에 올린 "음성인식" 관련 글을 참조해 주시기 바랍니다.

얼굴 인식의 기본적인 원리는 아래와 같습니다.


1. MS Azure Cognitive(인지) 기술 준비 (서비스 가입후 key 필요)

2. 분석할 이미지를 웹에 업로드 (클라우드 기반이라 로컬 이미지는 동작하지 않네요)

3. 분석할 이미지의 웹주소를 코드에 추가하고 인지 API 함수 호출

4. 클라우드 기반으로 웹 이미지 분석을 마치면, 이미지 속성 (사진에서의 얼굴영역, 나이, 머리색, 성별, 표정 등) 이 호출 함수 리턴값으로 들어옴

웹상의 이미지를 MS 머신러닝 서버에 넣으면, 분석이 나오는데 이를 결과로 받아오는 방식입니다.

얼굴 인식 알고리즘을 모르더라도, 쉽게 MS 인지 서비스를 이용해 해당 결과를 코드로 구현이 가능합니다. 참 좋은 세상입니다.

사실 얼굴인식 알고리즘은 개인 또는 기업이라도 쉽게 구현할 수준의 것이 아닙니다.


먼저 해당 코드를 실행한 결과부터 살펴보겠습니다.

첫번째로 MS 예제 코드에 링크된 여성의 사진입니다.



가운데 붉은 선으로 표시된 부분이 얼굴을 인식한 부분입니다.

코드를 작성한 후 해당 이미지의 속성을 같이 출력해 보니 다음과 같습니다.



face rectangle 정보는 이미지상에 붉은 사각형으로 표시된 얼굴 영역의 좌표를 의미합니다.
face attribute는 여성, 24세, 행복한 표정이라고 분석 결과가 나왔습니다.

우리 가족은 어떻게 나올까 싶어, 이미지를 변경해 실행해 보았습니다. ㅎㅎ


일단 4명의 인물에 대한 얼굴 영역을 정확히 인식합니다.

세부 결과는 아래와 같습니다.


저는 남성, 28세, 행복한 표정이라고 합니다. ㅋㅋㅋ

와이프는 여성 25세, 행복한 표정이네요.


코드로 만들어 보니 재미있기도 하고, A.I가 젊게 봐주니 고맙기도 합니다.


그럼, 어떻게 구현되었는지 파이썬 코드를 살펴볼까요.

import cognitive_face as CF

KEY = 'face subscription key'
# Replace with a valid subscription key (keeping the quotes in place).
CF.Key.set(KEY)

BASE_URL = 'https://koreacentral.api.cognitive.microsoft.com/face/v1.0' 
# Replace with your regional Base URL
CF.BaseUrl.set(BASE_URL)

# You can use this example JPG or replace the URL below with your own URL to a JPEG image.
img_url = 'https://raw.githubusercontent.com/Microsoft/Cognitive-Face-Windows/master/Data/detection1.jpg'
#img_url = 'myimage.jpg'

faces = CF.face.detect(img_url, False, False, "age,gender,emotion")

for i in faces:
    print(i)
    print()



# draw face rect on image
import requests
from io import BytesIO
from PIL import Image, ImageDraw


#Convert width height to a point in a rectangle
def getRectangle(faceDictionary):
    rect = faceDictionary['faceRectangle']
    left = rect['left']
    top = rect['top']
    bottom = left + rect['height']
    right = top + rect['width']
    return ((left, top), (bottom, right))

#Download the image from the url
response = requests.get(img_url)
img = Image.open(BytesIO(response.content))

#For each face returned use the face rectangle and draw a red box.
draw = ImageDraw.Draw(img)
for face in faces:
    draw.rectangle(getRectangle(face), outline='red')

#Display the image in the users default image browser.
img.show()


1번 라인은 파이썬 코드에 사용한 인지모듈을 불어오는 코드입니다.

파이썬에서 "pip install cognitive_face" 모듈을 설치해야 합니다.

3번 라인의 key는 MS Azure의 face 기술을 사용하기 위한 subscription key를 입력합니다.

7번 라인은 MS Azure face 기술을 사용할 서버의 Region (지역)을 의미합니다. Azure에 face 서비스 등록 시 해당 지역 서버가 정해지므로 차후 코드에서 에러가 난다면, 내가 등록한 서버의 지역이 맞는지 확인 해 볼 필요가 있습니다.

그 다음 12번 라인은 얼굴 분석에 사용할 이미지의 웹 주소(로컬 이미지는 안됩니다) 입니다.

15번 라인이 코드의 핵심인데 얼굴인지모듈의 detect()함수를 호출해 이미지의 주소와, 기타 정보를 입력하면 faces라는 리스트 형으로 이미지 분석 결과가 리턴됩니다.

사실 여기까지가 얼굴인식 코드의 전부입니다. 공백 포함  달랑 15줄 입니다.

나머지 15라인 이후 코드는 분석된 이미지 파일의 얼굴 영역에 붉은 사각테두리 그리는 코드입니다. ( "pip install pillow" 필요)

얼굴 인식 후 사각형 테두리 그리는 코드는 detect() 함수 호출 후 넘어온 사각형 좌표 정보에 대한 단순 그리기 코드이므로 자세한 설명은 생략하겠습니다.

다음 포스팅에서는 동일 인물의 다양한 사진을 제공하고, 같은 인물로 인식하는지 테스트 해 보려고 합니다.

사진의 밝기나 장소 등 환경 조건이 달라지더라도, 다양한 사진속 인물이 동일인임을 높은 확율로 분석해 낸다면 의미있는 본인 인증 수단으로 사용이 가능하지 않을까요?

이전 포스팅에서는 음성인식 기술(C++)을 이번에는 얼굴인식 기술(파이썬)을 코드로 구현해 보았습니다.

감사합니다.

댓글

댓글 쓰기

이 블로그의 인기 게시물

Qt Designer 설치하기

C++ 예제 (소켓 서버, 이미지, 파일전송)