이 문서는 카카오 비전(Vision) API 구현 방법을 소개합니다.
이 문서에 포함된 기능은 [도구] > [REST API 테스트]를 통해 사용해 볼 수 있습니다.
POST
로 호출합니다.image
또는 image_url
중 하나의 값을 지정해야 합니다. 단, OCR API는 image
만 지원합니다.image
에 업로드되는 이미지와 image_url
에 지정되는 이미지는 png 또는 jpg 포맷만 지원합니다. 단, OCR API는 bmp, dib, jpeg, jpg, jpe, jp2, png, webp, pbm, pgm, ppm, sr, ras, tiff, tif 포맷 또한 지원합니다.image
파일을 업로드하는 경우는 Content-Type
을 'multipart/form-data'로 요청해야 합니다.image_url
로 호출하는 경우는 Content-Type
을 'application/x-www-form-urlencoded'로 요청해야 합니다.얼굴 검출 API는 이미지 내의 얼굴을 찾아내고, 얼굴의 위치, 특징점, 각도, 성별, 나이 등을 추정해서 반환합니다. 호출 파라미터에 대한 공통 설명은 공통사항을 참고합니다.
요청이 성공하면 응답 바디에 JSON
객체로 검출된 얼굴 영역 정보를 포함합니다.
POST /v2/vision/face/detect HTTP/1.1
Host: dapi.kakao.com
Authorization: KakaoAK ${REST_API_KEY}
Name | Type | Description | Required |
---|---|---|---|
image | Binary |
이미지 파일 | O* |
image_url | String |
이미지 URL | O* |
threshold | Float |
검출된 얼굴이 오검출인지를 판단하기 위해 사용하는 기준값 0 ~ 1.0 사이의 값 (기본값 0.7) *얼굴검출의 기준값이 높으면 일부 인물은 검출하지 못할 수 있습니다. 반대로 기준값이 낮으면 인물이 아닌 영역도 얼굴로 오검출할 수 있습니다. |
X |
* 조건부: image/ image_url 중 하나 필수
Name | Type | Description |
---|---|---|
result | Result |
얼굴 검출 결과를 담는 객체 아래 Result 항목 구성 요소 참고 |
rid | String |
요청에 대한 ID 값 |
Name | Type | Description |
---|---|---|
width | Integer |
요청 이미지의 가로 길이 |
height | Integer |
요청 이미지의 세로 길이 |
faces | Face[] |
검출된 얼굴 정보를 담은 객체의 배열 |
Name | Type | Description |
---|---|---|
facial_attributes | FacialAttributes |
얼굴의 성별, 나이를 담은 객체 아래 facial_attributes 항목 구성 요소 참고 |
facial_points | FacialPoints |
검출된 얼굴의 특징점들을 담은 객체, 총 68개의 특징점이 영역별로 x,y 배열에 담겨있음 아래 facial_points 항목 구성 요소 참고 |
score | Float |
검출된 얼굴의 판별 점수, threshold에서 지정한 값 이상만 검출 결과에 나옴, 0 ~ 1.0 사이의 값 |
class_idx | Integer |
판별된 객체의 검출 값이며, 현재는 0만 반환함 |
x | Float |
얼굴의 x좌표, 이미지의 가로 길이에 비례하는 0 ~ 1.0 사이의 값 |
y | Float |
얼굴의 y좌표, 이미지의 세로 길이에 비례하는 0 ~ 1.0 사이의 값 |
w | Float |
얼굴의 가로 길이, 이미지의 가로 길이에 비례하는 0 ~ 1.0 사이의 값 |
h | Float |
얼굴의 세로 길이, 이미지의 세로 길이에 비례하는 0 ~ 1.0 사이의 값 |
pitch | Radian |
얼굴의 x축 각도, 얼굴의 상하 움직임 각도를 표현 |
yaw | Radian |
얼굴의 y축 각도, 얼굴의 좌우 움직임 각도를 표현 |
roll | Radian |
얼굴의 z축 각도, 얼굴의 회전 각도를 표현 |
얼굴의 각도를 나타내는 값들인 pitch, yaw, roll의 정의는 아래 그림과 같습니다.
이미지 출처: Enhanced real-time head pose estimation system for mobile device
Name | Type | Description |
---|---|---|
gender | Gender |
검출된 얼굴의 추정 성별 아래 gender 항목 구성 요소 참고 |
age | Float |
검출된 인물의 추정나이 |
Name | Type | Description |
---|---|---|
male | Float |
검출된 얼굴의 남성 추정 값, 0 ~ 1.0 사이의 값 |
female | Float |
검출된 인물의 여성 추정 값, 0 ~ 1.0 사이의 값 |
Name | Type | Description |
---|---|---|
jaw | List<Number[]> |
검출된 턱선의 17개의 좌표 배열, 0 ~ 1.0 사이의 (x,y) 값의 배열 |
right_eyebrow | List<Number[]> |
검출된 오른쪽 눈썹의 5개의 좌표 배열, 0 ~ 1.0 사이의 (x,y) 값의 배열 |
left_eyebrow | List<Number[]> |
검출된 왼쪽 눈썹의 5개의 좌표 배열, 0 ~ 1.0 사이의 (x,y) 값의 배열 |
nose | List<Number[]> |
검출된 코의 9개의 좌표 배열, 0 ~ 1.0 사이의 (x,y) 값의 배열 |
right_eye | List<Number[]> |
검출된 오른쪽 눈의 6개의 좌표 배열, 0 ~ 1.0 사이의 (x,y) 값의 배열 |
left_eye | List<Number[]> |
검출된 왼쪽 눈의 6개의 좌표 배열, 0 ~ 1.0 사이의 (x,y) 값의 배열 |
lip | List<Number[]> |
검출된 입술의 20개의 좌표 배열, 0 ~ 1.0 사이의 (x,y) 값의 배열 |
curl -v -X POST "https://dapi.kakao.com/v2/vision/face/detect" \
-H "Content-Type: application/x-www-form-urlencoded" \
-H "Authorization: KakaoAK ${REST_API_KEY}" \
--data-urlencode "image_url=https://t1.daumcdn.net/alvolo/_vision/openapi/r2/images/01.jpg"
curl -v -X POST "https://dapi.kakao.com/v2/vision/face/detect" \
-H "Content-Type: multipart/form-data" \
-H "Authorization: KakaoAK ${REST_API_KEY}" \
-F "image=@sample_face.jpg"
상품 검출 API는 이미지 내에 존재하는 상품의 위치와 종류를 반환합니다. 패션 상품, 가방, 신발 등을 검출할 수 있습니다. 호출 파라미터에 대한 공통 설명은 공통사항을 참고합니다.
요청이 성공하면 응답 바디에 JSON
객체로 상품 검출 결과를 포함합니다.
POST /v2/vision/product/detect HTTP/1.1
Host: dapi.kakao.com
Authorization: KakaoAK ${REST_API_KEY}
Name | Type | Description | Required |
---|---|---|---|
image | Binary |
이미지 파일 | O* |
image_url | String |
이미지 URL | O* |
threshold | Float |
검출 기준 값 0 ~ 1.0 사이의 값으로 기본값은 0.8 |
X |
* 조건부: image/ image_url 중 하나 필수
Name | Type | Description |
---|---|---|
result | Result |
상품 검출 결과를 담는 객체 |
rid | String |
요청에 대한 ID 값 |
Name | Type | Description |
---|---|---|
width | Integer |
요청 이미지의 가로 길이 |
height | Integer |
요청 이미지의 세로 길이 |
objects | Product[] |
검출된 상품 정보를 담은 객체의 배열 |
Name | Type | Description |
---|---|---|
x1 | Float |
검출된 상품영역 박스의 좌상단 x좌표, 이미지의 가로 길이에 비례하는 0 ~ 1.0 사이의 값 |
y1 | Float |
검출된 상품영역 박스의 좌상단 y좌표, 이미지의 세로 길이에 비례하는 0 ~ 1.0 사이의 값 |
x2 | Float |
검출된 상품영역 박스의 우하단 x좌표, 이미지의 가로 길이에 비례하는 0 ~ 1.0 사이의 값 |
y2 | Float |
검출된 상품영역 박스의 우하단 y좌표, 이미지의 세로 길이에 비례하는 0 ~ 1.0 사이의 값 |
class | String |
상품의 이름 |
curl -v -X POST "https://dapi.kakao.com/v2/vision/product/detect" \
-H "Content-Type: application/x-www-form-urlencoded" \
-H "Authorization: KakaoAK ${REST_API_KEY}" \
--data-urlencode "image_url=https://t1.daumcdn.net/alvolo/_vision/openapi/r2/images/06.jpg"
curl -v -X POST "https://dapi.kakao.com/v2/vision/product/detect" \
-H "Content-Type: multipart/form-data" \
-H "Authorization: KakaoAK ${REST_API_KEY}" \
-F "image=@sample_product.jpg"
성인 이미지 판별 API는 이미지가 성인물에 해당하는지를 판별한 결과를 알려줍니다. 스팸 이미지를 필터링하는 데 사용할 수 있습니다. 호출 파라미터에 대한 공통 설명은 공통사항을 참고합니다.
결과 값은 (normal
, soft
, adult
)의 점수를 반환합니다. soft
나 adult
의 점수가 높으면 성인 이미지일 가능성이 높습니다. 모든 카테고리의 점수의 합은 1.0이 됩니다. (normal
+ soft
+ adult
= 1.0)
POST /v2/vision/adult/detect HTTP/1.1
Host: dapi.kakao.com
Authorization: KakaoAK ${REST_API_KEY}
Name | Type | Description | Required |
---|---|---|---|
image | Binary |
이미지 파일 | O* |
image_url | String |
이미지 URL | O* |
* 조건부: image/ image_url 중 하나 필수
Name | Type | Description |
---|---|---|
result | Result |
성인 이미지 결과를 담는 객체 |
rid | String |
요청에 대한 ID 값 |
Name | Type | Description |
---|---|---|
normal | Float |
이미지가 정상일 확률, 0 ~ 1.0 사이의 값 |
soft | Float |
이미지에 약간의 노출이 있을 확률, 주로 수영복 사진일 경우 해당, 0 ~ 1.0 사이의 값 |
adult | Float |
이미지가 노출이 많은 성인 이미지일 경우, 주로 음란물일 경우 해당, 0 ~ 1.0 사이의 값 |
curl -v -X POST "https://dapi.kakao.com/v2/vision/adult/detect" \
-H "Content-Type: application/x-www-form-urlencoded" \
-H "Authorization: KakaoAK ${REST_API_KEY}" \
--data-urlencode "image_url=https://t1.daumcdn.net/alvolo/_vision/openapi/r2/images/09.jpg"
curl -v -X POST "https://dapi.kakao.com/v2/vision/adult/detect" \
-H "Content-Type: multipart/form-data" \
-H "Authorization: KakaoAK ${REST_API_KEY}" \
-F "image=@sample_adult.jpg"
썸네일 생성 API는 이미지 내의 콘텐츠를 바탕으로 중요한 부분을 썸네일로 생성해주는 API입니다. 요청한 width, height 비율에 따라 이미지를 잘라내어 반환합니다. 호출 파라미터에 대한 공통 설명은 공통사항을 참고합니다.
요청이 성공하면 응답 바디에 JSON
객체로 썸네일 정보를 포함합니다.
POST /v2/vision/thumbnail/crop HTTP/1.1
Host: dapi.kakao.com
Authorization: KakaoAK ${REST_API_KEY}
Name | Type | Description | Required |
---|---|---|---|
image | Binary |
이미지 파일 | O* |
image_url | String |
이미지 URL | O* |
width | Integer |
이미지 가로 길이 | O |
height | Integer |
이미지 세로 길이 | O |
* 조건부: image/ image_url 중 하나 필수
Name | Type | Description |
---|---|---|
thumbnail_image_url | String |
crop한 썸네일 이미지 url |
curl -v -X POST "https://dapi.kakao.com/v2/vision/thumbnail/crop" \
-H "Content-Type: application/x-www-form-urlencoded" \
-H "Authorization: KakaoAK ${REST_API_KEY}" \
--data-urlencode "image_url=https://t1.daumcdn.net/alvolo/_vision/openapi/r2/images/07.jpg"
-d "width=200" \
-d "height=200"
curl -v -X POST "https://dapi.kakao.com/v2/vision/thumbnail/crop" \
-H "Content-Type: multipart/form-data" \
-H "Authorization: KakaoAK ${REST_API_KEY}" \
-F "image=@sample_thumbnail.jpg" \
-F "width=200" \
-F "height=200"
썸네일 검출 API는 이미지 내의 콘텐츠를 바탕으로 중요한 부분을 썸네일로 생성할 수 있게 도와주는 API입니다. 요청한 width
, height
비율에 맞춰 이미지에서 잘라낼 수 있는 제안 영역을 반환합니다. 호출 파라미터에 대한 공통 설명은 공통사항을 참고합니다.
요청이 성공하면 응답 바디에 JSON
객체로 이미지 검출 결과를 포함합니다. 제안된 썸네일은 요청된 가로X세로의 비율에 해당하는 이미지의 영역입니다. 실제 썸네일을 생성할 경우는 제안 영역으로 자른 뒤에 원하는 크기로 다시 조정해야 합니다.
POST /v2/vision/thumbnail/detect HTTP/1.1
Host: dapi.kakao.com
Authorization: KakaoAK ${REST_API_KEY}
Name | Type | Description | Required |
---|---|---|---|
image | Binary |
이미지 파일 | O* |
image_url | String |
이미지 URL | O* |
width | Integer |
이미지 가로 길이 | O |
height | Integer |
이미지 세로 길이 | O |
* 조건부: image/ image_url 중 하나 필수
Name | Type | Description |
---|---|---|
result | Result |
이미지 검출 결과를 담는 객체 |
rid | String |
요청에 대한 ID 값 |
Name | Type | Description |
---|---|---|
width | Integer |
요청 이미지의 가로 길이 |
height | Integer |
요청 이미지의 세로 길이 |
thumbnail | Thumbnail |
제안하는 영역의 좌표를 담은 객체 |
Name | Type | Description |
---|---|---|
x | Intger |
썸네일 가로 시작 좌표 |
y | Intger |
썸네일 세로 시작 좌표 |
width | Intger |
썸네일의 가로 길이 |
height | Intger |
썸네일의 세로 길이 |
curl -v -X POST "https://dapi.kakao.com/v2/vision/thumbnail/detect" \
-H "Content-Type: application/x-www-form-urlencoded" \
-H "Authorization: KakaoAK ${REST_API_KEY}" \
--data-urlencode "image_url=https://t1.daumcdn.net/alvolo/_vision/openapi/r2/images/07.jpg" \
-d "width=200" \
-d "height=200"
curl -v -X POST "https://dapi.kakao.com/v2/vision/thumbnail/detect" \
-H "Content-Type: multipart/form-data" \
-H "Authorization: KakaoAK ${REST_API_KEY}" \
-F "image=@sample_thumbnail.jpg" \
-F "width=200" \
-F "height=200"
멀티태그 생성 API는 이미지 내의 콘텐츠에 대한 태그를 생성하는 API입니다. 이미지의 카테고리를 분류할 수 있도록 도움을 줍니다. 호출 파라미터에 대한 공통 설명은 공통사항을 참고합니다.
요청 성공 시 응답 바디는 JSON
객체로 검출된 태그 정보를 포함합니다.
POST /v2/vision/multitag/generate HTTP/1.1
Host: dapi.kakao.com
Authorization: KakaoAK ${REST_API_KEY}
Name | Type | Description | Required |
---|---|---|---|
image | Binary |
이미지 파일 | O* |
image_url | String |
이미지 URL | O* |
* 조건부: image/ image_url 중 하나 필수
Name | Type | Description |
---|---|---|
result | Result |
태그 생성 결과를 담는 객체 |
rid | String |
요청에 대한 ID 값 |
Name | Description | Type |
---|---|---|
label | String[] |
검출된 태그의 영문 목록 |
label_kr | String[] |
검출된 태그의 한글 목록 |
curl -v -X POST "https://dapi.kakao.com/v2/vision/multitag/generate" \
-H "Content-Type: application/x-www-form-urlencoded" \
-H "Authorization: KakaoAK ${REST_API_KEY}" \
--data-urlencode "image_url=https://t1.daumcdn.net/alvolo/_vision/openapi/r2/images/08.jpg"
curl -v -X POST "https://dapi.kakao.com/v2/vision/multitag/generate" \
-H "Content-Type: multipart/form-data" \
-H "Authorization: KakaoAK ${REST_API_KEY}" \
-F "image=@sample_tag.jpg"
OCR(Optical Character Recognition) API는 이미지에서 문자라고 판단되는 부분을 문자 영역으로 추출한 후, 해당 영역의 문자를 텍스트 정보로 변환시켜 주는 API 입니다. 문자 영역 인식 시, 여러 줄의 문자가 있을 경우 아래 사진과 같이 한 줄 당 하나의 문자 영역이 생성됩니다. 호출 파라미터에 대한 공통 설명은 공통사항을 참고합니다.
요청이 성공하면 응답 바디에 JSON
객체로 감지된 문자 영역과 텍스트 정보를 포함합니다.
POST /v2/vision/text/ocr HTTP/1.1
Host: dapi.kakao.com
Authorization: KakaoAK ${REST_API_KEY}
Content-Type: multipart/form-data
Name | Type | Description | Required |
---|---|---|---|
image | Binary |
이미지 파일 | O |
Name | Type | Description |
---|---|---|
result | Result |
추출한 문자 영역과 텍스트 정보 아래 results 항목 구성 요소 참고 |
Name | Type | Description |
---|---|---|
boxes | List<number[]> |
추출한 문자 영역에 대한 x와 y 좌표(원본 이미지 기준 픽셀 좌표) 하나의 box에서 꼭지점 순서는 [[좌상단x, 좌상단y], [우상단x, 우상단y], [우하단x, 우하단y], [좌하단x, 좌하단y]] *여기서 상단과 하단은 모니터의 위, 아래를 가리킵니다. x 좌표는 왼쪽에서 오른쪽으로 갈수록 증가하며, y 좌표는 위에서 아래로 갈수록 증가합니다. |
recognition_words | String[] |
문자 영역에 있는 문자를 텍스트로 변경한 결과 값 |
curl -v -X POST "https://dapi.kakao.com/v2/vision/text/ocr" \
-H "Content-Type: multipart/form-data" \
-H "Authorization: KakaoAK ${REST_API_KEY}" \
-F "image=@sample.jpg"
간단하게 Python을 이용해 비전 API를 활용할 수 있는 예제입니다. Python 버전은 2.7 또는 3.6 이상을 권장합니다. 설치가 필요한 Python 모듈의 요구 사양은 아래와 같습니다.
requests==2.14.2
Pillow==5.0.0
이미지에서 얼굴을 찾아내고, 찾아낸 얼굴의 사각형 영역에 모자이크 처리하는 예제입니다.
import sys
import argparse
import requests
from PIL import Image, ImageFilter
API_URL = 'https://dapi.kakao.com/v2/vision/face/detect'
MYAPP_KEY = 'YOUR_APP_KEY'
def detect_face(filename):
headers = {'Authorization': 'KakaoAK {}'.format(MYAPP_KEY)}
try:
files = { 'image' : open(filename, 'rb')}
resp = requests.post(API_URL, headers=headers, files=files)
resp.raise_for_status()
return resp.json()
except Exception as e:
print(str(e))
sys.exit(0)
def mosaic(filename, detection_result):
image = Image.open(filename)
for face in detection_result['result']['faces']:
x = int(face['x']*image.width)
w = int(face['w']*image.width)
y = int(face['y']*image.height)
h = int(face['h']*image.height)
box = image.crop((x,y,x+w, y+h))
box = box.resize((20,20), Image.NEAREST).resize((w,h), Image.NEAREST)
image.paste(box, (x,y,x+w, y+h))
return image
if __name__ == "__main__":
parser = argparse.ArgumentParser(description='Mosaic faces.')
parser.add_argument('image_file', type=str, nargs='?', default="./images/05.jpg",
help='image file to hide faces')
args = parser.parse_args()
detection_result = detect_face(args.image_file)
image = mosaic(args.image_file, detection_result)
image.show()
이미지로부터 상품 영역을 사각형으로 검출하고 검출된 상품 이름을 보여주는 예제입니다.
import sys
import argparse
import requests
from PIL import Image, ImageDraw, ImageFont
from io import BytesIO
API_URL = 'https://dapi.kakao.com/v2/vision/product/detect'
MYAPP_KEY = 'YOUR_APP_KEY'
def detect_product(image_url):
headers = {'Authorization': 'KakaoAK {}'.format(MYAPP_KEY)}
try:
data = { 'image_url' : image_url}
resp = requests.post(API_URL, headers=headers, data=data)
resp.raise_for_status()
return resp.json()
except Exception as e:
print(str(e))
sys.exit(0)
def show_products(image_url, detection_result):
try:
image_resp = requests.get(image_url)
image_resp.raise_for_status()
file_jpgdata = BytesIO(image_resp.content)
image = Image.open(file_jpgdata)
except Exception as e:
print(str(e))
sys.exit(0)
draw = ImageDraw.Draw(image)
for obj in detection_result['result']['objects']:
x1 = int(obj['x1']*image.width)
y1 = int(obj['y1']*image.height)
x2 = int(obj['x2']*image.width)
y2 = int(obj['y2']*image.height)
draw.rectangle([(x1,y1), (x2, y2)], fill=None, outline=(255,0,0,255))
draw.text((x1+5,y1+5), obj['class'], (255,0,0))
del draw
return image
if __name__ == "__main__":
parser = argparse.ArgumentParser(description='Detect Products.')
parser.add_argument('image_url', type=str, nargs='?',
default="http://t1.daumcdn.net/alvolo/_vision/openapi/r2/images/06.jpg",
help='image url to show product\'s rect')
args = parser.parse_args()
detection_result = detect_product(args.image_url)
image = show_products(args.image_url, detection_result)
image.show()
성인 이미지나 노출된 이미지 여부를 판단하여 점수로 보여주는 예제입니다.
import sys
import argparse
import requests
from PIL import Image, ImageDraw, ImageFont
from io import BytesIO
API_URL = 'https://dapi.kakao.com/v2/vision/adult/detect'
MYAPP_KEY = 'YOUR_APP_KEY'
def detect_adult(image_url):
headers = {'Authorization': 'KakaoAK {}'.format(MYAPP_KEY)}
try:
data = { 'image_url' : image_url}
resp = requests.post(API_URL, headers=headers, data=data)
resp.raise_for_status()
result = resp.json()['result']
if result['adult'] > result['normal'] and result['adult'] > result['soft']:
print("성인 이미지일 확률이 {}% 입니다.".format(float(result['adult'])*100)
elif result['soft'] > result['normal'] and result['soft'] > result['adult']:
print("노출이 포함된 이미지일 확률이 {}% 입니다.".format(float(result['soft'])*100)
else :
print("일반적인 이미지일 확률이 {}% 입니다.".format(float(result['normal'])*100
except Exception as e:
print(str(e))
sys.exit(0)
if __name__ == "__main__":
parser = argparse.ArgumentParser(description='Classify adult image.')
parser.add_argument('image_url', type=str, nargs='?',
default="http://t1.daumcdn.net/alvolo/_vision/openapi/r2/images/10.jpg",
help='image url to classify')
args = parser.parse_args()
detect_adult(args.image_url)
이미지의 주요 부분을 선택해서 지정한 width
와 height
의 비율에 맞도록 썸네일을 생성해서 보여주는 예제입니다.
import sys
import argparse
import requests
from PIL import Image, ImageFilter
API_URL = 'https://dapi.kakao.com/v2/vision/thumbnail/detect'
MYAPP_KEY = 'YOUR_APP_KEY'
def detect_thumbnail(filename, width, height):
headers = {'Authorization': 'KakaoAK {}'.format(MYAPP_KEY)}
try:
files = { 'image' : open(filename, 'rb')}
params = {'width': width, 'height': height}
resp = requests.post(API_URL, headers=headers, data=params, files=files)
resp.raise_for_status()
return resp.json()
except Exception as e:
print(str(e))
sys.exit(0)
def show_thumbnail(filename, detection_result, width, height):
image = Image.open(filename)
rect = detection_result['result']['thumbnail']
thumbnail = image.crop((rect['x'], rect['y'], rect['x'] + rect['width'], rect['y'] + rect['height']))
thumbnail = thumbnail.resize((width, height))
return thumbnail
if __name__ == "__main__":
parser = argparse.ArgumentParser(description='Make a thumbnail.')
parser.add_argument('image_file', type=str, nargs='?', default="./images/07.jpg",
help='image file to make a thumbnail')
parser.add_argument('width', type=int, nargs='?', default=150,
help='thumbnail width')
parser.add_argument('height', type=int, nargs='?', default=200,
help='thumbnail height')
args = parser.parse_args()
detection_result = detect_thumbnail(args.image_file, args.width, args.height)
image = show_thumbnail(args.image_file, detection_result, args.width, args.height)
image.show()
이미지를 대표하는 태그를 추출해서 출력하는 예제입니다.
import sys
import argparse
import requests
from PIL import Image, ImageDraw, ImageFont
from io import BytesIO
API_URL = 'https://dapi.kakao.com/v2/vision/multitag/generate'
MYAPP_KEY = 'YOUR_APP_KEY'
def generate_tag(image_url):
headers = {'Authorization': 'KakaoAK {}'.format(MYAPP_KEY)}
try:
data = { 'image_url' : image_url}
resp = requests.post(API_URL, headers=headers, data=data)
resp.raise_for_status()
result = resp.json()['result']
if len(result['label_kr']) > 0:
if type(result['label_kr'][0]) != str:
result['label_kr'] = map(lambda x: str(x.encode("utf-8")), result['label_kr'])
print("이미지를 대표하는 태그는 \"{}\"입니다.".format(','.join(result['label_kr'])))
else:
print("이미지로부터 태그를 생성하지 못했습니다.")
except Exception as e:
print(str(e))
sys.exit(0)
if __name__ == "__main__":
parser = argparse.ArgumentParser(description='Classify Tags')
parser.add_argument('image_url', type=str, nargs='?',
default="http://t1.daumcdn.net/alvolo/_vision/openapi/r2/images/08.jpg",
help='image url to classify')
args = parser.parse_args()
generate_tag(args.image_url)
이미지에서 문자 영역을 감지하고 문자로 추출하는 예제입니다.
import json
import cv2
import requests
import sys
LIMIT_PX = 1024
LIMIT_BYTE = 1024*1024 # 1MB
LIMIT_BOX = 40
def kakao_ocr_resize(image_path: str):
"""
ocr detect/recognize api helper
ocr api의 제약사항이 넘어서는 이미지는 요청 이전에 전처리가 필요.
pixel 제약사항 초과: resize
용량 제약사항 초과 : 다른 포맷으로 압축, 이미지 분할 등의 처리 필요. (예제에서 제공하지 않음)
:param image_path: 이미지파일 경로
:return:
"""
image = cv2.imread(image_path)
height, width, _ = image.shape
if LIMIT_PX < height or LIMIT_PX < width:
ratio = float(LIMIT_PX) / max(height, width)
image = cv2.resize(image, None, fx=ratio, fy=ratio)
height, width, _ = height, width, _ = image.shape
# api 사용전에 이미지가 resize된 경우, recognize시 resize된 결과를 사용해야함.
image_path = "{}_resized.jpg".format(image_path)
cv2.imwrite(image_path, image)
return image_path
return None
def kakao_ocr(image_path: str, appkey: str):
"""
OCR api request example
:param image_path: 이미지파일 경로
:param appkey: 카카오 앱 REST API 키
"""
API_URL = 'https://dapi.kakao.com/v2/vision/text/ocr'
headers = {'Authorization': 'KakaoAK {}'.format(appkey)}
image = cv2.imread(image_path)
jpeg_image = cv2.imencode(".jpg", image)[1]
data = jpeg_image.tobytes()
return requests.post(API_URL, headers=headers, files={"image": data})
def main():
if len(sys.argv) != 3:
print("Please run with args: $ python example.py /path/to/image appkey")
image_path, appkey = sys.argv[1], sys.argv[2]
resize_impath = kakao_ocr_resize(image_path)
if resize_impath is not None:
image_path = resize_impath
print("원본 대신 리사이즈된 이미지를 사용합니다.")
output = kakao_ocr(image_path, appkey).json()
print("[OCR] output:\n{}\n".format(json.dumps(output, sort_keys=True, indent=2)))
if __name__ == "__main__":
main()