페이지 이동경로
  • 문서>
  • 비전>
  • 개발 가이드

비전

개발 가이드

이 문서는 카카오 비전(Vision) API 구현 방법을 소개합니다.

이 문서에 포함된 기능은 [도구] > [REST API 테스트]를 통해 사용해 볼 수 있습니다.

공통사항

  • 서버에서 호출하는 경우 REST API 키를 사용해 POST로 호출합니다.
  • 모든 API는 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 포맷 또한 지원합니다.
  • 이미지의 가로와 세로 길이는 2048px 이하여야 하고, 최대 용량은 2MB 입니다.
  • image 파일을 업로드하는 경우는 Content-Type을 'multipart/form-data'로 요청해야 합니다.
  • image_url로 호출하는 경우는 Content-Type을 'application/x-www-form-urlencoded'로 요청해야 합니다.

얼굴 검출

얼굴 검출 API는 이미지 내의 얼굴을 찾아내고, 얼굴의 위치, 특징점, 각도, 성별, 나이 등을 추정해서 반환합니다. 호출 파라미터에 대한 공통 설명은 공통사항을 참고합니다.

요청이 성공하면 응답 바디에 JSON 객체로 검출된 얼굴 영역 정보를 포함합니다.

얼굴 검출 예시

Request

URL
POST /v2/vision/face/detect HTTP/1.1
Host: dapi.kakao.com
Authorization: KakaoAK ${REST_API_KEY}
Parameter
Name Type Description Required
image Binary 이미지 파일 O*
image_url String 이미지 URL O*
threshold Float 검출된 얼굴이 오검출인지를 판단하기 위해 사용하는 기준값
0 ~ 1.0 사이의 값 (기본값 0.7)
*얼굴검출의 기준값이 높으면 일부 인물은 검출하지 못할 수 있습니다. 반대로 기준값이 낮으면 인물이 아닌 영역도 얼굴로 오검출할 수 있습니다.
X

* 조건부: image/ image_url 중 하나 필수

Response

Name Type Description
result Result 얼굴 검출 결과를 담는 객체
아래 Result 항목 구성 요소 참고
rid String 요청에 대한 ID 값
Result
Name Type Description
width Integer 요청 이미지의 가로 길이
height Integer 요청 이미지의 세로 길이
faces Face[] 검출된 얼굴 정보를 담은 객체의 배열
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

FacialAttributes
Name Type Description
gender Gender 검출된 얼굴의 추정 성별
아래 gender 항목 구성 요소 참고
age Float 검출된 인물의 추정나이
Gender
  • male과 female 중 더 수치가 높은 성별을 사용합니다.
Name Type Description
male Float 검출된 얼굴의 남성 추정 값, 0 ~ 1.0 사이의 값
female Float 검출된 인물의 여성 추정 값, 0 ~ 1.0 사이의 값
FacialPoints
  • 모든 좌표는 왼쪽부터 아래로 정렬되어 있습니다.
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) 값의 배열

Sample

Request: 이미지 URL로 요청
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" 
Request: 이미지 파일로 요청
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" 
Response

상품 검출

상품 검출 API는 이미지 내에 존재하는 상품의 위치와 종류를 반환합니다. 패션 상품, 가방, 신발 등을 검출할 수 있습니다. 호출 파라미터에 대한 공통 설명은 공통사항을 참고합니다.

요청이 성공하면 응답 바디에 JSON 객체로 상품 검출 결과를 포함합니다.

상품 검출 예시

Request

URL
POST /v2/vision/product/detect HTTP/1.1
Host: dapi.kakao.com
Authorization: KakaoAK ${REST_API_KEY}
Parameter
Name Type Description Required
image Binary 이미지 파일 O*
image_url String 이미지 URL O*
threshold Float 검출 기준 값
0 ~ 1.0 사이의 값으로 기본값은 0.8
X

* 조건부: image/ image_url 중 하나 필수

Response

Name Type Description
result Result 상품 검출 결과를 담는 객체
rid String 요청에 대한 ID 값
Result
Name Type Description
width Integer 요청 이미지의 가로 길이
height Integer 요청 이미지의 세로 길이
objects Product[] 검출된 상품 정보를 담은 객체의 배열
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 상품의 이름

Sample

Request: 이미지 URL로 요청
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" 
Request: 이미지 파일로 요청
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"
Response

성인 이미지 판별

성인 이미지 판별 API는 이미지가 성인물에 해당하는지를 판별한 결과를 알려줍니다. 스팸 이미지를 필터링하는 데 사용할 수 있습니다. 호출 파라미터에 대한 공통 설명은 공통사항을 참고합니다.

결과 값은 (normal, soft, adult)의 점수를 반환합니다. softadult의 점수가 높으면 성인 이미지일 가능성이 높습니다. 모든 카테고리의 점수의 합은 1.0이 됩니다. (normal + soft + adult = 1.0)

성인 이미지 판별 예시

Request

URL

POST /v2/vision/adult/detect HTTP/1.1
Host: dapi.kakao.com
Authorization: KakaoAK ${REST_API_KEY}
Parameter
Name Type Description Required
image Binary 이미지 파일 O*
image_url String 이미지 URL O*

* 조건부: image/ image_url 중 하나 필수

Response

Name Type Description
result Result 성인 이미지 결과를 담는 객체
rid String 요청에 대한 ID 값
Result
Name Type Description
normal Float 이미지가 정상일 확률, 0 ~ 1.0 사이의 값
soft Float 이미지에 약간의 노출이 있을 확률, 주로 수영복 사진일 경우 해당, 0 ~ 1.0 사이의 값
adult Float 이미지가 노출이 많은 성인 이미지일 경우, 주로 음란물일 경우 해당, 0 ~ 1.0 사이의 값

Sample

Request: 이미지 URL로 요청
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" 
Request: 이미지 파일로 요청
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"
Response

썸네일 생성

썸네일 생성 API는 이미지 내의 콘텐츠를 바탕으로 중요한 부분을 썸네일로 생성해주는 API입니다. 요청한 width, height 비율에 따라 이미지를 잘라내어 반환합니다. 호출 파라미터에 대한 공통 설명은 공통사항을 참고합니다.

요청이 성공하면 응답 바디에 JSON 객체로 썸네일 정보를 포함합니다.

썸네일 생성 예시

Request

URL
POST /v2/vision/thumbnail/crop HTTP/1.1
Host: dapi.kakao.com
Authorization: KakaoAK ${REST_API_KEY}
Parameter
Name Type Description Required
image Binary 이미지 파일 O*
image_url String 이미지 URL O*
width Integer 이미지 가로 길이 O
height Integer 이미지 세로 길이 O

* 조건부: image/ image_url 중 하나 필수

Response

Name Type Description
thumbnail_image_url String crop한 썸네일 이미지 url

Sample

Request: 이미지 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" 
Request: 이미지 파일로 요청
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" 
Response

썸네일 검출

썸네일 검출 API는 이미지 내의 콘텐츠를 바탕으로 중요한 부분을 썸네일로 생성할 수 있게 도와주는 API입니다. 요청한 width, height 비율에 맞춰 이미지에서 잘라낼 수 있는 제안 영역을 반환합니다. 호출 파라미터에 대한 공통 설명은 공통사항을 참고합니다.

요청이 성공하면 응답 바디에 JSON 객체로 이미지 검출 결과를 포함합니다. 제안된 썸네일은 요청된 가로X세로의 비율에 해당하는 이미지의 영역입니다. 실제 썸네일을 생성할 경우는 제안 영역으로 자른 뒤에 원하는 크기로 다시 조정해야 합니다.

썸네일 검출 예시

Request

URL
POST /v2/vision/thumbnail/detect HTTP/1.1
Host: dapi.kakao.com
Authorization: KakaoAK ${REST_API_KEY}
Parameter
Name Type Description Required
image Binary 이미지 파일 O*
image_url String 이미지 URL O*
width Integer 이미지 가로 길이 O
height Integer 이미지 세로 길이 O

* 조건부: image/ image_url 중 하나 필수

Response

Name Type Description
result Result 이미지 검출 결과를 담는 객체
rid String 요청에 대한 ID 값
Result
Name Type Description
width Integer 요청 이미지의 가로 길이
height Integer 요청 이미지의 세로 길이
thumbnail Thumbnail 제안하는 영역의 좌표를 담은 객체
Thumbnail
Name Type Description
x Intger 썸네일 가로 시작 좌표
y Intger 썸네일 세로 시작 좌표
width Intger 썸네일의 가로 길이
height Intger 썸네일의 세로 길이

Sample

Request: 이미지 URL로 요청
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" 
Request: 이미지 파일로 요청
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" 
Response

멀티태그 생성

멀티태그 생성 API는 이미지 내의 콘텐츠에 대한 태그를 생성하는 API입니다. 이미지의 카테고리를 분류할 수 있도록 도움을 줍니다. 호출 파라미터에 대한 공통 설명은 공통사항을 참고합니다.

요청 성공 시 응답 바디는 JSON 객체로 검출된 태그 정보를 포함합니다.

멀티태그 생성 예시

Request

URL

POST /v2/vision/multitag/generate HTTP/1.1
Host: dapi.kakao.com
Authorization: KakaoAK ${REST_API_KEY}
Parameter
Name Type Description Required
image Binary 이미지 파일 O*
image_url String 이미지 URL O*

* 조건부: image/ image_url 중 하나 필수

Response

Name Type Description
result Result 태그 생성 결과를 담는 객체
rid String 요청에 대한 ID 값
Result
Name Description Type
label String[] 검출된 태그의 영문 목록
label_kr String[] 검출된 태그의 한글 목록

Sample

Request: 이미지 URL로 요청
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" 
Request: 이미지 파일로 요청
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" 
Response

OCR

OCR(Optical Character Recognition) API는 이미지에서 문자라고 판단되는 부분을 문자 영역으로 추출한 후, 해당 영역의 문자를 텍스트 정보로 변환시켜 주는 API 입니다. 문자 영역 인식 시, 여러 줄의 문자가 있을 경우 아래 사진과 같이 한 줄 당 하나의 문자 영역이 생성됩니다. 호출 파라미터에 대한 공통 설명은 공통사항을 참고합니다.

요청이 성공하면 응답 바디에 JSON 객체로 감지된 문자 영역과 텍스트 정보를 포함합니다.

OCR 예시

Request

URL

POST /v2/vision/text/ocr HTTP/1.1
Host: dapi.kakao.com
Authorization: KakaoAK ${REST_API_KEY}
Content-Type: multipart/form-data
Parameter
Name Type Description Required
image Binary 이미지 파일 O

Response

Name Type Description
result Result 추출한 문자 영역과 텍스트 정보
아래 results 항목 구성 요소 참고
Result
Name Type Description
boxes List<number[]> 추출한 문자 영역에 대한 x와 y 좌표(원본 이미지 기준 픽셀 좌표)
하나의 box에서 꼭지점 순서는 [[좌상단x, 좌상단y], [우상단x, 우상단y], [우하단x, 우하단y], [좌하단x, 좌하단y]]
*여기서 상단과 하단은 모니터의 위, 아래를 가리킵니다. x 좌표는 왼쪽에서 오른쪽으로 갈수록 증가하며, y 좌표는 위에서 아래로 갈수록 증가합니다.
recognition_words String[] 문자 영역에 있는 문자를 텍스트로 변경한 결과 값

Sample

Request
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" 
Response

구현 예제

간단하게 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)

썸네일 생성

이미지의 주요 부분을 선택해서 지정한 widthheight의 비율에 맞도록 썸네일을 생성해서 보여주는 예제입니다.

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)

OCR

이미지에서 문자 영역을 감지하고 문자로 추출하는 예제입니다.

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()

더보기