반원 블로그

9. Naver Developer api(2) - Clova Face Recognition, 얼굴 인식 API 본문

2018~/Python Skill Up

9. Naver Developer api(2) - Clova Face Recognition, 얼굴 인식 API

반원_SemiCircle 2019. 9. 6. 10:27

개요

  • 이미지 내의 얼굴을 분석하여 얼굴 수, 얼굴좌표(눈썹, 입꼬리 등), 추정한 감정, 추정한 나이 등의 데이터를 받아볼 수 있는 서비스
  • 참고1 : CFR 얼굴인식 요약

같이 읽으면 좋은 글

제공되는 기본 예제

  • 참고 링크
  • client_id와 client_secret에서 이전 네이버 개발자 등록 에서 발급받은 정보를 넣는다.
  • client_id와 client_secret은 내 애플리케이션 메뉴에서 확인
  • 파일명에는 로컬PC의 이미지 경로 및 파일명을 적어준다.
  • 가이드에서 주석 부분인 잘못되있으니 수정할 것
import os
import sys
import requests
client_id = "발급받은ID"
client_secret = "발급받은Secret"
url = "https://openapi.naver.com/v1/vision/face" # 얼굴감지
# url = "https://openapi.naver.com/v1/vision/celebrity" # 유명인 얼굴인식
files = {'image': open('파일명', 'rb')}
headers = {'X-Naver-Client-Id': client_id, 'X-Naver-Client-Secret': client_secret }
response = requests.post(url,  files=files, headers=headers)
rescode = response.status_code
if(rescode==200):
    print (response.text)
else:
    print("Error Code:" + rescode)

응답 데이터 상세

  • json 형태로 데이터가 구성되있다.
  • 참고

활용 예시 1

  • 여기서는 json모듈의 loads함수를 이용해 dict형으로 변환했습니다.
  • json 모듈되신 응답데이터(response) 내장 메소드인 .json()도 사용가능합니다.
import os
import sys
import requests
import json
client_id = "YOUR_CLIENT_ID"
client_secret = "YOUR_CLIENT_SECRET"
url = "https://openapi.naver.com/v1/vision/face" # 얼굴감지
# url = "https://openapi.naver.com/v1/vision/celebrity" # 유명인 얼굴인식
files = {'image': open('YOUR_FILE_NAME', 'rb')}
headers = {'X-Naver-Client-Id': client_id, 'X-Naver-Client-Secret': client_secret }
response = requests.post(url,  files=files, headers=headers)
rescode = response.status_code
if(rescode==200):
    # print (response.text)
    data = json.loads(response.text)
    faceCount = data['info']['faceCount']
    print("감지된 얼굴 수는 {}입니다.".format(faceCount))
else:
    print("Error Code:" + rescode)

활용 예시 2 + pillow패키지 crop 이용

  • 응답데이터에 있는 얼굴 좌표 정보를 이용합니다.
  • CFR로 받아오는 얼굴 좌표는 x,y,width, height입니다.
  • pillow의 crop시 사용되는 좌표는 좌상단(x1,y1) , 우하단(x2,y2)입니다.
  • 따라서 CFR에서 받은 얼굴 좌표를 crop시 필요한 좌표로 계산해야합니다.
  • 아래 예제를 실행하기 전에 파이썬 파일과 같은 위치에 result 폴더를 만들어야 합니다.
import os
import sys
import requests
import json
from pprint import pprint
from PIL import Image



client\_id = "서비스ID"  
client\_secret = "Secret키"  
url = "[https://openapi.naver.com/v1/vision/face"](https://openapi.naver.com/v1/vision/face") # 얼굴감지
# url = "[https://openapi.naver.com/v1/vision/celebrity"](https://openapi.naver.com/v1/vision/celebrity") # 유명인 얼굴인식

file_name = './images/bts1.jpg'

files = {'image': open(file_name, 'rb')}
headers = {'X-Naver-Client-Id': client_id, 'X-Naver-Client-Secret': client_secret }
response = requests.post(url,  files=files, headers=headers)
rescode = response.status_code
if(rescode==200):
    # print (response.text)
    data = json.loads(response.text)
    pprint(data)
    # faceCount = data['info']['faceCount']
    # print("감지된 얼굴 수는 {}입니다.".format(faceCount))

    #얼굴 좌표 수집하기 - ['faces'][인덱스]['roi'] -> {'height': 36, 'width': 36, 'x': 120, 'y': 91}
    faces = data['faces']

    #roi 좌표 별로 자르기
    img = Image.open(file_name)

    for index,face in enumerate(faces):
        left = face['roi']['x']
        top = face['roi']['y']
        right = left + face['roi']['width']
        bottom = top + face['roi']['height']
        box = (left,top,right,bottom)

        crop_img = img.crop(box)
        crop_img.save('./results/{}.jpg'.format(index))
    # The crop method from the Image module takes four coordinates as input.
    # The right can also be represented as (left+width)
    # and lower can be represented as (upper+height).
    # (left, upper, right, lower) = (20, 20, 100, 100)
    # Here the image "im" is cropped and assigned to new variable im_crop
    # im_crop = im.crop((left, upper, right, lower))

else:
    print("Error Code:{}".format(rescode))
Comments