본문 바로가기

Development/OCR

Naver CLOVA AI - OCR 사용하기 (2) - General 도메인

728x90
반응형

출처: https://clova.ai/m/ko/aiproducts

 

이전 포스트에 이어 이번에는 General 도메인을 이용, 실제 이미지에서 텍스트를 읽어오는 과정을 서술한다.

이전 포스트는 아래 링크를 참고하기 바란다.

 

[Development/OCR] - Naver CLOVA AI - OCR 사용하기 (1) - NCP 가입하기

 

Naver CLOVA AI - OCR 사용하기 (1) - NCP 가입하기

이번에는 CLOVA OCR을 사용해 보고자 한다. Google Cloud Vision API를 이용한 OCR은 아래 이전 포스팅을 참고하기 바란다. 2021.04.07 - [Development/Machine Learning] - Google Cloud Vision API - OCR 사용..

davelogs.tistory.com

 


1. 도메인 생성

적당한 도메인 이름과 코드를 넣어 General 도메인을 생성한다.

 

 

다시 한번 언급하자면, 각 도메인의 차이점은 다음과 같다.

 

  • General 도메인 : 입력 이미지에서 텍스트만 추출하는 Text OCR
  • Template 도메인: 입력 이미지에서 판독할 영역을 직접 지정해 영역에 포함된 텍스트만 추출

2. API 생성

 

 

생성된 도메인의 '동작' 컬럼에서 'Text OCR' 을 누르면 다음과 같은 화면이 나온다.

 

 

생성을 눌러 'Secret Key' 를 발급받고, 이어서 'APIGW 자동연동' 을 클릭하면 다음과 같은 화면이 나온다.

(API Gateway 이용 신청이 되어 있어야 한다는 팝업이 나오는데, 우린 이미 이용 신청을 했으니 '확인' 을 누른다)

 

 

이렇게 API 생성을 마무리했다.

 

728x90

 

3. API 사용

 

이제 생성된 API를 이용해 Python으로 샘플코드를 작성, 테스트한다.

먼저 아래 링크의 'API 참조서'에서 Python 코드 부분으로 이동한다.

 

apidocs.ncloud.com/ko/ai-application-service/ocr/ocr/

 

API 참조서 - HOME

쿠키 제공 동의 당사는 고객님의 브라우징 기반 정보를 바탕으로 관련 정보 및 광고 제공을 위하여 지식 기반 쿠키를 사용합니다.

api.ncloud-docs.com

 

 

위 코드와 함께 Request JSON 예시도 함께 확인한다.

 

 

아래는 읽어온 json 형식의 결과를 json 파일로 저장하는 것까지 구현한 샘플코드이다.

 

import requests
import uuid
import time
import json

api_url = 'YOUR_API_URL'
secret_key = 'YOUR_SECRET_KEY'

image_file = 'input/picture1.png'
output_file = 'output/output1.json'

request_json = {
    'images': [
        {
            'format': 'png',
            'name': 'demo'
        }
    ],
    'requestId': str(uuid.uuid4()),
    'version': 'V2',
    'timestamp': int(round(time.time() * 1000))
}

payload = {'message': json.dumps(request_json).encode('UTF-8')}
files = [
  ('file', open(image_file,'rb'))
]
headers = {
  'X-OCR-SECRET': secret_key
}

response = requests.request("POST", api_url, headers=headers, data = payload, files = files)

res = json.loads(response.text.encode('utf8'))
print(res)

with open(output_file, 'w', encoding='utf-8') as outfile:
    json.dump(res, outfile, indent=4, ensure_ascii=False)

 

위 코드에서 사용된 입력 이미지와 결과 파일은 다음과 같다.

 

입력이미지

 

너무 길어서 중간 부분부터 생략하긴 했지만, 나름 정확하게 인식하는 것을 볼 수 있다.

 

{
    "version": "V2",
    "requestId": "dcda1db5-7a19-41bb-8a77-dbb2e95a5050",
    "timestamp": 1617947318461,
    "images": [
        {
            "uid": "33894645ee8e4b8094fe309e6efd30a2",
            "name": "demo",
            "inferResult": "SUCCESS",
            "message": "SUCCESS",
            "validationResult": {
                "result": "NO_REQUESTED"
            },
            "fields": [
                {
                    "valueType": "ALL",
                    "boundingPoly": {
                        "vertices": [
                            {
                                "x": 14.0,
                                "y": 20.0
                            },
                            {
                                "x": 273.0,
                                "y": 20.0
                            },
                            {
                                "x": 273.0,
                                "y": 95.0
                            },
                            {
                                "x": 14.0,
                                "y": 95.0
                            }
                        ]
                    },
                    "inferText": "CLOVA",
                    "inferConfidence": 1.0,
                    "type": "NORMAL",
                    "lineBreak": false
                },
                {
                    "valueType": "ALL",
                    "boundingPoly": {
                        "vertices": [
                            {
                                "x": 286.0,
                                "y": 20.0
                            },
                            {
                                "x": 454.0,
                                "y": 20.0
                            },
                            {
                                "x": 454.0,
                                "y": 93.0
                            },
                            {
                                "x": 286.0,
                                "y": 93.0
                            }
                        ]
                    },
                    "inferText": "OCR",
                    "inferConfidence": 1.0,
                    "type": "NORMAL",
                    "lineBreak": true
                },
                {
                    "valueType": "ALL",
                    "boundingPoly": {
                        "vertices": [
                            {
                                "x": 55.0,
                                "y": 213.0
                            },
                            {
                                "x": 107.0,
                                "y": 213.0
                            },
                            {
                                "x": 107.0,
                                "y": 245.0
                            },
                            {
                                "x": 55.0,
                                "y": 245.0
                            }
                        ]
                    },
                    "inferText": "참고",
                    "inferConfidence": 1.0,
                    "type": "NORMAL",
                    "lineBreak": true
                },
                {
                    "valueType": "ALL",
                    "boundingPoly": {
                        "vertices": [
                            {
                                "x": 59.0,
                                "y": 357.0
                            },
                            {
                                "x": 146.0,
                                "y": 357.0
                            },
                            {
                                "x": 146.0,
                                "y": 395.0
                            },
                            {
                                "x": 59.0,
                                "y": 395.0
                            }
                        ]
                    },
                    "inferText": "네이버",
                    "inferConfidence": 1.0,
                    "type": "NORMAL",
                    "lineBreak": false
                },
                {
                    "valueType": "ALL",
                    "boundingPoly": {
                        "vertices": [
                            {
                                "x": 150.0,
                                "y": 359.0
                            },
                            {
                                "x": 267.0,
                                "y": 359.0
                            },
                            {
                                "x": 267.0,
                                "y": 395.0
                            },
                            {
                                "x": 150.0,
                                "y": 395.0
                            }
                        ]
                    },
                    "inferText": "클라우드",
                    "inferConfidence": 1.0,
                    "type": "NORMAL",
                    "lineBreak": false
                },
                {
                    "valueType": "ALL",
                    "boundingPoly": {
                        "vertices": [
                            {
                                "x": 269.0,
                                "y": 357.0
                            },
                            {
                                "x": 385.0,
                                "y": 357.0
                            },
                            {
                                "x": 385.0,
                                "y": 395.0
                            },
                            {
                                "x": 269.0,
                                "y": 395.0
                            }
                        ]
                    },
                    "inferText": "플랫폼의",
                    "inferConfidence": 0.9999,
                    "type": "NORMAL",
                    "lineBreak": false
                },
                
                ...
                
             ]
        }
    ]
}

 

여기까지 General 도메인을 이용한 OCR 기능을 확인했다.

 

참고로, Request JSON이나 API 활용 예시는 다음을 참고하면 된다.

 

apidocs.ncloud.com/ko/ai-application-service/ocr/ocr/

 

API 참조서 - HOME

쿠키 제공 동의 당사는 고객님의 브라우징 기반 정보를 바탕으로 관련 정보 및 광고 제공을 위하여 지식 기반 쿠키를 사용합니다.

api.ncloud-docs.com

 

또, 위 예시 코드는 아래 경로의 Jupyter Notebook으로 작성된 페이지에서 결과를 직접 확인할 수 있다.

 

github.com/DHDaveB/TIL-Getting-Started-With-OCR/blob/main/naver-clova-ocr/general-ocr-sample.ipynb

 

DHDaveB/TIL-Getting-Started-With-OCR

Contribute to DHDaveB/TIL-Getting-Started-With-OCR development by creating an account on GitHub.

github.com


다음 포스트에서는 Template 도메인을 이용한 OCR 기능을 확인해 보겠다.

 

[Development/OCR] - Naver CLOVA AI - OCR 사용하기 (3) - Template 도메인

 

Naver CLOVA AI - OCR 사용하기 (3) - Template 도메인

이전 포스트에 이어 이번에는 Template 도메인을 이용, 실제 이미지의 특정 영역에서 텍스트를 읽어오는 과정을 진행해 보겠다. 이전 포스트는 아래 링크를 참고하기 바란다. [Development/OCR] - Naver CL

davelogs.tistory.com

 

 

728x90
반응형