리눅스 명령줄 환경에서 Tesseract OCR 엔진을 활용하여 이미지 속 텍스트를 추출하는 방법을 소개합니다. Tesseract는 빠른 속도와 높은 정확도를 자랑하며, 약 100여 개의 다양한 언어를 지원합니다. 이제 그 사용법을 자세히 알아보겠습니다.
광학 문자 인식
광학 문자 인식(OCR)은 이미지 내의 글자를 인식하여 편집 가능한 텍스트 형태로 변환하는 기술입니다. 인간에게는 쉬운 이 작업이 컴퓨터에게는 매우 어려운 과제였으며, 초기 OCR 기술은 글꼴이나 크기가 맞지 않으면 오류를 자주 발생시켰습니다.
그럼에도 불구하고, 이 분야의 선구자들은 큰 공헌을 했습니다. 전자 문서 사본을 분실했을 때, 인쇄된 버전만 남아있다면 OCR을 통해 편집 가능한 전자 파일을 다시 만들 수 있습니다. 비록 100% 정확하지 않더라도, 이는 시간을 크게 절약해줍니다. 수동으로 수정하면 문서를 복원할 수 있었고, 사람들은 OCR 기술이 직면한 어려움을 이해했기에 그 오류들을 감수했습니다. 이는 전체 문서를 다시 입력하는 것보다 훨씬 나은 선택이었습니다.
이후 기술은 크게 발전했습니다. Tesseract OCR은 휴렛 패커드에서 1980년대에 상용 애플리케이션으로 시작되었으나, 2005년에 오픈 소스로 전환되었고, 현재는 Google의 지원을 받고 있습니다. 다국어 기능을 갖춘 Tesseract는 가장 정확한 OCR 시스템 중 하나로 인정받고 있으며, 무료로 이용 가능합니다.
Tesseract OCR 설치
Ubuntu 환경에 Tesseract OCR을 설치하려면 다음 명령을 사용하세요:
sudo apt-get install tesseract-ocr

Fedora에서는 다음과 같이 명령어를 입력합니다:
sudo dnf install tesseract
Manjaro에서는 아래와 같이 입력해야 합니다:
sudo pacman -Syu tesseract

Tesseract OCR 사용
Tesseract OCR의 성능을 시험해보기 위해 몇 가지 테스트를 진행할 것입니다. 첫 번째 이미지는 일반 데이터 보호 규정(General Data Protection Regulation)의 Recital 63에서 발췌한 텍스트입니다. OCR이 이 텍스트를 제대로 인식할 수 있을지 확인해 보겠습니다.

각 문장이 법률 문서에서 흔히 볼 수 있는 흐릿한 위첨자 숫자로 시작하기 때문에 다소 어려운 이미지입니다. Tesseract 명령에는 다음 정보들이 필요합니다:
- 처리할 이미지 파일의 이름.
- 추출한 텍스트를 저장할 텍스트 파일의 이름. 파일 확장자(.txt)는 필요하지 않습니다. 같은 이름의 파일이 이미 존재할 경우 덮어쓰게 됩니다.
- -dpi 옵션을 사용하여 이미지의 해상도 (인치당 도트 수)를 지정합니다. dpi 값을 제공하지 않으면 Tesseract가 스스로 추정합니다.
이미지 파일 이름은 “recital-63.png”이며, 해상도는 150dpi입니다. 텍스트 파일 이름은 “recital.txt”로 설정하겠습니다. 명령은 다음과 같습니다:
tesseract recital-63.png recital --dpi 150

결과는 매우 만족스럽습니다. 유일한 문제는 위 첨자가 너무 희미하여 제대로 인식되지 않았다는 점입니다. 정확한 결과를 위해서는 이미지 품질이 매우 중요합니다.

Tesseract는 위 첨자 숫자를 인용 부호(“”)와 도 기호(°)로 해석했지만, 실제 텍스트는 완벽하게 추출했습니다 (이미지 오른쪽 부분은 내용에 맞게 잘랐습니다). 마지막 문자는 캐리지 리턴을 나타내는 16진수 값 0x0C입니다.
다음은 다양한 크기의 텍스트와 굵은 글씨, 기울임꼴이 포함된 또 다른 이미지입니다.

이 파일의 이름은 “bold-italic.png”이며, 텍스트 파일 이름은 “bold.txt”로 지정하겠습니다. 명령은 다음과 같습니다:
tesseract bold-italic.png bold --dpi 150

이번에도 문제없이 텍스트가 완벽하게 추출되었습니다.

다른 언어 사용
Tesseract OCR은 약 100개의 언어를 지원합니다. 다른 언어를 사용하려면 먼저 해당 언어를 설치해야 합니다. 사용하려는 언어를 목록에서 찾은 다음, 해당 언어의 약어를 기록해 두세요. 여기서는 웨일스어 지원을 설치해보겠습니다. 웨일스어 약어는 “Cym”이며, 이는 웨일스어를 뜻하는 “Cymru”의 약자입니다.
설치 패키지 이름은 “tesseract-ocr-“에 언어 약어가 추가된 형태입니다. Ubuntu에서 웨일스어 언어 파일을 설치하려면 다음 명령을 실행합니다:
sudo apt-get install tesseract-ocr-cym

텍스트가 포함된 이미지는 아래와 같습니다. 이는 웨일스 국가의 첫 번째 구절입니다.

Tesseract OCR이 이 문제를 해결할 수 있는지 확인해 보겠습니다. -l(언어) 옵션을 사용하여 작업하려는 언어를 지정합니다.
tesseract hen-wlad-fy-nhadau.png anthem -l cym --dpi 150

Tesseract는 아래 추출된 텍스트와 같이 완벽하게 인식했습니다. 대단합니다, Tesseract OCR.

만약 문서에 두 개 이상의 언어가 포함되어 있다면 (예: 웨일스어-영어 사전), 더하기 기호(+)를 사용하여 다음과 같이 Tesseract에 추가 언어를 지정할 수 있습니다.
tesseract image.png textfile -l eng+cym+fra
PDF 파일과 함께 Tesseract OCR 사용
Tesseract 명령은 원래 이미지 파일을 처리하도록 설계되었지만 PDF 파일을 직접 읽을 수는 없습니다. PDF에서 텍스트를 추출해야 할 경우, 먼저 다른 유틸리티를 사용하여 이미지 세트를 만들어야 합니다. 각 이미지는 PDF의 한 페이지를 나타냅니다.
필요한 pdftoppm 유틸리티는 이미 설치되어 있어야 합니다. 여기서는 예시로 앨런 튜링의 인공 지능에 관한 논문 “Computing Machinery and Intelligence” 사본을 사용할 것입니다.

-png 옵션을 사용하여 PNG 파일을 생성하도록 지정합니다. PDF 파일 이름은 “turing.pdf”이며, 생성될 이미지 파일은 “turing-01.png”, “turing-02.png” 등으로 명명됩니다.
pdftoppm -png turing.pdf turing

단일 명령으로 각 이미지 파일에 대해 Tesseract를 실행하려면 for 루프를 사용해야 합니다. 각 “turing-nn.png” 파일에 대해 Tesseract를 실행하고, 이미지 파일 이름의 일부를 사용하여 “text-turing-nn” 형식의 텍스트 파일을 생성합니다.
for i in turing-??.png; do tesseract "$i" "text-$i" -l eng; done;

모든 텍스트 파일을 하나의 파일로 결합하려면 cat 명령을 사용합니다.
cat text-turing* > complete.txt

결과는 어땠을까요? 아래에서 확인할 수 있듯이 꽤 좋은 결과입니다. 하지만 첫 페이지는 다소 어려워 보입니다. 다양한 텍스트 스타일과 크기, 장식들이 있습니다. 페이지 오른쪽 가장자리에 세로 “워터마크”도 있습니다.
하지만 출력 결과는 원본에 매우 가깝습니다. 서식이 손실되었지만, 텍스트는 정확하게 인식되었습니다.

세로 워터마크는 페이지 하단에 횡설수설한 줄로 변환되었습니다. Tesseract가 텍스트가 너무 작아서 정확하게 읽지 못했지만, 충분히 파악하여 삭제할 수 있었습니다. 최악의 결과는 각 줄 끝에 문자가 누락되는 것이었습니다.
흥미롭게도, 2페이지의 질의응답 목록 시작 부분에 있는 단일 문자는 무시되었습니다. PDF의 해당 섹션은 다음과 같습니다.

아래 결과에서 볼 수 있듯이 질문은 남아 있지만, 각 줄 시작 부분의 “Q”와 “A”는 손실되었습니다.

다이어그램도 올바르게 변환되지 않았습니다. 튜링 PDF에서 아래 그림을 추출하려고 할 때 어떤 일이 발생하는지 살펴보겠습니다.

아래 결과에서 볼 수 있듯이 문자는 읽혔지만, 다이어그램의 형식은 손실되었습니다.

다시 말하지만, Tesseract는 아래 첨자의 작은 크기 때문에 어려움을 겪었고, 잘못 렌더링되었습니다.
하지만 공정하게 말하면, 여전히 좋은 결과였습니다. 텍스트를 직접 추출할 수는 없었지만, 이 예시는 일부러 어려운 도전을 제시하도록 선택되었습니다.
필요할 때 좋은 해결책
OCR은 매일 필요한 기술은 아닐 수 있습니다. 하지만 필요할 때 가장 뛰어난 OCR 엔진 중 하나를 사용할 수 있다는 사실은 매우 유용합니다.