SW개발/python

[python] OCR 테스트 - 카카오 kakao 비전 OCR API (1)

코대장 2021. 1. 9. 21:22
반응형
카카오 kakao 비전 API OCR 활용해 텍스트를 추출해보자.

 

1.서론

2.본론

    2.1 다음으로 카카오 KaKao 비전 OCR API를 알게되었다.

    2.2 그럼 실제 구현예제를 직접 사용해보자

    2.3 한글OCR 결과 출력할땐 이런 문제가 있구나

3. 결론

4. 마무리

5. 참고자료

 

 

1. 서론

모바일앱 개발과정 중 이미지(.jpg, .png 등)를 텍스트 정보로 추출하는 OCR 기능이 필요하게 되었다.

OCR(Optical Character Recognition)

OCR 이란?

 

무료로 사용할 수 있는 OCR 찾아보니 테서렉트?(tessaract) 라는 소프트웨어 툴이 있었는데,

테스트 해봤더니, 한글 인식률이 매우 저조했다. (내가 설정을 잘못했을 수도 있다.)

다시 말해, 내가 운영할 서비스에는 적용하기 어려운 수준이었다. 기회가 된다면 테서렉트 테스트 한 결과도 공유해야겠다.

 

2. 본론 - 카카오 KaKao 비전 OCR API

2.1 다음으로 카카오 KaKao 비전 OCR API를 알게되었다.

developers.kakao.com/

카카오 개발자 사이트 메인화면에서 "비전" -> "Read docs" 문서보기로 들어가보자.

OCR 외에 다양한 기능을 제공한다. 얼굴, 상품, 썸네일 검출 등...

KaKao Developer 메인화면

OCR 개발가이드 문서에도 나와 있지만, 이미지로부터 텍스트 영역(좌상, 좌하, 우상, 우하의  X, Y좌표)을 인식하고 

그 영역 안에 있는 텍스트 정보를 추출해오는 형태이다. OCR 데모도 있으니 직접 확인해 볼 수 있다.

그리고 친절하게도 구현예제 코드를 공개해줘서 유저들이 바로 사용하고 테스트 해 볼 수 있게 열어 주었다.

그냥 테스트할 이미지만 준비하면 된다.

개발가이드 화면

Python 버전은 2.7 또는 3.6 이상 버전을 권장하며
python module 요구사항은 은 아래와 같이 준비하면 된다.
- requests ==2.14.2

- Pillow==5.0.0 (OCR 의 경우 필수조건 아님)

OCR 구현예제 오픈코드

 

 

 

 

반응형

 

2.2 그럼 실제 구현예제를 직접 사용해보자

pycharm File->New Project 새로운 프로젝트를 생성했고, 테스트 이미지로 "가나다라.jpeg" 를 만들었다.

코드는 말한대로 카카오 사이트에서 그대로 복사-붙여넣기 했다.

PyCharm 생성 프로젝트

아차! 카카오 서비스를 이용하기 위해서 앱키(appKey)를 발급받아야 한다.

카카오 개발자 사이트에서 "내 애플리케이션" -> "애플리케이션 추가하기" 클릭 (당연히 카카오 로그인은 되어야 있어야 한다.)

카카오 개발자 메인 화면

앱이름과, 사업자명을 넣고 저장하면 애플리케이션이 성공적으로 생성된다.

애플리케이션 추가화면

이제 생성된 애플리케이션으로 이동해 앱키(appkey) 정보를 확인하자

REST API 형태로 결과값이 떨어지기 때문에 OCR API KEY로는 REST API키를 사용할 것이다.

애플리케이션 요약정보

자, 다시 코드로 돌아와 보자.

기본적으로 main() 함수가 호출이 이뤄지는데, 앞서 준비한 이미지에 대한 정보(이미지 경로)와 발급받은 앱키(appKey) 정보가 필요하다.

파이썬에서 입력인자로 아래와 같이 전달해주면 된다.

input 이미지
OCR 코드

그럼 실행해보자.

# python3 kakao_ocr.py [이미지절대경로] [발급받은앱키]

$ python3 kakao_ocr.py /bla.../bla.../input_img.jpeg app_key

결과를 보면 "recognition_words"에 예상했던 "가나다라.."가 아닌

이상한 "\uac00\ub098\ub2e4\ub77c" 문자로 출력이 된다. 왜 그럴까?

[OCR] output:
{
  "result": [
    {
      "boxes": [
        [
          344,
          110
        ],
        [
          682,
          110
        ],
        [
          682,
          198
        ],
        [
          344,
          198
        ]
      ],
      "recognition_words": [
        "\uac00\ub098\ub2e4\ub77c"
      ]
    },
    {
      "boxes": [
        [
          386,
          226
        ],
        [
          642,
          226
        ],
        [
          642,
          318
        ],
        [
          386,
          318
        ]
      ],
      "recognition_words": [
        "\ub9c8\ubc14\uc0ac"
      ]
    },
    {
      "boxes": [
        [
          341,
          375
        ],
        [
          685,
          375
        ],
        [
          685,
          467
        ],
        [
          341,
          467
        ]
      ],
      "recognition_words": [
        "\uc544\uc790\ucc28\uce74"
      ]
    },
    {
      "boxes": [
        [
          386,
          500
        ],
        [
          638,
          500
        ],
        [
          638,
          588
        ],
        [
          386,
          588
        ]
      ],
      "recognition_words": [
        "\ud0c0\ud30c\ud558"
      ]
    }
  ]
}

 

2.3 한글OCR 결과 출력할땐 이런 문제가 있구나

공개코드에서 최종적으로 값을 출력할 때는 JSON Dump를 통해서 이뤄지는데,

한글이 포함된 유니코드로 출력을 하게 되면 Terminal 출력창에서 한글이 아닌 유니코드 16진수로 나오게 되는 것이다.

...
print("[OCR] output:\n{}\n".format(json.dumps(output, sort_keys=True, indent=2))) # 변경 전
...

따라서 마지막 출력이 되는 부분에는 다음과 같은 옵션을 통해서 한글이 정상적으로 출력되게 변경하자.

...
print("[OCR] output:\n{}\n".format(json.dumps(output, sort_keys=True, indent=2, ensure_ascii=False))) # 변경 후
...

자, 이제 출력값을 다시 한번 보면

[OCR] output:
{
  "result": [
    {
      "boxes": [
        [
          344,
          110
        ],
        [
          682,
          110
        ],
        [
          682,
          198
        ],
        [
          344,
          198
        ]
      ],
      "recognition_words": [
        "가나다라"
      ]
    },
    {
      "boxes": [
        [
          386,
          226
        ],
        [
          642,
          226
        ],
        [
          642,
          318
        ],
        [
          386,
          318
        ]
      ],
      "recognition_words": [
        "마바사"
      ]
    },
    {
      "boxes": [
        [
          341,
          375
        ],
        [
          685,
          375
        ],
        [
          685,
          467
        ],
        [
          341,
          467
        ]
      ],
      "recognition_words": [
        "아자차카"
      ]
    },
    {
      "boxes": [
        [
          386,
          500
        ],
        [
          638,
          500
        ],
        [
          638,
          588
        ],
        [
          386,
          588
        ]
      ],
      "recognition_words": [
        "타파하"
      ]
    }
  ]
}

 

3. 결론

잘 나오네. 입력 이미지가 워낙 정제된(?) 깔끔한 형태여서 문자인식이 100% 정확하다.

좀더 혹독한(?) 이미지 처리에 대해서는 다음시간에 함께 살펴보자.

그럼 이상 끝.

 

4. 마무리

다음시간에는 네이버 OCR API를 통해서 텍스트 정보를 추출해보자.

또한 네이버와 카카오 각 서비스 변환 성공률을 비교해보자.

 

5. 참고자료

카카오 개발자 사이트 : developers.kakao.com/

 

Kakao Developers

카카오 API를 활용하여 다양한 어플리케이션을 개발해보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다.

developers.kakao.com

medium.com/@maxtortime_88708/%ED%8C%8C%EC%9D%B4%EC%8D%AC-json-%EB%AA%A8%EB%93%88-%EC%82%AC%EC%9A%A9%EC%8B%9C-%EC%A3%BC%EC%9D%98%EC%A0%90-92b626ebcfe2

 

파이썬 JSON 모듈 사용시 주의점

JSON으로 한글 같이 유니코드 문자가 포함된 데이터를 파일로 만들게 되면 열었을 때 텍스트 에디터에서 한글로 안 보이고 정말로 유니코드 16진수가 적혀있게 된다.

medium.com