이미지에서 수학 공식을 LaTeX 코드로 변환하는 시스템. 한국어 텍스트와 수식이 혼합된 콘텐츠도 지원.
- 수식 인식 - 손글씨/인쇄된 수학 공식을 LaTeX로 변환
- 혼합 콘텐츠 - 한국어 텍스트와 수식이 섞인 이미지 처리
- 다중 엔진 - UniMERNet, DeepSeek 등 OCR 엔진 선택 가능
- 실시간 미리보기 - MathJax로 변환 결과 즉시 확인
- 캔버스 입력 - 마우스/터치로 직접 수식 그리기
- 배치 처리 - 여러 이미지 동시 업로드 및 변환
3-tier 구조로 프론트엔드, API 게이트웨이, OCR 서비스가 분리되어 확장성과 유지보수성 확보.
┌─────────────┐ ┌──────────────────┐ ┌────────────────────┐
│ React UI │────▶│ Fastify API │────▶│ Python OCR │
│ (Vite) │ │ (Port 3001) │ │ Services │
│ │ │ │ │ ├─ UniMERNet:8000 │
│ - Canvas │ │ - Converter │ │ └─ DeepSeek:8001 │
│ - Upload │ │ Registry │ │ │
│ - Preview │ │ - File Manager │ │ │
└─────────────┘ └──────────────────┘ └────────────────────┘
| Layer | Technologies | Description |
|---|---|---|
| Frontend | React 18, TypeScript, Vite, MathJax | SPA UI, 캔버스 입력, LaTeX 렌더링 |
| Backend | Node.js, Fastify, TypeScript | API 라우팅, 파일 관리, 엔진 오케스트레이션 |
| OCR Services | FastAPI, PyTorch, UniMERNet, EasyOCR | 딥러닝 기반 수식/텍스트 인식 |
# 전체 서비스 시작 (권장)
./start.sh # Linux/Mac
start.bat # Windows
# 또는 개별 실행
cd services/unimernet_server && uvicorn app:app --host 0.0.0.0 --port 8000
cd apps/server && npm run dev├── apps/
│ ├── server/ # API 게이트웨이 - 컨버터 레지스트리, 라우팅, 파일 관리
│ └── web/ # React SPA - 캔버스, 파일 업로드, LaTeX 미리보기
├── services/
│ ├── unimernet_server/ # UniMERNet - 순수 수식 이미지 → LaTeX 변환
│ └── deepseek_server/ # DeepSeek - Vision-LLM 기반 혼합 콘텐츠 처리
├── config/
│ └── converters.json # OCR 엔진 URL, 기본값, 기능 플래그 설정
└── data/
├── uploads/ # 임시 업로드 (batchId별 분류)
└── outputs/ # 생성된 .md/.html 결과물
| Method | Endpoint | Description |
|---|---|---|
| GET | /api/latex/converters |
등록된 OCR 엔진 목록과 상태(online/offline) 반환 |
| POST | /api/latex/convert/:converter? |
단일/다중 수식 이미지를 LaTeX로 변환. converter 미지정시 기본 엔진 사용 |
| POST | /api/latex/convert-mixed/:converter? |
한글+수식 혼합 이미지 처리. 영역 분리 후 각 엔진으로 라우팅 |
| GET | /api/latex/download/:converter/:batchId/:file |
변환 결과물(.md, .html) 다운로드 |
한글과 수식이 혼합된 이미지는 단일 모델로 처리 불가. 영역 분리 후 적합한 엔진으로 라우팅하는 파이프라인 적용.
- Detection - EasyOCR로 텍스트 영역(bounding box) 탐지
- Classification - 휴리스틱 분류: OCR 신뢰도 < 0.7 또는 수학 기호 포함 → 수식으로 판정
- Routing - 한글 영역 → EasyOCR, 수식 영역 → UniMERNet
- Merging - y좌표 기준 정렬하여 읽기 순서대로 결과 병합
config/converters.json에서 OCR 엔진 등록. 서버 시작시 health check로 상태 확인.
{
"converters": [
{
"id": "unimernet",
"name": "UniMERNet",
"url": "http://localhost:8000",
"default": true,
"capabilities": ["equation", "mixed"]
},
{
"id": "deepseek-ocr",
"name": "DeepSeek OCR",
"url": "http://localhost:8001",
"capabilities": ["equation", "mixed"]
}
]
}| Field | Description |
|---|---|
id |
엔진 고유 식별자 (API 경로에 사용) |
name |
UI에 표시되는 엔진 이름 |
url |
Python 서비스 엔드포인트 |
default |
true인 엔진이 기본 선택됨 |
capabilities |
지원 기능: equation(수식), mixed(혼합) |