# -*- encoding: utf-8 -*- # @Author: SWHL # @Contact: liekkaskono@163.com from pathlib import Path from typing import List, Union import gradio as gr from omegaconf import OmegaConf import rapidocr from rapidocr import ( EngineType, LangCls, LangDet, LangRec, ModelType, OCRVersion, RapidOCR, ) def get_ocr_result( img_input, text_score, box_thresh, unclip_ratio, max_side_len, det_engine, lang_det, det_model_type, det_ocr_version, cls_engine, lang_cls, cls_model_type, cls_ocr_version, rec_engine, lang_rec, rec_model_type, rec_ocr_version, is_word, use_module, ): return_word_box = "Yes" in is_word use_det = "use_det" in use_module use_cls = "use_cls" in use_module use_rec = "use_rec" in use_module ocr_engine = RapidOCR( params={ "Global.max_side_len": max_side_len, "Det.engine_type": EngineType(det_engine), "Det.lang_type": LangDet(lang_det), "Det.model_type": ModelType(det_model_type), "Det.ocr_version": OCRVersion(det_ocr_version), "Cls.engine_type": EngineType(cls_engine), "Cls.lang_type": LangCls(lang_cls), "Cls.model_type": ModelType(cls_model_type), "Cls.ocr_version": OCRVersion(cls_ocr_version), "Rec.engine_type": EngineType(rec_engine), "Rec.lang_type": LangRec(lang_rec), "Rec.model_type": ModelType(rec_model_type), "Rec.ocr_version": OCRVersion(rec_ocr_version), } ) ocr_result = ocr_engine( img_input, use_det=use_det, use_cls=use_cls, use_rec=use_rec, text_score=text_score, box_thresh=box_thresh, unclip_ratio=unclip_ratio, return_word_box=return_word_box, ) vis_img = ocr_result.vis() if return_word_box: txts, scores, _ = list(zip(*ocr_result.word_results)) ocr_txts = [[i, txt, score] for i, (txt, score) in enumerate(zip(txts, scores))] return vis_img, ocr_txts, ocr_result.elapse if use_rec: ocr_txts = [ [i, txt, score] for i, (txt, score) in enumerate(zip(ocr_result.txts, ocr_result.scores)) ] else: ocr_txts = [] return vis_img, ocr_txts, ocr_result.elapse def create_examples() -> List[List[Union[str, float]]]: examples = [ [ "images/multi.jpg", 0.5, 0.5, 1.6, 2000, EngineType.ONNXRUNTIME, LangDet.CH, ModelType.MOBILE, OCRVersion.PPOCRV5, EngineType.ONNXRUNTIME, LangCls.CH, ModelType.MOBILE, OCRVersion.PPOCRV4, EngineType.ONNXRUNTIME, LangRec.CH, ModelType.MOBILE, OCRVersion.PPOCRV5, "No", ["use_det", "use_cls", "use_rec"], ], [ "images/ch_en_num.jpg", 0.5, 0.5, 1.6, 2000, EngineType.ONNXRUNTIME, LangDet.CH, ModelType.MOBILE, OCRVersion.PPOCRV4, EngineType.ONNXRUNTIME, LangCls.CH, ModelType.MOBILE, OCRVersion.PPOCRV4, EngineType.ONNXRUNTIME, LangRec.CH, ModelType.MOBILE, OCRVersion.PPOCRV4, "No", ["use_det", "use_cls", "use_rec"], ], [ "images/hand_writen.jpeg", 0.5, 0.5, 1.6, 2000, EngineType.ONNXRUNTIME, LangDet.CH, ModelType.MOBILE, OCRVersion.PPOCRV5, EngineType.ONNXRUNTIME, LangCls.CH, ModelType.MOBILE, OCRVersion.PPOCRV4, EngineType.ONNXRUNTIME, LangRec.CH, ModelType.MOBILE, OCRVersion.PPOCRV5, "No", ["use_det", "use_cls", "use_rec"], ], [ "images/japan.jpg", 0.5, 0.5, 1.6, 2000, EngineType.ONNXRUNTIME, LangDet.MULTI, ModelType.MOBILE, OCRVersion.PPOCRV4, EngineType.ONNXRUNTIME, LangCls.CH, ModelType.MOBILE, OCRVersion.PPOCRV4, EngineType.ONNXRUNTIME, LangRec.JAPAN, ModelType.MOBILE, OCRVersion.PPOCRV4, "No", ["use_det", "use_cls", "use_rec"], ], [ "images/korean.jpg", 0.5, 0.5, 1.6, 2000, EngineType.ONNXRUNTIME, LangDet.MULTI, ModelType.MOBILE, OCRVersion.PPOCRV4, EngineType.ONNXRUNTIME, LangCls.CH, ModelType.MOBILE, OCRVersion.PPOCRV4, EngineType.ONNXRUNTIME, LangRec.KOREAN, ModelType.MOBILE, OCRVersion.PPOCRV4, "No", ["use_det", "use_cls", "use_rec"], ], ] return examples def export_yaml( img_input, text_score, box_thresh, unclip_ratio, max_side_len, det_engine, lang_det, det_model_type, det_ocr_version, cls_engine, lang_cls, cls_model_type, cls_ocr_version, rec_engine, lang_rec, rec_model_type, rec_ocr_version, is_word, use_module, ): default_yaml_path = Path(rapidocr.__file__).parent / "config.yaml" cfg = OmegaConf.load(default_yaml_path) params = { "Global": { "max_side_len": max_side_len, "use_det": "use_det" in use_module, "use_cls": "use_cls" in use_module, "use_rec": "use_rec" in use_module, "return_word_box": "Yes" in is_word, "text_score": text_score, "box_thresh": box_thresh, }, "Det": { "engine_type": det_engine, "lang_type": lang_det, "model_type": det_model_type, "ocr_version": det_ocr_version, "box_thresh": box_thresh, "unclip_ratio": unclip_ratio, }, "Cls": { "engine_type": cls_engine, "lang_type": lang_cls, "model_type": cls_model_type, "ocr_version": cls_ocr_version, }, "Rec": { "engine_type": rec_engine, "lang_type": lang_rec, "model_type": rec_model_type, "ocr_version": rec_ocr_version, }, } cfg = OmegaConf.merge(cfg, params) save_path = Path(__file__).resolve().parent / "config.yaml" OmegaConf.save(cfg, save_path) return save_path custom_css = """ body {font-family: body {font-family: 'Helvetica Neue', Helvetica;} .gr-button {background-color: #4CAF50; color: white; border: none; padding: 10px 20px; border-radius: 5px;} .gr-button:hover {background-color: #45a049;} .gr-textbox {margin-bottom: 15px;} .example-button {background-color: #1E90FF; color: white; border: none; padding: 8px 15px; border-radius: 5px; margin: 5px;} .example-button:hover {background-color: #FF4500;} .tall-radio .gr-radio-item {padding: 15px 0; min-height: 50px; display: flex; align-items: center;} .tall-radio label {font-size: 16px;} .output-image, .input-image, .image-preview {height: 300px !important} """ with gr.Blocks( title="Rapid⚡OCR Demo", css="custom_css", theme=gr.themes.Soft() ) as demo: gr.HTML( """