본문으로 건너뛰기

© 2026 Molayo

GH Trending릴리즈2026. 06. 02. 21:43

datalab-to/surya

요약

Surya는 650M 파라미터 규모의 최첨단 OCR 모델로, 레이아웃 분석, 표 인식, 다국어 지원 기능을 제공합니다. olmOCR-bench에서 높은 정확도를 기록하며, 91개 언어에 대해 강력한 성능을 보여줍니다.

핵심 포인트

  • 650M 파라미터 규모의 고성능 OCR 모델
  • 레이아웃 분석 및 표 인식(행/열) 기능 포함
  • 91개 언어 지원 및 높은 다국어 정확도
  • Apache 2.0 라이선스로 코드 배포

문서 지능 (Document Intelligence)을 위한 최첨단 (State of the Art) 모델

Surya는 다음과 같은 특징을 가진 650M 파라미터 규모의 OCR 모델입니다:

  • 정확도 - olmOCR-bench에서 83.3% 점수 기록 (3B 파라미터 미만 모델 중 최상위)
  • 속도 - RTX 5090에서 초당 5페이지의 처리량 (throughput)
  • 다국어 지원 - 91개 언어로 구성된 내부 벤치마크 세트에서 87.2% 점수 기록 (자세한 내용은 여기 참조)
  • 읽기 순서 (reading order)를 포함한 레이아웃 분석 (Layout analysis: 표, 이미지, 헤더 등)
  • 표 인식 (Table recognition: 행 + 열)

또한 우리는 라인 레벨 (line-level) 텍스트 탐지 및 OCR 오류 탐지를 위한 더 작은 모델들도 제공합니다. 다양한 문서에서 작동합니다 (사용법 및 벤치마크 참조).

우리의 관리형 플랫폼 (managed platform)은 Surya와 당사의 최고 정확도 모델 변형인 Chandra를 모두 실행합니다.

$5의 무료 크레딧으로 시작해 보세요 — 가입(30초 미만 소요)하거나 무료 공개 플레이그라운드 (public playground)를 사용해 보세요.

탐지 (Detection)OCR
레이아웃 (Layout)표 인식 (Table Recognition)

Surya는 보편적인 시야를 가진 힌두교의 태양신 이름을 따서 명명되었습니다.

각 행은 동일한 페이지에 대한 다섯 가지 주석 처리된 뷰(annotated views)로 연결됩니다: 텍스트 라인 탐지 (text-line detection), OCR, 레이아웃 (layout), 읽기 순서 (reading order), 그리고 (존재하는 경우) 표 인식 (table recognition).

이름탐지 (Detection)OCR레이아웃 (Layout)순서 (Order)표 인식 (Table Rec)
NewspaperImageImageImageImage
...

Surya 코드는 Apache 2.0 라이선스 하에 배포됩니다. 모델 가중치 (model weights)는 수정된 AI Pubs Open Rail-M 라이선스를 사용합니다 (연구, 개인적 용도, 그리고 펀딩/매출 500만 달러 미만의 스타트업에 대해 무료). 모델 가중치에 대한 더 광범위한 상업적 라이선스는 여기 가격 페이지를 방문하세요.

설치 방법:

pip install surya-ocr

Surya는 처음 사용 시 서버를 자동으로 생성하며, vllm (NVIDIA GPU) 또는 llama.cpp (CPU / Apple Silicon)가 필요합니다:

NVIDIA GPU: Docker 및 NVIDIA Container Toolkit이 필요합니다.
CPU / Apple Silicon: llama.cpp의 llama-server 바이너리가 필요합니다: brew install llama.cpp # macOS # 또는 https://github.com/ggml-org/llama.cpp/releases 에서 릴리스를 받으세요.

v1 코드를 사용 중이라면, 다음으로 마이그레이션할 수 있습니다:

# v2
from surya.inference import SuryaInferenceManager
from surya.recognition import RecognitionPredictor
...

변경 사항:

SuryaInferenceManagerFoundationPredictor를 대체합니다. 동일한 매니저 인스턴스가 LayoutPredictor, RecognitionPredictor, TableRecPredictor 간에 공유됩니다.

  • 출력 스키마 (Output schemas) 변경: 아래의 섹션별 JSON 테이블을 참조하세요. 주요 변경 사항 —
    • text_linesblocks (html 포함)
    • 레이아웃 (layout)에서 top_k 제거, count 추가
    • 테이블 인식 (table_rec)에서 셀(cells)의 is_header, colspan, rowspan 제거

Surya 2는 단일 VLM (Vision Language Model)을 통해 레이아웃 (layout), OCR, 테이블 인식 (table recognition)을 실행합니다. 추론 매니저 (inference manager)는 처음 사용할 때 사용자를 위해 하나를 생성합니다. 또한 SURYA_INFERENCE_URL=http://host:port/v1을 통해 기존 서버를 가리킬 수도 있습니다.

  • surya/settings.py에서 설정을 검토하세요. 환경 변수(예: SURYA_INFERENCE_BACKEND=vllm)를 통해 모든 설정을 재정의할 수 있습니다.
  • 텍스트 탐지 (Text detection)와 OCR 오류는 별개의 모델입니다.

기본적으로 각 명령은 시작 시 VLM 서버를 생성하고 종료 시 종료합니다. 따라서 여러 명령을 연속해서 실행하면 매번 시작 비용(및 GPU의 경우 모델 로드 비용)이 발생합니다. --keep_server를 전달하면 서버를 실행 상태로 유지하여, 이후 명령들이 서버를 다시 생성하는 대신 실행 중인 서버에 연결되도록 할 수 있습니다:

surya_ocr DATA_PATH --keep_server # 서버를 생성하고 실행 상태로 유지합니다
surya_layout DATA_PATH # 실행 중인 서버에 연결합니다
surya_table DATA_PATH # ...이하 동일, 재생성 없음

--keep_server는 모든 명령에서 작동합니다. 작업이 끝나면 서버를 중지하거나 (surya-vllm-* 컨테이너를 docker stop 하거나, llama-server 프로세스를 종료), SURYA_INFERENCE_KEEP_ALIVE=1을 설정하여 keep-alive를 기본값으로 만드세요.

이미지나 PDF 파일에서 Surya를 대화형으로 테스트해 볼 수 있는 streamlit 앱을 포함했습니다. 다음과 같이 실행하세요:

pip install streamlit pdftext
surya_gui

이 명령은 탐지된 텍스트와 bboxes (bounding boxes)가 포함된 json 파일을 작성합니다:

surya_ocr DATA_PATH

DATA_PATH는 이미지, pdf, 또는 이미지/pdf 폴더(--images 포함)가 될 수 있습니다.

페이지 이미지 및 감지된 블록(blocks)의 이미지를 저장합니다 (선택 사항)
--output_dir

기본값 대신 결과를 저장할 디렉토리를 지정합니다.
--page_range

PDF에서 처리할 페이지 범위를 지정합니다. 단일 숫자, 쉼표로 구분된 목록, 범위 또는 쉼표로 구분된 범위로 지정할 수 있습니다 - 예: 0,5-10,20

--keep_server

명령어가 종료된 후에도 추론 서버(inference server)를 계속 실행 상태로 유지하여 이후 명령어가 이를 재사용할 수 있도록 합니다 (Server lifecycle 참조). 모든 명령어에서 사용할 수 있습니다.

results.json 파일은 입력 파일 이름(확장자 제외)을 키(key)로 하는 딕셔너리(dict)를 포함합니다. 각 값은 페이지 딕셔너리(page dicts)의 리스트입니다. 각 페이지 딕셔너리는 다음을 포함합니다:

blocks

  • 읽기 순서(reading order)에 따른 블록별 OCR 결과
    label

  • 표준화된 레이아웃 레이블 (예: Text, SectionHeader, Table, Equation, Picture, Form, PageHeader, ...). 전체 표준 이름 세트는 surya/layout/label.py:LAYOUT_PRED_RELABEL을 참조하세요.
    raw_label

  • 표준화되기 전 모델이 출력한 원래 레이블
    reading_order

  • 레이아웃 출력에서의 0부터 시작하는 인덱스 위치
    html

  • HTML 형식의 블록 콘텐츠 (수식은 <math>...</math>로, 표는 <table>...</table>로 감싸짐 등). 블록이 건너뛰어진 경우 "" (빈 문자열)
    polygon

  • [[x0,y0],[x1,y0],[x1,y1],[x0,y1]] 순서의 4개 모서리 다각형(polygon)
    bbox

  • 다각형으로부터 유도된 축 정렬(axis-aligned) [x0, y0, x1, y1]
    confidence

  • 블록 디코딩 전반에 걸친 토큰당 평균 확률 (0-1)
    skipped

  • 블록이 시각적 레이블(예: Picture)이며 OCR되지 않은 경우 true
    error

  • 블록 OCR 호출이 실패한 경우 true

image_bbox

  • 페이지 이미지에 대한 [0, 0, width, height]

성능 팁 (Performance tips)

  • 처리량(Throughput)은 추론 백엔드(inference backend)에 의해 제어됩니다. vllm을 사용하는 경우, 더 많은 페이지를 동시에 처리(in flight)할 수 있도록 --max-num-seqs / --max-num-batched-tokens (또는 클라이언트 측의 SURYA_INFERENCE_PARALLEL) 값을 높이세요. llama.cpp를 사용하는 경우, SURYA_INFERENCE_PARALLELllama-server--parallel 값과 일치하도록 설정하세요.

  • DPI 또한 처리량 (throughput)에 상당한 영향을 미칠 수 있습니다. 사용 사례에 맞는 적절한 처리량/정확도 트레이드오프 (tradeoff)를 위해 DPI 설정을 조정할 수 있습니다. 처리량을 개선하려면 192에서 96으로 낮추어 시도해 보세요.

  • MTP 또한 지연 시간 (latency)/처리량 (throughput)에 영향을 미칠 수 있습니다. 설정에서 vllm mtp 구성을 조정할 수 있습니다.

from PIL import Image
from surya.inference import SuryaInferenceManager
from surya.recognition import RecognitionPredictor
...

이 명령은 감지된 경계 상자 (bboxes)가 포함된 json 파일을 생성합니다.

surya_detect DATA_PATH

DATA_PATH는 이미지, PDF 또는 이미지/PDF 폴더가 될 수 있습니다.

--images는 페이지 이미지와 감지된 텍스트 라인 이미지를 저장합니다 (선택 사항).

--output_dir은 기본값 대신 결과를 저장할 디렉토리를 지정합니다.

--page_range는 PDF에서 처리할 페이지 범위를 지정하며, 단일 숫자, 쉼표로 구분된 목록, 범위 또는 쉼표로 구분된 범위로 지정할 수 있습니다 - 예: 0,5-10,20

results.json 파일은 확장자가 없는 입력 파일명을 키(key)로 하는 json 딕셔너리를 포함합니다. 각 값은 입력 문서의 페이지당 하나씩, 딕셔너리들의 리스트가 됩니다. 각 페이지 딕셔너리는 다음을 포함합니다:

bboxes

  • 텍스트에 대해 감지된 경계 상자 (bounding boxes)
    bbox: (x1, y1, x2, y2) 형식의 텍스트 라인에 대한 축 정렬 직사각형 (axis-aligned rectangle). (x1, y1)은 왼쪽 상단 모서리이고, (x2, y2)는 오른쪽 하단 모서리입니다.
    polygon: (x1, y1), (x2, y2), (x3, y3), (x4, y4) 형식의 텍스트 라인에 대한 다각형 (polygon). 점들은 왼쪽 상단부터 시계 방향 순서로 배치됩니다.
    confidence: 감지된 텍스트에 대한 모델의 신뢰도 (0-1)

vertical_lines

  • 문서에서 감지된 수직선 (vertical lines)
    bbox: 축 정렬된 선 좌표 (axis-aligned line coordinates).

page

  • 파일 내의 페이지 번호
    image_bbox: (x1, y1, x2, y2) 형식의 이미지에 대한 경계 상자 (bbox). (x1, y1)은 왼쪽 상단 모서리이고, (x2, y2)는 오른쪽 하단 모서리입니다. 모든 라인 경계 상자 (line bboxes)는 이 경계 상자 안에 포함됩니다.

성능 팁 (Performance tips)

감지 (Detection)는 torch 모델입니다. DETECTOR_BATCH_SIZE

런타임 시 자동으로 선택된 값을 기본값으로 사용합니다. GPU의 VRAM 사용량을 제어하려면 환경 변수 (env var)를 재정의하고, 더 큰 그래픽 카드를 사용하는 경우 이 값을 높이십시오.

from PIL import Image
from surya.detection import DetectionPredictor
det_predictor = DetectionPredictor()
...

이 명령은 감지된 레이아웃 (layout) 및 읽기 순서 (reading order)가 포함된 json 파일을 작성합니다.

surya_layout DATA_PATH

DATA_PATH는 이미지, PDF 또는 이미지/PDF 폴더가 될 수 있습니다.

--images는 페이지 이미지와 감지된 텍스트 라인 (선택 사항)을 저장합니다.

--output_dir은 기본값 대신 결과를 저장할 디렉토리를 지정합니다.

--page_range는 PDF에서 처리할 페이지 범위를 지정하며, 단일 숫자, 쉼표로 구분된 목록, 범위 또는 쉼표로 구분된 범위로 지정할 수 있습니다 - 예시: 0,5-10,20.

results.json 파일은 입력 파일 이름(확장자 제외)을 키로 하는 딕셔너리 (dict)를 포함합니다. 각 값은 페이지 딕셔너리들의 리스트입니다. 각 페이지 딕셔너리는 다음을 포함합니다:

bboxes

  • 읽기 순서대로 정렬된 레이아웃 박스 (layout boxes)

polygon

  • 4개 모서리 다각형 (4-corner polygon)
    [[x0,y0],[x1,y0],[x1,y1],[x0,y1]]

bbox

  • 축 정렬된 박스 (axis-aligned)
    [x0, y0, x1, y1]
    (다각형으로부터 유도됨)

label

  • 표준화된 레이블 (canonicalized label). 다음 중 하나입니다: Caption, Footnote, Equation, ListGroup, PageHeader, PageFooter, Picture, SectionHeader, Table, Text, Figure, Code, Form, TableOfContents, ChemicalBlock, Diagram, Bibliography, BlankPage

raw_label

  • 모델이 출력한 원래 레이블 (original label)

position

  • 0부터 시작하는 읽기 순서 (0-indexed reading order)

count

  • 이 블록을 OCR 하기 위한 모델의 토큰 추정치 (50의 배수로 반올림됨; 블록당 디코딩 예산 크기를 정하는 데 사용됨)

confidence

  • 레이아웃 디코딩 전반에 걸친 토큰당 평균 확률 (0-1)

image_bbox

  • [0, 0, width, height]

raw

  • 디버깅을 위한 레이아웃 모델이 출력한 원본 JSON (raw JSON)

error

  • 레이아웃 호출이 실패한 경우 true

성능 팁 (Performance tips)

레이아웃 (Layout)은 공유 추론 백엔드 (shared inference backend)를 통해 실행됩니다. 처리량 (Throughput) 조정은 OCR과 동일합니다 — 위의 성능 팁을 참조하십시오.

이 명령어는 감지된 테이블 셀과 행/열 ID, 그리고 행/열 바운딩 박스를 포함하는 json 파일을 작성합니다. 셀 위치와 텍스트를 보기 좋게 포맷하여 얻으려면 marker 리포지토리를 확인하십시오. TableConverter를 사용하여 이미지 및 PDF에서 테이블을 감지하고 추출할 수 있습니다. 이 도구는 json (bbox 포함), markdown, html 형식으로 출력을 지원합니다.

surya_table DATA_PATH

DATA_PATH는 이미지, pdf 또는 이미지/pdf 폴더일 수 있습니다.--images 플래그를 사용하면 json과 함께 주석이 달린 행 및 열 오버레이가 저장됩니다 (선택 사항).--output_dir은 결과를 기본값 대신 저장할 디렉터리를 지정합니다.--page_range는 PDF에서 처리할 페이지 범위를 지정하며, 단일 숫자, 쉼표로 구분된 목록, 범위 또는 쉼표로 구분된 범위를 지정할 수 있습니다. 예: 0,5-10,20

.--skip_table_detection은 테이블 인식 기능이 먼저 테이블을 감지하지 않도록 지시합니다. 이미지가 테이블에 맞춰 잘린 경우 이 옵션을 사용하십시오.

생성되는 results.json 파일에는 입력 파일명(확장자 제외)으로 키가 지정된 딕셔너리가 포함되어 있습니다. 각 값은 테이블별 딕셔너리 리스트입니다. 각 테이블 딕셔너리는 다음을 포함합니다:

rows - 읽기 순서로 감지된 테이블 행들polygon/bbox - 행의 기하학적 정보 (다른 모든 곳과 동일한 규칙)row_id - 0부터 시작하는 행 ID

cols - 감지된 테이블 열들polygon/bbox - 열의 기하학적 정보col_id - 0부터 시작하는 열 ID

cells - 기하학적 행 × 열 교차점 (simple 모드)polygon/bbox - 셀의 기하학적 정보row_id, col_id, cell_id

html - 전체 <table>...</table> HTML (predict_full이 사용될 때만 채워지며, 스팬하는 셀/헤더 행 처리). simple 모드에서는 null입니다.mode - `

from PIL import Image
from surya.inference import SuryaInferenceManager
from surya.table_rec import TableRecPredictor
...

Surya 2는 수학 식을 전체 페이지 OCR (Optical Character Recognition)의 일부로 인라인(inline) 처리합니다. 인식된 방정식은 주변 산문과 동일한 HTML 출력 내에서 KaTeX 호환 LaTeX 형식의 <math>...</math> 태그로 반환됩니다. 별도의 LaTeX OCR 단계는 거치지 않습니다.

Layout / OCR / table_rec는 모두 하나의 VLM (Vision Language Model)을 공유하며, vllm (GPU) 또는 llama.cpp (CPU / Apple Silicon)를 통해 서빙됩니다. SuryaInferenceManager가 이를 자동으로 실행하며, 이미 실행 중인 서버를 지정할 수도 있습니다:

# 기존 vllm에 연결
export SURYA_INFERENCE_BACKEND=vllm
export SURYA_INFERENCE_URL=http://localhost:8000/v1

AI 자동 생성 콘텐츠

본 콘텐츠는 GitHub Trending Python (daily)의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0