Skip to content

Commit 243a20a

Browse files
committed
refactor(ocr): use ppocrv6 small model only
1 parent efcffba commit 243a20a

3 files changed

Lines changed: 44 additions & 44 deletions

File tree

src/one_dragon/base/config/basic_model_config.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,13 @@
11
from one_dragon.base.config.config_item import ConfigItem
22
from one_dragon.base.config.yaml_config import YamlConfig
3-
from one_dragon.base.matcher.ocr.onnx_ocr_matcher import DEFAULT_OCR_MODEL_NAME, get_ocr_model_dir, \
4-
get_ocr_download_url_github, get_ocr_download_url_gitee, get_final_file_list
3+
from one_dragon.base.matcher.ocr.onnx_ocr_matcher import (
4+
DEFAULT_OCR_MODEL_NAME,
5+
PPOCRV6_MODEL_NAME,
6+
get_final_file_list,
7+
get_ocr_download_url_gitee,
8+
get_ocr_download_url_github,
9+
get_ocr_model_dir,
10+
)
511
from one_dragon.base.web.common_downloader import CommonDownloaderParam
612

713

@@ -34,7 +40,7 @@ def using_old_model(self) -> bool:
3440
pass
3541

3642
def get_ocr_opts() -> list[ConfigItem]:
37-
models_list = [DEFAULT_OCR_MODEL_NAME, 'ppocrv6_small', 'ppocrv6_tiny']
43+
models_list = [DEFAULT_OCR_MODEL_NAME, PPOCRV6_MODEL_NAME]
3844
config_list: list[ConfigItem] = []
3945
for model in models_list:
4046
model_dir = get_ocr_model_dir(model)

src/one_dragon/base/matcher/ocr/onnx_ocr_matcher.py

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,22 @@
1818
from one_dragon.utils.log_utils import log
1919

2020
DEFAULT_OCR_MODEL_NAME: str = 'ppocrv5'
21+
PPOCRV6_MODEL_NAME: str = 'ppocrv6'
2122
GITHUB_DOWNLOAD_URL: str = 'https://github.com/OneDragon-Anything/OneDragon-Env/releases/download'
2223
GITEE_DOWNLOAD_URL: str = 'https://gitee.com/OneDragon-Anything/OneDragon-Env/releases/download'
2324

2425

26+
def normalize_ocr_model_name(ocr_model_name: str) -> str:
27+
"""
28+
规范化 OCR 模型名。
29+
"""
30+
if ocr_model_name.startswith(PPOCRV6_MODEL_NAME):
31+
return PPOCRV6_MODEL_NAME
32+
return ocr_model_name
33+
34+
2535
def get_ocr_model_dir(ocr_model_name: str) -> str:
36+
ocr_model_name = normalize_ocr_model_name(ocr_model_name)
2637
return os_utils.get_path_under_work_dir('assets', 'models', 'onnx_ocr', ocr_model_name)
2738

2839

@@ -35,6 +46,7 @@ def get_ocr_download_url_gitee(ocr_model_name: str) -> str:
3546

3647

3748
def get_ocr_download_url(website: str, ocr_model_name: str) -> str:
49+
ocr_model_name = normalize_ocr_model_name(ocr_model_name)
3850
return f'{website}/{ocr_model_name}/{ocr_model_name}.zip'
3951

4052

@@ -88,13 +100,13 @@ def __init__(
88100
det_limit_side_len: float = 960.0,
89101
ocr_model_size: str | None = None,
90102
):
91-
self.ocr_model_name: str = ocr_model_name
103+
self.ocr_model_name: str = normalize_ocr_model_name(ocr_model_name)
92104
self.models_dir: str = get_ocr_model_dir(ocr_model_name)
93105
if dict_name is None:
94106
dict_name = get_ocr_model_dict_name(ocr_model_name)
95107
if dict_name is None:
96108
# 首次运行未下载时,根据模型名推导一个默认的字典文件名,避免崩溃
97-
dict_name = f"{ocr_model_name}_dict.txt"
109+
dict_name = f"{self.ocr_model_name}_dict.txt"
98110
# ===================================================================
99111
# I. 设备与性能 (Device & Performance)
100112
# ===================================================================
@@ -113,15 +125,8 @@ def __init__(
113125
# III. 核心功能开关 (Core Feature Switches)
114126
# ===================================================================
115127
self.use_angle_cls = use_angle_cls # 是否加载并使用方向分类模型
116-
if ocr_model_size is None:
117-
if 'medium' in ocr_model_name:
118-
ocr_model_size = 'medium'
119-
elif 'tiny' in ocr_model_name:
120-
ocr_model_size = 'tiny'
121-
elif 'small' in ocr_model_name:
122-
ocr_model_size = 'small'
123-
else:
124-
ocr_model_size = 'small'
128+
if self.ocr_model_name == PPOCRV6_MODEL_NAME or ocr_model_size is None:
129+
ocr_model_size = 'small'
125130
self.ocr_model_size: str | None = ocr_model_size
126131

127132
# ===================================================================
@@ -400,7 +405,7 @@ def match_words(
400405
"""
401406
all_match_result: dict = self.run_ocr(image, threshold, merge_line_distance=merge_line_distance)
402407
match_key = set()
403-
for k in all_match_result.keys():
408+
for k in all_match_result:
404409
for w in words:
405410
ocr_result: str = k
406411
ocr_target = gt(w, 'ocr')
@@ -533,7 +538,7 @@ def _emit_overlay_vision_from_ocr_results(
533538
return
534539

535540
offset_x, offset_y = bus.crop_offset
536-
for i, result in enumerate(ocr_results[:60]):
541+
for result in ocr_results[:60]:
537542
label = str(result.data or "").strip()
538543
if len(label) > 32:
539544
label = label[:29] + "..."

src/onnxocr/onnx_paddleocr.py

Lines changed: 17 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -12,60 +12,49 @@
1212

1313
log = get_logger("onnx_paddleocr")
1414

15-
PPOCRV6_MODEL_CONFIGS = {
16-
"medium": {
17-
"det_db_box_thresh": 0.45,
18-
"rec_char_dict_path": "ppocrv6_dict.txt",
19-
},
20-
"small": {
21-
"det_db_box_thresh": 0.45,
22-
"rec_char_dict_path": "ppocrv6_dict.txt",
23-
},
24-
"tiny": {
25-
"det_db_box_thresh": 0.4,
26-
"rec_char_dict_path": "ppocrv6_tiny_dict.txt",
27-
},
15+
PPOCRV6_MODEL_CONFIG = {
16+
"det_db_box_thresh": 0.45,
17+
"rec_char_dict_path": "ppocrv6_dict.txt",
2818
}
2919

3020

31-
def _normalize_ppocrv6_size(model_name=None, model_size=None):
21+
def _normalize_ppocrv6_size(model_name: str | None = None, model_size: str | None = None) -> str | None:
3222
if not model_name:
3323
return None
34-
if model_size:
35-
size = str(model_size).lower()
36-
else:
37-
normalized = str(model_name).lower()
38-
size = next((name for name in PPOCRV6_MODEL_CONFIGS if name in normalized), None)
39-
40-
if size not in PPOCRV6_MODEL_CONFIGS:
24+
if "ppocrv6" not in str(model_name).lower():
4125
return None
42-
return size
26+
return "small"
27+
28+
29+
def _normalize_ppocrv6_model_name(model_name: str) -> str:
30+
if "ppocrv6" in model_name.lower():
31+
return "ppocrv6"
32+
return model_name
4333

4434

45-
def _build_ppocrv6_defaults(kwargs):
35+
def _build_ppocrv6_defaults(kwargs: dict[str, Any]) -> dict[str, Any]:
4636
"""为 PP-OCRv6 模型构建默认参数。如果不是 v6 模型则返回空字典,保证 v5 兼容。"""
4737
model_name = kwargs.pop("ocr_model_name", None)
4838
if not model_name:
4939
kwargs.pop("ocr_model_size", None)
5040
return {}
5141
model_size = kwargs.pop("ocr_model_size", None)
52-
size = _normalize_ppocrv6_size(model_name=model_name, model_size=model_size)
53-
if not size:
42+
if _normalize_ppocrv6_size(model_name=model_name, model_size=model_size) is None:
5443
return {}
44+
model_name = _normalize_ppocrv6_model_name(model_name)
5545

5646
from one_dragon.utils import os_utils
5747
model_root = Path(os_utils.get_path_under_work_dir('assets', 'models', 'onnx_ocr', model_name))
58-
config = PPOCRV6_MODEL_CONFIGS[size]
5948

6049
defaults = {
6150
"det_model_dir": str(model_root / "det.onnx"),
6251
"rec_model_dir": str(model_root / "rec.onnx"),
63-
"rec_char_dict_path": str(model_root / config["rec_char_dict_path"]),
52+
"rec_char_dict_path": str(model_root / PPOCRV6_MODEL_CONFIG["rec_char_dict_path"]),
6453
"rec_image_shape": "3, 48, 320",
6554
"det_limit_side_len": 960,
6655
"det_limit_type": "max",
6756
"det_db_thresh": 0.3,
68-
"det_db_box_thresh": config["det_db_box_thresh"],
57+
"det_db_box_thresh": PPOCRV6_MODEL_CONFIG["det_db_box_thresh"],
6958
"det_db_unclip_ratio": 1.5,
7059
"det_db_max_candidates": 1000,
7160
}

0 commit comments

Comments
 (0)