diff --git a/python/demo.py b/python/demo.py index cc8808c..af1ef62 100644 --- a/python/demo.py +++ b/python/demo.py @@ -3,7 +3,7 @@ # @Contact: liekkaskono@163.com from rapidocr import RapidOCR -engine = RapidOCR() +engine = RapidOCR(params={"Global.with_torch": True}) img_url = "https://img1.baidu.com/it/u=3619974146,1266987475&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=516" result = engine(img_url) diff --git a/python/rapidocr/ch_ppocr_rec/main.py b/python/rapidocr/ch_ppocr_rec/main.py index a36da20..227f313 100644 --- a/python/rapidocr/ch_ppocr_rec/main.py +++ b/python/rapidocr/ch_ppocr_rec/main.py @@ -21,18 +21,20 @@ import numpy as np from rapidocr.inference_engine.base import get_engine -from ..utils import Logger, download_file +from ..utils import Logger +from ..utils.download_file import DownloadFile, DownloadFileInput from .utils import CTCLabelDecode, TextRecInput, TextRecOutput DEFAULT_DICT_PATH = Path(__file__).parent.parent / "models" / "ppocr_keys_v1.txt" -DEFAULT_DICT_URL = "https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/paddle/PP-OCRv4/rec/ch_PP-OCRv4_rec_infer/ppocr_keys_v1.txt" -DEFAULT_MODE_PATH = Path(__file__).parent.parent / "models" +DEFAULT_DICT_URL = "https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/paddle/PP-OCRv4/rec/ch_PP-OCRv4_rec_infer/ppocr_keys_v1.txt" +DEFAULT_MODEL_PATH = Path(__file__).parent.parent / "models" class TextRecognizer: def __init__(self, config: Dict[str, Any]): - self.session = get_engine(config.engine_name)(config, mode="rec") + self.session = get_engine(config.engine_name)(config) self.logger = Logger(logger_name=__name__).get_log() + # onnx has inner character, other engine get or download character_dict_path character, character_dict_path = self.get_character_dict(config) @@ -60,9 +62,16 @@ class TextRecognizer: dict_download_url = ( dict_download_url if dict_download_url is not None else DEFAULT_DICT_URL ) - dict_path = DEFAULT_MODE_PATH / Path(dict_download_url).name + dict_path = DEFAULT_MODEL_PATH / Path(dict_download_url).name if not Path(dict_path).exists(): - download_file(dict_download_url, dict_path, self.logger) + DownloadFile.run( + DownloadFileInput( + file_url=dict_download_url, + sha256=None, + save_path=dict_path, + logger=self.logger, + ) + ) return character, dict_path diff --git a/python/rapidocr/default_models.yaml b/python/rapidocr/default_models.yaml index bb7b834..794ea4b 100644 --- a/python/rapidocr/default_models.yaml +++ b/python/rapidocr/default_models.yaml @@ -1,187 +1,352 @@ onnxruntime: PP-OCRv4: det: - ch_PP-OCRv4_det_infer.onnx: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/onnx/PP-OCRv4/det/ch_PP-OCRv4_det_infer.onnx - ch_PP-OCRv4_det_server_infer.onnx: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/onnx/PP-OCRv4/det/ch_PP-OCRv4_det_server_infer.onnx - en_PP-OCRv3_det_infer.onnx: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/onnx/PP-OCRv4/det/en_PP-OCRv3_det_infer.onnx - multi_PP-OCRv3_det_infer.onnx: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/onnx/PP-OCRv4/det/Multilingual_PP-OCRv3_det_infer.onnx + ch_PP-OCRv4_det_infer.onnx: + model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/onnx/PP-OCRv4/det/ch_PP-OCRv4_det_infer.onnx + SHA256: d2a7720d45a54257208b1e13e36a8479894cb74155a5efe29462512d42f49da9 + ch_PP-OCRv4_det_server_infer.onnx: + model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/onnx/PP-OCRv4/det/ch_PP-OCRv4_det_server_infer.onnx + SHA256: cfa39a3f298f6d3fc71789834d15da36d11a6c59b489fc16ea4733728012f786 + en_PP-OCRv3_det_infer.onnx: + model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/onnx/PP-OCRv4/det/en_PP-OCRv3_det_infer.onnx + SHA256: ea07c15d38ac40cd69da3c493444ec75b44ff23840553ff8ba102c1219ed39c2 + multi_PP-OCRv3_det_infer.onnx: + model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/onnx/PP-OCRv4/det/Multilingual_PP-OCRv3_det_infer.onnx + SHA256: 5475c6c7f4d84a6c4f32241b487435d59f126a40c023387af99732258844cdc3 rec: - arabic_PP-OCRv4_rec_infer.onnx: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/onnx/PP-OCRv4/rec/arabic_PP-OCRv4_rec_infer.onnx - ch_PP-OCRv4_rec_infer.onnx: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/onnx/PP-OCRv4/rec/ch_PP-OCRv4_rec_infer.onnx - ch_PP-OCRv4_rec_server_infer.onnx: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/onnx/PP-OCRv4/rec/ch_PP-OCRv4_rec_server_infer.onnx - chinese_cht_PP-OCRv3_rec_infer.onnx: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/onnx/PP-OCRv4/rec/chinese_cht_PP-OCRv3_rec_infer.onnx - cyrillic_PP-OCRv3_rec_infer.onnx: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/onnx/PP-OCRv4/rec/cyrillic_PP-OCRv3_rec_infer.onnx - devanagari_PP-OCRv4_rec_infer.onnx: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/onnx/PP-OCRv4/rec/devanagari_PP-OCRv4_rec_infer.onnx - en_PP-OCRv4_rec_infer.onnx: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/onnx/PP-OCRv4/rec/en_PP-OCRv4_rec_infer.onnx - japan_PP-OCRv4_rec_infer.onnx: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/onnx/PP-OCRv4/rec/japan_PP-OCRv4_rec_infer.onnx - ka_PP-OCRv4_rec_infer.onnx: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/onnx/PP-OCRv4/rec/ka_PP-OCRv4_rec_infer.onnx - korean_PP-OCRv4_rec_infer.onnx: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/onnx/PP-OCRv4/rec/korean_PP-OCRv4_rec_infer.onnx - latin_PP-OCRv3_rec_infer.onnx: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/onnx/PP-OCRv4/rec/latin_PP-OCRv3_rec_infer.onnx - ta_PP-OCRv4_rec_infer.onnx: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/onnx/PP-OCRv4/rec/ta_PP-OCRv4_rec_infer.onnx - te_PP-OCRv4_rec_infer.onnx: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/onnx/PP-OCRv4/rec/te_PP-OCRv4_rec_infer.onnx + arabic_PP-OCRv4_rec_infer.onnx: + model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/onnx/PP-OCRv4/rec/arabic_PP-OCRv4_rec_infer.onnx + SHA256: 4a9011bef71687bb84288dc86ad2471bd5d37b717ddf672dd156f9e7a5601bac + ch_PP-OCRv4_rec_infer.onnx: + model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/onnx/PP-OCRv4/rec/ch_PP-OCRv4_rec_infer.onnx + SHA256: 48fc40f24f6d2a207a2b1091d3437eb3cc3eb6b676dc3ef9c37384005483683b + ch_PP-OCRv4_rec_server_infer.onnx: + model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/onnx/PP-OCRv4/rec/ch_PP-OCRv4_rec_server_infer.onnx + SHA256: 6a2676219be9907c7fc9cf61ebaa843bf2898777def567925b78886fcd90c07a + chinese_cht_PP-OCRv3_rec_infer.onnx: + model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/onnx/PP-OCRv4/rec/chinese_cht_PP-OCRv3_rec_infer.onnx + SHA256: 779656d044ce388045e02ea9244724616194e63928606436cdfc6dc3c9528cc6 + cyrillic_PP-OCRv3_rec_infer.onnx: + model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/onnx/PP-OCRv4/rec/cyrillic_PP-OCRv3_rec_infer.onnx + SHA256: 1efb65bdc460af1c0e8733d005b20952b17ca5aac10ddb56c968333791c5eaa3 + devanagari_PP-OCRv4_rec_infer.onnx: + model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/onnx/PP-OCRv4/rec/devanagari_PP-OCRv4_rec_infer.onnx + SHA256: a62b6148303187907aa0b0d3a0125bdc62557d07966468cab9056949e36035e8 + en_PP-OCRv4_rec_infer.onnx: + model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/onnx/PP-OCRv4/rec/en_PP-OCRv4_rec_infer.onnx + SHA256: e8770c967605983d1570cdf5352041dfb68fa0c21664f49f47b155abd3e0e318 + japan_PP-OCRv4_rec_infer.onnx: + model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/onnx/PP-OCRv4/rec/japan_PP-OCRv4_rec_infer.onnx + SHA256: e1075a67dba758ecfc7ebc78a10ae61c95ac8fb66a9c86fab5541e33f085cb7a + ka_PP-OCRv4_rec_infer.onnx: + model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/onnx/PP-OCRv4/rec/ka_PP-OCRv4_rec_infer.onnx + SHA256: 9c1e186ea1d13cf6c853e57b42d382c3961fdd6acc2409e0d0dc44defc9f152b + korean_PP-OCRv4_rec_infer.onnx: + model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/onnx/PP-OCRv4/rec/korean_PP-OCRv4_rec_infer.onnx + SHA256: ab151ba9065eccd98f884cf4d927db091be86137276392072edd4f9d43ad7426 + latin_PP-OCRv3_rec_infer.onnx: + model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/onnx/PP-OCRv4/rec/latin_PP-OCRv3_rec_infer.onnx + SHA256: e9d7a33667e8aaa702862975186adf2012e3f390cc0f9422865957125f8071cf + ta_PP-OCRv4_rec_infer.onnx: + model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/onnx/PP-OCRv4/rec/ta_PP-OCRv4_rec_infer.onnx + SHA256: f78d752148873c5fa6e4294002bfd162dbba54236e406a39665ebbda766161b5 + te_PP-OCRv4_rec_infer.onnx: + model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/onnx/PP-OCRv4/rec/te_PP-OCRv4_rec_infer.onnx + SHA256: e608c3be00c8a9ea2f5c667d90f379403e2568bd5c8183308a49ca093def8eff cls: - ch_ppocr_mobile_v2.0_cls_infer.onnx: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/onnx/PP-OCRv4/cls/ch_ppocr_mobile_v2.0_cls_infer.onnx + ch_ppocr_mobile_v2.0_cls_infer.onnx: + model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/onnx/PP-OCRv4/cls/ch_ppocr_mobile_v2.0_cls_infer.onnx + SHA256: e47acedf663230f8863ff1ab0e64dd2d82b838fceb5957146dab185a89d6215c openvino: PP-OCRv4: det: - ch_PP-OCRv4_det_infer.onnx: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/onnx/PP-OCRv4/det/ch_PP-OCRv4_det_infer.onnx - ch_PP-OCRv4_det_server_infer.onnx: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/onnx/PP-OCRv4/det/ch_PP-OCRv4_det_server_infer.onnx - en_PP-OCRv3_det_infer.onnx: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/onnx/PP-OCRv4/det/en_PP-OCRv3_det_infer.onnx - multi_PP-OCRv3_det_infer.onnx: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/onnx/PP-OCRv4/det/Multilingual_PP-OCRv3_det_infer.onnx + ch_PP-OCRv4_det_infer.onnx: + model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/onnx/PP-OCRv4/det/ch_PP-OCRv4_det_infer.onnx + SHA256: d2a7720d45a54257208b1e13e36a8479894cb74155a5efe29462512d42f49da9 + ch_PP-OCRv4_det_server_infer.onnx: + model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/onnx/PP-OCRv4/det/ch_PP-OCRv4_det_server_infer.onnx + SHA256: cfa39a3f298f6d3fc71789834d15da36d11a6c59b489fc16ea4733728012f786 + en_PP-OCRv3_det_infer.onnx: + model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/onnx/PP-OCRv4/det/en_PP-OCRv3_det_infer.onnx + SHA256: ea07c15d38ac40cd69da3c493444ec75b44ff23840553ff8ba102c1219ed39c2 + multi_PP-OCRv3_det_infer.onnx: + model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/onnx/PP-OCRv4/det/Multilingual_PP-OCRv3_det_infer.onnx + SHA256: 5475c6c7f4d84a6c4f32241b487435d59f126a40c023387af99732258844cdc3 rec: arabic_PP-OCRv4_rec_infer: - model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/onnx/PP-OCRv4/rec/arabic_PP-OCRv4_rec_infer.onnx - dict_url: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/paddle/PP-OCRv4/rec/arabic_PP-OCRv4_rec_infer/arabic_dict.txt + model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/onnx/PP-OCRv4/rec/arabic_PP-OCRv4_rec_infer.onnx + dict_url: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/paddle/PP-OCRv4/rec/arabic_PP-OCRv4_rec_infer/arabic_dict.txt + SHA256: 4a9011bef71687bb84288dc86ad2471bd5d37b717ddf672dd156f9e7a5601bac ch_PP-OCRv4_rec_infer: - model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/onnx/PP-OCRv4/rec/ch_PP-OCRv4_rec_infer.onnx - dict_url: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/paddle/PP-OCRv4/rec/ch_PP-OCRv4_rec_infer/ppocr_keys_v1.txt + model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/onnx/PP-OCRv4/rec/ch_PP-OCRv4_rec_infer.onnx + dict_url: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/paddle/PP-OCRv4/rec/ch_PP-OCRv4_rec_infer/ppocr_keys_v1.txt + SHA256: 48fc40f24f6d2a207a2b1091d3437eb3cc3eb6b676dc3ef9c37384005483683b ch_PP-OCRv4_rec_server_infer: - model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/onnx/PP-OCRv4/rec/ch_PP-OCRv4_rec_server_infer.onnx - dict_url: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/paddle/PP-OCRv4/rec/ch_PP-OCRv4_rec_infer/ppocr_keys_v1.txt + model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/onnx/PP-OCRv4/rec/ch_PP-OCRv4_rec_server_infer.onnx + dict_url: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/paddle/PP-OCRv4/rec/ch_PP-OCRv4_rec_infer/ppocr_keys_v1.txt + SHA256: 6a2676219be9907c7fc9cf61ebaa843bf2898777def567925b78886fcd90c07a chinese_cht_PP-OCRv3_rec_infer: - model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/onnx/PP-OCRv4/rec/chinese_cht_PP-OCRv3_rec_infer.onnx - dict_url: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/paddle/PP-OCRv4/rec/chinese_cht_PP-OCRv3_rec_infer/chinese_cht_dict.txt + model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/onnx/PP-OCRv4/rec/chinese_cht_PP-OCRv3_rec_infer.onnx + dict_url: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/paddle/PP-OCRv4/rec/chinese_cht_PP-OCRv3_rec_infer/chinese_cht_dict.txt + SHA256: 779656d044ce388045e02ea9244724616194e63928606436cdfc6dc3c9528cc6 cyrillic_PP-OCRv3_rec_infer: - model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/onnx/PP-OCRv4/rec/cyrillic_PP-OCRv3_rec_infer.onnx - dict_url: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/paddle/PP-OCRv4/rec/cyrillic_PP-OCRv3_rec_infer/cyrillic_dict.txt + model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/onnx/PP-OCRv4/rec/cyrillic_PP-OCRv3_rec_infer.onnx + dict_url: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/paddle/PP-OCRv4/rec/cyrillic_PP-OCRv3_rec_infer/cyrillic_dict.txt + SHA256: 1efb65bdc460af1c0e8733d005b20952b17ca5aac10ddb56c968333791c5eaa3 devanagari_PP-OCRv4_rec_infer: - model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/onnx/PP-OCRv4/rec/devanagari_PP-OCRv4_rec_infer.onnx - dict_url: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/paddle/PP-OCRv4/rec/devanagari_PP-OCRv4_rec_infer/devanagari_dict.txt + model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/onnx/PP-OCRv4/rec/devanagari_PP-OCRv4_rec_infer.onnx + dict_url: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/paddle/PP-OCRv4/rec/devanagari_PP-OCRv4_rec_infer/devanagari_dict.txt + SHA256: a62b6148303187907aa0b0d3a0125bdc62557d07966468cab9056949e36035e8 en_PP-OCRv4_rec_infer: - model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/onnx/PP-OCRv4/rec/en_PP-OCRv4_rec_infer.onnx - dict_url: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/paddle/PP-OCRv4/rec/en_PP-OCRv4_rec_infer/en_dict.txt + model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/onnx/PP-OCRv4/rec/en_PP-OCRv4_rec_infer.onnx + dict_url: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/paddle/PP-OCRv4/rec/en_PP-OCRv4_rec_infer/en_dict.txt + SHA256: e8770c967605983d1570cdf5352041dfb68fa0c21664f49f47b155abd3e0e318 japan_PP-OCRv4_rec_infer: - model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/onnx/PP-OCRv4/rec/japan_PP-OCRv4_rec_infer.onnx - dict_url: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/paddle/PP-OCRv4/rec/japan_PP-OCRv4_rec_infer/japan_dict.txt + model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/onnx/PP-OCRv4/rec/japan_PP-OCRv4_rec_infer.onnx + dict_url: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/paddle/PP-OCRv4/rec/japan_PP-OCRv4_rec_infer/japan_dict.txt + SHA256: e1075a67dba758ecfc7ebc78a10ae61c95ac8fb66a9c86fab5541e33f085cb7a ka_PP-OCRv4_rec_infer: - model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/onnx/PP-OCRv4/rec/ka_PP-OCRv4_rec_infer.onnx - dict_url: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/paddle/PP-OCRv4/rec/kannada_PP-OCRv4_rec_infer/ka_dict.txt + model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/onnx/PP-OCRv4/rec/ka_PP-OCRv4_rec_infer.onnx + dict_url: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/paddle/PP-OCRv4/rec/kannada_PP-OCRv4_rec_infer/ka_dict.txt + SHA256: 9c1e186ea1d13cf6c853e57b42d382c3961fdd6acc2409e0d0dc44defc9f152b korean_PP-OCRv4_rec_infer: - model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/onnx/PP-OCRv4/rec/korean_PP-OCRv4_rec_infer.onnx - dict_url: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/paddle/PP-OCRv4/rec/korean_PP-OCRv4_rec_infer/korean_dict.txt + model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/onnx/PP-OCRv4/rec/korean_PP-OCRv4_rec_infer.onnx + dict_url: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/paddle/PP-OCRv4/rec/korean_PP-OCRv4_rec_infer/korean_dict.txt + SHA256: ab151ba9065eccd98f884cf4d927db091be86137276392072edd4f9d43ad7426 latin_PP-OCRv3_rec_infer: - model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/onnx/PP-OCRv4/rec/latin_PP-OCRv3_rec_infer.onnx - dict_url: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/paddle/PP-OCRv4/rec/latin_PP-OCRv3_rec_infer/latin_dict.txt + model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/onnx/PP-OCRv4/rec/latin_PP-OCRv3_rec_infer.onnx + dict_url: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/paddle/PP-OCRv4/rec/latin_PP-OCRv3_rec_infer/latin_dict.txt + SHA256: e9d7a33667e8aaa702862975186adf2012e3f390cc0f9422865957125f8071cf ta_PP-OCRv4_rec_infer: - model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/onnx/PP-OCRv4/rec/ta_PP-OCRv4_rec_infer.onnx - dict_url: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/paddle/PP-OCRv4/rec/ta_PP-OCRv4_rec_infer/ta_dict.txt + model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/onnx/PP-OCRv4/rec/ta_PP-OCRv4_rec_infer.onnx + dict_url: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/paddle/PP-OCRv4/rec/ta_PP-OCRv4_rec_infer/ta_dict.txt + SHA256: f78d752148873c5fa6e4294002bfd162dbba54236e406a39665ebbda766161b5 te_PP-OCRv4_rec_infer: - model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/onnx/PP-OCRv4/rec/te_PP-OCRv4_rec_infer.onnx - dict_url: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/paddle/PP-OCRv4/rec/te_PP-OCRv4_rec_infer/te_dict.txt + model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/onnx/PP-OCRv4/rec/te_PP-OCRv4_rec_infer.onnx + dict_url: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/paddle/PP-OCRv4/rec/te_PP-OCRv4_rec_infer/te_dict.txt + SHA256: e608c3be00c8a9ea2f5c667d90f379403e2568bd5c8183308a49ca093def8eff cls: - ch_ppocr_mobile_v2.0_cls_infer.onnx: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/onnx/PP-OCRv4/cls/ch_ppocr_mobile_v2.0_cls_infer.onnx + ch_ppocr_mobile_v2.0_cls_infer.onnx: + model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/onnx/PP-OCRv4/cls/ch_ppocr_mobile_v2.0_cls_infer.onnx + SHA256: e47acedf663230f8863ff1ab0e64dd2d82b838fceb5957146dab185a89d6215c paddle: PP-OCRv4: det: - ch_PP-OCRv4_det_infer: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/paddle/PP-OCRv4/det/ch_PP-OCRv4_det_infer - ch_PP-OCRv4_det_server_infer: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/paddle/PP-OCRv4/det/ch_PP-OCRv4_det_server_infer - en_PP-OCRv3_det_infer: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/paddle/PP-OCRv4/det/en_PP-OCRv3_det_infer - multi_PP-OCRv3_det_infer: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/paddle/PP-OCRv4/det/Multilingual_PP-OCRv3_det_infer + ch_PP-OCRv4_det_infer: + model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/paddle/PP-OCRv4/det/ch_PP-OCRv4_det_infer + inference.pdiparams: 49ee815e30cff43cb1057d33bf0d94193e4d4f1ae28451cad15b40be830df915 + inference.pdiparams.info: 4e0f29e5fa476126f9efe0dc69f7ca7be960705ad549385d30c9604193463e69 + inference.pdmodel: 2ad68ed2768fe6c41166a5bc64680cc9f445390acb6528da449a4db2f7b90e14 + ch_PP-OCRv4_det_server_infer: + model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/paddle/PP-OCRv4/det/ch_PP-OCRv4_det_server_infer + inference.pdiparams: 48cecf9e30e9261a634126bc5211a2736508ae89d2d6199ef2ede06cdebe678f + inference.pdiparams.info: 231d32f0fc329cffcd3f756ef6ab6899663222a6b655b577400a2dd9cb8d2ac8 + inference.pdmodel: fec18291e9994c66a8c6877c7194c094071f115f7fd9f48b4da40e966749b03agit + en_PP-OCRv3_det_infer: + model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/paddle/PP-OCRv4/det/en_PP-OCRv3_det_infer + inference.pdiparams: 83676ec730627ab4502f401410a4b6a3ce1c0bb98fa249b71db055b6bddae051 + inference.pdiparams.info: 2fe414d9eadf914bf44e3f9ba212988a6f26f364e4f87c6d0af57438ffffc0c4 + inference.pdmodel: c4bfb1b05d9d1d5a760801eaf6d20180ef7e47bcc675fb17d1f3a89da5fef427 + multi_PP-OCRv3_det_infer: + model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/paddle/PP-OCRv4/det/Multilingual_PP-OCRv3_det_infer + inference.pdiparams: a6119e639cade15873ac32eb4bee121b63c811c4d007d9f618baf680aef8b857 + inference.pdiparams.info: 2fe414d9eadf914bf44e3f9ba212988a6f26f364e4f87c6d0af57438ffffc0c4 + inference.pdmodel: c49f664c75549678deedcaff8d11f8f2b9f1303ef6c72deccdb98a5ea2104381 rec: arabic_PP-OCRv4_rec_infer: - model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/paddle/PP-OCRv4/rec/arabic_PP-OCRv4_rec_infer - dict_url: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/paddle/PP-OCRv4/rec/arabic_PP-OCRv4_rec_infer/arabic_dict.txt + model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/paddle/PP-OCRv4/rec/arabic_PP-OCRv4_rec_infer + dict_url: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/paddle/PP-OCRv4/rec/arabic_PP-OCRv4_rec_infer/arabic_dict.txt + inference.pdiparams: b388bf744151963a21b9ee9c60b4624ba90976ae5f1f1b023e594032b16ce40f + inference.pdiparams.info: 710d9f3d7c503067ae708f4bc3adc6973c0d6391adb7a1470c36eb70da6b5b83 + inference.pdmodel: c9a2f2e222937a934c5c23fd95dbba5b62a3f6d822a14f86cf8b3e9b93632c64 ch_PP-OCRv4_rec_infer: - model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/paddle/PP-OCRv4/rec/ch_PP-OCRv4_rec_infer - dict_url: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/paddle/PP-OCRv4/rec/ch_PP-OCRv4_rec_infer/ppocr_keys_v1.txt + model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/paddle/PP-OCRv4/rec/ch_PP-OCRv4_rec_infer + dict_url: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/paddle/PP-OCRv4/rec/ch_PP-OCRv4_rec_infer/ppocr_keys_v1.txt + inference.pdiparams: a6dbfa63e7ee161688523c954e9e293f77dc24044db81e836ff9c7f103fd191a + inference.pdiparams.info: 0706cc669bdce382f582c139906076b170b112c51bf32573fe43438025777f12 + inference.pdmodel: bf78f3898a004615e69c676259d8171bd7ae99000653b41fd72aaa36ae8bd304 ch_PP-OCRv4_rec_server_infer: - model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/paddle/PP-OCRv4/rec/ch_PP-OCRv4_rec_server_infer - dict_url: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/paddle/PP-OCRv4/rec/ch_PP-OCRv4_rec_infer/ppocr_keys_v1.txt + model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/paddle/PP-OCRv4/rec/ch_PP-OCRv4_rec_server_infer + dict_url: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/paddle/PP-OCRv4/rec/ch_PP-OCRv4_rec_infer/ppocr_keys_v1.txt + inference.pdiparams: 0319d16cb29b01788757164083da6512a5defb9bccdff5148a929bd43b2cd58f + inference.pdiparams.info: 3aad501d0aa2bb2785b90e184c8c5d21718a72c5b896e4493856eb8936ab8455 + inference.pdmodel: d3cbe31c26670a275c74bba052a49925e24452243f6f646a9ef92c4f5acffd37 chinese_cht_PP-OCRv3_rec_infer: - model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/paddle/PP-OCRv4/rec/chinese_cht_PP-OCRv3_rec_infer - dict_url: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/paddle/PP-OCRv4/rec/chinese_cht_PP-OCRv3_rec_infer/chinese_cht_dict.txt + model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/paddle/PP-OCRv4/rec/chinese_cht_PP-OCRv3_rec_infer + dict_url: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/paddle/PP-OCRv4/rec/chinese_cht_PP-OCRv3_rec_infer/chinese_cht_dict.txt + inference.pdiparams: 53cdd14ef365d43a3de5357dea00935c56ae6d8f0f7d464b8aee187df8bdea47 + inference.pdiparams.info: cf79f0b9689b4d6b8094d8bfe2481dc4b4d1699adb622568384695b5f56dc600 + inference.pdmodel: 343da1722eae396309e365f9a98bca53f55ca71cf757743abaf83dce9d805bc0 cyrillic_PP-OCRv3_rec_infer: - model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/paddle/PP-OCRv4/rec/cyrillic_PP-OCRv3_rec_infer - dict_url: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/paddle/PP-OCRv4/rec/cyrillic_PP-OCRv3_rec_infer/cyrillic_dict.txt + model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/paddle/PP-OCRv4/rec/cyrillic_PP-OCRv3_rec_infer + dict_url: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/paddle/PP-OCRv4/rec/cyrillic_PP-OCRv3_rec_infer/cyrillic_dict.txt + inference.pdiparams: 2ef815afbb8970610618561946ce86faf60745ada64cd316ed34bfe34bdbf46f + inference.pdiparams.info: cf79f0b9689b4d6b8094d8bfe2481dc4b4d1699adb622568384695b5f56dc600 + inference.pdmodel: 377bee205d0ba2d401cb463c300366ab87b2373b45dd9c8e3b560166b064beee devanagari_PP-OCRv4_rec_infer: - model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/paddle/PP-OCRv4/rec/devanagari_PP-OCRv4_rec_infer - dict_url: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/paddle/PP-OCRv4/rec/devanagari_PP-OCRv4_rec_infer/devanagari_dict.txt + model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/paddle/PP-OCRv4/rec/devanagari_PP-OCRv4_rec_infer + dict_url: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/paddle/PP-OCRv4/rec/devanagari_PP-OCRv4_rec_infer/devanagari_dict.txt + inference.pdiparams: 3effa6613d040b79aac36699a3c97fe835fc91791db2010d614cc9ffb08ee415 + inference.pdiparams.info: 710d9f3d7c503067ae708f4bc3adc6973c0d6391adb7a1470c36eb70da6b5b83 + inference.pdmodel: 854c6d41d186be07588f3cd4ced044270ad96afd7f31ee4f63a70e1d3714a9d1 en_PP-OCRv4_rec_infer: - model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/paddle/PP-OCRv4/rec/en_PP-OCRv4_rec_infer - dict_url: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/paddle/PP-OCRv4/rec/en_PP-OCRv4_rec_infer/en_dict.txt + model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/paddle/PP-OCRv4/rec/en_PP-OCRv4_rec_infer + dict_url: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/paddle/PP-OCRv4/rec/en_PP-OCRv4_rec_infer/en_dict.txt + inference.pdiparams: 75f64a1ffb70c56b7a25655963ca16f5bf3286202e3f52ac972bee05cdee2f56 + inference.pdiparams.info: 710d9f3d7c503067ae708f4bc3adc6973c0d6391adb7a1470c36eb70da6b5b83 + inference.pdmodel: 85b952f05f709af259cfe4254012aa7208bef0998f71f57a15495446f25ccd43 japan_PP-OCRv4_rec_infer: - model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/paddle/PP-OCRv4/rec/japan_PP-OCRv4_rec_infer - dict_url: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/paddle/PP-OCRv4/rec/japan_PP-OCRv4_rec_infer/japan_dict.txt + model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/paddle/PP-OCRv4/rec/japan_PP-OCRv4_rec_infer + dict_url: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/paddle/PP-OCRv4/rec/japan_PP-OCRv4_rec_infer/japan_dict.txt + inference.pdiparams: e6e9b7395bb8476e85a15776aa09445c483778c06a512921cbc9ba81c6a2719a + inference.pdiparams.info: 710d9f3d7c503067ae708f4bc3adc6973c0d6391adb7a1470c36eb70da6b5b83 + inference.pdmodel: d3339a79fa88863f639a00cd57e973cc278fa46c3eb369b88cb24bb06c96b89d ka_PP-OCRv4_rec_infer: - model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/paddle/PP-OCRv4/rec/kannada_PP-OCRv4_rec_infer - dict_url: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/paddle/PP-OCRv4/rec/kannada_PP-OCRv4_rec_infer/ka_dict.txt + model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/paddle/PP-OCRv4/rec/kannada_PP-OCRv4_rec_infer + dict_url: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/paddle/PP-OCRv4/rec/kannada_PP-OCRv4_rec_infer/ka_dict.txt + inference.pdiparams: 580fe5bc0a45956569bc63bda99b27f33505f20e519fa43517d1d5b9bcbb029b + inference.pdiparams.info: 710d9f3d7c503067ae708f4bc3adc6973c0d6391adb7a1470c36eb70da6b5b83 + inference.pdmodel: bb23a7045f9f03c414f727c75752660d51760f02da2023e258bcc014f585f8e8 korean_PP-OCRv4_rec_infer: - model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/paddle/PP-OCRv4/rec/korean_PP-OCRv4_rec_infer - dict_url: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/paddle/PP-OCRv4/rec/korean_PP-OCRv4_rec_infer/korean_dict.txt + model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/paddle/PP-OCRv4/rec/korean_PP-OCRv4_rec_infer + dict_url: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/paddle/PP-OCRv4/rec/korean_PP-OCRv4_rec_infer/korean_dict.txt + inference.pdiparams: ea4f4762582336e9b85653b016c5b1091223c947fafd282161fa3145ecb72d1d + inference.pdiparams.info: 533380ead7fe161fc32ac0bdc966e65c18c0d9d1a16088736c4aa3c628701374 + inference.pdmodel: 992eed58af98ed6125065027e52fbc69b570e6c2e74610ec240e8a2436151ada latin_PP-OCRv3_rec_infer: - model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/paddle/PP-OCRv4/rec/latin_PP-OCRv3_rec_infer - dict_url: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/paddle/PP-OCRv4/rec/latin_PP-OCRv3_rec_infer/latin_dict.txt + model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/paddle/PP-OCRv4/rec/latin_PP-OCRv3_rec_infer + dict_url: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/paddle/PP-OCRv4/rec/latin_PP-OCRv3_rec_infer/latin_dict.txt + inference.pdiparams: fa6f22a8b2a669c7d5b4dfd2607491abd4cd2467adf7077c9cc70ce8c47b61d9 + inference.pdiparams.info: cf79f0b9689b4d6b8094d8bfe2481dc4b4d1699adb622568384695b5f56dc600 + inference.pdmodel: 23e11a537d8cd7ebab669a9e48fb12f49c295ca9ecde398c6b5460830bd174b8 ta_PP-OCRv4_rec_infer: - model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/paddle/PP-OCRv4/rec/ta_PP-OCRv4_rec_infer - dict_url: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/paddle/PP-OCRv4/rec/ta_PP-OCRv4_rec_infer/ta_dict.txt + model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/paddle/PP-OCRv4/rec/ta_PP-OCRv4_rec_infer + dict_url: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/paddle/PP-OCRv4/rec/ta_PP-OCRv4_rec_infer/ta_dict.txt + inference.pdiparams: b0ae170098a2f706de3c60496f5730b5ea4afe1d6e679a67ab6f89aa1018ffde + inference.pdiparams.info: 533380ead7fe161fc32ac0bdc966e65c18c0d9d1a16088736c4aa3c628701374 + inference.pdmodel: 42ddd121b43ab9ef399e59705bcde6c56891a531c6df87a467aa99c5db54926f te_PP-OCRv4_rec_infer: - model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/paddle/PP-OCRv4/rec/te_PP-OCRv4_rec_infer - dict_url: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/paddle/PP-OCRv4/rec/te_PP-OCRv4_rec_infer/te_dict.txt + model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/paddle/PP-OCRv4/rec/te_PP-OCRv4_rec_infer + dict_url: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/paddle/PP-OCRv4/rec/te_PP-OCRv4_rec_infer/te_dict.txt + inference.pdiparams: 6efc7c74d4ff86b4187ece2f3b4f6ecd775c3a780b82d27d39a9c506d6e9eb42 + inference.pdiparams.info: 533380ead7fe161fc32ac0bdc966e65c18c0d9d1a16088736c4aa3c628701374 + inference.pdmodel: f07501e6a3e96aa065ed5a656c8aee5bff9694ac8cb51826178dd4f34e884333 cls: - ch_ppocr_mobile_v2.0_cls_infer: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/paddle/PP-OCRv4/cls/ch_ppocr_mobile_v2_cls_infer + ch_ppocr_mobile_v2.0_cls_infer: + model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/paddle/PP-OCRv4/cls/ch_ppocr_mobile_v2_cls_infer + inference.pdiparams: d1efda1b80e174b4fcb168a035ac96c1af4938892bd86a55f300a6027105d08c + inference.pdiparams.info: ee0c2eaa4c09814802bf520c01dfdbc1345dc2879dc9e67424d32c7b0ee88e59 + inference.pdmodel: 3c4337ec61722a20b1dca2e5bfaffc313c0592bc89ad6e0d45168224186f6683 torch: PP-OCRv4: det: - ch_PP-OCRv4_det_infer.pth: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/torch/ch_PP-OCRv4_det_infer.pth - ch_PP-OCRv4_det_server_infer.pth: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/torch/ch_PP-OCRv4_det_server_infer.pth - en_PP-OCRv3_det_infer.pth: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/torch/en_PP-OCRv3_det_infer.pth - multi_PP-OCRv3_det_infer.pth: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/torch/Multilingual_PP-OCRv3_det_infer.pth + ch_PP-OCRv4_det_infer.pth: + model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/torch/PP-OCRv4/det/ch_PP-OCRv4_det_infer.pth + SHA256: 89622c3f3e76b3ac7d10d9434c1f117a7471dba44723885cc04b49932a740d5b + ch_PP-OCRv4_det_server_infer.pth: + model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/torch/PP-OCRv4/det/ch_PP-OCRv4_det_server_infer.pth + SHA256: 2ccb02359eb1e56c72ba3cc21d166ed32a517863554f19fc6ec1b663fe4a6652 + en_PP-OCRv3_det_infer.pth: + model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/torch/PP-OCRv4/det/en_PP-OCRv3_det_infer.pth + SHA256: 62aba369c8245f131bb08348a7d9c3135234d5c139ec92b34c8ac7b9ba7c2846 + multi_PP-OCRv3_det_infer.pth: + model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/torch/PP-OCRv4/det/Multilingual_PP-OCRv3_det_infer.pth + SHA256: 05eb1c89030b269b830ba7f2d424a4ac80c7593ea1795fef9777fedbc18e383f rec: arabic_PP-OCRv4_rec_infer: - model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/torch/arabic_PP-OCRv4_rec_infer.pth - dict_url: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/paddle/PP-OCRv4/rec/arabic_PP-OCRv4_rec_infer/arabic_dict.txt + model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/torch/PP-OCRv4/rec/arabic_PP-OCRv4_rec_infer.pth + dict_url: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/paddle/PP-OCRv4/rec/arabic_PP-OCRv4_rec_infer/arabic_dict.txt + SHA256: 4dced07241dba41911aca9b5b2c3505e4c041d836d7225700007981375d4f387 ch_PP-OCRv4_rec_infer.pth: - model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/torch/ch_PP-OCRv4_rec_infer.pth - dict_url: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/paddle/PP-OCRv4/rec/ch_PP-OCRv4_rec_infer/ppocr_keys_v1.txt + model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/torch/PP-OCRv4/rec/ch_PP-OCRv4_rec_infer.pth + dict_url: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/paddle/PP-OCRv4/rec/ch_PP-OCRv4_rec_infer/ppocr_keys_v1.txt + SHA256: cb4265bb4300a2487e93e82ccfa1924bf9cd1194c1a202ab17a96b4911c27e0b ch_PP-OCRv4_rec_server_infer.pth: - model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/torch/ch_PP-OCRv4_rec_server_infer.pth - dict_url: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/paddle/PP-OCRv4/rec/ch_PP-OCRv4_rec_infer/ppocr_keys_v1.txt + model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/torch/PP-OCRv4/rec/ch_PP-OCRv4_rec_server_infer.pth + dict_url: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/paddle/PP-OCRv4/rec/ch_PP-OCRv4_rec_infer/ppocr_keys_v1.txt + SHA256: 2c0c9f5180ae3e4d8ea9d3830116ac49900abbb2af3985db02c2bbf484bb0bf9 chinese_cht_PP-OCRv3_rec_infer.pth: - model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/torch/chinese_cht_PP-OCRv3_rec_infer.pth - dict_url: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/paddle/PP-OCRv4/rec/chinese_cht_PP-OCRv3_rec_infer/chinese_cht_dict.txt + model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/torch/PP-OCRv4/rec/chinese_cht_PP-OCRv3_rec_infer.pth + dict_url: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/paddle/PP-OCRv4/rec/chinese_cht_PP-OCRv3_rec_infer/chinese_cht_dict.txt + SHA256: e1a636246ca348d481161fb4e2d3dc4aea4223e71fc50b0e72984ebaa322cbb4 cyrillic_PP-OCRv3_rec_infer.pth: - model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/torch/cyrillic_PP-OCRv3_rec_infer.pth - dict_url: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/paddle/PP-OCRv4/rec/cyrillic_PP-OCRv3_rec_infer/cyrillic_dict.txt + model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/torch/PP-OCRv4/rec/cyrillic_PP-OCRv3_rec_infer.pth + dict_url: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/paddle/PP-OCRv4/rec/cyrillic_PP-OCRv3_rec_infer/cyrillic_dict.txt + SHA256: 77d16690e6b3f16c2c907a7dcfe1c3722169fd22913fcfe84ee54069b8e5798d devanagari_PP-OCRv4_rec_infer: - model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/torch/devanagari_PP-OCRv4_rec_infer.pth - dict_url: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/paddle/PP-OCRv4/rec/devanagari_PP-OCRv4_rec_infer/devanagari_dict.txt + model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/torch/PP-OCRv4/rec/devanagari_PP-OCRv4_rec_infer.pth + dict_url: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/paddle/PP-OCRv4/rec/devanagari_PP-OCRv4_rec_infer/devanagari_dict.txt + SHA256: 423c6d25e3c0db42192fdb2e87af37fed3e772f2433fefad0e13572b87788ad7 en_PP-OCRv4_rec_infer.pth: - model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/torch/en_PP-OCRv4_rec_infer.pth - dict_url: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/paddle/PP-OCRv4/rec/en_PP-OCRv4_rec_infer/en_dict.txt + model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/torch/PP-OCRv4/rec/en_PP-OCRv4_rec_infer.pth + dict_url: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/paddle/PP-OCRv4/rec/en_PP-OCRv4_rec_infer/en_dict.txt + SHA256: f9723c94847de59df9b059faaed041fbb35f014ea973da40290b1e97004e1d4e japan_PP-OCRv4_rec_infer: - model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/torch/japan_PP-OCRv4_rec_infer.pth - dict_url: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/paddle/PP-OCRv4/rec/japan_PP-OCRv4_rec_infer/japan_dict.txt + model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/torch/PP-OCRv4/rec/japan_PP-OCRv4_rec_infer.pth + dict_url: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/paddle/PP-OCRv4/rec/japan_PP-OCRv4_rec_infer/japan_dict.txt + SHA256: de4549a131821f7456a16175e6aea85c4fda5a6cec10b119c3c2d54c02ceb06f ka_PP-OCRv4_rec_infer: - model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/torch/ka_PP-OCRv4_rec_infer.pth - dict_url: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/paddle/PP-OCRv4/rec/kannada_PP-OCRv4_rec_infer/ka_dict.txt + model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/torch/PP-OCRv4/rec/ka_PP-OCRv4_rec_infer.pth + dict_url: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/paddle/PP-OCRv4/rec/kannada_PP-OCRv4_rec_infer/ka_dict.txt + SHA256: 4a537f8aa90afb4f3bb63d0950c2d408b18d586509956b4f56652ef0829764f3 korean_PP-OCRv4_rec_infer: - model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/torch/korean_PP-OCRv4_rec_infer.pth - dict_url: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/paddle/PP-OCRv4/rec/korean_PP-OCRv4_rec_infer/korean_dict.txt + model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/torch/PP-OCRv4/rec/korean_PP-OCRv4_rec_infer.pth + dict_url: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/paddle/PP-OCRv4/rec/korean_PP-OCRv4_rec_infer/korean_dict.txt + SHA256: f50614ab06416037454ac2cc6ade9a758f0222f518254fd57dd65f428f763a01 latin_PP-OCRv3_rec_infer.pth: - model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/torch/latin_PP-OCRv3_rec_infer.pth - dict_url: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/paddle/PP-OCRv4/rec/latin_PP-OCRv3_rec_infer/latin_dict.txt + model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/torch/PP-OCRv4/rec/latin_PP-OCRv3_rec_infer.pth + dict_url: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/paddle/PP-OCRv4/rec/latin_PP-OCRv3_rec_infer/latin_dict.txt + SHA256: caf8e0f2572a7dea2d901c7f50bd78fc310a4246a655d062b69f30258c15bf90 ta_PP-OCRv4_rec_infer: - model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/paddle/PP-OCRv4/rec/ta_PP-OCRv4_rec_infer.pth - dict_url: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/paddle/PP-OCRv4/rec/ta_PP-OCRv4_rec_infer/ta_dict.txt + model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/torch/PP-OCRv4/rec/ta_PP-OCRv4_rec_infer.pth + dict_url: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/paddle/PP-OCRv4/rec/ta_PP-OCRv4_rec_infer/ta_dict.txt + SHA256: 16f42da51ddbad9acbb2a0372ddc2432c49ba3d1ccabc98acec55a4684b6a644 te_PP-OCRv4_rec_infer: - model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/torch/te_PP-OCRv4_rec_infer.pth - dict_url: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/paddle/PP-OCRv4/rec/te_PP-OCRv4_rec_infer/te_dict.txt + model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/torch/PP-OCRv4/rec/te_PP-OCRv4_rec_infer.pth + dict_url: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/paddle/PP-OCRv4/rec/te_PP-OCRv4_rec_infer/te_dict.txt + SHA256: 0597e97b27be9298d703267ed28227abfa6c0a60c07817575b5fa7d2124e7dbc cls: - ch_ptocr_mobile_v2.0_cls_infer.pth: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/torch/ch_ptocr_mobile_v2.0_cls_infer.pth + ch_ptocr_mobile_v2.0_cls_infer.pth: + model_dir: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/torch/PP-OCRv4/cls/ch_ptocr_mobile_v2.0_cls_infer.pth + SHA256: bfe13860824b3365c0c7f7ccfcddc8ff11645c60051739ff18bc9913f60c98e1 fonts: - ch: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/resources/fonts/FZYTK.TTF - en: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/resources/fonts/FZYTK.TTF - japan: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/resources/fonts/japan.ttc - arabic: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/resources/fonts/arabic.ttf - chinese_cht: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/resources/fonts/chinese_cht.ttf - cyrillic: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/resources/fonts/cyrillic.ttf - devanagari: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/resources/fonts/devanagari_Martel-Regular.ttf - korean: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/resources/fonts/korean.ttf - ka: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/resources/fonts/kannada.ttf - latin: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/resources/fonts/latin.ttf - ta: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/resources/fonts/tamil.ttf - te: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/master/resources/fonts/telugu.ttf \ No newline at end of file + ch: + path: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/resources/fonts/FZYTK.TTF + SHA256: 4065a23df6823c8e2b69a0e76d02f02a6470b8774a5e91086609701ad95cc33f + en: + path: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/resources/fonts/FZYTK.TTF + SHA256: 4065a23df6823c8e2b69a0e76d02f02a6470b8774a5e91086609701ad95cc33f + japan: + path: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/resources/fonts/japan.ttc + SHA256: 11122490a5e3a862015c8894183750de59abf95c3936d63d5978293d92f23dba + arabic: + path: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/resources/fonts/arabic.ttf + SHA256: cd25bfc3c6d745a8a4b4d415321aa5b43d99b61744b50d20e32931811ec7e268 + chinese_cht: + path: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/resources/fonts/chinese_cht.ttf + SHA256: 5ce814960d0cdea1dd647180636babc1cf6a0acf0a9a9019424f4689acedd9ea + cyrillic: + path: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/resources/fonts/cyrillic.ttf + SHA256: 084768d29859a62b735387fb5946dfe61fb3d844031c7c51c1668d8afbe3b802 + devanagari: + path: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/resources/fonts/devanagari_Martel-Regular.ttf + SHA256: b37a04d22ee4700f5018d39678ebb2b9fc64c9d06cd9ec6f9f3fb4c27870a63b + korean: + path: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/resources/fonts/korean.ttf + SHA256: 0897316bdb2e308cea2841c54940f2ef5707856000aa07910c8bff39a47e40bd + ka: + path: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/resources/fonts/kannada.ttf + SHA256: b337386a8e853ccba53c0c248bd06f025d7667b800ba74c72c66040d67315c6e + latin: + path: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/resources/fonts/latin.ttf + SHA256: 1562fe5cbdaacab4a5880d6404ba05245d12f3a4478fe16021e976bc725ce5d5 + ta: + path: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/resources/fonts/tamil.ttf + SHA256: b771ac413157f6b1f1a52fb8ff1b56057f4b492fcce385ddd32ca12eee0c73b0 + te: + path: https://www.modelscope.cn/models/RapidAI/RapidOCR/resolve/v2.0.7/resources/fonts/telugu.ttf + SHA256: 7f82ab141b77d263f9ea9b31b47faf50c11310f42fce6d9dffeaaa334909bbf9 diff --git a/python/rapidocr/inference_engine/base.py b/python/rapidocr/inference_engine/base.py index 4326128..8e161a7 100644 --- a/python/rapidocr/inference_engine/base.py +++ b/python/rapidocr/inference_engine/base.py @@ -4,7 +4,7 @@ import abc from enum import Enum from pathlib import Path -from typing import List, Union +from typing import Dict, List, Union import numpy as np from omegaconf import DictConfig, OmegaConf @@ -98,7 +98,7 @@ def get_engine_name(config: DictConfig) -> str: class InferSession(abc.ABC): model_info = OmegaConf.load(MODEL_URL_PATH) - DEFAULT_MODE_PATH = cur_dir / "models" + DEFAULT_MODEL_PATH = cur_dir / "models" logger = Logger(logger_name=__name__).get_log() @abc.abstractmethod @@ -126,7 +126,9 @@ class InferSession(abc.ABC): pass @classmethod - def get_model_url(cls, engine_name: str, task_type: str, lang: str) -> str: + def get_model_url( + cls, engine_name: str, task_type: str, lang: str + ) -> Dict[str, str]: lang, model_type = lang.rsplit("_", 1) model_dict = cls.model_info[engine_name]["PP-OCRv4"][task_type] diff --git a/python/rapidocr/inference_engine/onnxruntime.py b/python/rapidocr/inference_engine/onnxruntime.py index fcdfff6..11fb040 100644 --- a/python/rapidocr/inference_engine/onnxruntime.py +++ b/python/rapidocr/inference_engine/onnxruntime.py @@ -6,7 +6,7 @@ import platform import traceback from enum import Enum from pathlib import Path -from typing import Any, Dict, List, Optional, Tuple +from typing import Any, Dict, List, Tuple import numpy as np from onnxruntime import ( @@ -17,7 +17,7 @@ from onnxruntime import ( get_device, ) -from ..utils import download_file +from ..utils import DownloadFile, DownloadFileInput from ..utils.logger import Logger from .base import InferSession @@ -29,17 +29,23 @@ class EP(Enum): class OrtInferSession(InferSession): - def __init__(self, config: Dict[str, Any], mode: Optional[str] = None): + def __init__(self, config: Dict[str, Any]): self.logger = Logger(logger_name=__name__).get_log() model_path = config.get("model_path", None) if model_path is None: # 说明用户没有指定自己模型,使用默认模型 - default_model_url = self.get_model_url( + model_info = self.get_model_url( config.engine_name, config.task_type, config.lang ) - model_path = self.DEFAULT_MODE_PATH / Path(default_model_url).name - download_file(default_model_url, model_path, self.logger) + model_path = self.DEFAULT_MODEL_PATH / Path(model_info["model_dir"]).name + download_params = DownloadFileInput( + file_url=model_info["model_dir"], + sha256=model_info["SHA256"], + save_path=model_path, + logger=self.logger, + ) + DownloadFile.run(download_params) self._verify_model(model_path) @@ -152,8 +158,10 @@ class OrtInferSession(InferSession): return False window_build_number_str = platform.version().split(".")[-1] - window_build_number = int(window_build_number_str) if window_build_number_str.isdigit() else 0 - + window_build_number = ( + int(window_build_number_str) if window_build_number_str.isdigit() else 0 + ) + if window_build_number < 18362: self.logger.warning( "DirectML is only supported in Windows 10 Build 18362 and above OS. The current Windows Build is %s. Use %s inference by default.", diff --git a/python/rapidocr/inference_engine/openvino.py b/python/rapidocr/inference_engine/openvino.py index e854bf4..ad114b4 100644 --- a/python/rapidocr/inference_engine/openvino.py +++ b/python/rapidocr/inference_engine/openvino.py @@ -4,34 +4,36 @@ import os import traceback from pathlib import Path -from typing import Optional import numpy as np from omegaconf import DictConfig from openvino.runtime import Core -from ..utils import Logger, download_file +from ..utils import Logger +from ..utils.download_file import DownloadFile, DownloadFileInput from .base import InferSession class OpenVINOInferSession(InferSession): - def __init__(self, config: DictConfig, mode: Optional[str] = None): + def __init__(self, config: DictConfig): super().__init__(config) - self.mode = mode self.logger = Logger(logger_name=__name__).get_log() core = Core() model_path = config.get("model_path", None) if model_path is None: - default_model_url = self.get_model_url( + model_info = self.get_model_url( config.engine_name, config.task_type, config.lang ) - if self.mode == "rec": - default_model_url = default_model_url.model_dir - - model_path = self.DEFAULT_MODE_PATH / Path(default_model_url).name - download_file(default_model_url, model_path, self.logger) + model_path = self.DEFAULT_MODEL_PATH / Path(model_info["model_dir"]).name + download_params = DownloadFileInput( + file_url=model_info["model_dir"], + sha256=model_info["SHA256"], + save_path=model_path, + logger=self.logger, + ) + DownloadFile.run(download_params) self._verify_model(model_path) model_onnx = core.read_model(model_path) diff --git a/python/rapidocr/inference_engine/paddle.py b/python/rapidocr/inference_engine/paddle.py index 48efbba..e7a257f 100644 --- a/python/rapidocr/inference_engine/paddle.py +++ b/python/rapidocr/inference_engine/paddle.py @@ -10,7 +10,7 @@ import numpy as np import paddle from paddle import inference -from ..utils import download_file +from ..utils.download_file import DownloadFile, DownloadFileInput from ..utils.logger import Logger from .base import InferSession @@ -26,23 +26,36 @@ class PaddleInferSession(InferSession): model_dir = config.get("model_dir", None) if model_dir is None: - default_model_url = self.get_model_url( + model_info = self.get_model_url( config.engine_name, config.task_type, config.lang ) - if self.mode == "rec": - default_model_url = default_model_url["model_dir"] - pd_model_url = f"{default_model_url}/{PDMODEL_NAME}" + default_model_dir = model_info["model_dir"] + pd_model_url = f"{default_model_dir}/{PDMODEL_NAME}" pdmodel_path = ( - self.DEFAULT_MODE_PATH / Path(default_model_url).name / PDMODEL_NAME + self.DEFAULT_MODEL_PATH / Path(default_model_dir).name / PDMODEL_NAME + ) + DownloadFile.run( + DownloadFileInput( + file_url=pd_model_url, + sha256=model_info[PDMODEL_NAME], + save_path=pdmodel_path, + logger=self.logger, + ) ) - download_file(pd_model_url, pdmodel_path, self.logger) - pdiparams_url = f"{default_model_url}/{PDIPARAMS_NAME}" + pdiparams_url = f"{default_model_dir}/{PDIPARAMS_NAME}" pdiparams_path = ( - self.DEFAULT_MODE_PATH / Path(default_model_url).name / PDIPARAMS_NAME + self.DEFAULT_MODEL_PATH / Path(default_model_dir).name / PDIPARAMS_NAME + ) + DownloadFile.run( + DownloadFileInput( + file_url=pdiparams_url, + sha256=model_info[PDIPARAMS_NAME], + save_path=pdiparams_path, + logger=self.logger, + ) ) - download_file(pdiparams_url, pdiparams_path, self.logger) else: pdmodel_path = model_dir / "inference.pdmodel" pdiparams_path = model_dir / "inference.pdiparams" diff --git a/python/rapidocr/inference_engine/torch.py b/python/rapidocr/inference_engine/torch.py index f3922a2..651862a 100644 --- a/python/rapidocr/inference_engine/torch.py +++ b/python/rapidocr/inference_engine/torch.py @@ -2,15 +2,14 @@ # @Author: SWHL # @Contact: liekkaskono@163.com from pathlib import Path -from typing import Optional import numpy as np import torch from omegaconf import OmegaConf from ..networks.architectures.base_model import BaseModel +from ..utils.download_file import DownloadFile, DownloadFileInput from ..utils.logger import Logger -from ..utils.utils import download_file from .base import InferSession root_dir = Path(__file__).resolve().parent.parent @@ -18,20 +17,24 @@ DEFAULT_CFG_PATH = root_dir / "networks" / "arch_config.yaml" class TorchInferSession(InferSession): - def __init__(self, config, mode: Optional[str] = None) -> None: + def __init__(self, config) -> None: self.logger = Logger(logger_name=__name__).get_log() - self.mode = mode model_path = config.get("model_path", None) if model_path is None: - default_model_url = self.get_model_url( + model_info = self.get_model_url( config.engine_name, config.task_type, config.lang ) - if self.mode == "rec": - default_model_url = default_model_url["model_dir"] - - model_path = self.DEFAULT_MODE_PATH / Path(default_model_url).name - download_file(default_model_url, model_path, self.logger) + default_model_url = model_info["model_dir"] + model_path = self.DEFAULT_MODEL_PATH / Path(default_model_url).name + DownloadFile.run( + DownloadFileInput( + file_url=default_model_url, + sha256=model_info["SHA256"], + save_path=model_path, + logger=self.logger, + ) + ) self._verify_model(model_path) diff --git a/python/rapidocr/utils/__init__.py b/python/rapidocr/utils/__init__.py index dcebccf..1220932 100644 --- a/python/rapidocr/utils/__init__.py +++ b/python/rapidocr/utils/__init__.py @@ -1,10 +1,10 @@ # -*- encoding: utf-8 -*- # @Author: SWHL # @Contact: liekkaskono@163.com +from .download_file import DownloadFile, DownloadFileException, DownloadFileInput from .load_image import LoadImage, LoadImageError from .logger import Logger from .parse_parameters import ParseLang, ParseParams from .process_img import add_round_letterbox, increase_min_side, reduce_max_side from .typings import RapidOCROutput -from .utils import download_file from .vis_res import VisRes diff --git a/python/rapidocr/utils/download_file.py b/python/rapidocr/utils/download_file.py new file mode 100644 index 0000000..e4c0fdd --- /dev/null +++ b/python/rapidocr/utils/download_file.py @@ -0,0 +1,95 @@ +# -*- encoding: utf-8 -*- +# @Author: SWHL +# @Contact: liekkaskono@163.com +import logging +from dataclasses import dataclass +from pathlib import Path +from typing import Optional, Union + +import requests +from tqdm import tqdm + +from .utils import get_file_sha256 + + +@dataclass +class DownloadFileInput: + file_url: str + save_path: Union[str, Path] + logger: logging.Logger + sha256: Optional[str] = None + + +class DownloadFile: + BLOCK_SIZE = 1024 # 1 KiB + REQUEST_TIMEOUT = 60 + + @classmethod + def run(cls, input_params: DownloadFileInput): + save_path = Path(input_params.save_path) + + logger = input_params.logger + cls._ensure_parent_dir_exists(save_path) + if cls._should_skip_download(save_path, input_params.sha256, logger): + return + + response = cls._make_http_request(input_params.file_url, logger) + cls._save_response_with_progress(response, save_path, logger) + + @staticmethod + def _ensure_parent_dir_exists(path: Path): + path.parent.mkdir(parents=True, exist_ok=True) + + @classmethod + def _should_skip_download( + cls, path: Path, expected_sha256: Optional[str], logger: logging.Logger + ) -> bool: + if not path.exists(): + return False + + if expected_sha256 is None: + logger.info("File exists (no checksum verification): %s", path) + return True + + if cls.check_file_sha256(path, expected_sha256): + logger.info("File exists and is valid: %s", path) + return True + + logger.warning("File exists but is invalid, redownloading: %s", path) + return False + + @classmethod + def _make_http_request(cls, url: str, logger: logging.Logger) -> requests.Response: + logger.info("Initiating download: %s", url) + try: + response = requests.get(url, stream=True, timeout=cls.REQUEST_TIMEOUT) + response.raise_for_status() # Raises HTTPError for 4XX/5XX + return response + except requests.RequestException as e: + logger.error("Download failed: %s", url) + raise DownloadFileException(f"Failed to download {url}") from e + + @classmethod + def _save_response_with_progress( + cls, response: requests.Response, save_path: Path, logger: logging.Logger + ) -> None: + total_size = int(response.headers.get("content-length", 0)) + logger.debug("Download size: %d bytes", total_size) + + with ( + tqdm(total=total_size, unit="iB", unit_scale=True) as progress_bar, + open(save_path, "wb") as output_file, + ): + for chunk in response.iter_content(chunk_size=cls.BLOCK_SIZE): + progress_bar.update(len(chunk)) + output_file.write(chunk) + + logger.info("Successfully saved to: %s", save_path) + + @staticmethod + def check_file_sha256(file_path: Union[str, Path], gt_sha256: str) -> bool: + return get_file_sha256(file_path) == gt_sha256 + + +class DownloadFileException(Exception): + pass diff --git a/python/rapidocr/utils/utils.py b/python/rapidocr/utils/utils.py index 99416cc..203c171 100644 --- a/python/rapidocr/utils/utils.py +++ b/python/rapidocr/utils/utils.py @@ -1,6 +1,7 @@ # -*- encoding: utf-8 -*- # @Author: SWHL # @Contact: liekkaskono@163.com +import hashlib import importlib from pathlib import Path from typing import Union @@ -8,8 +9,18 @@ from urllib.parse import urlparse import cv2 import numpy as np -import requests -from tqdm import tqdm + + +def get_file_sha256(file_path: Union[str, Path], chunk_size: int = 65536) -> str: + with open(file_path, "rb") as file: + sha_signature = hashlib.sha256() + while True: + chunk = file.read(chunk_size) + if not chunk: + break + sha_signature.update(chunk) + + return sha_signature.hexdigest() def save_img(save_path: Union[str, Path], img: np.ndarray): @@ -33,38 +44,3 @@ def import_package(name, package=None): return module except ModuleNotFoundError: return None - - -def download_file(url: str, save_path: Union[str, Path], logger=None): - if not Path(save_path).parent.exists(): - Path(save_path).parent.mkdir(parents=True, exist_ok=True) - - if Path(save_path).exists(): - if logger is not None: - logger.info("File already exists in %s", save_path) - else: - print(f"File already exists in {save_path}") - return - - if logger is not None: - logger.info("Downloading file from %s to %s", url, save_path) - else: - print(f"Downloading file from {url} to {save_path}") - - response = requests.get(url, stream=True, timeout=60) - status_code = response.status_code - - if status_code != 200: - raise DownloadFileError("Something went wrong while downloading models") - - total_size_in_bytes = int(response.headers.get("content-length", 1)) - block_size = 1024 # 1 Kibibyte - with tqdm(total=total_size_in_bytes, unit="iB", unit_scale=True) as pb: - with open(save_path, "wb") as file: - for data in response.iter_content(block_size): - pb.update(len(data)) - file.write(data) - - -class DownloadFileError(Exception): - pass diff --git a/python/rapidocr/utils/vis_res.py b/python/rapidocr/utils/vis_res.py index eba6fe4..16063b0 100644 --- a/python/rapidocr/utils/vis_res.py +++ b/python/rapidocr/utils/vis_res.py @@ -11,9 +11,9 @@ import numpy as np from omegaconf import OmegaConf from PIL import Image, ImageDraw, ImageFont +from .download_file import DownloadFile, DownloadFileInput from .load_image import LoadImage from .logger import Logger -from .utils import download_file root_dir = Path(__file__).resolve().parent.parent InputType = Union[str, np.ndarray, bytes, Path, Image.Image] @@ -80,27 +80,42 @@ class VisRes: font_path: Optional[Union[str, Path]] = None, lang_rec: Optional[str] = None, ) -> str: + default_info = self.font_cfg["ch"] + default_input_params = DownloadFileInput( + file_url=default_info["path"], + sha256=default_info["SHA256"], + save_path=DEFAULT_FONT_PATH, + logger=self.logger, + ) + if lang_rec is None: # 没有指定语种,用默认字体文件 - download_file(self.font_cfg["ch"], DEFAULT_FONT_PATH, logger=self.logger) + DownloadFile.run(default_input_params) return str(DEFAULT_FONT_PATH) if font_path is None: # 指定了语种,但是没有指定字体文件,根据语种选择字体文件 lang_rec = lang_rec.rsplit("_", 1)[0] - font_url = self.font_cfg.get(lang_rec, None) + font_info = self.font_cfg.get(lang_rec, None) + font_url, font_sha256 = font_info["path"], font_info["SHA256"] + if font_url is None: self.logger.warning( "Font file for %s is not found in the supported font list. Default font file will be used.", lang_rec, ) - download_file( - self.font_cfg["ch"], DEFAULT_FONT_PATH, logger=self.logger - ) + + DownloadFile.run(default_input_params) return str(DEFAULT_FONT_PATH) save_font_path = DEFAULT_FONT_DIR / f"{Path(font_url).name}" - download_file(font_url, save_font_path, logger=self.logger) + input_param = DownloadFileInput( + file_url=font_url, + sha256=font_sha256, + save_path=save_font_path, + logger=self.logger, + ) + DownloadFile.run(input_param) return str(save_font_path) return str(font_path) diff --git a/python/tests/test_main.py b/python/tests/test_main.py index 47b922e..d25c736 100644 --- a/python/tests/test_main.py +++ b/python/tests/test_main.py @@ -16,7 +16,6 @@ sys.path.append(str(root_dir)) from rapidocr import LoadImageError, RapidOCR from rapidocr.main import main from rapidocr.utils.logger import Logger -from rapidocr.utils.utils import download_file tests_dir = root_dir / "tests" / "test_files" img_path = tests_dir / "ch_en_num.jpg" @@ -179,16 +178,11 @@ def test_engine_torch(): def test_long_img(engine): img_url = "https://github.com/RapidAI/RapidOCR/releases/download/v1.1.0/long.jpeg" - img_path = tests_dir / "long.jpeg" - - download_file(img_url, img_path, logger) - result = engine(img_path) + result = engine(img_url) assert result is not None assert len(result.boxes) >= 53 - img_path.unlink() - def test_mode_one_img(engine): img_path = tests_dir / "issue_170.png"