이 세션에서는 Python과 Tesseract, CV2를 사용해 OCR 실습을 진행합니다.
mac os이고 프로젝트 간의 패키지 충돌을 방지하기 위해 anaconda 가상환경을 사용해 vscode에서 진행하지만, 문제가 없다면 가상환경 부분을 스킵하고 진행하셔도 무관합니다.
Environment Setting
anaconda virtual environment
OCR 실습을 위한 anaconda 가상환경을 생성하고 활성화합니다.
% conda create -n ocr_project python=3.9
% conda activate ocr_project
가상환경을 활성화한 후, pip도 가장 최신버전으로 업그레이드 해주고 이미지를 처리하는 데 사용할 opencv도 설치해줍니다.
% python -m pip install --upgrade pip
% pip install opencv-python=4.6.0.66
tesseract & pytesseract installation
이번 실습에서는 파이썬 코드를 통해 이미지를 불러오고 tesseract ocr을 진행하는 것이 목표입니다. 당연히 tesseract를 import해서 사용해야겠죠. 그런데, 실제로 이미지에서 텍스트를 인식하는 기능을 하는 Tesseract는 C++로 작성된 OCR 엔진, 즉 독립적인 소프트웨어에요. 때문에 Python 코드에서 사용하기 위해서는 wrapper library가 필요합니다. 래퍼 라이브러리의 이름은 pytesseract예요. 둘 다 설치해야 합니다.
- tesseract 설치
macOS를 사용 중이기 때문에 Homebrew를 이용해 소프트웨어를 설치해줍니다. 만약 windowOS를 사용 중이라면 직접 설치파일을 다운로드하여 설치해주세요.
% brew install tesseract
- pytesseract 설치
pytesseract는 소프트웨어가 아니라 라이브러리이기 때문에, pip 명령어를 이용해 설치할 수 있습니다. 가상환경에 들어와 다음 명령어를 입력해 설치를 진행해주세요.
% pip install pytesseract
vscode
vscode를 열고, 파이썬 파일을 하나 만들어줍니다. tesseract.py라는 이름으로 만들었지만 다른 걸로 해도 괜찮아요.
또 같은 디렉토리에 사용할 이미지파일도 넣어줍니다. 이번 실습에서는 영문 영수증 이미지를 사용했어요.
여기까지 하면 코드를 작성할 준비를 모두 마쳤습니다!
이제 실제 코드를 작성해볼게요.
Python OCR Code
필요한 라이브러리들을 import 합니다. 편의를 위해 pytesseract를 import할 때 tesseract로 alias를 지정해줬습니다.
사용할 이미지의 파일 경로를 설정하고 cv2.imread 메소드를 이용해 이미지를 불러올 거예요.
해당 이미지파일이 존재하는지 확인하는 부분인데요, 코드가 정상적으로 작동하지 않을 시 이미지파일 경로 설정에 실수가 있는 경우가 있어 디버깅을 위해 추가합니다. OCR 자체와는 상관이 없는 부분이기 때문에 생략해도 돼요!
pytesseract의 image_to_string() 함수가 바로 ocr을 진행하는 함수입니다. opencv를 통해 불러온 이미지와, 읽어야할 텍스트의 언어를 지정해줌으로써 간단하게 텍스트를 추출할 수 있어요.
print()함수로 텍스트를 출력해볼 수 있고, imshow 메소드로 텍스트를 추출한 이미지를 확인해볼 수 있어요.
사용된 이미지와 텍스트 추출 결과입니다. 알파벳은 물론 기호까지 잘 출력하는 걸 확인할 수 있습니다. 그런데 이건 영어로 된 문서를 인식할 때의 경우이고, 한국어나 다른 언어로 된 문서로부터 텍스트를 읽어내야할 때는 어떻게 해야 할까요?
단순히 코드에서 lang='eng' 부분만 lang='kor' 부분으로 바꿈으로써 해결되면 좋겠지만, 그보다 먼저 한글 학습 데이터를 다운 받아 tesseract 프로그램에 추가해주어야 해요.
아래 tesseract 깃허브에서 다운받을 수 있습니다.
https://github.com/tesseract-ocr/tessdata/blob/main/kor.traineddata
tessdata/kor.traineddata at main · tesseract-ocr/tessdata
Trained models with fast variant of the "best" LSTM models + legacy models - tesseract-ocr/tessdata
github.com
다운이 완료되었으면, 이 파일을 tesseract의 tessdata 디렉토리에 추가해줘야 하는데요, 먼저 tessdata가 어디있는지 경로를 알아야 합니다. 터미널에 다음과 같이 입력해 tessearact가 설치된 경로를 구하고, tessdata 디렉토리를 확인해보면 eng.traineddata가 있는 걸 확인할 수 있어요.
경로를 확인했으면 해당 경로에 아까 다운 받은 kor.traineddata를 복사 붙여넣기 해줍니다. 다시 tessdata 디렉토리를 열어 kor.traineddata파일이 정상적으로 들어있는지 확인해주세요.
다시 python 작업 중이던 vscode로 돌아와서, 코드를 다음과 같이 수정해줍니다.
그럼 이제 아래처럼 한글 텍스트가 추출되는 걸 확인할 수 있어요.
디지털 영수증인 첫번째 이미지의 경우 감지해내지 못 하는 문자도 있고 인식한 문자에 오류도 좀 있지만 꽤나 많이 인식해내는데, 굴림체로 표현된 지류영수증 이미지의 경우 제대로 인식하지 못 하는 게 제대로 하는 것보다 많네요..
디지털 영수증의 경우 디지털 화면을 캡쳐한 이미지이기 때문에 배경의 밝기가 고르고 글씨가 선명하게 나타난다는 점, 또 고딕체에 가까운 단순한 폰트로 표현되었다는 점이 상대적으로 높은 인식률에 영향을 미쳤을 것입니다.
반면에 지류 영수증을 스캔한 이미지의 경우, 아무래도 애초에 디지털 상에 픽셀로 표현된 화면을 캡쳐하는 것보다 글씨의 윤곽이 선명하지 않다는 점, 굴림체에 가까운 폰트(뚱띵이글씨가되..) 등이 낮은 성능에 영향을 줬을 거예요. 또, 종이 문서는 시간이 지남에 따라 잉크가 번지거나 휘발하며 원본 문서 자체에 나타나는 문자의 물리적 형상이 뚜렷하지 않다는 점도 문서의 텍스트추출을 어렵게 합니다.
easyocr은 상대적으로 한글 텍스트의 인식률이 높다고 해서 사용해봤는데, 딱히..........모르겟네요 저는
#2 세션처럼 수동으로 전처리를 해줌으로써 성능을 향상시킬 수는 있을 테지만 모델이 한글 공부를 너무 게을리 한 게overwhelming할 것 같아서 딱히 시도해보고 싶지는 않고요..
클로바 api를 사용하면 놀라울 만큼 성능이 좋다고 하던데 차차 써보든지 말든지 하겠습니다.
'Study > Deep Learning' 카테고리의 다른 글
[OCR] #4_Naver Clova OCR API 네이버 클로바 OCR 사용해보기 (0) | 2024.08.05 |
---|---|
[OCR] #2_Improving OCR quality with Preprocessing OCR 성능향상을 위한 전처리 방법들 (0) | 2024.08.01 |
[OCR] #1_OCR Intro OCR이란 (0) | 2024.08.01 |
[Object Detection] #2_OpenCV & YOLOv8 & DeepSORT 객체탐지와 객체추적 (0) | 2024.08.01 |
[Object Detection] #1_Object Detection Intro 객체탐지란 (0) | 2024.07.31 |