레이블이 OCR인 게시물을 표시합니다. 모든 게시물 표시
레이블이 OCR인 게시물을 표시합니다. 모든 게시물 표시

2021년 1월 2일 토요일

OCR로 영수증 정리

 

구글 OCR을 이용해서 영수증을 읽을 수 있습니다.  일반개인은 영수증을 정리할 필요가 없지만 개인사업자만 되더라도 영수증을 정리해서 세무서에 부가가치세를 신고해야 합니다. 매입 영수증에서 중요한 부분은 상호, 사업자등록번호, 총금액인데 영수증에서 이것들을 추출하는 프로그램을 구성해 봅니다.

전체 프로그램은 https://github.com/yoojchul/receipt-through-OCR에 있습니다. 파이썬 프로그램인데 구글 OCR를 통해 모두 text로 바꿉니다.  상호, 사업자등록번호, 총액이 들어가 있는 문구를 찾으면 쉽지만 이런 문구도 없는 영수증도 많습니다.  문구가 없으면 앞뒤의 맥락, 위치 등을 고려해서 찾는데 아직 문자 인식률 자체가 완벽하지 않아 못 찾는 경우가 있습니다. 

아래는 성공적인 사례입니다.



-상호

서서울농협하나로마트사직점

-사업자등록번호

사업자번호:101-xx-xxxxx

-총액

27,600

 

문구 표시도 없고 문자 인식률이 좋지 않은 아래 그림은 결국 상호, 등록번호, 총액을 찾지 못합니다.



2020년 11월 7일 토요일

책장 속의 책 제목과 저자 자동 인식

 

작은 도서관이나 책이 많은 개인 서고의 책을 정리하는데 도움이 되는 프로그램입니다. 책장 속의 있는 책을 휴대폰으로 찍은 사진을 대상으로 프로그램을 실행하면 사진 속에 있는 책의 제목, 저자, 출판사 등을 자동으로 인식해서 출력합니다.

구글 OCR를 사용한 예제 https://blog.naver.com/yoojchul/222007575531 를 따라 하면




















....

를 얻습니다.  대상으로 한 그림은 아래에 있습니다.  출력 앞 부분에 그림 중간에 있는 내용이 나오기는 하지만 전반적으로 오른쪽부터 시작해서 아래로 갔다가 다시 왼쪽으로 옮겨 가는 순서로 한글, 영문 그리고 한자까지 인식합니다.  



광학 문자에 대한 인식률이 완벽하지는 않지만 각 책에 대한 구별이 없다는 불편함도 있습니다. 책으로 구분되는 선을 근거로 opencv를 응용해서 책을 구분합니다.



인식된 글자 사이에 붉은 선이 없다면 같은 책으로 간주하고 제목, 저자 그리고 출판사를 한 줄에 출력하여 좀 더 근사한 결과를 얻을 수 있습니다. 



















....


부족한 인식률과 책 구분은 사람의 눈과 손을 아직 필요로 합니다.  전체 프로그램은 깃허브  https://github.com/yoojchul/book-title 에 있습니다.

2020년 6월 20일 토요일

카카오, 네이버 구글 OCR 테스트


그림에서 글자를 추출하는 것을 OCR (Optical Character Recognition)이라고 합니다.   대표적으로 ABBYY라는 프로그램이 유명하지만 최근에는  카카오,  네이버, 구글에서 API 형태로도 가능한 OCR 프로그램을 내놓았습니다.   이들 OCR는 처리량에 비례하는 요금제를 채택하고 있어 테스트하기에는  재정적인 부담이 전혀 없습니다.

테스트 대상은  책 사진입니다. 책 사진에서 제목을 뽑으려고 합니다. 



카카오 OCR API  https://developers.kakao.com/docs/latest/ko/vision/common에서 사용자와 서비스를  등록하고 아래 파이썬 프로그램으로 테스트합니다.   프로그램에 나온 appkey는 등록 후에 받아야 합니다.  이 프로그램도 위 사이트에서 가져 왔는데  function main만 편집하고 나머지는 그대로입니다.



import json

import cv2
import requests
import sys

LIMIT_PX = 1024
LIMIT_BYTE = 1024*1024  # 1MB
LIMIT_BOX = 40

appkey = "4c65b9287b7b7a53fb3e211a9268"

def kakao_ocr_resize(image_path: str):

    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_detect(image_path: str, appkey: str):
    API_URL = 'https://kapi.kakao.com/v1/vision/text/detect'

    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={"file": data})


def kakao_ocr_recognize(image_path: str, boxes: list, appkey: str):
    API_URL = 'https://kapi.kakao.com/v1/vision/text/recognize'

    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={"file": data}, data={"boxes": json.dumps(boxes)})

resize_impath = kakao_ocr_resize("book.jpg")
if resize_impath is not None:
    image_path = resize_impath
    print("원본 대신 리사이즈된 이미지를 사용합니다.")

output = kakao_ocr_detect(image_path, appkey).json()
print("[detect] output:\n{}\n".format(output))

boxes = output["result"]["boxes"]
boxes = boxes[:min(len(boxes), LIMIT_BOX)]
output = kakao_ocr_recognize(image_path, boxes, appkey).json()
print("[recognize] output:\n{}\n".format(json.dumps(output, sort_keys=True, indent=2)))


결과는 다소 실망입니다.   한글을 전혀 인식하지 못해서 이상한 영문자를 출력하고 있습니다.



다음은 네이버  OCR입니다.   사용자와 서비스는 등록은  https://www.ncloud.com/product/aiService/ocr 에서  합니다.    네이버에는  파이썬 프로그램 샘플이 없습니다.  대신 postman이라는  간단한 프로그램을 통해 결과를 확인할 수 있습니다.  아래와 같이 URL 을 지정해서 API를 호출하고  json 파일에 인식해야 할 사진 파일을 지정합니다.  Postman는 따로 설치가 필요합니다.



문자 인식에 대한 결과가 다음입니다.



제목이  정원가의 열두렐로 오류가 있지만 카카오 OCR 보다 나아 보입니다.

다음은 구글 OCR입니다.    https://cloud.google.com/vision/docs/ocr?hl=ko  에서 사용자와 서비스를 등록합니다.  등록 후에  Credential 파일을 다운 받고 환경 변수 GOOGLE_APPLICATION_CREDENTIALS으로 이 파일을 지정합니다.   아래  테스트 프로그램은 구글에서 제공합니다.   실행 전에 “pip install google-cloud-vision”으로 모듈 설치가 필요합니다.


import os, io

def detect_text(path):
    from google.cloud import vision
    client = vision.ImageAnnotatorClient()

    with io.open(path, 'rb') as image_file:
        content = image_file.read()

    image = vision.types.Image(content=content)

    response = client.text_detection(image=image)
    texts = response.text_annotations
    print('Texts:')

    for text in texts:
        print('\n"{}"'.format(text.description))

        vertices = (['({},{})'.format(vertex.x, vertex.y)
                    for vertex in text.bounding_poly.vertices])

        print('bounds: {}'.format(','.join(vertices)))


detect_text("book.jpg")


아래는 위 실행 결과 일부입니다. 



엉뚱한 문자가 있기는 하지만  OCR의 인식 결과는 나쁘지 않습니다.  제목 정원가의 열두달을 정확하게 출력합니다.

이용 요금도 구글 OCR이 네이버보다 싸기 때문에 당분간 구글 OCR를 이용하려고 합니다.