Portfolio

illustrations illustrations illustrations illustrations

OCR - Optical Character Recognition with Python

Published on May 31, 2019 by Yunwoong Kim on OCR OPTICAL CHARACTER RECOGNITION DEEPLEARNING

OCR - Optical Character Recognition with Python


Image OCR

Description

Python으로 작성되었으며 그래픽 인터페이스에 PyQt를 사용합니다. OCR엔진은 Tesseract 오픈소스를 사용하였습니다. 핵심 기술은 어떠한 OCR엔진을 사용하더라도 높은 인식율을 보장 할 수 있도록 분류하고 이미지를 전처리후 OCR을 수행하려는 범위를 자동으로 추출하는 것입니다.

Image를 Load하여 OCR결과를 확인하고 분석하기 위한 GUI를 제공


이미지가 Load되면 DeepLearning으로 학습된 Model을 통해 자동으로 서식지가 분류

이미지를 입력 받아서 D/L Model을 기반으로 서식지를 자동으로 분류합니다. (가족관계증명, 주민등록등본, 기타)


이미지 전처리 (Crop, Rotate, Nose..)

이미지의 기울기를 보정

  • 왜곡(낙서, 구김, 빛등)으로 인해 기울기에 영향이 생길 수 있어 입력한 angle 값 이하는 보정하지 않음
# gubun :** 'Image Deskewing'
# angle :** Skip below the entered angle
    
option = [{'gubun': 'Image Deskewing', 'angle': 1}]
ocrImg.modImg.addImgApplyList(option)
ocrImg.modImg.imgCompareShow()

이미지 자동 자르기

  • 이미지에서 불필요한 영역 자르기
# gubun : Image Autocrop
# aspectRatio :입력된 aspect ratio(종횡비) 보다 낮은 경우 화질이 좋지 못해서 Cutting 영역을 잡을 수 없기때문에 Skip 처리함
# threshold1 : Hysteresis Thredsholding 작업에서의 min 값
# threshold2 : Hysteresis Thredsholding 작업에서의 max 값

option = [{'gubun': 'Image Autocrop', 'aspectRatio': 0.8, 'threshold1': 100, 'threshold2': 100}]
ocrImg.modImg.addImgApplyList(option)
ocrImg.modImg.imgCompareShow()

워터마크 제거

option = [{'gubun': 'Remove Watermark', 'alpha': 2.0, 'beta':220}]
ocrImg.modImg.addImgApplyList(option)
ocrImg.modImg.imgCompareShow()

이미지 사이즈 조정

  • cv2.pyrDown() 과 cv2.pyrUp() 함수를 사용하여 이미지를 축소, 확장
    • 가장 아래에 가장 큰 해상도를 놓고 점점 줄여가면서 쌓아가는 형태
# gubun : Image Resize
# resizeCl : resize 구분값 (pyrDown, pyrUp, Auto)
    
option = [{'gubun': 'Image Resize', 'resizeCl':'Auto'}]
ocrImg.modImg.addImgApplyList(option)
ocrImg.modImg.imgCompareShow()

가로축, 세로축 라인 제거

option = [{'gubun': 'Image RemoveHLine', 'horizontalsize': 30}]
ocrImg.modImg.addImgApplyList(option)
ocrImg.modImg.imgCompareShow()

option = [{'gubun': 'Image RemoveVLine', 'verticalsize': 50}]
ocrImg.modImg.addImgApplyList(option)
ocrImg.modImg.imgCompareShow()


추출 영역 탐지

가이드 이미지를 생성하여 원하는 영역을 추출

ocrImg.detectionField.segmentation(findFieldInfo=fieldInfo, flag='WHY')
ocrImg.detectionField.imgShow(field='name', debug=False)

ocrImg.addDetectionImg(fieldInfo=fieldInfo)
ocrImg.detectionField.imgShow(field='birth')

찾아낸 영역을 추출하여 하나의 이미지로 병합

ocrImg.detectionField.cropImgShow(field='name')
ocrImg.detectionField.cropMergeImgShow(field='name')


인식

인식은 Tesseract OCR 엔진을 사용하며 N개의 프로세스로 수행이 가능

ocrImg.recogTesserOCR(field='name', imgType='cropMergeImg', segmode='-psm 6', ocrmode='kor', process='01', gray=False)
ocrImg.recogResult

[{'field': 'name', 'result': ['이희', '이학승', '정정옥', '성기복', '성광현', '성현선', '성상현']}]

다른 서식의 문서도 가능

Features

  • 이미지 파일 열기/자동보정
  • Image Classfication (Deeplearning Model)
  • Guide Image 생성 (morphologyEx, threshold 를 이용하여 Guide Image를 만듬)
  • Character Sement (Guide Image를 통해서 contours 추출)
  • Field Detection
  • Character Recognition
  • Function to improve performance

Requirements

  • Ubuntu / macOS / Windows
  • Python2 / Python3
  • PyQt4 / PyQt5 / PySide2
  • Tesseract 4.0

Structure

Image_OCR/
├── libs/         
|  └── ocrImage.py                              # OCR Image Class
|  └── modifiedImage.py                         # Modified Image Class
|  └── classification/
|  |  └── classificationDialog.py               # source code for the Classification
|  |  └── classify.py                           # Image document classification
|  |  └── VGGNET_adam_ocr_classification.model  # classification model
|  |  └── VGGNET_adam_ocr_classification.pickle # classification labels
|  └── preprocessing/
|  |  └── preprocessing.py                      # Image preprocessing
|  └── detection/
|  |  └── detection_landmark.py                 # detect via landmark
|  |  └── guideImage.py                         # Guide Image Class
|  |  └── segmentation.py                       # Segmentation Image Class
|  |  └── landmark/
|  |  |  └── landmark.ini                       # landmark file
|  |  |  └── doc_fc_name.py                     # Family certificate document (Name)
|  |  |  └── doc_rr_nameTitle.py                # Resident registration document (Title)
|  |  |  └── doc_rr_nameTitle.py                # Resident registration document (Name)
|  └── recognition/
|  |  └── recognitionTesseract.py               # text recognition
|  |  └── Tesseract-OCR/                        # tesseract installation directory
├── UI/
|  └── icon/
|  └── NewImageOcr_0.5.1.ui
|  └── DetectionField_0.1.1.ui
|  └── NewImageOcr_0.5.1.ui
|  └── Preprocessing_0.1.1.ui
|  └── canvas.py
|  └── labelDialog.py
|  └── preprocessingDialog.py
|  └── detectionFieldDialog.py
|  └── lib.py
|  └── shape.py
|  └── ustr.py
├── result/                                      # direcotry for the Ocr results
├── sol_csv/                                     # directory for scoring
├── New_Image_Ocr_0.5.1.py                       # source code for the Main GUI
├── res_rc.py                                    # pyqt Resource File
└── config.ini                                   # config file

외부(OCR) 솔루션과 비교해도 경쟁력이 있을까?

Use Case (실 적용 사례)

자동화 적용 효과

  1. 심사 업무량 30% 이상 감소
  2. 실시간 결합 심사 처리로 불필요한 할인 비용 감소 (연간 1.8억)
  3. 심사 자동화로 수수료 감소 (연간 2.3억)