본문 바로가기

Previous (20-22)/Development

(AMI / Python) 이미지 내 문자 추출 도구 Tesseract-ocr 사용하기(기초편)

이번 글에서는 Amazon Linux(AMI) 및 Python에서 Tesseract-ocr을 설치하고 사용하는 법을 알아본다.


먼저 Tesseract-ocr 이란 무엇인가부터 보자.

간단하게, 이미지에서 문자를 추출하기 위한 ocr 기술을 오픈소스로 제공하는 도구로 보면 된다.


사실 이것과 관련해서는 이 블로그 외에도 다른 블로그에도 상당히 많은 자료가 있어서 금방 찾기가 쉽다.

하지만, Amazon Linux AMI 및 Python 2.7 기반에서 설치 및 사용하는 부분은 문서 하나로 정리되어 있지 않고 여러 문서를 통해서 나타나 있어서

이를 하나로 정리하고자 포스팅을 올려본다.


개발 환경

OS: Amazon Linux AMI

python: 2.7

tesseract-ocr: 3.04



1. tesseract-ocr 설치 및 실행

Amazon Linux에서의 tesseract-ocr 설치는 다음 문서를 기반으로 한다.

https://gist.github.com/IaroslavR/834066ba4c0e25a27078

물론 OS가 다르다면 다른 블로그 및 tesseract-ocr 설치 문서에 의거해서 설치가 가능하지만,

Amazon Linux AMI는 해당 문서대로 설치해도 설치가 실제로 잘 안된다.

그러므로 위 링크에 있는 문서를 기반으로 하게 되었다.


다만 위 문서대로 100% 할 수는 없다. 

왜냐하면 우리는 한국어 버전을 설치하고 사용해야 하기 때문에, 코드도 이에 맞게 변형이 필요하다.

이에 따라 위 문서를 기반으로 코드를 수정하면 다음과 같다.


# 기본 프로그램 설치
sudo yum install autoconf aclocal automake
sudo yum install libtool
sudo yum install libjpeg-devel libpng-devel libtiff-devel zlib-devel

# Leptonica 설치 - 이미지 처리 분석을 위한 도구

cd ~/downloads
wget http://www.leptonica.com/source/leptonica-1.72.tar.gz
tar -zxvf leptonica-1.72.tar.gz
cd leptonica-1.72
./configure
make
sudo make install
cd ..

# Tesseract-ocr 3.04 설치

# 주의점: c++이 설치되어있지 않으면 설치가 안된다. 
# 만약 설치가 안되어있다면 sudo yum install gcc-c++ 을 실행해서 설치한다.

wget https://github.com/tesseract-ocr/tesseract/archive/3.04.00.tar.gz

tar -zxvf 3.04.00.tar.gz
cd tesseract-3.04.00/
./autogen.sh
./configure
make
sudo make install
sudo ldconfig

# 언어 팩을 다운받고 추가하는 부분을 아래에서 진행한다.

cd /usr/local/share/tessdata
# 원문 문서에서는 해당 경로가 아닌 다른 경로에서 다운받도록 되어있으나, 3.04 파일이 아니므로 아래 링크에서 받아야 한다.

# 만약 다운을 받았는데 용량이 너무 적게 나타나면, 제대로 다운로드가 안된것이니 참고하도록 한다.

sudo wget https://github.com/tesseract-ocr/tessdata/tree/3.04.00/eng.traineddata
sudo wget https://github.com/tesseract-ocr/tessdata/tree/3.04.00/kor.traineddata
export TESSDATA_PREFIX=/usr/local/share/

# 최적화에 사용되는 파일이다. 이것은 받아두도록 한다.
sudo wget hhttp://tesseract-ocr.googlecode.com/files/tesseract-ocr-3.01.osd.tar.gz
sudo tar xvf tesseract-ocr-3.01.osd.tar.gz
sudo mv tesseract-ocr/tessdata/* .
sudo rm tesseract-ocr-3.01.osd.tar.gz

nano ~/.bash_profile
# Copy this line to the end: export TESSDATA_PREFIX=/usr/local/share/
# Verify:
tesseract --list-langs



여기까지만 하면 설치 완료. 테스트를 해보도록 한다.

테스트를 위해서 아무 문서나 막 퍼오면 안되므로, 공정거래법 조항 일부를 이미지로 저장해보도록 한다.



이제 한번 실행해보도록 한다.


~/$ tesseract test.png ./out_kor -l kor hocr
Tesseract Open Source OCR Engine v3.04.00 with Leptonica


여기서 파라미터를 보자.

test.png: 이미지파일

out_kor: 텍스트파일, out_kor.txt로 생성된다.

-l kor: language를 한국어(kor)로 한다.

hocr: 이건 사실 안붙여도 된다. 결과값을 XML로 받아볼 때 쓰는 파라미터로, out_kor.hocr 파일이 추가 생성된다.


이제 한번 결과를 보도록 한다.



제1징 충직
제1조(독적) 미 킵톨 시밉저익 시짐저쎄직저뮈익 님욤피 과도한 결재릭익 짐중들 말저히고「 부딥한곰돔뱉뮈 및 믈곰짐거레뱉뮈쿨 규재히며 곰절히고 저뮤로문 결젤들 촉 같으로써 칠익직민 기밉팥돔들 조

제츠조썹의) 미 밑에서 시욤히는 욤머익 짐익는 다믈피 같다 <개절 `딘므2 `2 핀′ 잿딘므듭 `2 3[| ′ 잿므므므 2 5 ′ 2[|미 ` 내 ′ 2띤띤4 `2 어 ′2[|띤7 4 27 ′ 2딘[|7 된 3 ′ 2미7 4 내 ′ 2미7 m 읽 >
` 쩨밉쟈맙 말든 재조밉「 서비스밉「 기다시밉들 미 }는 저들 말한다 시밉저익 미믹들 무 햐뱉뮈쿨 흡 밈뮌 좁밉뮌 대리인 기다익 저는 시밉저한체에 관한 규절익 직욤에 있어서는 미룰 시밉저로 튼다
`익2 에주회샤맙 말릴 ×식(붉홍들 쪼힙한다 미바같다뵙 소뮤쿨 톰히며 극내회시익 시밉내욤들 저쎄바는 것들 주된 시밉으로 허는 회시로서 저 솝긔미 다쇼톨효렬미 접히는 굳맥미심민 회시쿨 렬한다
잿익딘 셈저회시셈긴흔 펫주회시에 익히며 돠쇼롤효렬미 접히는 기준에 따리 그 시밉내욤들 저쎄말는 극내회시쿨 말한다
`익4 "손 텃샤한 저회시에 익히며 다쇼롤효렬으로 접히는 기준에 따리시밉내욤들 저쎄말는 극내회시쿨 말한다
2 미밉짐」 미리 말든 돔말민미 다들 칵독익 구쿤에 따리다쇼롤효렬미 접히는 기준에 익히며 시실십 그 시밉내욤들 저쎄히는 회시익 짐한들
기 돔말민미 회시민 결무그 돔말민피그 돔말민미 저배늘 」 히다미십익 회시익 징한
다 돔말민미 회시기미닌 결무 그 돔말민미 저쎄히는 2미심익 회시익 징한
3 에멸회샤맙 말든 2미십익 회시기돔말한기밉짐한에 속하는 결무에 미돌 회시는 서로 심대말익 계멸회시리 한다
3익2 에멸줄쟈틴 기밉짐한 소속 회시기 계멸회시익 주식들 취득 또는 소뮤히는 뱉뮈쿨 }
딘익딘 에멸줄저회 린 계멸줄저쿨 톱히며 튼 계열 법 주식들 또는 소뮤히는 계멸회시쿨 말한다
3익4 에멸줄저대뺄뵈샤틴 계멸줄저쿨 뺄바며 계멸줄저회시기 쉐득 또는 소뮤히는 계멸회시 주식들 말뱉한 계멸회시쿨 말한다
딘익드 }줄저”린 크게 미십익 계멸줄저로 민결된 계멸회시모두기계멸줄저회시 및 계멸줄저대심회시기 되는 계멸줄저 핀계쿨 말한다
딘익듭 〉줄저회시짐한"미린 기밉짐한 소 회시중 순흰줄저핀계에 있는 계 법 짐한들 말한다
3익7 재무보즐떼린 기밉짐한에 속바는 회시기다믈 칵 독인 어느 히다에 레딥바는 극내굳튤기핀익 며신피핀킥히며 극내계멸회시에 대히며 뱉히는 보즐 말한다



보다시피, 100% 만족하는 결과가 나오지는 못하였다.

하지만 그래도 어느 정도의 인식은 가능하다는 것을 증명할 수 있다.

해당 부분의 정확도를 높이기 위한 부분은 추후 테스트를 통해서 세부적으로 다룰 예정이다.



2. python에서의 설치 및 실행 (pytesseract)

Python 2.7에서는 pytesseract 를 설치하여 구현이 가능하다.

물론 Tesseract가 사전에 설치가 되어 있어야 한다.

그러므로 설치한다.



~/$ pip install opencv-python
~/$ pip install pytesseract

이렇게 두개를 설치하면 된다.

테스트 코드도 다음과 같이 짜본다.



import cv2
import PIL
import pytesseract

img_path = 'test.png'
img = cv2.imread(img_path,cv2.IMREAD_COLOR)
img2 = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
img2 = PIL.Image.fromarray(img2)
txt = pytesseract.image_to_string(img2, lang='kor')
print(txt)



1. test.png를 img_path 이름으로 한다.

2. img 변수에 cv2.imread를 이용해서 이미지를 실제로 불러온다.

3. img2 변수에 Grayscale(흑백) 으로 변환을 시킨다.

4. 이미지 처리 및 핸들링을 위해서 PIL Image를 사용한다. (다만 위 예제에서는 이를 직접적으로 활용하지는 않는다, 세부적으로 다룰 때 사용할 것으로 보인다)

5. pytesseract를 사용하여 이미지 내 글자 추출을 txt로 하고 출력한다.


이렇게 하면 다음과 같은 결과가 나온다.



제1징 충직
재1조(독적) 미 킵톨 시밉저익 시짐저쎄직저뮈익 님욤피 과도한 결재릭익 짐중들 말저히고「 부딥한곰돔뱉뮈 및 믈곰짐거레뱉뮈쿨 규재히며 곰절히고 저뮤로문 결젤들 촉 같으로써 칠익직민 기밉팥돔들 조

재츠조찔의) 미 밑에서 시욤히는 욤머익 짐익는 다믈피 같다 <개절 `딘므2 `2 핀′ 잿딘므듭 `2 3[| ′ 잿므므므 2 5 ′ 2[|미 ` 내 ′ 2띤띤4 `2 어 ′2[|띤7 4 27 ′ 2딘[|7 된 3 ′ 2미7 4 내 ′ 2미7 m 읽 >
` 쩨밉쟈맙 말든 재조밉「 서비스밉「 기다시밉들 미 }는 저들 말한다 시밉저익 미믹들 무 햐뱉뮈쿨 흡 밈뮌 좁밉뮌 대리인 기다익 저는 시밉저한체에 관한 규절익 직욤에 있어서는 미룰 시밉저로 튼다
`익2 에주회샤맙 말릴 ×식(붉홍들 쪼힙한다 미바같다뵙 소뮤쿨 톰히며 극내회시익 시밉내욤들 저쎄바는 것들 주된 시밉으로 허는 회시로서 저 솝긔미 다쇼톨효렬미 접히는 굳맥미심민 회시쿨 렬한다
잿익딘 셈저회시셈긴흔 펫주회시에 익히며 돠쇼롤효렬미 접히는 기준에 따리 그 시밉내욤들 저쎄말는 극내회시쿨 말한다
`익4 "손 텃샤한 저회시에 익히며 다쇼롤효렬으로 접히는 기준에 따리시밉내욤들 저쎄말는 극내회시쿨 말한다
2 미밉짐」 미리 말든 돔말민미 다들 칵독익 구쿤에 따리다쇼롤효렬미 접히는 기준에 익히며 시실십 그 시밉내욤들 저쎄히는 회시익 짐한들
기 돔말민미 회시민 결무그 돔말민피그 돔말민미 저배늘 」 히다미십익 회시익 징한
다 돔말민미 회시기미닌 결무 그 돔말민미 저쎄히는 2미심익 회시익 징한
3 에멸회샤맙 말든 2미십익 회시기돔말한기밉짐한에 속하는 결무에 미돌 회시는 서로 심대말익 계멸회시리 한다
3익2 에멸줄쟈틴 기밉짐한 소속 회시기 계멸회시익 주식들 취득 또는 소뮤히는 뱉뮈쿨 }
딘익딘 에멸줄저회 린 계멸줄저쿨 톱히며 튼 계열 법 주식들 또는 소뮤히는 계멸회시쿨 말한다
3익4 에멸줄저대뺄뵈샤틴 계멸줄저쿨 뺄바며 계멸줄저회시기 쉐득 또는 소뮤히는 계멸회시 주식들 말뱉한 계멸회시쿨 말한다
딘익드 }줄저”린 크게 미십익 계멸줄저로 민결된 계멸회시모두기계멸줄저회시 및 계멸줄저대심회시기 되는 계멸줄저 핀계쿨 말한다
딘익듭 〉줄저회시짐한"미린 기밉짐한 소 회시중 순흰줄저핀계에 있는 계 법 짐한들 말한다
3익7 재무보즐떼린 기밉짐한에 속바는 회시기다믈 칵 독인 어느 히다에 레딥바는 극내굳튤기핀익 며신피핀킥히며 극내계멸회시에 대히며 뱉히는 보즐




물론 위 예제와 마찬가지로 글씨 필터링이 썩 만족스럽지는 못한다.

다만 tesseract-ocr에서 직접 실행한 것보다는 그나마 조금 나아 보이기도 하다.


이제 이 부분을 바탕으로 좀 더 정교한 검색 및 부분 추출 등에 대해서는 다음 글에서 다루도록 하며,

기초적인 설치 및 사용은 여기서 마친다.