Files
2026-08-31 16:41:12 +08:00

63 lines
1.8 KiB
Python

from pathlib import Path
from typing import Annotated, Literal
from pydantic import AfterValidator, Field
from pydantic_settings import BaseSettings, SettingsConfigDict
PROJECT_ROOT = Path(__file__).resolve().parents[1]
def resolve_model_dir(value: Path) -> Path:
"""将模型目录解析为项目根目录下的绝对路径。"""
path = value.expanduser()
if not path.is_absolute():
path = PROJECT_ROOT / path
path = path.resolve()
if not path.is_dir():
raise ValueError(f"OCR模型目录不存在: {path}")
return path
ModelDir = Annotated[Path, AfterValidator(resolve_model_dir)]
class Settings(BaseSettings):
"""应用配置"""
model_config = SettingsConfigDict(
env_file=PROJECT_ROOT / ".env",
case_sensitive=False,
extra="ignore",
)
host: str = "0.0.0.0"
port: int = 15651
debug: bool = False
# OCR阶段
ocr_use_det: bool = True
ocr_use_cls: bool = False
ocr_use_rec: bool = True
# 模型与常用调优参数
ocr_model_dir: ModelDir = Path("model")
ocr_text_score: float = Field(default=0.5, ge=0.0, le=1.0)
ocr_max_side_len: int = Field(default=2000, ge=32, le=16384)
ocr_det_limit_side_len: int = Field(default=736, ge=32, le=8192)
ocr_det_box_thresh: float = Field(default=0.5, ge=0.0, le=1.0)
ocr_det_thresh: float = Field(default=0.3, ge=0.0, le=1.0)
ocr_rec_batch_num: int = Field(default=6, ge=1, le=256)
# 推理设备
ocr_device: Literal["cpu", "cuda", "dml", "tensorrt"] = "cpu"
ocr_device_id: int = Field(default=0, ge=0)
ocr_intra_threads: int = Field(default=4, ge=1)
ocr_inter_threads: int = Field(default=2, ge=1)
# 竖排文字补充通道(边缘带旋转90°检测,需 model/PP-OCRv4 目录下的 server 模型)
ocr_enable_vertical: bool = False
settings = Settings()