ocrs: PyTorch로 학습하고 Rust로 추론하는 OCR 라이브러리 및 CLI 도구

ocrs 소개

ocrs는 이미지에서 텍스트를 추출하는 최신 OCR(Optical Character Recognition, 광학 문자 인식) 엔진입니다. Rust 프로그래밍 언어로 작성되어 가볍고 빠르며, 별도의 복잡한 설정 없이 로컬 환경에서 손쉽게 실행할 수 있도록 설계되었습니다. 이 프로젝트는 기존의 오픈소스 OCR 강자인 Tesseract가 가진 한계인 오래된 기술 스택, 복잡한 빌드 과정, 이미지 노이즈에 대한 취약성 등을 극복하고, 최신 머신러닝 모델의 정확성을 Rust의 성능 및 이식성과 결합하려는 시도에서 시작되었습니다.

이 도구는 단순히 텍스트를 읽어내는 것뿐만 아니라, 개발자가 자신의 애플리케이션에 OCR 기능을 손쉽게 통합할 수 있도록 라이브러리(Crate)와 CLI(Command Line Interface) 도구를 모두 제공합니다. 내부적으로는 PyTorch로 학습된 신경망 모델을 사용하지만, 이를 Rust로 작성된 경량 추론 엔진인 rten을 통해 실행하므로 무거운 Python 환경이나 외부 의존성 없이 단일 바이너리로 동작 가능한 것이 큰 장점입니다.

ocrs 프로젝트가 주목받는 이유는 '접근성'과 '현대화'에 있습니다. 기존에 고성능 OCR을 구현하려면 거대한 머신러닝 프레임워크를 설치하거나 클라우드 API를 사용해야 했지만, ocrscargo install 명령어 하나로 최신 딥러닝 기반의 OCR 도구를 로컬에 설치할 수 있게 해줍니다. 현재는 초기 개발 단계(Preview)로 주로 영문 인식을 지원하지만, 최신 AI 기술을 Rust 생태계로 가져왔다는 점에서 기술적인 의의가 큽니다.

문서 자동화, 이미지 내 데이터 추출, 혹은 단순히 가볍고 빠른 로컬 OCR 도구가 필요한 개발자라면 이 프로젝트를 눈여겨볼 만합니다. 특히 프라이버시 문제로 클라우드 API를 사용할 수 없거나, 제한된 리소스 환경(예: 엣지 디바이스, 웹어셈블리 환경)에서 OCR을 구동해야 하는 경우 ocrs는 훌륭한 대안이 될 잠재력을 가지고 있습니다.

Tesseract OCR과 비교

ocrs는 개발 초기 단계부터 Tesseract OCR을 대체하거나 보완하는 것을 목표로 언급되곤 합니다. 두 기술은 텍스트 인식이라는 같은 목적을 가지지만, 접근 방식과 기술적 배경에는 큰 차이가 있습니다.

  • 기술적 기반: Tesseract는 1980년대부터 개발되어 온 유서 깊은 엔진으로, 전통적인 이미지 처리 기법과 LSTM(Long Short-Term Memory) 신경망을 혼합하여 사용합니다. 반면 ocrs는 처음부터 최신 딥러닝(CNN, Transformer 등) 아키텍처를 기반으로 설계되었습니다. 덕분에 스캔 상태가 좋지 않거나 노이즈가 많은 이미지, 복잡한 배경 위의 텍스트 인식에서 Tesseract보다 더 강건한 성능을 보일 잠재력이 있습니다.

  • 사용성 및 배포: Tesseract는 C++로 작성되어 빌드 및 의존성 관리가 다소 까다로운 편이며, 다양한 언어에서 사용하려면 래퍼(Wrapper)가 필요합니다. ocrs는 Rust로 작성되어 메모리 안전성이 보장되며, Rust 개발 환경(Cargo)이 있다면 설치와 통합이 매우 직관적입니다. 또한 ocrs는 WebAssembly(WASM) 컴파일이 용이하여 웹 브라우저상에서의 실행도 더 수월하게 지원합니다.

  • 지원 범위: 현재 시점에서 Tesseract의 가장 큰 강점은 방대한 언어 지원(100개 이상의 언어)입니다. 반면 ocrs는 현재 영문(라틴 문자) 위주로 지원하며, 다른 언어 지원은 아직 초기 단계이거나 계획 중에 있습니다. 따라서 다국어 지원이 필수적인 프로젝트라면 아직은 Tesseract가 더 적합할 수 있습니다.

ocrs의 주요 특징

ocrs의 가장 큰 기술적 특징은 자체적인 추론 엔진인 RTen을 사용한다는 점입니다. RTen은 이 프로젝트의 작성자인 Robert Knight가 개발한 Rust 기반의 머신러닝 런타임입니다. 보통 PyTorch나 TensorFlow 모델을 배포하려면 무거운 런타임 라이브러리가 필요하지만, ocrs는 학습된 모델을 ONNX 포맷을 거쳐 rten 형식으로 변환하여 사용합니다. 이를 통해 바이너리 크기를 줄이고 실행 속도를 최적화했습니다.

OCR 파이프라인은 크게 두 단계로 나뉩니다:

  • 첫 번째는 텍스트 감지(Text Detection) 단계로, 이미지 내에서 텍스트가 있는 위치(Bounding Box)를 찾아냅니다.

  • 두 번째는 텍스트 인식(Text Recognition) 단계로, 잘라낸 텍스트 영역 이미지를 실제 문자열로 변환합니다.

이 두 과정 모두 최신 신경망 모델을 사용하여 수행되므로, 전통적인 컴퓨터 비전 방식보다 기울어지거나 흐릿한 텍스트도 잘 잡아냅니다.


ocrs는 또한, 단순한 텍스트 추출 외에도 구조화된 데이터 추출을 지원합니다. 예를 들어, 텍스트가 위치한 좌표 정보가 필요한 경우 JSON 포맷으로 결과를 출력할 수 있습니다. 이는 이미지 내의 특정 위치에 있는 텍스트만 필터링하거나, UI 자동화 테스트 등에서 유용하게 사용될 수 있습니다.

또한, 디버깅이나 시각화를 위해 텍스트가 감지된 영역을 표시한 이미지를 생성하는 기능도 제공합니다. 이는 OCR 모델이 이미지의 어떤 부분을 텍스트로 인식했는지 검증할 때 매우 유용합니다.

ocrs의 설치 및 CLI 사용 방법

Rust 개발자라면 누구나 쉽게 설치할 수 있습니다. cargo 패키지 매니저를 통해 CLI 도구를 직접 설치할 수 있습니다. 설치 시 시스템에 Rust 툴체인이 구성되어 있어야 합니다.

$ cargo install ocrs-cli

설치가 완료되면 터미널에서 ocrs 명령어를 사용할 수 있습니다. 사용법은 매우 직관적입니다. 이미지를 인자로 넘기면 자동으로 모델을 다운로드(최초 1회)하고 결과를 출력합니다.

# 기본 사용법: 이미지에서 텍스트 추출하여 콘솔에 출력
$ ocrs image.png

# 결과를 파일로 저장
$ ocrs image.png -o output.txt

Rust 라이브러리로서의 활용

ocrs는 CLI 도구뿐만 아니라 Rust 라이브러리(Crate) 형태로도 제공됩니다. 이를 통해 개발자는 자신의 Rust 애플리케이션 내에 OCR 기능을 직접 내장할 수 있습니다. 이미지 디코딩을 위해 image 크레이트와 함께 사용하는 것이 일반적입니다.

use ocrs::{OcrEngine, OcrEngineParams};
use rten::Model;

// 모델 로드 및 엔진 초기화
let detection_model = Model::load_file("text-detection.rten")?;
let recognition_model = Model::load_file("text-recognition.rten")?;
let engine = OcrEngine::new(OcrEngineParams {
    detection_model: Some(detection_model),
    recognition_model: Some(recognition_model),
    ..Default::default()
})?;

// 이미지 처리 및 텍스트 추출 로직 수행...

위 코드는 예시이며, 실제로는 이미지를 rten 텐서 포맷으로 변환하는 과정이 필요합니다. 라이브러리는 텍스트의 위치 좌표, 인식 신뢰도(Confidence) 등 세부적인 정보에도 접근할 수 있는 API를 제공합니다.

라이선스

ocrs 프로젝트는 MIT 라이선스 또는 Apache License 2.0 하에 배포되고 있습니다. 사용자는 두 라이선스 중 하나를 선택하여 따를 수 있으며, 상업적 이용을 포함한 수정 및 배포가 자유로운 편입니다.

:github: ocrs 프로젝트 GitHub 저장소




이 글은 GPT 모델로 정리한 글을 바탕으로 한 것으로, 원문의 내용 또는 의도와 다르게 정리된 내용이 있을 수 있습니다. 관심있는 내용이시라면 원문도 함께 참고해주세요! 읽으시면서 어색하거나 잘못된 내용을 발견하시면 덧글로 알려주시기를 부탁드립니다. :hugs:

:pytorch:파이토치 한국 사용자 모임:south_korea:이 정리한 이 글이 유용하셨나요? 회원으로 가입하시면 주요 글들을 이메일:love_letter:로 보내드립니다! (기본은 Weekly지만 Daily로 변경도 가능합니다.)

:wrapped_gift: 아래:down_right_arrow:쪽에 좋아요:+1:를 눌러주시면 새로운 소식들을 정리하고 공유하는데 힘이 됩니다~ :star_struck:

1개의 좋아요