2017년 2월 28일 화요일

MS Cognitive Service - OCR API 활용기

OCR(Optical character recognition) 은 PDF ,출력 Scan 된 문서나 아날로그 Ouput , 상품 카달로그 이미지, 혹은 사진 등 에서 문자영역을 인식하고, Image Processing 이나 deep learning 기술을 이용, digital 화 가능한 문자를 추출하는 기술이다.

한때(불과 몇년 전만 해도) 해당 기술은 그리 정확도가 높지 않아, Scan된 문서나, 명함에서의 Text 추출 정도에서만 사용되었으나, 최근에는 OCR에 있어서도 Deep Learning 기술이 이용되면서, 그 정확도가 매우 향상되었다.

현재는 실시간 사진 업로드 및 스마트폰 카메라와 연동된 다양한 Business Model 들이 나오고 있는 추세이다.

OCR 관련 하여서는 다양한 API 나 제품 솔루션이  있으며, Open Source 또한 존재한다. 뒤에서 언급하겠지만, Google API 는 Github 에 Source 가 Open 되어 있다. 하지만, OCR 은 훌륭한 Open Source 가 있어도, Open API 가 좀더 유리한 분야 중 하나이다. Training 을 위한 Data 확보가 쉽지 않은 분야이기 때문이다.

Open API 및 제품 솔루션 중 가장 알려진 솔루션은 아래 세가지 이다.
각각이 장단점이 있는데, 간략하게 비교해보면 아래와 같다.
  1. Google OCR 
    1. github 에 소스가 오픈되어 있다.
    2. 적은 양이지만, Data 도 있다.
    3. 성능은 복합적인 이미지 내 문자의 경우 정확도 60% 정도.
    4. [장점] 소스가 오픈되어 있어, 기술 자체를 내재화 하고자 할때 좋은 시작 솔루션이 될 수 있음. Open API 도 있는데, 가격대가 4단계로 세분화 되어 있음.
    5. [단점] 한글의 경우 성능이 그다지 좋진 않음. 전문 솔루션 회사를 인수. 인수 시점이 꽤 되서, 해당 솔루션이 Deep Learning  기반은 아닌듯.
  2. MS OCR
    1. Open API 형태로 Cloud 사용량 Base 과금.
    2. Document 화가 잘 되어 있음.
    3. 성능은 복합적인 이미지 내 문자의 경우 정확도 85% 정도. 스캔 문서의 경우 정확도 90% 정도.
    4. [장점] 한글의 경우에도 성능이 꽤 좋은 편. 복잡한 이미지 내 문자이든, 스캔문서의 문자이든 고르게 성능이 나옴. 
    5. [단점] 구글이 4단계 볼륨별 과금인 반면 MS 는 3단계. 3단계 까지는 가격이 Google 과 동일하나, 4단계 초 대 용량은 Google 이 더 저렴한 요금제 제공. 소스는 없음.
  3. Abbyy
    1. 설치형 제품.
    2. 코어당 라이센스 혹은 서버당 트랜잭션 Limit 라이센스
    3. 성능은 복합적인 이미지 내 문자의 경우 인식이 Skip 되는 경우 많음 정확도 70% 정도. 스캔 문서의 경우 정확도 95% 정도.
    4. [장점] 스캔문서의 경우 정확도 가장 높음. 다양한 부가 Tool 제공. 
    5. [단점] 설치형 제품이라 비쌈. 복합적인 이미지 내부의 활자의 경우 정확도 떨어지고, 활자를 skip 해 버림. 내부 하드웨어를 구비해야 함. Linux 버전은 관리 및 개발 편의 Tool이 빈약함.
위 3가지가 각각 장단점이 있으나, 아래는 Open API 방식을 제공하는 MS OCR 과 Google OCR 의 성능 비교 예시이다.

1. MS OCR API
- 좌측 원본 이미지, 우측 OCR Text


2. Google OCR API
- 위 동일 이미지에 대한 OCR Text


위 처럼 이미지 내에서 활자를 뽑아냄에 있어, MS 가 Google 의 그것 보다 훨씬 좋은 성능을 보여 준다.

MS API 는 Restful API 의 Return String 이 JSON 형태이다. 해당 JSON 으로 부터 Plain Text 뿐 아니라, 각 문자들의 그룹별(이미지 이므로 문단이 그룹단위로 표현 가능) 위치 좌표를 뽑을 수 있다.(단어 단위의 좌표 또한 제공하고 있다.)

아래는 각각을 Parsing 하여 추출하는 Source 이다. MSDN Example 에는 아래와 같은 Parsing Source 예시가 존재하지 않아, 간단하게 만들어 본 예이다. JSON Parser 를 써도 되겠지만, JSON Structure 구조가 패턴화 되어 있어, 아래와 같은 트리구조 loop 패턴으로 코딩 구현하면, 어떤 Language 에서든 손쉽게 원하는 정보 추출이 가능하다.

1. Plain Text 추출 Source (Example)


2. 문단별 좌표 포함 Text 추출 Source (Example)


Spark Machine Learning - Deep Dive ( and Deep Learning )

2017년 2월 두번의 Spark Machine Learning 및 Deep Learning 관련 Speaking 을 했다.
  1. 스사모 팍스 스터디 모임.
    1. 2017년 2월 20일
    2. Spark 로 하는 Machine Learning 실무에서의 Pain Point 와 그 극복 방법
    3. MS R on Spark, Tensorflow(+ Keras) on Spark, Python scikit-learn on Spark 등 다양한 Machine Learning 및 Deep Learning 도구들을 Spark 와 hybrid 하게 사용하는 방법
  2. 대한민국 개발자 커뮤니티 데이.
    1. 앞선  팍스 스터디 모임 내용과 다소 겹치지만, 좀더 고찰 내용에 치중했다.
    2. 빅데이타 개발자 혹은 개발자 Base 머신러닝 Data Scientist 가 AI시대에 임하는 자세. 등등...
위 두 모임에서의 발표 내용을 Merge 하여 슬라이드로 만들어 보았다.