C#에서 오프라인으로 효율적인 OCR 구현

이 프로젝트는 로컬 환경에서 Tesseract 엔진을 활용한 OCR 기능을 구현하는 방법을 설명합니다. 본문에 포함된 코드는 공개되어 있으며, 특정 채널을 통해 저장소 접근이 가능합니다. 테스트용 이미지는 인터넷 자료이며, 저작권 문제 시 삭제됩니다.

윈도우 10 환경에서 .NET 6 기반으로 실행 가능한 OCR 시스템을 구축하는 과정을 다룹니다. 주요 기능으로는 문서 인식, 스크린샷 텍스트 추출, 스캔 이미지 PDF 변환 등이 있습니다.

OCR 기술 기초

==========

Tesseract(아파치 2.0 라이선스, 71.4K 스타)는 현재 가장 정확한 오픈소스 OCR 엔진 중 하나입니다. 구글이 유지 관리하며, 인쇄체 및 손글씨를 텍스트, PDF, HTML 등으로 변환할 수 있습니다. 100개 이상의 언어를 지원하며, Tesseract 4 버전부터는 LSTM 신경망 모델을 도입해 정확도가 크게 향상되었습니다.

C#에서 Tesseract를 사용하는 두 가지 방법은 다음과 같습니다:

  • 명령줄 실행: tesseract.exe를 파라미터와 함께 실행하여 결과를 콘솔에서 받아옵니다. 간단한 사용이 가능하며, 언어와 무관하게 실행 가능합니다.
  • 래퍼 라이브러리 사용: C# 라이브러리를 통해 직접 함수를 호출합니다. 성능 최적화 및 오류 감소에 유리합니다.

명령줄 사용법은 별도 자료에서 확인 가능하며, 본 프로젝트에 포함된 예제 파일에서 확인할 수 있습니다. 여기서는 래퍼 라이브러리 사용 방식을 중심으로 설명합니다. NuGet을 통해 설치 가능한 Tesseract.NET(https://github.com/charlesw/tesseract) 라이브러리를 사용하면 실행 파일과 라이브러리가 모두 포함되어 즉시 사용 가능합니다.

모델 준비

===============

OCR 실행 전에는 사전 학습된 모델 파일이 필요합니다. 공식 저장소에서 제공하는 tessdata_best 및 tessdata_fast 저장소에서 다운로드 가능합니다. 언어 모델은 "언어 코드 + 방향/변종" 형식으로 구성되며, 예시로는 eng, chi_sim, jpn, kor, rus 등이 있습니다. 추가로 수직 배치 모델(chi_sim_vert) 및 특수 형식 모델(frak, equ)도 지원됩니다.

간단한 OCR 구현

=============

다음은 4줄로 구성된 핵심 코드 예제입니다:

// 엔진 인스턴스 생성 (언어 패키지, 데이터 경로)
using (var engine = new TesseractEngine(dataPath, "chi_sim + eng", EngineMode.LstmOnly))
{                    
    // 이미지 로드
    using (var image = Pix.LoadFromFile(imagePath))
    {
        // 페이지 객체 생성
        using (var page = engine.Process(image, PageSegMode.Auto))
        {
            // 결과 출력
            Console.WriteLine("인식 결과:\n" + page.GetText());
        }
    }
}

모델 파라미터

다중 언어를 동시에 로드할 경우 "+" 기호로 연결하여 지정할 수 있습니다. 예: "eng + chi_sim + osd".

엔진 모드

OEM(Engine Mode) 파라미터는 다음 옵션을 지원합니다:

  • 0: 전통적 엔진
  • 1: LSTM 네트워크
  • 2: 두 엔진 병합
  • 3: 자동 선택(기본값)

페이지 분할 모드

PSM(Page Segmentation Mode) 파라미터는 이미지를 어떻게 처리할지를 결정합니다. 0~13까지 14단계로 구성되어 있으며, 예를 들어 3은 자동 분할, 7은 단일 텍스트 블록 처리 등이 있습니다.

주의 사항

특정 작업에 맞는 모델을 선택해야 합니다. 예를 들어 차량 번호 인식 시 페이지 분할 모드를 변경해야 정확도가 향상됩니다.

확장 기능

======

텍스트 블록 좌표 추출

페이지 내부의 블록, 단어 단위로 데이터를 분석하여 문서 정보 추출이 가능합니다:

using (var iterator = page.GetIterator())
{
    iterator.Begin();
    do
    {
        do
        {
            do
            {
                if (iterator.IsAtBeginningOf(PageIteratorLevel.TextLine))
                {
                    iterator.GetImage(PageIteratorLevel.TextLine, 0, out var x, out var y);
                    Console.WriteLine($"<BLOCK> ({x},{y}): {iterator.GetWordRecognitionLanguage()}");
                }
                Console.Write(iterator.GetText(PageIteratorLevel.Word));
                Console.Write(" ");
            } while (iterator.Next(PageIteratorLevel.TextLine, PageIteratorLevel.Word));
        } while (iterator.Next(PageIteratorLevel.Block, PageIteratorLevel.Para));
    } while (iterator.Next(PageIteratorLevel.Block));
}

PDF 생성

이미지를 기반으로 OCR 가능한 PDF 파일을 생성합니다:

using (IResultRenderer renderer = Tesseract.PdfResultRenderer.CreatePdfRenderer("output.pdf", dataPath, false))
{
    using (renderer.BeginDocument("SearchablePDF"))
    {
        using (var engine = new TesseractEngine(dataPath, "chi_sim+eng", EngineMode.Default))
        {
            using (var image = Pix.LoadFromFile("input.png"))
            {
                using (var page = engine.Process(image, "SearchablePDF"))
                {
                    renderer.AddPage(page);
                }
            }
        }
    }
}

단일 파일 배포 문제

=========

단일 파일로 배포할 경우, 라이브러리 경로 설정 문제로 실행 오류가 발생할 수 있습니다. 본 프로젝트에서는 윈도우 x64 환경에 최적화된 비관리 코드를 고정하여 배포 가능성을 확보했습니다. 필요한 모든 파일을 포함한 최소 크기는 40MB입니다.

마무리

=====

Tesseract 엔진을 활용하면 C#에서 쉽게 OCR 기능을 구현할 수 있습니다. 복잡한 인증 절차 없이 자체적으로 구현이 가능하며, 프로그래머와 협업하여 빠르게 완성할 수 있습니다.

모든 예제 코드는 오픈소스로 공개되어 있으며, 저장소에서 확인 가능합니다. 관련 코드는 OCRSharp 폴더에 위치합니다.

태그: Tesseract OCR C# .NET 6 LSTM PDF Generation

5월 25일 20:04에 게시됨