본문 바로가기

Development/OCR

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

728x90
반응형

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

 

이전 포스트에 이어 이번에는 Template 도메인을 이용, 실제 이미지의 특정 영역에서 텍스트를 읽어오는 과정을 진행해 보겠다.

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

 

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

 

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


1. 도메인 생성

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

 

 

생성한 Template 도메인의 '템플릿 빌더' 를 클릭한다.

 

 

그럼 아래와 같은 생성 도메인 정보를 확인할 수 있다.

 

 

2. 템플릿 생성

 

이제 General 도메인과 다르게 템플릿을 생성해 주는 과정을 진행한다.

바로 위 화면에서 좌측 '템플릿 목록' 을 선택하면 아래와 같은 페이지가 열리고 그 다음 '템플릿 생성' 버튼을 클릭한다.

 

 

그러면 아래와 같은 페이지가 열린다.

 

여기서부터가 중요하다.

우선 템플릿명을 정의하고 대표 샘플을 설정해야 하는데, 이는 다음과 같은 의미를 지닌다.

 

  • 템플릿명: 말 그대로 템플릿의 명칭이다. 샘플에 맞는 적당한 이름으로 정의한다.
  • 대표 샘플 설정: 샘플 이미지를 넣고, 해당 이미지를 기준으로 대표 샘플명과 영역을 설정해 준다. 그러면 이후 Template 도메인 API를 통해 인식 대상 이미지에 여기서 설정한 대표 샘플명을 확인하여 본 템플릿을 적용하는지 여부를 판단할 수 있는 것이다. 예를 들면, 대표 샘플명을 'post_office_tracking_number'라 하고, '우체국택배' 라 적혀있는 곳에 영역을 지정해 두면, 다음에 인식할 이미지에서 대표 샘플명을 확인할 해당 영역에 '우체국택배'가 없으면 본 템플릿에서 제외되는 형식이다. (내가 읽어봐도 너무 어렵다...)

이어서 아래와 같이 판독 필드를 지정하는데 '필드 추가' 를 누르고 받는 사람의 주소로 지정했다.

이렇게 우체국 송장을 인식하는 템플릿을 다음과 같이 만들었다.

 

 

저장 후엔 아래와 같이 템플릿 목록이 추가된 것을 확인할 수 있다.

 

 

3. API 생성

좌측 메뉴 상단의 설정을 눌러 도메인 정보 페이지로 이동 후 '외부연동' 탭을 클릭한다.

 

 

'외부연동' 페이지에서 API 연동 설정을 진행한다.

 

 

General 도메인에서 진행했던 것처럼, 다음과 같이 Secret Key를 생성한다.

 

 

4. API 배포

General 도메인과 다르게 API 배포라는 과정을 거쳐야 한다.

 

 

좌측 상단의 '배포 관리'를 누르면 다음과 같은 화면이 나온다.

 

 

추가한 템플릿을 선택하고 '베타 배포' 를 클릭한다.

 

 

팝업으로 나온 위 페이지에서 '확인' 을 누르면 배포가 시작되면서 다음과 같은 내용을 확인할 수 있다.

 

 

이제 '베타' 상태로 배포가 준비되었다.

좌측의 '테스트' 메뉴를 통해 테스트 후 배포를 완료하도록 하겠다.

 

아래와 같이 이동한 페이지에서 테스트 이미지를 업로드한다.

 

 

'테스트' 를 누르면 다음과 같은 메시지가 나오는데, 이건 뭐 무료 회원이니 '확인' 을 누르고 넘어가자.

 

 

그러면 다음과 같은 테스트 결과가 나온다. 생각보다 꽤 괜찮은 결과를 보여주고 있다.

 

 

의도한 대로 '대표 샘플명' 을 확인하고, 이어서 지정한 '필드01' 에서 원하는 문자열을 판독한 것이 보인다.

또한, 결과를 JSON이나 CSV 파일형태로 다운로드할 수 있는 기능을 제공한다.
(줄바꿈이 하나도 없어, 결과를 따로 보여주기엔 좀 그래서 생략했다....)

 

이제 테스트도 완료했으니, 우측 최상단에 위치한 '서비스 배포' 를 눌러 배포후 API를 통해 직접 구현해 보자.

 

 

728x90

 

5. API 사용 및 샘플코드 구현

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

이전 포스트와 마찬가지로 작성할 것인데, 먼저 Template 도메인의 Secret Key와 API 주소를 복사한다.

 

 

'외부연동' 에서 위 버튼을 누르면 다음과 같은 화면이 나온다.

 

 

'Secret Key''API' 주소를 복사한 후 다음을 진행한다.

단, 앞서 General 도메인과는 다르게, 요청 json에 'templateIds'가 포함되어야 한다는 점이다. 이 templateIds는 다음과 같은 화면에서 확인할 수 있다.

 

 

이제 이전 포스트에서와 마찬가지로, 아래 링크에서 Request JSON 형태를 먼저 파악한다.

 

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

 

API 참조서 - HOME

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

api.ncloud-docs.com

 

 

이제 위의 내용을 포함해 구현한 코드는 다음과 같다.

 

import requests
import uuid
import time
import json

api_url = 'YOUR_API_URL'
secret_key = 'YOUR_SECRET_KEY'

image_file = 'input/picture2.jpg'
output_file = 'output/output2.json'

request_json = {
    'images': [
        {
            'format': 'jpg',
            'name': 'demo',
            'templateIds': [YOUR_TEMPLATEIDS]
        }
    ],
    '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": "935dc1d6-c21a-499c-a177-67f540a56b6e",
    "timestamp": 1618202693156,
    "images": [
        {
            "uid": "8ef7d4bd8fe647ee860e3b8a2026645d",
            "name": "demo",
            "inferResult": "SUCCESS",
            "message": "SUCCESS",
            "matchedTemplate": {
                "id": 7813,
                "name": "Post Office Waybill"
            },
            "validationResult": {
                "result": "NO_REQUESTED"
            },
            "title": {
                "name": "Post Office Mark",
                "boundingPoly": {
                    "vertices": [
                        {
                            "x": 52.0,
                            "y": 11.0
                        },
                        {
                            "x": 120.0,
                            "y": 11.0
                        },
                        {
                            "x": 120.0,
                            "y": 39.0
                        },
                        {
                            "x": 52.0,
                            "y": 39.0
                        }
                    ]
                },
                "inferText": ". ePOST\n우체국 택배",
                "inferConfidence": 0.88116664
            },
            "fields": [
                {
                    "name": "받는사람 주소",
                    "valueType": "ALL",
                    "boundingPoly": {
                        "vertices": [
                            {
                                "x": 239.0,
                                "y": 135.0
                            },
                            {
                                "x": 516.0,
                                "y": 135.0
                            },
                            {
                                "x": 516.0,
                                "y": 204.0
                            },
                            {
                                "x": 239.0,
                                "y": 204.0
                            }
                        ]
                    },
                    "inferText": "서울시 종로구 세종대로 23 길21\n(구)서울시 종로구 당주동 145번지\n(당주동 15-7)",
                    "inferConfidence": 0.9999636,
                    "type": "NORMAL"
                }
            ]
        }
    ]
}

 

템플릿이라는 이름에 걸맞게 정형화된 데이터에 한해서는 보다 더 정확하게 인식했음을 볼 수 있다. 

 

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

 

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

 

github.com/DHDaveB/TIL-Getting-Started-With-OCR/blob/main/naver-clova-ocr/template-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

 

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

 

Document 도메인은 개인이 사용해 보기엔 개인 정보, 민감 정보 등의 노출 우려 등으로 인해 사전 신청, 승인 및 사업 제휴 신청 등 절차가 복잡해 따로 다루진 않는 것으로 결정했다.

 

 


 

참고로, 아래는 Google Cloud Vision API에서 제공하는 OCR 기술에 대한 내용을 기술한 포스트이니 참고하기 바란다.

 

 

[Development/OCR] - Google Cloud Vision API - OCR 사용하기 (1)

 

Google Cloud Vision API - OCR 사용하기 (1)

먼저 Google의 서비스를 이용해야 하므로 로그인부터 하고 진행한다. 1. Google Cloud 시작하기 먼저 다음 링크에서 Google Cloud에 가입하는 것부터 시작하자. cloud.google.com/gcp/ Google Cloud 컴퓨팅, 호스..

davelogs.tistory.com

 

728x90
반응형