From 94474e40fcd817cb4276fb457729736121109431 Mon Sep 17 00:00:00 2001 From: tink2123 Date: Tue, 13 Apr 2021 17:54:10 +0800 Subject: [PATCH 1/3] polish mult-lang doc and whl --- MANIFEST.in | 3 +- .../generate_multi_language_configs.py | 167 +++++++++++++----- .../multi_language/rec_arabic_lite_train.yml | 111 ++++++++++++ .../rec_cyrillic_lite_train.yml | 111 ++++++++++++ .../rec_devanagari_lite_train.yml | 111 ++++++++++++ .../rec_en_number_lite_train.yml | 4 +- .../multi_language/rec_latin_lite_train.yml | 111 ++++++++++++ doc/doc_ch/models_list.md | 23 +-- doc/doc_ch/multi_languages.md | 2 +- doc/doc_ch/recognition.md | 30 +--- doc/doc_en/models_list_en.md | 25 +-- doc/doc_en/multi_languages_en.md | 2 +- doc/doc_en/recognition_en.md | 29 +-- paddleocr.py | 37 ++-- setup.py | 2 +- 15 files changed, 623 insertions(+), 145 deletions(-) create mode 100644 configs/rec/multi_language/rec_arabic_lite_train.yml create mode 100644 configs/rec/multi_language/rec_cyrillic_lite_train.yml create mode 100644 configs/rec/multi_language/rec_devanagari_lite_train.yml create mode 100644 configs/rec/multi_language/rec_latin_lite_train.yml diff --git a/MANIFEST.in b/MANIFEST.in index 4c16c09d..e16f157d 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -4,4 +4,5 @@ include README.md recursive-include ppocr/utils *.txt utility.py logging.py recursive-include ppocr/data/ *.py recursive-include ppocr/postprocess *.py -recursive-include tools/infer *.py \ No newline at end of file +recursive-include tools/infer *.py +recursive-include ppocr/utils/e2e_utils/ *.py \ No newline at end of file diff --git a/configs/rec/multi_language/generate_multi_language_configs.py b/configs/rec/multi_language/generate_multi_language_configs.py index 027a65c0..c3e33c0e 100644 --- a/configs/rec/multi_language/generate_multi_language_configs.py +++ b/configs/rec/multi_language/generate_multi_language_configs.py @@ -19,21 +19,56 @@ import logging logging.basicConfig(level=logging.INFO) support_list = { - 'it':'italian', 'xi':'spanish', 'pu':'portuguese', 'ru':'russian', 'ar':'arabic', - 'ta':'tamil', 'ug':'uyghur', 'fa':'persian', 'ur':'urdu', 'rs':'serbian latin', - 'oc':'occitan', 'rsc':'serbian cyrillic', 'bg':'bulgarian', 'uk':'ukranian', 'be':'belarusian', - 'te':'telugu', 'ka':'kannada', 'chinese_cht':'chinese tradition','hi':'hindi','mr':'marathi', - 'ne':'nepali', + 'it': 'italian', + 'xi': 'spanish', + 'pu': 'portuguese', + 'ru': 'russian', + 'ar': 'arabic', + 'ta': 'tamil', + 'ug': 'uyghur', + 'fa': 'persian', + 'ur': 'urdu', + 'rs': 'serbian latin', + 'oc': 'occitan', + 'rsc': 'serbian cyrillic', + 'bg': 'bulgarian', + 'uk': 'ukranian', + 'be': 'belarusian', + 'te': 'telugu', + 'ka': 'kannada', + 'chinese_cht': 'chinese tradition', + 'hi': 'hindi', + 'mr': 'marathi', + 'ne': 'nepali', } -assert( - os.path.isfile("./rec_multi_language_lite_train.yml") - ),"Loss basic configuration file rec_multi_language_lite_train.yml.\ + +latin_lang = [ + 'af', 'az', 'bs', 'cs', 'cy', 'da', 'de', 'es', 'et', 'fr', 'ga', 'hr', + 'hu', 'id', 'is', 'it', 'ku', 'la', 'lt', 'lv', 'mi', 'ms', 'mt', 'nl', + 'no', 'oc', 'pi', 'pl', 'pt', 'ro', 'rs_latin', 'sk', 'sl', 'sq', 'sv', + 'sw', 'tl', 'tr', 'uz', 'vi', 'latin' +] +arabic_lang = ['ar', 'fa', 'ug', 'ur'] +cyrillic_lang = [ + 'ru', 'rs_cyrillic', 'be', 'bg', 'uk', 'mn', 'abq', 'ady', 'kbd', 'ava', + 'dar', 'inh', 'che', 'lbe', 'lez', 'tab', 'cyrillic' +] +devanagari_lang = [ + 'hi', 'mr', 'ne', 'bh', 'mai', 'ang', 'bho', 'mah', 'sck', 'new', 'gom', + 'sa', 'bgc', 'devanagari' +] +multi_lang = latin_lang + arabic_lang + cyrillic_lang + devanagari_lang + +assert (os.path.isfile("./rec_multi_language_lite_train.yml") + ), "Loss basic configuration file rec_multi_language_lite_train.yml.\ You can download it from \ https://github.com/PaddlePaddle/PaddleOCR/tree/dygraph/configs/rec/multi_language/" - -global_config = yaml.load(open("./rec_multi_language_lite_train.yml", 'rb'), Loader=yaml.Loader) + +global_config = yaml.load( + open("./rec_multi_language_lite_train.yml", 'rb'), Loader=yaml.Loader) project_path = os.path.abspath(os.path.join(os.getcwd(), "../../../")) + class ArgsParser(ArgumentParser): def __init__(self): super(ArgsParser, self).__init__( @@ -41,15 +76,30 @@ class ArgsParser(ArgumentParser): self.add_argument( "-o", "--opt", nargs='+', help="set configuration options") self.add_argument( - "-l", "--language", nargs='+', help="set language type, support {}".format(support_list)) + "-l", + "--language", + nargs='+', + help="set language type, support {}".format(support_list)) self.add_argument( - "--train",type=str,help="you can use this command to change the train dataset default path") + "--train", + type=str, + help="you can use this command to change the train dataset default path" + ) self.add_argument( - "--val",type=str,help="you can use this command to change the eval dataset default path") + "--val", + type=str, + help="you can use this command to change the eval dataset default path" + ) self.add_argument( - "--dict",type=str,help="you can use this command to change the dictionary default path") + "--dict", + type=str, + help="you can use this command to change the dictionary default path" + ) self.add_argument( - "--data_dir",type=str,help="you can use this command to change the dataset default root path") + "--data_dir", + type=str, + help="you can use this command to change the dataset default root path" + ) def parse_args(self, argv=None): args = super(ArgsParser, self).parse_args(argv) @@ -68,21 +118,38 @@ class ArgsParser(ArgumentParser): return config def _set_language(self, type): - assert(type),"please use -l or --language to choose language type" + print("type:", type) + lang = type[0] + assert (type), "please use -l or --language to choose language type" assert( - type[0] in support_list.keys() + lang in support_list.keys() or lang in multi_lang ),"the sub_keys(-l or --language) can only be one of support list: \n{},\nbut get: {}, " \ - "please check your running command".format(support_list, type) - global_config['Global']['character_dict_path'] = 'ppocr/utils/dict/{}_dict.txt'.format(type[0]) - global_config['Global']['save_model_dir'] = './output/rec_{}_lite'.format(type[0]) - global_config['Train']['dataset']['label_file_list'] = ["train_data/{}_train.txt".format(type[0])] - global_config['Eval']['dataset']['label_file_list'] = ["train_data/{}_val.txt".format(type[0])] - global_config['Global']['character_type'] = type[0] - assert( - os.path.isfile(os.path.join(project_path,global_config['Global']['character_dict_path'])) - ),"Loss default dictionary file {}_dict.txt.You can download it from \ -https://github.com/PaddlePaddle/PaddleOCR/tree/dygraph/ppocr/utils/dict/".format(type[0]) - return type[0] + "please check your running command".format(multi_lang, type) + if lang in latin_lang: + lang = "latin" + elif lang in arabic_lang: + lang = "arabic" + elif lang in cyrillic_lang: + lang = "cyrillic" + elif lang in devanagari_lang: + lang = "devanagari" + global_config['Global'][ + 'character_dict_path'] = 'ppocr/utils/dict/{}_dict.txt'.format(lang) + global_config['Global'][ + 'save_model_dir'] = './output/rec_{}_lite'.format(lang) + global_config['Train']['dataset'][ + 'label_file_list'] = ["train_data/{}_train.txt".format(lang)] + global_config['Eval']['dataset'][ + 'label_file_list'] = ["train_data/{}_val.txt".format(lang)] + global_config['Global']['character_type'] = lang + assert ( + os.path.isfile( + os.path.join(project_path, global_config['Global'][ + 'character_dict_path'])) + ), "Loss default dictionary file {}_dict.txt.You can download it from \ +https://github.com/PaddlePaddle/PaddleOCR/tree/dygraph/ppocr/utils/dict/".format( + lang) + return lang def merge_config(config): @@ -110,43 +177,51 @@ def merge_config(config): cur[sub_key] = value else: cur = cur[sub_key] - -def loss_file(path): - assert( - os.path.exists(path) - ),"There is no such file:{},Please do not forget to put in the specified file".format(path) - + +def loss_file(path): + assert ( + os.path.exists(path) + ), "There is no such file:{},Please do not forget to put in the specified file".format( + path) + + if __name__ == '__main__': FLAGS = ArgsParser().parse_args() merge_config(FLAGS.opt) save_file_path = 'rec_{}_lite_train.yml'.format(FLAGS.language) if os.path.isfile(save_file_path): os.remove(save_file_path) - + if FLAGS.train: global_config['Train']['dataset']['label_file_list'] = [FLAGS.train] - train_label_path = os.path.join(project_path,FLAGS.train) + train_label_path = os.path.join(project_path, FLAGS.train) loss_file(train_label_path) if FLAGS.val: global_config['Eval']['dataset']['label_file_list'] = [FLAGS.val] - eval_label_path = os.path.join(project_path,FLAGS.val) + eval_label_path = os.path.join(project_path, FLAGS.val) loss_file(eval_label_path) if FLAGS.dict: global_config['Global']['character_dict_path'] = FLAGS.dict - dict_path = os.path.join(project_path,FLAGS.dict) + dict_path = os.path.join(project_path, FLAGS.dict) loss_file(dict_path) if FLAGS.data_dir: global_config['Eval']['dataset']['data_dir'] = FLAGS.data_dir global_config['Train']['dataset']['data_dir'] = FLAGS.data_dir - data_dir = os.path.join(project_path,FLAGS.data_dir) + data_dir = os.path.join(project_path, FLAGS.data_dir) loss_file(data_dir) - + with open(save_file_path, 'w') as f: - yaml.dump(dict(global_config), f, default_flow_style=False, sort_keys=False) + yaml.dump( + dict(global_config), f, default_flow_style=False, sort_keys=False) logging.info("Project path is :{}".format(project_path)) - logging.info("Train list path set to :{}".format(global_config['Train']['dataset']['label_file_list'][0])) - logging.info("Eval list path set to :{}".format(global_config['Eval']['dataset']['label_file_list'][0])) - logging.info("Dataset root path set to :{}".format(global_config['Eval']['dataset']['data_dir'])) - logging.info("Dict path set to :{}".format(global_config['Global']['character_dict_path'])) - logging.info("Config file set to :configs/rec/multi_language/{}".format(save_file_path)) + logging.info("Train list path set to :{}".format(global_config['Train'][ + 'dataset']['label_file_list'][0])) + logging.info("Eval list path set to :{}".format(global_config['Eval'][ + 'dataset']['label_file_list'][0])) + logging.info("Dataset root path set to :{}".format(global_config['Eval'][ + 'dataset']['data_dir'])) + logging.info("Dict path set to :{}".format(global_config['Global'][ + 'character_dict_path'])) + logging.info("Config file set to :configs/rec/multi_language/{}". + format(save_file_path)) diff --git a/configs/rec/multi_language/rec_arabic_lite_train.yml b/configs/rec/multi_language/rec_arabic_lite_train.yml new file mode 100644 index 00000000..6dcfd1b6 --- /dev/null +++ b/configs/rec/multi_language/rec_arabic_lite_train.yml @@ -0,0 +1,111 @@ +Global: + use_gpu: true + epoch_num: 500 + log_smooth_window: 20 + print_batch_step: 10 + save_model_dir: ./output/rec_arabic_lite + save_epoch_step: 3 + eval_batch_step: + - 0 + - 2000 + cal_metric_during_train: true + pretrained_model: null + checkpoints: null + save_inference_dir: null + use_visualdl: false + infer_img: null + character_dict_path: ppocr/utils/dict/arabic_dict.txt + character_type: arabic + max_text_length: 25 + infer_mode: false + use_space_char: true +Optimizer: + name: Adam + beta1: 0.9 + beta2: 0.999 + lr: + name: Cosine + learning_rate: 0.001 + regularizer: + name: L2 + factor: 1.0e-05 +Architecture: + model_type: rec + algorithm: CRNN + Transform: null + Backbone: + name: MobileNetV3 + scale: 0.5 + model_name: small + small_stride: + - 1 + - 2 + - 2 + - 2 + Neck: + name: SequenceEncoder + encoder_type: rnn + hidden_size: 48 + Head: + name: CTCHead + fc_decay: 1.0e-05 +Loss: + name: CTCLoss +PostProcess: + name: CTCLabelDecode +Metric: + name: RecMetric + main_indicator: acc +Train: + dataset: + name: SimpleDataSet + data_dir: train_data/ + label_file_list: + - train_data/arabic_train.txt + transforms: + - DecodeImage: + img_mode: BGR + channel_first: false + - RecAug: null + - CTCLabelEncode: null + - RecResizeImg: + image_shape: + - 3 + - 32 + - 320 + - KeepKeys: + keep_keys: + - image + - label + - length + loader: + shuffle: true + batch_size_per_card: 256 + drop_last: true + num_workers: 8 +Eval: + dataset: + name: SimpleDataSet + data_dir: train_data/ + label_file_list: + - train_data/arabic_val.txt + transforms: + - DecodeImage: + img_mode: BGR + channel_first: false + - CTCLabelEncode: null + - RecResizeImg: + image_shape: + - 3 + - 32 + - 320 + - KeepKeys: + keep_keys: + - image + - label + - length + loader: + shuffle: false + drop_last: false + batch_size_per_card: 256 + num_workers: 8 diff --git a/configs/rec/multi_language/rec_cyrillic_lite_train.yml b/configs/rec/multi_language/rec_cyrillic_lite_train.yml new file mode 100644 index 00000000..52527c1d --- /dev/null +++ b/configs/rec/multi_language/rec_cyrillic_lite_train.yml @@ -0,0 +1,111 @@ +Global: + use_gpu: true + epoch_num: 500 + log_smooth_window: 20 + print_batch_step: 10 + save_model_dir: ./output/rec_cyrillic_lite + save_epoch_step: 3 + eval_batch_step: + - 0 + - 2000 + cal_metric_during_train: true + pretrained_model: null + checkpoints: null + save_inference_dir: null + use_visualdl: false + infer_img: null + character_dict_path: ppocr/utils/dict/cyrillic_dict.txt + character_type: cyrillic + max_text_length: 25 + infer_mode: false + use_space_char: true +Optimizer: + name: Adam + beta1: 0.9 + beta2: 0.999 + lr: + name: Cosine + learning_rate: 0.001 + regularizer: + name: L2 + factor: 1.0e-05 +Architecture: + model_type: rec + algorithm: CRNN + Transform: null + Backbone: + name: MobileNetV3 + scale: 0.5 + model_name: small + small_stride: + - 1 + - 2 + - 2 + - 2 + Neck: + name: SequenceEncoder + encoder_type: rnn + hidden_size: 48 + Head: + name: CTCHead + fc_decay: 1.0e-05 +Loss: + name: CTCLoss +PostProcess: + name: CTCLabelDecode +Metric: + name: RecMetric + main_indicator: acc +Train: + dataset: + name: SimpleDataSet + data_dir: train_data/ + label_file_list: + - train_data/cyrillic_train.txt + transforms: + - DecodeImage: + img_mode: BGR + channel_first: false + - RecAug: null + - CTCLabelEncode: null + - RecResizeImg: + image_shape: + - 3 + - 32 + - 320 + - KeepKeys: + keep_keys: + - image + - label + - length + loader: + shuffle: true + batch_size_per_card: 256 + drop_last: true + num_workers: 8 +Eval: + dataset: + name: SimpleDataSet + data_dir: train_data/ + label_file_list: + - train_data/cyrillic_val.txt + transforms: + - DecodeImage: + img_mode: BGR + channel_first: false + - CTCLabelEncode: null + - RecResizeImg: + image_shape: + - 3 + - 32 + - 320 + - KeepKeys: + keep_keys: + - image + - label + - length + loader: + shuffle: false + drop_last: false + batch_size_per_card: 256 + num_workers: 8 diff --git a/configs/rec/multi_language/rec_devanagari_lite_train.yml b/configs/rec/multi_language/rec_devanagari_lite_train.yml new file mode 100644 index 00000000..e1a7c829 --- /dev/null +++ b/configs/rec/multi_language/rec_devanagari_lite_train.yml @@ -0,0 +1,111 @@ +Global: + use_gpu: true + epoch_num: 500 + log_smooth_window: 20 + print_batch_step: 10 + save_model_dir: ./output/rec_devanagari_lite + save_epoch_step: 3 + eval_batch_step: + - 0 + - 2000 + cal_metric_during_train: true + pretrained_model: null + checkpoints: null + save_inference_dir: null + use_visualdl: false + infer_img: null + character_dict_path: ppocr/utils/dict/devanagari_dict.txt + character_type: devanagari + max_text_length: 25 + infer_mode: false + use_space_char: true +Optimizer: + name: Adam + beta1: 0.9 + beta2: 0.999 + lr: + name: Cosine + learning_rate: 0.001 + regularizer: + name: L2 + factor: 1.0e-05 +Architecture: + model_type: rec + algorithm: CRNN + Transform: null + Backbone: + name: MobileNetV3 + scale: 0.5 + model_name: small + small_stride: + - 1 + - 2 + - 2 + - 2 + Neck: + name: SequenceEncoder + encoder_type: rnn + hidden_size: 48 + Head: + name: CTCHead + fc_decay: 1.0e-05 +Loss: + name: CTCLoss +PostProcess: + name: CTCLabelDecode +Metric: + name: RecMetric + main_indicator: acc +Train: + dataset: + name: SimpleDataSet + data_dir: train_data/ + label_file_list: + - train_data/devanagari_train.txt + transforms: + - DecodeImage: + img_mode: BGR + channel_first: false + - RecAug: null + - CTCLabelEncode: null + - RecResizeImg: + image_shape: + - 3 + - 32 + - 320 + - KeepKeys: + keep_keys: + - image + - label + - length + loader: + shuffle: true + batch_size_per_card: 256 + drop_last: true + num_workers: 8 +Eval: + dataset: + name: SimpleDataSet + data_dir: train_data/ + label_file_list: + - train_data/devanagari_val.txt + transforms: + - DecodeImage: + img_mode: BGR + channel_first: false + - CTCLabelEncode: null + - RecResizeImg: + image_shape: + - 3 + - 32 + - 320 + - KeepKeys: + keep_keys: + - image + - label + - length + loader: + shuffle: false + drop_last: false + batch_size_per_card: 256 + num_workers: 8 diff --git a/configs/rec/multi_language/rec_en_number_lite_train.yml b/configs/rec/multi_language/rec_en_number_lite_train.yml index 13eda848..fff4dfcd 100644 --- a/configs/rec/multi_language/rec_en_number_lite_train.yml +++ b/configs/rec/multi_language/rec_en_number_lite_train.yml @@ -15,11 +15,11 @@ Global: use_visualdl: False infer_img: # for data or label process - character_dict_path: ppocr/utils/dict/en_dict.txt + character_dict_path: ppocr/utils/en_dict.txt character_type: EN max_text_length: 25 infer_mode: False - use_space_char: False + use_space_char: True Optimizer: diff --git a/configs/rec/multi_language/rec_latin_lite_train.yml b/configs/rec/multi_language/rec_latin_lite_train.yml new file mode 100644 index 00000000..e71112b4 --- /dev/null +++ b/configs/rec/multi_language/rec_latin_lite_train.yml @@ -0,0 +1,111 @@ +Global: + use_gpu: true + epoch_num: 500 + log_smooth_window: 20 + print_batch_step: 10 + save_model_dir: ./output/rec_latin_lite + save_epoch_step: 3 + eval_batch_step: + - 0 + - 2000 + cal_metric_during_train: true + pretrained_model: null + checkpoints: null + save_inference_dir: null + use_visualdl: false + infer_img: null + character_dict_path: ppocr/utils/dict/latin_dict.txt + character_type: latin + max_text_length: 25 + infer_mode: false + use_space_char: true +Optimizer: + name: Adam + beta1: 0.9 + beta2: 0.999 + lr: + name: Cosine + learning_rate: 0.001 + regularizer: + name: L2 + factor: 1.0e-05 +Architecture: + model_type: rec + algorithm: CRNN + Transform: null + Backbone: + name: MobileNetV3 + scale: 0.5 + model_name: small + small_stride: + - 1 + - 2 + - 2 + - 2 + Neck: + name: SequenceEncoder + encoder_type: rnn + hidden_size: 48 + Head: + name: CTCHead + fc_decay: 1.0e-05 +Loss: + name: CTCLoss +PostProcess: + name: CTCLabelDecode +Metric: + name: RecMetric + main_indicator: acc +Train: + dataset: + name: SimpleDataSet + data_dir: train_data/ + label_file_list: + - train_data/latin_train.txt + transforms: + - DecodeImage: + img_mode: BGR + channel_first: false + - RecAug: null + - CTCLabelEncode: null + - RecResizeImg: + image_shape: + - 3 + - 32 + - 320 + - KeepKeys: + keep_keys: + - image + - label + - length + loader: + shuffle: true + batch_size_per_card: 256 + drop_last: true + num_workers: 8 +Eval: + dataset: + name: SimpleDataSet + data_dir: train_data/ + label_file_list: + - train_data/latin_val.txt + transforms: + - DecodeImage: + img_mode: BGR + channel_first: false + - CTCLabelEncode: null + - RecResizeImg: + image_shape: + - 3 + - 32 + - 320 + - KeepKeys: + keep_keys: + - image + - label + - length + loader: + shuffle: false + drop_last: false + batch_size_per_card: 256 + num_workers: 8 diff --git a/doc/doc_ch/models_list.md b/doc/doc_ch/models_list.md index d647d032..4842a8c5 100644 --- a/doc/doc_ch/models_list.md +++ b/doc/doc_ch/models_list.md @@ -104,27 +104,16 @@ python3 generate_multi_language_configs.py -l it \ | german_mobile_v2.0_rec |德文识别|[rec_german_lite_train.yml](../../configs/rec/multi_language/rec_german_lite_train.yml)|2.65M|[推理模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/german_mobile_v2.0_rec_infer.tar) / [训练模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/german_mobile_v2.0_rec_train.tar) | | korean_mobile_v2.0_rec |韩文识别|[rec_korean_lite_train.yml](../../configs/rec/multi_language/rec_korean_lite_train.yml)|3.9M|[推理模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/korean_mobile_v2.0_rec_infer.tar) / [训练模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/korean_mobile_v2.0_rec_train.tar) | | japan_mobile_v2.0_rec |日文识别|[rec_japan_lite_train.yml](../../configs/rec/multi_language/rec_japan_lite_train.yml)|4.23M|[推理模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/japan_mobile_v2.0_rec_infer.tar) / [训练模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/japan_mobile_v2.0_rec_train.tar) | -| it_mobile_v2.0_rec |意大利文识别|rec_it_lite_train.yml|2.53M|[推理模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/it_mobile_v2.0_rec_infer.tar) / [训练模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/it_mobile_v2.0_rec_train.tar) | -| xi_mobile_v2.0_rec |西班牙文识别|rec_xi_lite_train.yml|2.53M|[推理模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/xi_mobile_v2.0_rec_infer.tar) / [训练模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/xi_mobile_v2.0_rec_train.tar) | -| pu_mobile_v2.0_rec |葡萄牙文识别|rec_pu_lite_train.yml|2.63M|[推理模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/pu_mobile_v2.0_rec_infer.tar) / [训练模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/pu_mobile_v2.0_rec_train.tar) | -| ru_mobile_v2.0_rec |俄罗斯文识别|rec_ru_lite_train.yml|2.63M|[推理模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/ru_mobile_v2.0_rec_infer.tar) / [训练模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/ru_mobile_v2.0_rec_train.tar) | -| ar_mobile_v2.0_rec |阿拉伯文识别|rec_ar_lite_train.yml|2.53M|[推理模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/ar_mobile_v2.0_rec_infer.tar) / [训练模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/ar_mobile_v2.0_rec_train.tar) | -| hi_mobile_v2.0_rec |印地文识别|rec_hi_lite_train.yml|2.63M|[推理模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/hi_mobile_v2.0_rec_infer.tar) / [训练模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/hi_mobile_v2.0_rec_train.tar) | | chinese_cht_mobile_v2.0_rec |中文繁体识别|rec_chinese_cht_lite_train.yml|5.63M|[推理模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/chinese_cht_mobile_v2.0_rec_infer.tar) / [训练模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/chinese_cht_mobile_v2.0_rec_train.tar) | -| ug_mobile_v2.0_rec |维吾尔文识别|rec_ug_lite_train.yml|2.63M|[推理模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/ug_mobile_v2.0_rec_infer.tar) / [训练模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/ug_mobile_v2.0_rec_train.tar) | -| fa_mobile_v2.0_rec |波斯文识别|rec_fa_lite_train.yml|2.63M|[推理模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/fa_mobile_v2.0_rec_infer.tar) / [训练模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/fa_mobile_v2.0_rec_train.tar) | -| ur_mobile_v2.0_rec |乌尔都文识别|rec_ur_lite_train.yml|2.63M|[推理模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/ur_mobile_v2.0_rec_infer.tar) / [训练模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/ur_mobile_v2.0_rec_train.tar) | -| rs_mobile_v2.0_rec |塞尔维亚文(latin)识别|rec_rs_lite_train.yml|2.53M|[推理模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/rs_mobile_v2.0_rec_infer.tar) / [训练模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/rs_mobile_v2.0_rec_train.tar) | -| oc_mobile_v2.0_rec |欧西坦文识别|rec_oc_lite_train.yml|2.53M|[推理模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/oc_mobile_v2.0_rec_infer.tar) / [训练模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/oc_mobile_v2.0_rec_train.tar) | -| mr_mobile_v2.0_rec |马拉地文识别|rec_mr_lite_train.yml|2.63M|[推理模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/mr_mobile_v2.0_rec_infer.tar) / [训练模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/mr_mobile_v2.0_rec_train.tar) | -| ne_mobile_v2.0_rec |尼泊尔文识别|rec_ne_lite_train.yml|2.63M|[推理模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/ne_mobile_v2.0_rec_infer.tar) / [训练模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/ne_mobile_v2.0_rec_train.tar) | -| rsc_mobile_v2.0_rec |塞尔维亚文(cyrillic)识别|rec_rsc_lite_train.yml|2.63M|[推理模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/rsc_mobile_v2.0_rec_infer.tar) / [训练模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/rsc_mobile_v2.0_rec_train.tar) | -| bg_mobile_v2.0_rec |保加利亚文识别|rec_bg_lite_train.yml|2.63M|[推理模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/bg_mobile_v2.0_rec_infer.tar) / [训练模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/bg_mobile_v2.0_rec_train.tar) | -| uk_mobile_v2.0_rec |乌克兰文识别|rec_uk_lite_train.yml|2.63M|[推理模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/uk_mobile_v2.0_rec_infer.tar) / [训练模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/uk_mobile_v2.0_rec_train.tar) | -| be_mobile_v2.0_rec |白俄罗斯文识别|rec_be_lite_train.yml|2.63M|[推理模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/be_mobile_v2.0_rec_infer.tar) / [训练模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/be_mobile_v2.0_rec_train.tar) | | te_mobile_v2.0_rec |泰卢固文识别|rec_te_lite_train.yml|2.63M|[推理模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/te_mobile_v2.0_rec_infer.tar) / [训练模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/te_mobile_v2.0_rec_train.tar) | | ka_mobile_v2.0_rec |卡纳达文识别|rec_ka_lite_train.yml|2.63M|[推理模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/ka_mobile_v2.0_rec_infer.tar) / [训练模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/ka_mobile_v2.0_rec_train.tar) | | ta_mobile_v2.0_rec |泰米尔文识别|rec_ta_lite_train.yml|2.63M|[推理模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/ta_mobile_v2.0_rec_infer.tar) / [训练模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/ta_mobile_v2.0_rec_train.tar) | +| latin_mobile_v2.0_rec | 拉丁文识别 | [rec_latin_lite_train.yml](../../configs/rec/multi_language/rec_latin_lite_train.yml) |2.6M|[推理模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/latin_ppocr_mobile_v2.0_rec_infer.tar) / [训练模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/latin_ppocr_mobile_v2.0_rec_train.tar) | +| arabic_mobile_v2.0_rec | 阿拉伯字母 | [rec_arabic_lite_train.yml](../../configs/rec/multi_language/rec_arabic_lite_train.yml) |2.6M|[推理模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/arabic_ppocr_mobile_v2.0_rec_infer.tar) / [训练模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/arabic_ppocr_mobile_v2.0_rec_train.tar) | +| cyrillic_mobile_v2.0_rec | 斯拉夫字母 | [rec_cyrillic_lite_train.yml](../../configs/rec/multi_language/rec_cyrillic_lite_train.yml) |2.6M|[推理模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/cyrillic_ppocr_mobile_v2.0_rec_infer.tar) / [训练模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/cyrillic_ppocr_mobile_v2.0_rec_train.tar) | +| devanagari_mobile_v2.0_rec | 梵文字母 | [rec_devanagari_lite_train.yml](../../configs/rec/multi_language/rec_devanagari_lite_train.yml) |2.6M|[推理模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/devanagari_ppocr_mobile_v2.0_rec_infer.tar) / [训练模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/devanagari_ppocr_mobile_v2.0_rec_train.tar) | + +更多支持语种请参考: [多语言模型](https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.1/doc/doc_ch/multi_languages.md#%E8%AF%AD%E7%A7%8D%E7%BC%A9%E5%86%99) diff --git a/doc/doc_ch/multi_languages.md b/doc/doc_ch/multi_languages.md index eec09535..4e84c085 100644 --- a/doc/doc_ch/multi_languages.md +++ b/doc/doc_ch/multi_languages.md @@ -59,7 +59,7 @@ pip instll paddlepaddle-gpu pip 安装 ``` -pip install "paddleocr>=2.0.4" # 推荐使用2.0.4版本 +pip install "paddleocr>=2.0.6" # 推荐使用2.0.6版本 ``` 本地构建并安装 ``` diff --git a/doc/doc_ch/recognition.md b/doc/doc_ch/recognition.md index 907cf24e..8a7c341c 100644 --- a/doc/doc_ch/recognition.md +++ b/doc/doc_ch/recognition.md @@ -138,7 +138,7 @@ PaddleOCR内置了一部分字典,可以按需使用。 `ppocr/utils/dict/german_dict.txt` 是一个包含131个字符的德文字典 -`ppocr/utils/dict/en_dict.txt` 是一个包含63个字符的英文字典 +`ppocr/utils/en_dict.txt` 是一个包含96个字符的英文字典 @@ -285,7 +285,7 @@ Eval: #### 2.3 小语种 -PaddleOCR目前已支持26种(除中文外)语种识别,`configs/rec/multi_languages` 路径下提供了一个多语言的配置文件模版: [rec_multi_language_lite_train.yml](../../configs/rec/multi_language/rec_multi_language_lite_train.yml)。 +PaddleOCR目前已支持80种(除中文外)语种识别,`configs/rec/multi_languages` 路径下提供了一个多语言的配置文件模版: [rec_multi_language_lite_train.yml](../../configs/rec/multi_language/rec_multi_language_lite_train.yml)。 您有两种方式创建所需的配置文件: @@ -368,26 +368,12 @@ PaddleOCR目前已支持26种(除中文外)语种识别,`configs/rec/multi | rec_ger_lite_train.yml | CRNN | Mobilenet_v3 small 0.5 | None | BiLSTM | ctc | 德语 | german | | rec_japan_lite_train.yml | CRNN | Mobilenet_v3 small 0.5 | None | BiLSTM | ctc | 日语 | japan | | rec_korean_lite_train.yml | CRNN | Mobilenet_v3 small 0.5 | None | BiLSTM | ctc | 韩语 | korean | -| rec_it_lite_train.yml | CRNN | Mobilenet_v3 small 0.5 | None | BiLSTM | ctc | 意大利语 | it | -| rec_xi_lite_train.yml | CRNN | Mobilenet_v3 small 0.5 | None | BiLSTM | ctc | 西班牙语 | xi | -| rec_pu_lite_train.yml | CRNN | Mobilenet_v3 small 0.5 | None | BiLSTM | ctc | 葡萄牙语 | pu | -| rec_ru_lite_train.yml | CRNN | Mobilenet_v3 small 0.5 | None | BiLSTM | ctc | 俄罗斯语 | ru | -| rec_ar_lite_train.yml | CRNN | Mobilenet_v3 small 0.5 | None | BiLSTM | ctc | 阿拉伯语 | ar | -| rec_hi_lite_train.yml | CRNN | Mobilenet_v3 small 0.5 | None | BiLSTM | ctc | 印地语 | hi | -| rec_ug_lite_train.yml | CRNN | Mobilenet_v3 small 0.5 | None | BiLSTM | ctc | 维吾尔语 | ug | -| rec_fa_lite_train.yml | CRNN | Mobilenet_v3 small 0.5 | None | BiLSTM | ctc | 波斯语 | fa | -| rec_ur_ite_train.yml | CRNN | Mobilenet_v3 small 0.5 | None | BiLSTM | ctc | 乌尔都语 | ur | -| rec_rs_lite_train.yml | CRNN | Mobilenet_v3 small 0.5 | None | BiLSTM | ctc | 塞尔维亚(latin)语 | rs | -| rec_oc_lite_train.yml | CRNN | Mobilenet_v3 small 0.5 | None | BiLSTM | ctc | 欧西坦语 | oc | -| rec_mr_lite_train.yml | CRNN | Mobilenet_v3 small 0.5 | None | BiLSTM | ctc | 马拉地语 | mr | -| rec_ne_lite_train.yml | CRNN | Mobilenet_v3 small 0.5 | None | BiLSTM | ctc | 尼泊尔语 | ne | -| rec_rsc_lite_train.yml | CRNN | Mobilenet_v3 small 0.5 | None | BiLSTM | ctc | 塞尔维亚(cyrillic)语 | rsc | -| rec_bg_lite_train.yml | CRNN | Mobilenet_v3 small 0.5 | None | BiLSTM | ctc | 保加利亚语 | bg | -| rec_uk_lite_train.yml | CRNN | Mobilenet_v3 small 0.5 | None | BiLSTM | ctc | 乌克兰语 | uk | -| rec_be_lite_train.yml | CRNN | Mobilenet_v3 small 0.5 | None | BiLSTM | ctc | 白俄罗斯语 | be | -| rec_te_lite_train.yml | CRNN | Mobilenet_v3 small 0.5 | None | BiLSTM | ctc | 泰卢固语 | te | -| rec_ka_lite_train.yml | CRNN | Mobilenet_v3 small 0.5 | None | BiLSTM | ctc | 卡纳达语 | ka | -| rec_ta_lite_train.yml | CRNN | Mobilenet_v3 small 0.5 | None | BiLSTM | ctc | 泰米尔语 | ta | +| rec_latin_lite_train.yml | CRNN | Mobilenet_v3 small 0.5 | None | BiLSTM | ctc | 拉丁字母 | latin | +| rec_arabic_lite_train.yml | CRNN | Mobilenet_v3 small 0.5 | None | BiLSTM | ctc | 阿拉伯字母 | ar | +| rec_cyrillic_lite_train.yml | CRNN | Mobilenet_v3 small 0.5 | None | BiLSTM | ctc | 斯拉夫字母 | cyrillic | +| rec_devanagari_lite_train.yml | CRNN | Mobilenet_v3 small 0.5 | None | BiLSTM | ctc | 梵文字母 | devanagari | + +更多支持语种请参考: [多语言模型](https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.1/doc/doc_ch/multi_languages.md#%E8%AF%AD%E7%A7%8D%E7%BC%A9%E5%86%99) 多语言模型训练方式与中文模型一致,训练数据集均为100w的合成数据,少量的字体可以在 [百度网盘](https://pan.baidu.com/s/1bS_u207Rm7YbY33wOECKDA) 上下载,提取码:frgi。 diff --git a/doc/doc_en/models_list_en.md b/doc/doc_en/models_list_en.md index e0163972..7d5b0d08 100644 --- a/doc/doc_en/models_list_en.md +++ b/doc/doc_en/models_list_en.md @@ -102,27 +102,16 @@ python3 generate_multi_language_configs.py -l it \ | german_mobile_v2.0_rec |Lightweight model for German recognition|[rec_german_lite_train.yml](../../configs/rec/multi_language/rec_german_lite_train.yml)|2.65M|[inference model](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/german_mobile_v2.0_rec_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/german_mobile_v2.0_rec_train.tar) | | korean_mobile_v2.0_rec |Lightweight model for Korean recognition|[rec_korean_lite_train.yml](../../configs/rec/multi_language/rec_korean_lite_train.yml)|3.9M|[inference model](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/korean_mobile_v2.0_rec_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/korean_mobile_v2.0_rec_train.tar) | | japan_mobile_v2.0_rec |Lightweight model for Japanese recognition|[rec_japan_lite_train.yml](../../configs/rec/multi_language/rec_japan_lite_train.yml)|4.23M|[inference model](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/japan_mobile_v2.0_rec_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/japan_mobile_v2.0_rec_train.tar) | -| it_mobile_v2.0_rec |Lightweight model for Italian recognition|rec_it_lite_train.yml|2.53M|[inference model](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/it_mobile_v2.0_rec_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/it_mobile_v2.0_rec_train.tar) | -| xi_mobile_v2.0_rec |Lightweight model for Spanish recognition|rec_xi_lite_train.yml|2.53M|[inference model](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/xi_mobile_v2.0_rec_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/xi_mobile_v2.0_rec_train.tar) | -| pu_mobile_v2.0_rec |Lightweight model for Portuguese recognition|rec_pu_lite_train.yml|2.63M|[inference model](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/pu_mobile_v2.0_rec_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/pu_mobile_v2.0_rec_train.tar) | -| ru_mobile_v2.0_rec |Lightweight model for Russia recognition|rec_ru_lite_train.yml|2.63M|[inference model](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/ru_mobile_v2.0_rec_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/ru_mobile_v2.0_rec_train.tar) | -| ar_mobile_v2.0_rec |Lightweight model for Arabic recognition|rec_ar_lite_train.yml|2.53M|[inference model](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/ar_mobile_v2.0_rec_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/ar_mobile_v2.0_rec_train.tar) | -| hi_mobile_v2.0_rec |Lightweight model for Hindi recognition|rec_hi_lite_train.yml|2.63M|[inference model](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/hi_mobile_v2.0_rec_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/hi_mobile_v2.0_rec_train.tar) | -| chinese_cht_mobile_v2.0_rec |Lightweight model for chinese traditional recognition|rec_chinese_cht_lite_train.yml|5.63M|[inference model](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/chinese_cht_mobile_v2.0_rec_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/chinese_cht_mobile_v2.0_rec_train.tar) | -| ug_mobile_v2.0_rec |Lightweight model for Uyghur recognition|rec_ug_lite_train.yml|2.63M|[inference model](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/ug_mobile_v2.0_rec_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/ug_mobile_v2.0_rec_train.tar) | -| fa_mobile_v2.0_rec |Lightweight model for Persian recognition|rec_fa_lite_train.yml|2.63M|[inference model](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/fa_mobile_v2.0_rec_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/fa_mobile_v2.0_rec_train.tar) | -| ur_mobile_v2.0_rec |Lightweight model for Urdu recognition|rec_ur_lite_train.yml|2.63M|[inference model](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/ur_mobile_v2.0_rec_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/ur_mobile_v2.0_rec_train.tar) | -| rs_mobile_v2.0_rec |Lightweight model for Serbian(latin) recognition|rec_rs_lite_train.yml|2.53M|[inference model](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/rs_mobile_v2.0_rec_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/rs_mobile_v2.0_rec_train.tar) | -| oc_mobile_v2.0_rec |Lightweight model for Occitan recognition|rec_oc_lite_train.yml|2.53M|[inference model](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/oc_mobile_v2.0_rec_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/oc_mobile_v2.0_rec_train.tar) | -| mr_mobile_v2.0_rec |Lightweight model for Marathi recognition|rec_mr_lite_train.yml|2.63M|[inference model](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/mr_mobile_v2.0_rec_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/mr_mobile_v2.0_rec_train.tar) | -| ne_mobile_v2.0_rec |Lightweight model for Nepali recognition|rec_ne_lite_train.yml|2.63M|[inference model](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/ne_mobile_v2.0_rec_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/ne_mobile_v2.0_rec_train.tar) | -| rsc_mobile_v2.0_rec |Lightweight model for Serbian(cyrillic) recognition|rec_rsc_lite_train.yml|2.63M|[inference model](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/rsc_mobile_v2.0_rec_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/rsc_mobile_v2.0_rec_train.tar) | -| bg_mobile_v2.0_rec |Lightweight model for Bulgarian recognition|rec_bg_lite_train.yml|2.63M|[inference model](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/bg_mobile_v2.0_rec_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/bg_mobile_v2.0_rec_train.tar) | -| uk_mobile_v2.0_rec |Lightweight model for Ukranian recognition|rec_uk_lite_train.yml|2.63M|[inference model](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/uk_mobile_v2.0_rec_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/uk_mobile_v2.0_rec_train.tar) | -| be_mobile_v2.0_rec |Lightweight model for Belarusian recognition|rec_be_lite_train.yml|2.63M|[inference model](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/be_mobile_v2.0_rec_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/be_mobile_v2.0_rec_train.tar) | +| chinese_cht_mobile_v2.0_rec |Lightweight model for chinese cht recognition|rec_chinese_cht_lite_train.yml|5.63M|[推理模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/chinese_cht_mobile_v2.0_rec_infer.tar) / [训练模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/chinese_cht_mobile_v2.0_rec_train.tar) | | te_mobile_v2.0_rec |Lightweight model for Telugu recognition|rec_te_lite_train.yml|2.63M|[inference model](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/te_mobile_v2.0_rec_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/te_mobile_v2.0_rec_train.tar) | | ka_mobile_v2.0_rec |Lightweight model for Kannada recognition|rec_ka_lite_train.yml|2.63M|[inference model](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/ka_mobile_v2.0_rec_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/ka_mobile_v2.0_rec_train.tar) | | ta_mobile_v2.0_rec |Lightweight model for Tamil recognition|rec_ta_lite_train.yml|2.63M|[inference model](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/ta_mobile_v2.0_rec_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/ta_mobile_v2.0_rec_train.tar) | +| latin_mobile_v2.0_rec | Lightweight model for latin recognition | [rec_latin_lite_train.yml](../../configs/rec/multi_language/rec_latin_lite_train.yml) |2.6M|[推理模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/latin_ppocr_mobile_v2.0_rec_infer.tar) / [训练模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/latin_ppocr_mobile_v2.0_rec_train.tar) | +| arabic_mobile_v2.0_rec | Lightweight model for arabic recognition | [rec_arabic_lite_train.yml](../../configs/rec/multi_language/rec_arabic_lite_train.yml) |2.6M|[推理模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/arabic_ppocr_mobile_v2.0_rec_infer.tar) / [训练模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/arabic_ppocr_mobile_v2.0_rec_train.tar) | +| cyrillic_mobile_v2.0_rec | Lightweight model for cyrillic recognition | [rec_cyrillic_lite_train.yml](../../configs/rec/multi_language/rec_cyrillic_lite_train.yml) |2.6M|[推理模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/cyrillic_ppocr_mobile_v2.0_rec_infer.tar) / [训练模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/cyrillic_ppocr_mobile_v2.0_rec_train.tar) | +| devanagari_mobile_v2.0_rec | Lightweight model for devanagari recognition | [rec_devanagari_lite_train.yml](../../configs/rec/multi_language/rec_devanagari_lite_train.yml) |2.6M|[推理模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/devanagari_ppocr_mobile_v2.0_rec_infer.tar) / [训练模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/devanagari_ppocr_mobile_v2.0_rec_train.tar) | + +For more supported languages, please refer to : [Multi-language model](https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.1/doc/doc_en/multi_languages_en.md#4-support-languages-and-abbreviations) diff --git a/doc/doc_en/multi_languages_en.md b/doc/doc_en/multi_languages_en.md index 3f4f0226..3a7dde96 100644 --- a/doc/doc_en/multi_languages_en.md +++ b/doc/doc_en/multi_languages_en.md @@ -60,7 +60,7 @@ pip instll paddlepaddle-gpu pip install ``` -pip install "paddleocr>=2.0.4" # 2.0.4 version is recommended +pip install "paddleocr>=2.0.6" # 2.0.6 version is recommended ``` Build and install locally ``` diff --git a/doc/doc_en/recognition_en.md b/doc/doc_en/recognition_en.md index aeb9aa0d..0b3db6a2 100644 --- a/doc/doc_en/recognition_en.md +++ b/doc/doc_en/recognition_en.md @@ -131,7 +131,7 @@ PaddleOCR has built-in dictionaries, which can be used on demand. `ppocr/utils/dict/german_dict.txt` is a German dictionary with 131 characters -`ppocr/utils/dict/en_dict.txt` is a English dictionary with 63 characters +`ppocr/utils/en_dict.txt` is a English dictionary with 96 characters The current multi-language model is still in the demo stage and will continue to optimize the model and add languages. **You are very welcome to provide us with dictionaries and fonts in other languages**, @@ -279,7 +279,7 @@ Eval: #### 2.3 Multi-language -PaddleOCR currently supports 26 (except Chinese) language recognition. A multi-language configuration file template is +PaddleOCR currently supports 80 (except Chinese) language recognition. A multi-language configuration file template is provided under the path `configs/rec/multi_languages`: [rec_multi_language_lite_train.yml](../../configs/rec/multi_language/rec_multi_language_lite_train.yml)。 There are two ways to create the required configuration file:: @@ -368,27 +368,12 @@ Currently, the multi-language algorithms supported by PaddleOCR are: | rec_ger_lite_train.yml | CRNN | Mobilenet_v3 small 0.5 | None | BiLSTM | ctc | German | german | | rec_japan_lite_train.yml | CRNN | Mobilenet_v3 small 0.5 | None | BiLSTM | ctc | Japanese | japan | | rec_korean_lite_train.yml | CRNN | Mobilenet_v3 small 0.5 | None | BiLSTM | ctc | Korean | korean | -| rec_it_lite_train.yml | CRNN | Mobilenet_v3 small 0.5 | None | BiLSTM | ctc | Italian | it | -| rec_xi_lite_train.yml | CRNN | Mobilenet_v3 small 0.5 | None | BiLSTM | ctc | Spanish | xi | -| rec_pu_lite_train.yml | CRNN | Mobilenet_v3 small 0.5 | None | BiLSTM | ctc | Portuguese | pu | -| rec_ru_lite_train.yml | CRNN | Mobilenet_v3 small 0.5 | None | BiLSTM | ctc | Russia | ru | -| rec_ar_lite_train.yml | CRNN | Mobilenet_v3 small 0.5 | None | BiLSTM | ctc | Arabic | ar | -| rec_hi_lite_train.yml | CRNN | Mobilenet_v3 small 0.5 | None | BiLSTM | ctc | Hindi | hi | -| rec_ug_lite_train.yml | CRNN | Mobilenet_v3 small 0.5 | None | BiLSTM | ctc | Uyghur | ug | -| rec_fa_lite_train.yml | CRNN | Mobilenet_v3 small 0.5 | None | BiLSTM | ctc | Persian(Farsi) | fa | -| rec_ur_ite_train.yml | CRNN | Mobilenet_v3 small 0.5 | None | BiLSTM | ctc | Urdu | ur | -| rec_rs_lite_train.yml | CRNN | Mobilenet_v3 small 0.5 | None | BiLSTM | ctc | Serbian(latin) | rs | -| rec_oc_lite_train.yml | CRNN | Mobilenet_v3 small 0.5 | None | BiLSTM | ctc | Occitan | oc | -| rec_mr_lite_train.yml | CRNN | Mobilenet_v3 small 0.5 | None | BiLSTM | ctc | Marathi | mr | -| rec_ne_lite_train.yml | CRNN | Mobilenet_v3 small 0.5 | None | BiLSTM | ctc | Nepali | ne | -| rec_rsc_lite_train.yml | CRNN | Mobilenet_v3 small 0.5 | None | BiLSTM | ctc | Serbian(cyrillic) | rsc | -| rec_bg_lite_train.yml | CRNN | Mobilenet_v3 small 0.5 | None | BiLSTM | ctc | Bulgarian | bg | -| rec_uk_lite_train.yml | CRNN | Mobilenet_v3 small 0.5 | None | BiLSTM | ctc | Ukranian | uk | -| rec_be_lite_train.yml | CRNN | Mobilenet_v3 small 0.5 | None | BiLSTM | ctc | Belarusian | be | -| rec_te_lite_train.yml | CRNN | Mobilenet_v3 small 0.5 | None | BiLSTM | ctc | Telugu | te | -| rec_ka_lite_train.yml | CRNN | Mobilenet_v3 small 0.5 | None | BiLSTM | ctc | Kannada | ka | -| rec_ta_lite_train.yml | CRNN | Mobilenet_v3 small 0.5 | None | BiLSTM | ctc | Tamil | ta | +| rec_latin_lite_train.yml | CRNN | Mobilenet_v3 small 0.5 | None | BiLSTM | ctc | Latin | latin | +| rec_arabic_lite_train.yml | CRNN | Mobilenet_v3 small 0.5 | None | BiLSTM | ctc | arabic | ar | +| rec_cyrillic_lite_train.yml | CRNN | Mobilenet_v3 small 0.5 | None | BiLSTM | ctc | cyrillic | cyrillic | +| rec_devanagari_lite_train.yml | CRNN | Mobilenet_v3 small 0.5 | None | BiLSTM | ctc | devanagari | devanagari | +For more supported languages, please refer to : [Multi-language model](https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.1/doc/doc_en/multi_languages_en.md#4-support-languages-and-abbreviations) The multi-language model training method is the same as the Chinese model. The training data set is 100w synthetic data. A small amount of fonts and test data can be downloaded on [Baidu Netdisk](https://pan.baidu.com/s/1bS_u207Rm7YbY33wOECKDA),Extraction code:frgi. diff --git a/paddleocr.py b/paddleocr.py index 47e1267a..d5b6a01b 100644 --- a/paddleocr.py +++ b/paddleocr.py @@ -34,8 +34,12 @@ from ppocr.utils.utility import check_and_read_gif, get_image_file_list __all__ = ['PaddleOCR'] model_urls = { - 'det': - 'https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_det_infer.tar', + 'det': { + 'ch': + 'https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_det_infer.tar', + 'en': + 'https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/en_ppocr_mobile_v2.0_det_infer.tar' + }, 'rec': { 'ch': { 'url': @@ -45,7 +49,7 @@ model_urls = { 'en': { 'url': 'https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/en_number_mobile_v2.0_rec_infer.tar', - 'dict_path': './ppocr/utils/dict/en_dict.txt' + 'dict_path': './ppocr/utils/en_dict.txt' }, 'french': { 'url': @@ -113,7 +117,7 @@ model_urls = { } SUPPORT_DET_MODEL = ['DB'] -VERSION = 2.0 +VERSION = 2.1 SUPPORT_REC_MODEL = ['CRNN'] BASE_DIR = os.path.expanduser("~/.paddleocr/") @@ -199,7 +203,7 @@ def parse_args(mMain=True, add_help=True): parser.add_argument("--rec_model_dir", type=str, default=None) parser.add_argument("--rec_image_shape", type=str, default="3, 32, 320") parser.add_argument("--rec_char_type", type=str, default='ch') - parser.add_argument("--rec_batch_num", type=int, default=30) + parser.add_argument("--rec_batch_num", type=int, default=6) parser.add_argument("--max_text_length", type=int, default=25) parser.add_argument("--rec_char_dict_path", type=str, default=None) parser.add_argument("--use_space_char", type=bool, default=True) @@ -209,7 +213,7 @@ def parse_args(mMain=True, add_help=True): parser.add_argument("--cls_model_dir", type=str, default=None) parser.add_argument("--cls_image_shape", type=str, default="3, 48, 192") parser.add_argument("--label_list", type=list, default=['0', '180']) - parser.add_argument("--cls_batch_num", type=int, default=30) + parser.add_argument("--cls_batch_num", type=int, default=6) parser.add_argument("--cls_thresh", type=float, default=0.9) parser.add_argument("--enable_mkldnn", type=bool, default=False) @@ -243,7 +247,7 @@ def parse_args(mMain=True, add_help=True): rec_model_dir=None, rec_image_shape="3, 32, 320", rec_char_type='ch', - rec_batch_num=30, + rec_batch_num=6, max_text_length=25, rec_char_dict_path=None, use_space_char=True, @@ -251,7 +255,7 @@ def parse_args(mMain=True, add_help=True): cls_model_dir=None, cls_image_shape="3, 48, 192", label_list=['0', '180'], - cls_batch_num=30, + cls_batch_num=6, cls_thresh=0.9, enable_mkldnn=False, use_zero_copy_run=False, @@ -274,10 +278,10 @@ class PaddleOCR(predict_system.TextSystem): self.use_angle_cls = postprocess_params.use_angle_cls lang = postprocess_params.lang latin_lang = [ - 'af', 'az', 'bs', 'cs', 'cy', 'da', 'de', 'en', 'es', 'et', 'fr', - 'ga', 'hr', 'hu', 'id', 'is', 'it', 'ku', 'la', 'lt', 'lv', 'mi', - 'ms', 'mt', 'nl', 'no', 'oc', 'pi', 'pl', 'pt', 'ro', 'rs_latin', - 'sk', 'sl', 'sq', 'sv', 'sw', 'tl', 'tr', 'uz', 'vi' + 'af', 'az', 'bs', 'cs', 'cy', 'da', 'de', 'es', 'et', 'fr', 'ga', + 'hr', 'hu', 'id', 'is', 'it', 'ku', 'la', 'lt', 'lv', 'mi', 'ms', + 'mt', 'nl', 'no', 'oc', 'pi', 'pl', 'pt', 'ro', 'rs_latin', 'sk', + 'sl', 'sq', 'sv', 'sw', 'tl', 'tr', 'uz', 'vi' ] arabic_lang = ['ar', 'fa', 'ug', 'ur'] cyrillic_lang = [ @@ -299,6 +303,10 @@ class PaddleOCR(predict_system.TextSystem): assert lang in model_urls[ 'rec'], 'param lang must in {}, but got {}'.format( model_urls['rec'].keys(), lang) + if lang == "ch": + det_lang = "ch" + else: + det_lang = "en" use_inner_dict = False if postprocess_params.rec_char_dict_path is None: use_inner_dict = True @@ -308,7 +316,7 @@ class PaddleOCR(predict_system.TextSystem): # init model dir if postprocess_params.det_model_dir is None: postprocess_params.det_model_dir = os.path.join( - BASE_DIR, '{}/det'.format(VERSION)) + BASE_DIR, '{}/det/{}'.format(VERSION, det_lang)) if postprocess_params.rec_model_dir is None: postprocess_params.rec_model_dir = os.path.join( BASE_DIR, '{}/rec/{}'.format(VERSION, lang)) @@ -317,7 +325,8 @@ class PaddleOCR(predict_system.TextSystem): BASE_DIR, '{}/cls'.format(VERSION)) print(postprocess_params) # download model - maybe_download(postprocess_params.det_model_dir, model_urls['det']) + maybe_download(postprocess_params.det_model_dir, + model_urls['det'][det_lang]) maybe_download(postprocess_params.rec_model_dir, model_urls['rec'][lang]['url']) maybe_download(postprocess_params.cls_model_dir, model_urls['cls']) diff --git a/setup.py b/setup.py index d491adb1..a1ddbbb6 100644 --- a/setup.py +++ b/setup.py @@ -32,7 +32,7 @@ setup( package_dir={'paddleocr': ''}, include_package_data=True, entry_points={"console_scripts": ["paddleocr= paddleocr.paddleocr:main"]}, - version='2.0.4', + version='2.0.6', install_requires=requirements, license='Apache License 2.0', description='Awesome OCR toolkits based on PaddlePaddle (8.6M ultra-lightweight pre-trained model, support training and deployment among server, mobile, embeded and IoT devices', From 87ec85458a2def59b8b3de1bdb6a9eebd12140f8 Mon Sep 17 00:00:00 2001 From: littletomatodonkey Date: Wed, 14 Apr 2021 03:25:02 +0000 Subject: [PATCH 2/3] add cpp infer img demo --- deploy/cpp_infer/imgs/cpp_infer_pred_12.png | Bin 0 -> 26798 bytes deploy/cpp_infer/readme.md | 2 +- deploy/cpp_infer/readme_en.md | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 deploy/cpp_infer/imgs/cpp_infer_pred_12.png diff --git a/deploy/cpp_infer/imgs/cpp_infer_pred_12.png b/deploy/cpp_infer/imgs/cpp_infer_pred_12.png new file mode 100644 index 0000000000000000000000000000000000000000..eb5f64e1f6c329f7ae772c50edce7fc8afcb1211 GIT binary patch literal 26798 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Μ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 SynTlVMovmuvgVU<@c#lG=@t?I literal 0 HcmV?d00001 diff --git a/deploy/cpp_infer/readme.md b/deploy/cpp_infer/readme.md index 63355308..eaa841dc 100644 --- a/deploy/cpp_infer/readme.md +++ b/deploy/cpp_infer/readme.md @@ -232,7 +232,7 @@ visualize 1 # 是否对结果进行可视化,为1时,会在当前文件夹 最终屏幕上会输出检测结果如下。
- +
diff --git a/deploy/cpp_infer/readme_en.md b/deploy/cpp_infer/readme_en.md index cfe18a28..bdfcb0e6 100644 --- a/deploy/cpp_infer/readme_en.md +++ b/deploy/cpp_infer/readme_en.md @@ -238,7 +238,7 @@ visualize 1 # Whether to visualize the results,when it is set as 1, The predic The detection results will be shown on the screen, which is as follows.
- +
From 2ab133ed43f0f4538347d63d676280d677edafcf Mon Sep 17 00:00:00 2001 From: LDOUBLEV Date: Fri, 19 Mar 2021 10:39:51 +0800 Subject: [PATCH 3/3] fix conflicts --- deploy/cpp_infer/CMakeLists.txt | 11 ++++++----- deploy/cpp_infer/readme.md | 5 ++--- deploy/cpp_infer/readme_en.md | 4 ++-- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/deploy/cpp_infer/CMakeLists.txt b/deploy/cpp_infer/CMakeLists.txt index 120cf06a..bdcfefee 100644 --- a/deploy/cpp_infer/CMakeLists.txt +++ b/deploy/cpp_infer/CMakeLists.txt @@ -40,6 +40,7 @@ endif() if (WIN32) include_directories("${PADDLE_LIB}/paddle/fluid/inference") include_directories("${PADDLE_LIB}/paddle/include") + link_directories("${PADDLE_LIB}/paddle/lib") link_directories("${PADDLE_LIB}/paddle/fluid/inference") find_package(OpenCV REQUIRED PATHS ${OPENCV_DIR}/build/ NO_DEFAULT_PATH) @@ -140,22 +141,22 @@ else() endif () endif() -# Note: libpaddle_inference_api.so/a must put before libpaddle_fluid.so/a +# Note: libpaddle_inference_api.so/a must put before libpaddle_inference.so/a if(WITH_STATIC_LIB) if(WIN32) set(DEPS - ${PADDLE_LIB}/paddle/lib/paddle_fluid${CMAKE_STATIC_LIBRARY_SUFFIX}) + ${PADDLE_LIB}/paddle/lib/paddle_inference${CMAKE_STATIC_LIBRARY_SUFFIX}) else() set(DEPS - ${PADDLE_LIB}/paddle/lib/libpaddle_fluid${CMAKE_STATIC_LIBRARY_SUFFIX}) + ${PADDLE_LIB}/paddle/lib/libpaddle_inference${CMAKE_STATIC_LIBRARY_SUFFIX}) endif() else() if(WIN32) set(DEPS - ${PADDLE_LIB}/paddle/lib/paddle_fluid${CMAKE_SHARED_LIBRARY_SUFFIX}) + ${PADDLE_LIB}/paddle/lib/paddle_inference${CMAKE_SHARED_LIBRARY_SUFFIX}) else() set(DEPS - ${PADDLE_LIB}/paddle/lib/libpaddle_fluid${CMAKE_SHARED_LIBRARY_SUFFIX}) + ${PADDLE_LIB}/paddle/lib/libpaddle_inference${CMAKE_SHARED_LIBRARY_SUFFIX}) endif() endif(WITH_STATIC_LIB) diff --git a/deploy/cpp_infer/readme.md b/deploy/cpp_infer/readme.md index eaa841dc..b62b1a4c 100644 --- a/deploy/cpp_infer/readme.md +++ b/deploy/cpp_infer/readme.md @@ -74,9 +74,10 @@ opencv3/ * 有2种方式获取Paddle预测库,下面进行详细介绍。 + #### 1.2.1 直接下载安装 -* [Paddle预测库官网](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/guides/05_inference_deployment/inference/build_and_install_lib_cn.html)上提供了不同cuda版本的Linux预测库,可以在官网查看并选择合适的预测库版本。 +* [Paddle预测库官网](https://www.paddlepaddle.org.cn/documentation/docs/zh/advanced_guide/inference_deployment/inference/build_and_install_lib_cn.html)上提供了不同cuda版本的Linux预测库,可以在官网查看并选择合适的预测库版本(*建议选择paddle版本>=2.0.1版本的预测库* )。 * 下载之后使用下面的方法解压。 @@ -130,8 +131,6 @@ build/paddle_inference_install_dir/ 其中`paddle`就是C++预测所需的Paddle库,`version.txt`中包含当前预测库的版本信息。 - - ## 2 开始运行 ### 2.1 将模型导出为inference model diff --git a/deploy/cpp_infer/readme_en.md b/deploy/cpp_infer/readme_en.md index bdfcb0e6..cfda7ca0 100644 --- a/deploy/cpp_infer/readme_en.md +++ b/deploy/cpp_infer/readme_en.md @@ -91,8 +91,8 @@ tar -xf paddle_inference.tgz Finally you can see the following files in the folder of `paddle_inference/`. #### 1.2.2 Compile from the source code -* If you want to get the latest Paddle inference library features, you can download the latest code from Paddle github repository and compile the inference library from the source code. -* You can refer to [Paddle inference library] (https://www.paddlepaddle.org.cn/documentation/docs/en/develop/guides/05_inference_deployment/inference/build_and_install_lib_en.html) to get the Paddle source code from github, and then compile To generate the latest inference library. The method of using git to access the code is as follows. +* If you want to get the latest Paddle inference library features, you can download the latest code from Paddle github repository and compile the inference library from the source code. It is recommended to download the inference library with paddle version greater than or equal to 2.0.1. +* You can refer to [Paddle inference library] (https://www.paddlepaddle.org.cn/documentation/docs/en/advanced_guide/inference_deployment/inference/build_and_install_lib_en.html) to get the Paddle source code from github, and then compile To generate the latest inference library. The method of using git to access the code is as follows. ```shell