| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135 |
- """配置管理器 - 加载和验证配置文件"""
- import yaml
- from pathlib import Path
- from typing import Dict, Any, Optional
- class ConfigManager:
- """配置管理器"""
-
- _config_cache = {}
-
- @classmethod
- def load_config(cls, config_path: str) -> Dict[str, Any]:
- """加载配置文件"""
- config_path = Path(config_path)
-
- # 缓存机制
- cache_key = str(config_path.absolute())
- if cache_key in cls._config_cache:
- return cls._config_cache[cache_key]
-
- if not config_path.exists():
- raise FileNotFoundError(f"Config file not found: {config_path}")
-
- with open(config_path, 'r', encoding='utf-8') as f:
- config = yaml.safe_load(f)
-
- # 配置验证和默认值设置
- config = cls._validate_and_set_defaults(config)
-
- # 缓存配置
- cls._config_cache[cache_key] = config
-
- return config
-
- @classmethod
- def _validate_and_set_defaults(cls, config: Dict[str, Any]) -> Dict[str, Any]:
- """验证配置并设置默认值"""
- # 设置默认场景名称
- if 'scene_name' not in config:
- config['scene_name'] = 'unknown'
-
- # 验证必需的配置项
- required_sections = ['preprocessor', 'layout_detection', 'vl_recognition', 'ocr_recognition']
- for section in required_sections:
- if section not in config:
- config[section] = {'module': 'mineru'}
-
- # 设置预处理器默认配置
- preprocessor_defaults = {
- 'module': 'mineru',
- 'orientation_classifier': {'enabled': True},
- 'unwarping': {'enabled': False}
- }
- config['preprocessor'] = cls._merge_defaults(
- config.get('preprocessor', {}), preprocessor_defaults
- )
-
- # 设置版式检测默认配置
- layout_defaults = {
- 'module': 'mineru',
- 'model_name': 'RT-DETR-H_layout_17cls',
- 'device': 'cpu',
- 'batch_size': 1,
- 'conf': 0.25,
- 'iou': 0.45
- }
- config['layout_detection'] = cls._merge_defaults(
- config.get('layout_detection', {}), layout_defaults
- )
-
- # 设置VL识别默认配置
- vl_defaults = {
- 'module': 'mineru',
- 'backend': 'vllm-http-client',
- 'server_url': 'http://localhost:8111/v1',
- 'device': 'cpu',
- 'batch_size': 1,
- 'model_params': {'max_concurrency': 10, 'http_timeout': 600}
- }
- config['vl_recognition'] = cls._merge_defaults(
- config.get('vl_recognition', {}), vl_defaults
- )
-
- # 设置OCR默认配置
- ocr_defaults = {
- 'module': 'mineru',
- 'language': 'ch',
- 'det_threshold': 0.3,
- 'unclip_ratio': 1.8,
- 'batch_size': 8,
- 'device': 'cpu'
- }
- config['ocr_recognition'] = cls._merge_defaults(
- config.get('ocr_recognition', {}), ocr_defaults
- )
-
- # 设置输出默认配置
- output_defaults = {
- 'format': 'enhanced_json',
- 'save_json': True,
- 'save_markdown': True,
- 'save_html': True,
- 'save_images': {'layout': True, 'ocr': True, 'table_cells': True},
- 'coordinate_precision': 2
- }
- config['output'] = cls._merge_defaults(
- config.get('output', {}), output_defaults
- )
-
- return config
-
- @classmethod
- def _merge_defaults(cls, user_config: Dict[str, Any], defaults: Dict[str, Any]) -> Dict[str, Any]:
- """合并用户配置和默认配置"""
- result = defaults.copy()
- for key, value in user_config.items():
- if isinstance(value, dict) and key in result and isinstance(result[key], dict):
- result[key] = cls._merge_defaults(value, result[key])
- else:
- result[key] = value
- return result
-
- @classmethod
- def save_config(cls, config: Dict[str, Any], config_path: str):
- """保存配置文件"""
- config_path = Path(config_path)
- config_path.parent.mkdir(parents=True, exist_ok=True)
-
- with open(config_path, 'w', encoding='utf-8') as f:
- yaml.dump(config, f, default_flow_style=False, allow_unicode=True)
-
- @classmethod
- def clear_cache(cls):
- """清空配置缓存"""
- cls._config_cache.clear()
|