웹사이트 검색

PDF 및 이미지에서 서버 측 OCR을 수행하는 방법


소개

광학 문자 인식(OCR)은 주로 스캔한 이미지의 텍스트를 선택 가능하고 복사 가능하며 인코딩된 내장 텍스트로 변환하는 데 사용됩니다. 많은 최신 데스크톱 및 모바일 응용 프로그램과 스캐너 소프트웨어 스택에는 일부 OCR 기능이 내장되어 있으며 대부분의 순환 PDF에는 텍스트가 포함되어 있습니다. 그러나 자동으로 추출할 수 없는 상당한 양의 포함되지 않은 텍스트가 포함된 문서나 이미지가 여전히 나타날 수 있습니다.

이 경우 오픈 소스 도구의 파이프라인을 사용하여 자동으로 OCR을 수행할 수 있습니다. 이는 텍스트를 추출해야 하는 웹 애플리케이션에 문서 또는 이미지를 수집하거나 전체 텍스트를 인덱싱해야 하는 대량의 문서로 작업하는 경우에 특히 유용합니다.

이 튜토리얼에서는 PDFtk를 사용하여 OCR 파이프라인을 설정하는 방법을 다룹니다. 이 기본 기능 대신 또는 추가로 사용할 수 있는 다른 도구도 검토합니다.

전제 조건

이러한 도구는 대부분의 플랫폼에서 사용할 수 있습니다. 이 자습서에서는 Ubuntu 22.04를 사용한 초기 서버 설정 가이드에 따라 Ubuntu 22.04 서버에 대한 설치 지침을 제공합니다.

1단계 – Ghostscript, Tesseract 및 PDFtk 설치

OCR은 PDF(이미지를 포함하고 때로는 이미지로 렌더링됨)와 독립 실행형 이미지 모두에서 수행할 수 있습니다. PDF로 작업하면 몇 가지 추가 단계가 추가되며 이미지 자체로 작업하는 경우 건너뛸 수 있습니다.

엔드투엔드 파이프라인에는 세 가지 도구가 필요합니다. 모든 종류의 PDF를 이미지로 변환하거나 그 반대로 처리하는 Ghostscript(원래 PDF의 전신 기술인 Postscript의 인터프리터로 생성됨), Tesseract , Ghostscript와 마찬가지로 1980년대부터 지속적으로 개발된 오픈 소스 OCR 엔진 및 개별 페이지에서 PDF를 슬라이싱하거나 재구성하기 위한 더 작은 유틸리티인 PDFtk.

세 가지 응용 프로그램 모두 Ubuntu의 기본 리포지토리에서 사용할 수 있으며 apt 패키지 관리자를 사용하여 설치할 수 있습니다. apt update로 패키지 소스를 업데이트한 다음 apt install을 사용하여 설치하십시오.

  1. sudo apt update
  2. sudo apt install pdftk ghostscript tesseract-ocr x11-utils

이제 which를 사용하여 확인할 수 있는 각 응용 프로그램에 하나씩 세 개의 새 명령이 있어야 합니다.

  1. which pdftk
Output
/usr/bin/pdftk
  1. which gs
Output
/usr/bin/gs
  1. which tesseract
Output
/usr/bin/tesseract

이 명령을 사용하여 다음 단계에서 OCR을 수행합니다.

2단계 – PDF를 이미지로 변환하고 Tesseract 실행하기

OCR을 수행할 PDF가 아직 없는 경우 포함된 텍스트 없이 스캔된 이 샘플 PDF를 다운로드하여 이 튜토리얼을 따라할 수 있습니다. PDF를 서버에 다운로드하려면 -O 플래그와 함께 curl을 사용하여 동일한 파일 이름으로 현재 디렉토리에 저장할 수 있습니다.

  1. curl -O https://deved-images.nyc3.digitaloceanspaces.com/server-ocr/OCR-sample-paper.pdf

하나 이상의 PDF로 작업하는 경우 OCR 소스로 사용하기 전에 개별 이미지로 변환해야 합니다. 이는 Ghostscript 명령을 사용하여 수행할 수 있습니다. 색상 공간 및 치수에 대한 일관성을 유지하려면 추가 매개변수를 포함해야 합니다. 먼저 이 프로세스에서 만든 파일에 대한 작업 output 디렉터리를 만든 다음 gs를 실행합니다.

  1. mkdir output
  2. gs -o output/%05d.png -sDEVICE=png16m -r300 -dPDFFitPage=true OCR-sample-paper.pdf

gs 명령은 -o 플래그를 사용하여 나머지 명령 앞에 출력 경로를 지정합니다. %05d는 Ghostscript가 기본적으로 이해하는 모호한 셸 구문입니다. 이 경우 자동으로 증가하는 5자리 숫자를 사용하여 입력 PDF에서 출력 PNG 파일의 이름을 지정하는 것을 의미합니다. 다른 이전 명령줄 응용 프로그램에서 사용되는 것을 볼 수 있습니다. 일부 PNG 서식 구문과 -r300의 DPI를 추가한 후 OCR-sample-paper.pdf 또는 선택한 입력 파일에 대한 경로를 제공합니다. .

Ghostscript는 PDF의 모든 페이지를 개별적으로 출력합니다.

Output
Processing pages 1 through 14. Page 1 Page 2 Page 3 Page 4 Page 5 …

완료되면 output 디렉토리의 내용을 확인할 수 있습니다.

  1. ls output
Output
00001.png 00003.png 00005.png 00007.png 00009.png 00011.png 00013.png 00002.png 00004.png 00006.png 00008.png 00010.png 00012.png 00014.png

다음으로 tesseract 명령 주위에 쉘 for 루프를 사용하여 생성한 이미지를 이번에는 포함된 텍스트가 있는 개별 PDF 페이지로 다시 전환합니다. 셸 루프는 다른 프로그래밍 언어의 루프와 유사하게 작동하며 각 부분을 세미콜론으로 구분하고 done으로 끝나 단일 명령으로 형식을 지정할 수 있습니다.

  1. for png in $(ls output); do tesseract -l eng output/$png output/$(echo $png | sed -e "s/\.png//g") pdf; done

명령이 반복되는 동안 일부 텍스트가 셸에 출력됩니다.

Output
Tesseract Open Source OCR Engine v4.1.1 with Leptonica Tesseract Open Source OCR Engine v4.1.1 with Leptonica Tesseract Open Source OCR Engine v4.1.1 with Leptonica Tesseract Open Source OCR Engine v4.1.1 with Leptonica ...

Tesseract 구문 자체는 tesseract -l 언어 input_filename output_base_filename [pdf] 구성 요소입니다. -l 언어 구성 요소가 생략되면 Tesseract는 기본적으로 영어 모델을 사용하고 pdf가 생략되면 Tesseract는 입력 이미지와 별도로 식별된 텍스트를 출력합니다. PDF로. 이 명령에 추가된 추가 sed 구문은 Tesseract에 올바른 경로가 제공되고 출력 파일의 이름을 .pdf로 바꿀 때 .png 파일 확장자가 제거되도록 합니다.

참고: Ubuntu에서 Tesseract는 기본적으로 모든 언어 모델을 설치하지 않습니다. 영어가 아닌 OCR을 수행해야 하는 경우 sudo apt install tesseract-ocr-all을 사용하여 tesseract-ocr-all 패키지를 설치해야 합니다.

공식 문서에서 더 많은 Tesseract 명령줄 예제를 찾을 수 있습니다.

Tesseract를 실행한 후 출력 디렉토리를 다시 확인하십시오.

  1. ls output

새로 만든 PDF 페이지가 모두 표시됩니다.

Output
00001.pdf 00003.pdf 00005.pdf 00007.pdf 00009.pdf 00011.pdf 00013.pdf 00001.png 00003.png 00005.png 00007.png 00009.png 00011.png 00013.png 00002.pdf 00004.pdf 00006.pdf 00008.pdf 00010.pdf 00012.pdf 00014.pdf 00002.png 00004.png 00006.png 00008.png 00010.png 00012.png 00014.png

출력 이미지만 필요한 경우 이 자습서의 마지막 단계로 건너뛰어 대량 텍스트 추출 옵션에 대해 자세히 알아볼 수 있습니다. PDF를 사용하는 경우 다음 단계에서 재구성하고 마무리합니다.

3단계(선택 사항) – 이미지 출력에서 PDF 재구성

마지막 단계에서 PDF를 입력으로 사용한 경우 이제 PDFtk 및 Ghostscript를 다시 사용하여 Tesseract에서 생성된 개별 페이지에서 다시 결합해야 합니다. 순차적으로 번호가 지정되기 때문에 셸 구문을 사용하여 정렬된 파일 목록을 pdftk cat 명령에 전달하여 연결할 수 있습니다.

  1. pdftk output/*.pdf cat output joined.pdf

이제 joined.pdf라는 이름의 Tesseract 출력에서 재구성된 단일 PDF가 있습니다. 남은 유일한 단계는 Ghostscript를 사용하여 PDF를 다시 포맷하는 것입니다. 이것은 Tesseract가 항상 정확한 PDF 치수에 충실하지 않기 때문에 중요합니다. 새 PDF는 최적화되지 않았기 때문에 현재 입력한 것보다 훨씬 큽니다. Ghostscript는 PDF를 정확한 사양으로 다시 렌더링하는 훨씬 더 강력한 도구입니다. joined.pdf에서 마지막 gs 명령을 하나 실행합니다.

  1. gs -sDEVICE=pdfwrite -sPAPERSIZE=letter -dFIXEDMEDIA -dPDFFitPage -o final.pdf joined.pdf

이 명령에서 PDF 사양 준수에 대한 경고 출력을 받을 수 있으며 이는 정상적인 현상입니다. Ghostscript는 다른 도구보다 PDF 표준에 대해 훨씬 더 정확하며 대부분의 PDF는 대부분의 뷰어에서 렌더링됩니다.

-sDEVICE=pdfwrite -sPAPERSIZE=letter -dFIXEDMEDIA -dPDFFitPage 매개변수는 모두 PDF 크기를 적용하는 데 사용됩니다. 다른 페이지 형식으로 작업하는 경우 sPAPERSIZE=letter를 변경해야 할 수 있습니다. gs 명령에 제공된 -o final.pdf 파일 이름이 완성된 출력의 이름이 됩니다.

OCR이 성공적이었는지 테스트하려면 데스크탑 애플리케이션에서 로컬로 PDF를 열거나 pdftotext와 같은 명령줄 애플리케이션을 사용하여 문서에서 현재 포함된 텍스트를 덤프할 수 있습니다.

명령줄에서 PDF로 작업하기 위한 여러 도구가 포함된 poppler-utils라는 패키지를 통해 Ubuntu에 pdftotext를 설치할 수 있습니다.

  1. sudo apt install poppler-utils

다음으로 새 PDF에서 pdftotext를 실행합니다.

  1. pdftotext final.pdf

새 파일인 final.txt가 생성됩니다. head와 같은 도구를 사용하여 이 파일의 내용을 미리 봅니다.

  1. head final.txt
Output
Pakistan Journal of Applied Economics (1983) vol. II, no. 2 (167—180) THE MEASUREMENT OF FARM-SPECIFIC TECHNICAL EFFICIENCY K. P. KALIRAJAN and J. C, FLINN* Measures of technical efficiency were estimated using a stochastic translog production frontier for a sample of rainfed rice farmers in Bicol, Philippines. These estimates were farm specific as opposed to being based on deviations from an average sample efficiency. A wide variation in the level of technical

입력 파일에서 텍스트 스트림을 받아야 합니다. 순서가 맞지 않거나 이상한 서식 문자가 포함될 수 있지만 텍스트를 한 번에 덤프할 때 자연스러운 현상입니다. 중요한 것은 이제 문서에 포함된 텍스트가 포함된다는 것입니다. 이 시점에서 작업 중인 이미지와 PDF 페이지를 포함하는 생성한 output 디렉토리를 제거할 수 있습니다. 이러한 이미지는 더 이상 필요하지 않습니다.

이제 세 가지 도구와 네 가지 명령을 사용하는 종단 간 PDF OCR 파이프라인이 있습니다. 이들은 독립 실행형 스크립트로 결합하거나 다른 애플리케이션에 통합하거나 필요에 따라 대화식으로 실행할 수 있습니다. 개별 PDF 문서를 위한 완벽한 솔루션입니다. 다음 단계에서는 데이터 테이블 서식 지정 및 대량 텍스트 추출을 위한 몇 가지 추가 옵션을 검토합니다.

4단계(선택 사항) – OCR 후 문서에서 CSV 테이블 추출

이미지 또는 PDF에서 OCR을 수행한 후 선택적으로 표 또는 스프레드시트 형식의 데이터를 CSV 파일로 추출할 수도 있습니다. 이것은 오래된 데이터 소스나 과학 논문으로 작업할 때 특히 유용할 수 있습니다.

이 기능을 제공하는 두 가지 도구가 있으며 둘 다 비슷하게 수행됩니다. Python으로 작성된 Camelot.

타불라

Tabula는 snap install을 사용하여 Ubuntu에 스냅 패키지로 설치할 수 있습니다.

  1. sudo snap install tabula

이 자습서에서 사용된 샘플 PDF를 육안으로 검사하면 6페이지 중간에 표가 있습니다.

따라서 final.pdf-p 6에서 테이블을 추출하도록 지정하여 PDF에서 tabula를 실행합니다. 출력을 test.csv라는 새 파일로 리디렉션합니다.

  1. tabula -p 6 final.pdf > test.csv

test.csv에서 테이블 감지 품질을 확인하십시오. 이제 Excel과 같은 스프레드시트 프로그램 또는 다른 데이터 분석 스크립트에 대한 입력으로 사용할 수 있습니다.

카멜롯

Camelot은 Python 라이브러리이며 Python과 Python 패키지 관리자인 pip가 설치되어 있어야 합니다. Python을 아직 설치하지 않은 경우 Ubuntu 22.04 서버에서 Python 3를 설치하고 프로그래밍 환경을 설정하는 방법의 첫 번째 단계를 참조할 수 있습니다.

다음으로 opencv 종속성과 함께 pip install로 Camelot을 설치합니다.

  1. sudo pip install camelot-py opencv-python-headless ghostscript

그런 다음 -p 6, 출력 경로 및 파일 유형, 입력 final.pdfcamelot을 실행할 수 있습니다. >:

  1. camelot -p 6 -f csv -o test.csv stream final.pdf

필요한 경우 추출을 미세 조정하기 위해 Camelot 설명서를 참조할 수 있습니다.

이 자습서의 마지막 선택적 단계에서는 다른 OCR 솔루션을 검토합니다.

5단계(선택 사항) – 대량 추출을 위한 다른 OCR 솔루션 사용

Tesseract는 가장 오래 개발된 오픈 소스 OCR 도구이며 가장 광범위한 출력 형식 세트를 지원하지만 서버 측 OCR을 수행하기 위한 몇 가지 다른 옵션도 있습니다. EasyOCR은 보다 적극적으로 개발되고 GPU에서 실행되어 보다 빠르고 정확한 결과를 제공할 수 있는 최신 오픈 소스 OCR 엔진입니다. 그러나 EasyOCR은 PDF 출력을 지원하지 않아 입력 문서를 재구성하기 어렵고 주로 대량의 원시 텍스트를 출력하는 데 유용합니다.

EasyOCR은 Python 라이브러리이며 Python과 Python 패키지 관리자인 pip가 설치되어 있어야 합니다. Python을 아직 설치하지 않은 경우 Ubuntu 22.04 서버에서 Python 3를 설치하고 프로그래밍 환경을 설정하는 방법의 첫 번째 단계를 참조할 수 있습니다.

다음으로 pip install로 EasyOCR을 설치합니다.

  1. sudo pip install easyocr

EasyOCR을 설치한 후 Python 스크립트 내에서 라이브러리로 사용하거나 easyocr 명령을 사용하여 명령줄에서 직접 호출할 수 있습니다. 샘플 EasyOCR 명령은 다음과 같습니다.

  1. easyocr -l ch_sim en -f image.jpg --detail=1 --gpu=True

EasyOCR은 다국어 OCR을 수행하기 위해 한 번에 여러 언어 모델을 로드하는 것을 지원합니다. -l 플래그 다음에 여러 언어를 지정할 수 있습니다. 이 경우 ch_sim은 중국어 간체이고 en은 영어입니다. -f image.jpg는 입력 파일의 경로입니다. --detail=1은 파일에서 추출된 텍스트의 위치를 참조해야 하는 경우 출력과 함께 경계 상자 좌표를 제공합니다. --detail=0로 실행하여 이 정보를 생략할 수도 있습니다.

-gpu=True 플래그는 선택 사항이며 GPU 환경이 구성된 경우 보다 효율적인 추출을 위해 CUDA 코드 경로를 사용하려고 시도합니다.

결론

이 자습서에서는 다른 애플리케이션 스택에 구현하거나 웹 서비스를 통해 노출할 수 있는 몇 가지 성숙한 오픈 소스 도구를 사용하여 OCR 파이프라인을 만들었습니다. 또한 미세 조정을 위해 이러한 도구에서 사용할 수 있는 일부 구문 및 옵션을 검토하고 CSV 테이블을 추출하고 대규모 텍스트 대량 추출을 실행하기 위해 다른 OCR 옵션을 고려했습니다.

OCR은 잘 이해되고 널리 사용되는 기술입니다. 언제 필요할지 알 수 있습니다. 그럼에도 불구하고 턴키 OCR 구현은 종종 유료 데스크톱 소프트웨어로 제한됩니다. 필요할 때마다 OCR 도구를 배포할 수 있다는 것은 매우 유용할 수 있습니다. 다음으로 기계 학습 소개를 읽고 관련 주제 영역을 검토할 수 있습니다.