.
This commit is contained in:
92
config.py
Normal file
92
config.py
Normal file
@@ -0,0 +1,92 @@
|
|||||||
|
import torch
|
||||||
|
import os
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
# 학습 및 추론 페이지
|
||||||
|
PDF_MAX_PAGES = 10
|
||||||
|
|
||||||
|
SERVICE = "ucar"
|
||||||
|
|
||||||
|
# ── 인증 ──────────────────────────────────────────
|
||||||
|
SERVICE_ACCOUNT_FILE = "ocrlogin-431508-8db9e68e7a47.json"
|
||||||
|
|
||||||
|
# ── 경로 ──────────────────────────────────────────
|
||||||
|
BASE_DIR = Path(__file__).parent
|
||||||
|
FILES_DIR = BASE_DIR / "files"
|
||||||
|
DATA_DIR = FILES_DIR / "data" / SERVICE
|
||||||
|
MODEL_BASE_PATH = FILES_DIR / "models" / SERVICE
|
||||||
|
MODEL_SAVE_PATH = MODEL_BASE_PATH
|
||||||
|
CLASSIFIER_MODEL_BASE_PATH = FILES_DIR / "classifier_models" / SERVICE
|
||||||
|
OCR_CACHE_DIR = FILES_DIR / "json" / SERVICE
|
||||||
|
REPLAY_BUFFER_FILE= MODEL_BASE_PATH / "replay_buffer.json"
|
||||||
|
LOG_DIR = BASE_DIR / "logs"
|
||||||
|
TMP_DIR = FILES_DIR / "tmp"
|
||||||
|
|
||||||
|
# ── Classifier ────────────────────────────────────
|
||||||
|
CLASSIFIER_JSON_DIR = OCR_CACHE_DIR # files/json/{SERVICE}
|
||||||
|
CLASSIFIER_CACHE_PATH = CLASSIFIER_MODEL_BASE_PATH / "classifier_dataset.pkl"
|
||||||
|
|
||||||
|
if SERVICE == "ucar":
|
||||||
|
CLASSIFIER_MIN_WORDS = 5
|
||||||
|
else:
|
||||||
|
CLASSIFIER_MIN_WORDS = 20
|
||||||
|
|
||||||
|
# 폴더 자동 생성
|
||||||
|
for d in [DATA_DIR, MODEL_SAVE_PATH, LOG_DIR, OCR_CACHE_DIR, TMP_DIR, CLASSIFIER_MODEL_BASE_PATH]:
|
||||||
|
d.mkdir(parents=True, exist_ok=True)
|
||||||
|
|
||||||
|
# ── 모델 ──────────────────────────────────────────
|
||||||
|
MODEL_NAME = "microsoft/layoutlmv3-base"
|
||||||
|
MAX_LEN = 512
|
||||||
|
BATCH_SIZE = 4
|
||||||
|
EPOCHS = 10
|
||||||
|
LR = 1e-5
|
||||||
|
DEVICE = torch.device("cuda" if torch.cuda.is_available() else "cpu")
|
||||||
|
|
||||||
|
# ── OCR ───────────────────────────────────────────
|
||||||
|
# 단어 수 미달 페이지 제외 기준
|
||||||
|
OCR_MIN_WORDS = CLASSIFIER_MIN_WORDS
|
||||||
|
|
||||||
|
OCR_ENGINE = "paddle" # "google" | "paddle"
|
||||||
|
|
||||||
|
if SERVICE == "ucar":
|
||||||
|
PADDLE_OCR_URL = "http://localhost:10930/run_ocr"
|
||||||
|
else:
|
||||||
|
PADDLE_OCR_URL = "http://localhost:10931/run_ocr"
|
||||||
|
|
||||||
|
OCR_DPI = 150
|
||||||
|
OCR_MAX_WORKERS = 8
|
||||||
|
OCR_CONF_THRESH = 0.7 # PaddleOCR 신뢰도 임계값 (Google Vision은 미사용)
|
||||||
|
|
||||||
|
PDF_IMAGE_FORMAT = "jpeg" # "png" | "jpeg"
|
||||||
|
PDF_JPEG_QUALITY = 75
|
||||||
|
PDF_MAX_WIDTH = 800 # 최대 가로 픽셀 제한 (추가)
|
||||||
|
|
||||||
|
# ── 모델 저장 경로 (날짜/차수) ─────────────────────
|
||||||
|
def get_model_save_path() -> Path:
|
||||||
|
"""
|
||||||
|
날짜/차수 폴더 자동 생성
|
||||||
|
files/models/20260305/0001/
|
||||||
|
files/models/20260305/0002/ ← 같은 날 두 번째 학습
|
||||||
|
"""
|
||||||
|
from datetime import datetime
|
||||||
|
date_dir = MODEL_BASE_PATH / datetime.now().strftime("%Y%m%d")
|
||||||
|
date_dir.mkdir(exist_ok=True)
|
||||||
|
|
||||||
|
# 기존 차수 폴더 중 최대값 + 1
|
||||||
|
existing = sorted([
|
||||||
|
d for d in date_dir.iterdir()
|
||||||
|
if d.is_dir() and d.name.isdigit()
|
||||||
|
])
|
||||||
|
next_idx = int(existing[-1].name) + 1 if existing else 1
|
||||||
|
save_path = date_dir / f"{next_idx:04d}"
|
||||||
|
save_path.mkdir(exist_ok=True)
|
||||||
|
return save_path
|
||||||
|
|
||||||
|
|
||||||
|
def get_latest_model_path() -> Path | None:
|
||||||
|
"""저장된 모델 중 가장 최신 경로 반환"""
|
||||||
|
candidates = sorted(MODEL_BASE_PATH.rglob("config.json"))
|
||||||
|
if not candidates:
|
||||||
|
return None
|
||||||
|
return candidates[-1].parent
|
||||||
Reference in New Issue
Block a user