딥러닝/이미지처리

naver pose estimation api 사용하기

씩씩한 IT블로그 2020. 10. 2. 16:16
반응형

0. 서론

네이버 pose estimation api를 이용하여 사진속 사람의 신체 각부위의 위치를 찾는다.

 

1. application 등록

(1) 로그인후 우측위에있는 콘솔창으로 간다

 

 

 

(2) 왼쪽에 products&services로 가서 posesti mation이 있는 AI NAVER API를 누른다

 

 

 

(3) 그러면 왼쪽에 ai.naver.api가 생기고 그밑에 appication탭으로 들어간다.

들어가서 파란색바탕의 applicaiton등록 버튼을 누르고 application을 등록하면 pose estimation박스가 만들어진다.

그리고 박스안에 인증정보를 누르면 client key와 client_secret을 확인할 수 있다.

 

 

 

2. 코드

(1) 1에서 발급받은 id와 secret을 입력하고, 파일경로를 입력한다.

import os
import sys
import requests

# 발급받은 아이디와 비밀번호 
client_id = "발급받은 clinet_id"
client_secret = "발급받은 clinet_secret"

#파일경로
files = {'image': open('test.jpeg', 'rb')} #파일경로 적기

 

(2) 나머지 코드는 그냥 똑같이 치면된다.

url = "https://naveropenapi.apigw.ntruss.com/vision-pose/v1/estimate"
headers = {'X-NCP-APIGW-API-KEY-ID': client_id, 'X-NCP-APIGW-API-KEY': client_secret }
response = requests.post(url,  files=files, headers=headers)
rescode = response.status_code
if(rescode==200):
    print (response.text)
else:
    print("Error Code:" + str(rescode))

 

실행결과는 아래와 같은 형식이다.

* 사진 용량, 크기, 형식등을 잘맞춰줘야지 아니면 오류가 잘난다..

{
    "predictions": [
        {
            "0": {
                "score": 0.8141005635261536,
                "x": 0.5517241379310345,
                "y": 0.245
            },
            "1": {
                "score": 0.9288979768753052,
                "x": 0.5379310344827586,
                "y": 0.305
            },
            "2": {
                "score": 0.7301899194717407,
                "x": 0.4482758620689655,
                "y": 0.295
            },
            "3": {
                "score": 0.8133980631828308,
                "x": 0.3310344827586207,
                "y": 0.27
            },
            "4": {
                "score": 0.8456760048866272,
                "x": 0.3103448275862069,
                "y": 0.185
            },
            "5": {
                "score": 0.7346079349517822,
                "x": 0.6275862068965518,
                "y": 0.315
            },
            "6": {
                "score": 0.7499009966850281,
                "x": 0.7517241379310344,
                "y": 0.3
            },
            "7": {
                "score": 0.854416012763977,
                "x": 0.8482758620689655,
                "y": 0.23
            },
            "8": {
                "score": 0.5724149942398071,
                "x": 0.47586206896551725,
                "y": 0.54
            },
            "9": {
                "score": 0.8327369689941406,
                "x": 0.47586206896551725,
                "y": 0.725
            },
            "10": {
                "score": 0.6039261221885681,
                "x": 0.41379310344827586,
                "y": 0.895
            },
            "11": {
                "score": 0.5944526791572571,
                "x": 0.5793103448275863,
                "y": 0.545
            },
            "12": {
                "score": 0.709257960319519,
                "x": 0.5448275862068965,
                "y": 0.715
            },
            "13": {
                "score": 0.7348979711532593,
                "x": 0.5379310344827586,
                "y": 0.875
            },
            "14": {
                "score": 0.9104539752006531,
                "x": 0.5310344827586206,
                "y": 0.23
            },
            "15": {
                "score": 0.931114912033081,
                "x": 0.5724137931034483,
                "y": 0.23
            },
            "16": {
                "score": 0.7952859401702881,
                "x": 0.4896551724137931,
                "y": 0.235
            },
            "17": {
                "score": 0.3894619941711426,
                "x": 0.593103448275862,
                "y": 0.23
            }
        }
    ]
}

 

(3) json파일을 딕셔너리형태로 바꿔준다.

response_json=response.json()
response_dict=dict(response_json['predictions'][0])

 

(4) 신체부위별 키값이 있고 이를 부위 이름에 매칭시켜서 보기편하게 출력해봤다.

part_index=["코","목","오른쪽 어깨","오른쪽 팔꿈치","오른쪽 손목","왼쪽 어깨",
           "왼쪽 팔꿈치","왼쪽 손목","오른쪽 엉덩이","오른쪽 무릎","오른쪽 발목",
           "왼쪽 엉덩이","왼쪽 무릎","왼쪽 발목","오른쪽 눈","왼쪽 눈","오른쪽 귀",
           "왼쪽 귀"]
for key in response_dict:
    print(part_index[int(key)],end=" : ")
    print("%.3f, %.3f"%(response_dict[key]["x"],response_dict[key]["y"]))
코 : 0.552, 0.245
목 : 0.538, 0.305
오른쪽 어깨 : 0.448, 0.295
오른쪽 팔꿈치 : 0.331, 0.270
오른쪽 손목 : 0.310, 0.185
왼쪽 어깨 : 0.628, 0.315
왼쪽 팔꿈치 : 0.752, 0.300
왼쪽 손목 : 0.848, 0.230
오른쪽 엉덩이 : 0.476, 0.540
오른쪽 무릎 : 0.476, 0.725
오른쪽 발목 : 0.414, 0.895
왼쪽 엉덩이 : 0.579, 0.545
왼쪽 무릎 : 0.545, 0.715
왼쪽 발목 : 0.538, 0.875
오른쪽 눈 : 0.531, 0.230
왼쪽 눈 : 0.572, 0.230
오른쪽 귀 : 0.490, 0.235
왼쪽 귀 : 0.593, 0.230

 

(5) 신체부위 시각화

 

 

- 좌표는 왼쪽위가 영점으로 가로가 x축, 세로가 y축이다.

- 오른쪽으로 갈수록, 아래로 갈수록 좌표가 커진다.

- 신체부위별 키값은 빨간색으로 표시돼있다.

- 오른쪽과 왼쪽은 사진기준이 아니라 사람기준이다. 

 

반응형