본문 바로가기

문돌이 존버/카카오 챗봇 스터디

Ubuntu 18.04에 opencv 및 tesseract 설치하기, feat. 에러 해결

반응형

이번에는 AWS Ubuntu 18.04 서버에 opencv와 tesseract를 설치해보겠습니다. 간단하게 명함 인식을 구현해보고자 하는데요, 인식한 이후에는 텍스트를 추출하기 위해 tesseract의 OCR 기술도 사용해보려고 합니다.

가장 기본적으로 가상환경을 세팅해줘야겠죠. 다른 글에서는 이미 설명을 드렸지만 혹시 설정이 안되신 분들을 위해서 아래에 다시 소개하겠습니다.

sudo apt-get install python3-pip
mkdir myvenv
cd myvenv
# sudo apt install virtualenv
# virtualenv myvenv
apt-get install python3-venv
python3 -m venv myvenv

이제 서버에 opencv 설치가 필요한데, 실시간 객체 검출 등을 하지 않을 것이기 때문에 파이썬용 opencv만 설치하면 됩니다. 아래 명령어를 통해 설치 가능할 것입니다.

pip install opencv-contrib-python

여기서 잠깐! AWS나 GCP와 같이 가상환경을 사용하는 경우, ImportError: libSM.so.6: cannot open shared object file: No such file or directory 와 같은 에러 메시지가 나타날 수 있습니다. 이는 GUI가 없는 OS 환경에서 나타나는 에러로 opencv를 설치할 때는 아래 명령어를 이용하셔야 합니다.

pip install opencv-contrib-python-headless

이후 tesseract를 다운받아야 할 차례입니다. 아래 코드를 통해 설치 가능하며, 우분투에선 기본적으로 tesseract 4.0 버전이 탑재되어 설치 과정이 비교적 간단합니다.

sudo apt install tesseract-ocr

# 설치 버전 확인
tesseract -v # or tesseract --version

이로써 opencv와 tesseract 설치는 마쳤고, 이외에 필요한 다른 모듈도 설치해보겠습니다.

pip install pillow
pip install pytesseract # 파이썬용 tesseract

(오류!! 해결 못함 ㅠㅠ) 다른 블로그 글을 보시면 터미널에서도 tesseract sample.jpg stdout -l eng 등의 명령어를 통해 텍스트 추출을 확인할 수 있다고 하는데요. 저는 이상하게도 "warning: invalid resolution 0 dpi" 와 같은 에러 메시지가 정말 1초 보이고 터미널이 리셋되는 현상이 발생하고 있습니다. 관련 에러 메시지는 이미지에 metadata가 없어서 나타나는 것인데, 해상도를 tesseract가 알아서 판단하기 때문에 정확성은 떨어질 수 있어도 터미널 화면이 리셋되는 현상은 이해가 안되네요 ㅠ

구글링을 해도 해당 에러 메시지가 떠도 텍스트 추출은 되는 것을 확인했습니다. 참 이상하고도 웃긴 것은 터미널에 텍스트를 출력하지 말고 txt 파일로 저장하는 작업은 가능하다는 것입니다. 그런데 터미널에서 cat sample.txt 명령어도 먹히지 않고 또 화면이 리셋되네요... 결국 로컬로 txt 파일을 옮기고 텍스트 추출 결과를 봐야했습니다. 해당 문제는 계속 구글링을 해보고 해결방법을 찾으면 본 글에 공유하겠습니다. 

간단하게 opencv를 통해 텍스트 영역을 인식하고 pytesseract 모듈을 사용하여 텍스트를 추출하는 코드를 작성해보겠습니다.

import cv2
import pytesseract
from pytesseract import *
import numpy as np

img = cv2.imread('./test.png')

# 회색 변환(channel 수 감소)
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 이진수 변환(흑 / 백)
img_binary = cv2.threshold(img_gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1]

# 모폴로지 연산(Opening)
kernel = np.ones((5, 5), np.uint8)
img_open = cv2.morphologyEx(img_binary, cv2.MORPH_OPEN, kernel)

# tesseract 설정
custom_config = '--oem 3' # LSTM 버전
text = pytesseract.image_to_string(img_binary, 'eng+Hangul') # 한글은 kor이 아닌 Hangul

with open('file.txt', mode='w') as f:
    f.write(text)

컴퓨터비전에 관련해선 제가 한참이나 부족하기 때문에 대단한 것을 설명드릴 수 없을 것 같습니다. 대신 다른 블로그를 참고하면서 공부한 내용, 제 코드에 실제 적용한 것들을 시리즈로 구성하여 알기 쉽게 소개하겠습니다.

다음은 tesseract OCR 성능을 높이기 위해 opencv를 활용한 이미지 전처리 과정에 대해 이야기해볼께요~

728x90
반응형