요즘 정말 멋지고 독특한 새로운 리눅스 소프트웨어를 찾는 일은 점점 어려워졌습니다. 일종의 숙제처럼 느껴질 정도인데요. 지난 4~5년간 데스크톱 환경에서 열정과 혁신이 서서히 사그라들기 시작했기 때문입니다. 유한한 지적 자원 안에서 만들어낼 수 있는 좋은 것에는 한계가 있지만, 모바일로 초점이 잘못 이동한 것과 '리눅스의 해'라는 꿈이 산산조각 난 사실도 잊어서는 안 됩니다.
이런 배경에서 저는 4년 전에 만들어진 소프트웨어인 OCRFeeder를 테스트해 보았습니다. 두 가지 이유 때문입니다. 첫째, 좋은 소프트웨어는 오래되어도 여전히 좋습니다. 둘째, 저는 광학 문자 인식(OCR) 기술의 발전에 늘 관심이 많았고, 우리 도구(AI)가 이 분야에서 얼마나 쓸만한 성능을 내는지 궁금했습니다. 예전에 이 주제로 상세히 글을 쓴 적도 있었고, 2015년에는 YAGF를 리뷰하기도 했습니다. 이제 OCRFeeder가 무엇을 할 수 있는지 함께 살펴보겠습니다. 용감한 리눅스 전사 여러분, 따라오세요!

JPG 파일에서 글자를 꺼내다
프로그램 설치는 결코 가볍지 않습니다. 필요한 라이브러리가 상당히 많아서 Ubuntu 18.04에서는 설치 목록이 몇 줄에 걸쳐 표시될 정도였습니다. 이 프로그램은 Tesseract OCR 엔진을 기본 패키지로 사용합니다.
The following additional packages will be installed:
blt gir1.2-goocanvas-2.0 gir1.2-gtkspell3-3.0 libgoocanvas-2.0-9 libgoocanvas-2.0-common libgtkspell3-3-0 liblept5 libtesseract4 libyelp0 python-bs4 python-chardet python-enchant python-html5lib python-lxml python-numpy python-olefile python-pil python-renderpm python-reportlab python-reportlab-accel python-sane python-tk python-webencodings tesseract-ocr tesseract-ocr-eng tesseract-ocr-osd tk8.6-blt2.5 unpaper yelp yelp-xsl
Suggested packages:
blt-demo python-gobject python-wxgtk3.0 python-genshi python-lxml-dbg python-lxml-doc gfortran python-dev python-nose python-numpy-dbg python-numpy-doc python-pil-doc python-pil-dbg python-renderpm-dbg python-egenix-mxtexttools python-reportlab-doc python-sane-dbg tix python-tk-dbg
실행해 보면 인터페이스가 다소 실용적이라는 느낌을 받습니다. 먼저 하나 이상의 이미지를 불러온 뒤, 그 이미지들을 OCR 엔진에 입력하고, 결과물로 어느 정도 정확도 있는 텍스트가 나오기를 기대하게 됩니다. 변환이 끝나면 결과 텍스트를 LibreOffice로 내보낼 수 있습니다.


OCR 엔진
앞서 말했듯이 OCRFeeder는 기본적으로 Tesseract를 사용하지만, 원하는 다른 엔진을 추가할 수도 있습니다. 실제로 CuneiForm, GOCR, Ocrad를 시험해 보았는데, 프로그램이 세 가지 엔진 모두를 정상적으로 감지하고 불러왔습니다. 아주 깔끔하네요. 덕분에 같은 문서를 여러 방식으로 처리해 볼 수 있고, 어떤 엔진이 더 나은 결과를 내는지 비교할 수 있습니다.

sudo apt-get install cuneiform gocr ocrad

이미지-텍스트 변환
이제 핵심 부분입니다. 여기서 저는 약간 헤매었습니다. 프로그램에게 모든 이미지에서 텍스트를 자동으로 감지하도록(모든 페이지 인식) 명령했더니, 색상으로 표시된 다소 이상한 출력물이 나왔습니다. 불러온 PNG 파일 세 개를 처리하는 데 약 3분이 걸렸고, 그 동안 OCRFeeder의 CPU 사용률은 약 17%, Tesseract는 약 4~5% 수준이었습니다. 애플리케이션이 프로세서 코어를 더 효율적으로 활용한다면 처리 시간은 충분히 단축될 수 있을 것입니다. 게다가 그 이상한 출력 결과 때문에 무엇을 해야 할지 알 수 없었고, 진전이 전혀 없는 듯한 느낌이 들었습니다.


곧 방법을 깨달았습니다. 마우스로 화면에 표시된 이미지의 일부를 드래그해 선택하면 별도의 창이 열리고, 거기서 원하는 OCR 엔진을 골라 실제 변환을 실행할 수 있었습니다. 시각적인 버그는 있었지만 전반적으로 꽤 잘 작동했고, 이미지 하나당 처리 시간은 몇 초밖에 걸리지 않았습니다.
별도의 학습이나 기본 설정 변경 없이 네 가지 엔진의 결과 차이는 매우 컸습니다. Tesseract가 가장 좋았고, 사실상 유일하게 쓸 만한 변환 품질을 보여주었습니다. 나머지 엔진들은 사용을 고려할 수 없을 정도였습니다. 이유는 잘 모르겠지만 어쨌든 그런 결과였습니다.




또한 회색 배경 이미지에서 더 나은 결과를 얻었습니다. 과거 Tesseract는 이런 경우에 고전했는데, 그동안 엔진에 들어간 개선이 실감되네요. 물론 이것은 엄밀히 말해 OCRFeeder 자체의 특징이 아니며, 원한다면 명령줄에서 직접 Tesseract를 실행할 수도 있습니다.

기울기 보정(deskew)과 언페이퍼(unpaper)
OCRFeeder에는 유용한 기능 두 가지가 포함되어 있습니다. 하나는 기울어진 스캔 이미지에서 텍스트를 자동으로 회전시켜 주는 기능(deskew)이고, 다른 하나는 종이 배경 노이즈를 제거해 더 정확한 변환을 돕는 기능(unpaper)입니다. 두 가지 모두 시험해 보았는데, deskew는 잘 작동했고 unpaper는 그럭저럭이었습니다. 하지만 텍스트를 올바르게 회전한 후(예전에 GIMP로 대조 이미지를 처리했던 것처럼) 변환 결과는 한층 더 좋아졌습니다.



ODT로 내보내기
이 부분은 다소 까다로웠습니다. 몇 번 시도하는 동안 여러 오류를 만났지만, 결국에는 성공했습니다. 출력 결과가 미려하지는 않지만, 좋은 점은 여러 변환 결과를 동시에 내보낼 수 있고, 이미지마다 서로 다른 엔진을 사용한 결과까지 한꺼번에 저장할 수 있다는 것입니다. 꽤 유용한 기능입니다.


환경설정
마지막으로 프로그램의 동작 방식을 조정할 수 있습니다. 대단한 설정은 아니지만 텍스트 감지율과 인식 정확도 개선에 도움이 됩니다. 대체로 텍스트 열 폭, 여백, 언어 선택 등을 조정하는 수준입니다. 대부분의 사용자에게는 기본값이 충분히 합리적인 출발점입니다.

결론
OCRFeeder는 합리적이고 유연한 소프트웨어입니다. 여러 OCR 엔진을 지원하고 이미지 보정 알고리즘도 훌륭한 보너스입니다. 이러한 장점 덕분에 자유 소프트웨어 시장에서 이런 종류의 프로그램 중 가장 가능성 있는 후보라고 할 수 있지만, 안타깝게도 누군가 프로젝트를 이어받지 않는 한 당분간 업데이트를 기대하기는 어려워 보입니다. 이 분야에는 충분한 시장성이 있음에도 리눅스 세계는 피로와 무관심 사이 어딘가에 갇혀 있는 셈입니다.
그런 아쉬움을 제외하면, 나이와 업데이트 문제를 제외하면, OCRFeeder는 대체로 제 역할을 해냈습니다. 변환 품질도 나쁘지 않았고, UI를 통해 작업한다고 손해 볼 일도 없으며, 내보내기 기능으로 편집 가능한 깔끔한 문서를 만들 수 있습니다. Tesseract의 발전 또한 반갑습니다. 텍스트가 가득한 이미지가 쌓여 있다면, 혹은 오래된 서식 위의 필기 텍스트를 현대적이고 쓸모 있는 데이터로 바꾸고 싶다면 OCRFeeder를 시험해 볼 만합니다. PDF 지원은 물론 스캐너에서 직접 읽어오는 기능도 갖추고 있습니다. 실험해 볼 가치가 충분한 프로그램입니다. 이제 슬슬 가보겠습니다. 안녕!
Cheers.