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) |
|---|---|---|---|---|---|
| Newspaper | Image | Image | Image | Image | |
| ... |
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
...
변경 사항:
SuryaInferenceManager가 FoundationPredictor를 대체합니다. 동일한 매니저 인스턴스가 LayoutPredictor, RecognitionPredictor, TableRecPredictor 간에 공유됩니다.
- 출력 스키마 (Output schemas) 변경: 아래의 섹션별 JSON 테이블을 참조하세요. 주요 변경 사항 —
text_lines→blocks(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_PARALLEL을llama-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가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기