飞桨常规赛:中文场景文字识别- 12月第8名方案

该内容围绕中文场景文字识别常规赛展开,介绍了比赛任务是用飞桨框架预测图像文字行内容。涵盖数据集情况,利用PaddleOCR的配置、训练、评估、预测等流程,包括模型选择、参数设置、预训练模型使用,以及结果提交相关的模型导出等内容。

☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜

飞桨常规赛:中文场景文字识别- 12月第8名方案 - 创想鸟

一、常规赛:中文场景文字识别

比赛地址:https://aistudio.baidu.com/aistudio/competition/detail/20/0/datasets

1.比赛简介

中文场景文字识别技术在人们的日常生活中受到广泛关注,具有丰富的应用场景,如:拍照翻译、图像检索、场景理解等。然而,中文场景中的文字面临着包括光照变化、低分辨率、字体以及排布多样性、中文字符种类多等复杂情况。如何解决上述问题成为一项极具挑战性的任务。

中文场景文字识别常规赛全新升级,提供轻量级中文场景文字识别数据,要求选手使用飞桨框架,对图像区域中的文字行进行预测,并返回文字行的内容。

2.数据集描述

本次赛题数据集共包括6万张图片,其中5万张图片作为训练集,1万张作为测试集。数据集采自中国街景,并由街景图片中的文字行区域(例如店铺标牌、地标等等)截取出来而形成。

具体数据介绍

数据集中所有图像都经过一些预处理,如下图所示:

飞桨常规赛:中文场景文字识别- 12月第8名方案 - 创想鸟

(a) 标注:久斯台球会所

飞桨常规赛:中文场景文字识别- 12月第8名方案 - 创想鸟

(b) 标注:上海创科泵业制造有限公司

标注文件

平台提供的标注文件为.csv文件格式,文件中的四列分别为图片的宽、高、文件名和文字标注。样例如下:

name value

0.jpg文本0—————-1.jpg文本0

二、环境设置

PaddleOCR https://github.com/paddlepaddle/PaddleOCR 是一款全宇宙最强的用的OCR工具库,开箱即用,速度杠杠的。

In [ ]

# 从gitee上下载PaddleOCR代码,也可以从GitHub链接下载!git clone https://gitee.com/paddlepaddle/PaddleOCR.git --depth=1# 升级pip!pip install -U pip # 安装依赖%cd ~/PaddleOCR%pip install -r requirements.txt

In [ ]

%cd ~/PaddleOCR/!tree   -L 1
/home/aistudio/PaddleOCR.├── benchmark├── configs├── deploy├── doc├── __init__.py├── LICENSE├── MANIFEST.in├── paddleocr.py├── ppocr├── PPOCRLabel├── ppstructure├── README_ch.md├── README.md├── requirements.txt├── setup.py├── StyleText├── test_tipc├── tools└── train.sh10 directories, 9 files

三、数据准备

据悉train数据集共10万张,解压,并划分出10000张作为测试集。

1.数据下载解压

In [ ]

#  解压缩数据集%cd ~!unzip -qa data/data62842/train_images.zip -d data/data62842/!unzip -qa data/data62843/test_images.zip -d data/data62843/
/home/aistudio

In [ ]

# 使用命令查看训练数据文件夹下数据量是否是5万张!cd ~/data/data62842/train_images  &&  ls -l | grep "^-" | wc -l
50000

In [ ]

# 使用命令查看test数据文件夹下数据量是否是1万张!cd ~/data/data62843/test_images  &&  ls -l | grep "^-" | wc -l
10000

2. 数据集划分

In [ ]

# 读取数据列表文件import pandas as pd%cd ~data_label=pd.read_csv('data/data62842/train_label.csv', encoding='gb2312')data_label.head()
/home/aistudio
    name    value0  0.jpg       拉拉1  1.jpg       6号2  2.jpg       胖胖3  3.jpg  前门大栅栏总店4  4.jpg   你来就是旺季

In [ ]

# 对数据列表文件进行划分%cd ~/data/data62842/print(data_label.shape)train=data_label[:45000]val=data_label[45000:]train.to_csv('train.txt',sep='t',header=None,index=None)val.to_csv('val.txt',sep='t',header=None,index=None)
/home/aistudio/data/data62842(50000, 2)

In [ ]

# 查看数量print(train.shape)print(val.shape)
(45000, 2)(5000, 2)

In [ ]

!head val.txt
45000.jpg责任单位:北京市环清环卫设施维修45001.jpg眼镜45002.jpg光临45003.jpg主治45004.jpg菜饭骨头汤45005.jpg理45006.jpg要多者提前预定45007.jpg干洗湿洗45008.jpg画布咖啡45009.jpg电焊、气割、专业自卸车

In [ ]

!head train.txt
0.jpg拉拉1.jpg6号2.jpg胖胖3.jpg前门大栅栏总店4.jpg你来就是旺季5.jpg毛衣厂家直销6.jpg137619162187.jpg福鼎白茶8.jpg妍心美容9.jpg童车童床

四、配置训练参数

以PaddleOCR/configs/rec/ch_ppocr_v2.0/rec_chinese_lite_train_v2.0.yml为基准进行配置

1.配置模型网络

使用CRNN算法,backbone是MobileNetV3,损失函数是CTCLoss

Architecture:  model_type: rec  algorithm: CRNN  Transform:  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: 0.00001

2.配置数据

对Train.data_dir, Train.label_file_list, Eval.data_dir, Eval.label_file_list进行配置

Train:  dataset:    name: SimpleDataSet    data_dir: /home/aistudio/data/data62842/train_images    label_file_list: ["/home/aistudio/data/data62842/train.txt"]......Eval:  dataset:    name: SimpleDataSet    data_dir: /home/aistudio/data/data62842/train_images    label_file_list: ["/home/aistudio/data/data62842/val.txt"]

3. 显卡、评估设置

use_gpu、cal_metric_during_train分别是GPU、评估开关

Global:  use_gpu: false             # true 使用GPU  .....  cal_metric_during_train: False   # true 打开评估

4. 多线程任务

Train.loader.num_workers:4Eval.loader.num_workers: 4

5.完整配置

Global:  use_gpu: true  epoch_num: 500  log_smooth_window: 20  print_batch_step: 10  save_model_dir: ./output/rec_chinese_lite_v2.0  save_epoch_step: 3  # evaluation is run every 5000 iterations after the 4000th iteration  eval_batch_step: [0, 2000]  cal_metric_during_train: True  pretrained_model: ./ch_ppocr_mobile_v2.0_rec_pre/best_accuracy  checkpoints:   save_inference_dir:  use_visualdl: True  infer_img: doc/imgs_words/ch/word_1.jpg  # for data or label process  character_dict_path: ppocr/utils/ppocr_keys_v1.txt  max_text_length: 25  infer_mode: False  use_space_char: True  save_res_path: ./output/rec/predicts_chinese_lite_v2.0.txtOptimizer:  name: Adam  beta1: 0.9  beta2: 0.999  lr:    name: Cosine    learning_rate: 0.001    warmup_epoch: 5  regularizer:    name: 'L2'    factor: 0.00001Architecture:  model_type: rec  algorithm: CRNN  Transform:  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: 0.00001Loss:  name: CTCLossPostProcess:  name: CTCLabelDecodeMetric:  name: RecMetric  main_indicator: accTrain:  dataset:    name: SimpleDataSet    data_dir: /home/aistudio/data/data62842/train_images    label_file_list: ["/home/aistudio/data/data62842/train.txt"]    transforms:      - DecodeImage: # load image          img_mode: BGR          channel_first: False      - RecAug:       - CTCLabelEncode: # Class handling label      - RecResizeImg:          image_shape: [3, 32, 320]      - KeepKeys:          keep_keys: ['image', 'label', 'length'] # dataloader will return list in this order  loader:    shuffle: True    batch_size_per_card: 256    drop_last: True    num_workers: 8Eval:  dataset:    name: SimpleDataSet    data_dir: /home/aistudio/data/data62842/train_images    label_file_list: ["/home/aistudio/data/data62842/val.txt"]    transforms:      - DecodeImage: # load image          img_mode: BGR          channel_first: False      - CTCLabelEncode: # Class handling label      - RecResizeImg:          image_shape: [3, 32, 320]      - KeepKeys:          keep_keys: ['image', 'label', 'length'] # dataloader will return list in this order  loader:    shuffle: False    drop_last: False    batch_size_per_card: 256    num_workers: 8

In [1]

# 覆盖配置!cp -f  ~/rec_chinese_lite_train_v2.0.yml ~/PaddleOCR/configs/rec/ch_ppocr_v2.0/rec_chinese_lite_train_v2.0.yml
cp: cannot stat '/home/aistudio/PaddleOCR/configs/rec/ch_ppocr_v2.0/rec_chinese_lite_train_v2.0.yml': No such file or directory

6.使用预训练模型

据悉使用预训练模型,训练速度更快!!!

PaddleOCR提供的可下载模型包括推理模型、训练模型、预训练模型、slim模型,模型区别说明如下:

模型类型 模型格式 简介

推理模型inference.pdmodel、inference.pdiparams用于预测引擎推理,详情训练模型、预训练模型*.pdparams、*.pdopt、*.states训练过程中保存的模型的参数、优化器状态和训练中间信息,多用于模型指标评估和恢复训练slim模型*.nb经过飞桨模型压缩工具PaddleSlim压缩后的模型,适用于移动端/IoT端等端侧部署场景(需使用飞桨Paddle Lite部署)。

各个模型的关系如下面的示意图所示。

飞桨常规赛:中文场景文字识别- 12月第8名方案 - 创想鸟

文本检测模型

模型名称 模型简介 配置文件 推理模型大小 下载地址

ch_ppocr_mobile_slim_v2.0_detslim裁剪版超轻量模型,支持中英文、多语种文本检测ch_det_mv3_db_v2.0.yml2.6M推理模型ch_ppocr_mobile_v2.0_det原始超轻量模型,支持中英文、多语种文本检测ch_det_mv3_db_v2.0.yml3M推理模型 / 训练模型ch_ppocr_server_v2.0_det通用模型,支持中英文、多语种文本检测,比超轻量模型更大,但效果更好ch_det_res18_db_v2.0.yml47M推理模型 / 训练模型

文本识别模型

中文识别模型
模型名称 模型简介 配置文件 推理模型大小 下载地址

ch_ppocr_mobile_slim_v2.0_recslim裁剪量化版超轻量模型,支持中英文、数字识别rec_chinese_lite_train_v2.0.yml6M推理模型 / 训练模型ch_ppocr_mobile_v2.0_rec原始超轻量模型,支持中英文、数字识别rec_chinese_lite_train_v2.0.yml5.2M推理模型 / 训练模型 / 预训练模型ch_ppocr_server_v2.0_rec通用模型,支持中英文、数字识别rec_chinese_common_train_v2.0.yml94.8M推理模型 / 训练模型 / 预训练模型

说明: 训练模型是基于预训练模型在真实数据与竖排合成文本数据上finetune得到的模型,在真实应用场景中有着更好的表现,预训练模型则是直接基于全量真实数据与合成数据训练得到,更适合用于在自己的数据集上finetune。

英文识别模型
模型名称 模型简介 配置文件 推理模型大小 下载地址

en_number_mobile_slim_v2.0_recslim裁剪量化版超轻量模型,支持英文、数字识别rec_en_number_lite_train.yml2.7M推理模型 / 训练模型en_number_mobile_v2.0_rec原始超轻量模型,支持英文、数字识别rec_en_number_lite_train.yml2.6M推理模型 / 训练模型

In [ ]

%cd ~/PaddleOCR/# mobile模型# !wget https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_rec_pre.tar# !tar -xf ch_ppocr_mobile_v2.0_rec_pre.tar# server模型!wget https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_server_v2.0_rec_pre.tar!tar -xf ch_ppocr_server_v2.0_rec_pre.tar
/home/aistudio/PaddleOCR--2021-12-31 12:58:03--  https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_server_v2.0_rec_pre.tarResolving paddleocr.bj.bcebos.com (paddleocr.bj.bcebos.com)... 182.61.200.195, 182.61.200.229, 2409:8c04:1001:1002:0:ff:b001:368aConnecting to paddleocr.bj.bcebos.com (paddleocr.bj.bcebos.com)|182.61.200.195|:443... connected.HTTP request sent, awaiting response... 200 OKLength: 490184704 (467M) [application/x-tar]Saving to: ‘ch_ppocr_server_v2.0_rec_pre.tar’ch_ppocr_server_v2. 100%[===================>] 467.48M  56.0MB/s    in 13s     2021-12-31 12:58:17 (34.9 MB/s) - ‘ch_ppocr_server_v2.0_rec_pre.tar’ saved [490184704/490184704]

五、训练

In [9]

%cd ~/PaddleOCR/# mobile模型# !python tools/train.py -c ./configs/rec/ch_ppocr_v2.0/rec_chinese_lite_train_v2.0.yml -o Global.checkpoints=./output/rec_chinese_lite_v2.0/latest# server模型!python tools/train.py -c ./configs/rec/ch_ppocr_v2.0/rec_chinese_common_train_v2.0.yml

1.选择合适的batch size

飞桨常规赛:中文场景文字识别- 12月第8名方案 - 创想鸟

2.训练日志

[2021/12/30 23:26:54] root INFO: epoch: [68/500], iter: 9930, lr: 0.000962, loss: 5.635038, acc: 0.521482, norm_edit_dis: 0.745346, reader_cost: 0.01405 s, batch_cost: 0.26990 s, samples: 2560, ips: 948.50786[2021/12/30 23:27:11] root INFO: epoch: [68/500], iter: 9940, lr: 0.000962, loss: 5.653114, acc: 0.509764, norm_edit_dis: 0.740487, reader_cost: 0.01402 s, batch_cost: 0.26862 s, samples: 2560, ips: 953.03473[2021/12/30 23:27:26] root INFO: epoch: [68/500], iter: 9950, lr: 0.000962, loss: 5.411234, acc: 0.515623, norm_edit_dis: 0.748549, reader_cost: 0.00091 s, batch_cost: 0.26371 s, samples: 2560, ips: 970.76457[2021/12/30 23:27:40] root INFO: epoch: [68/500], iter: 9960, lr: 0.000962, loss: 5.588465, acc: 0.525389, norm_edit_dis: 0.755345, reader_cost: 0.00684 s, batch_cost: 0.25901 s, samples: 2560, ips: 988.38445[2021/12/30 23:27:48] root INFO: epoch: [68/500], iter: 9970, lr: 0.000961, loss: 5.789876, acc: 0.513670, norm_edit_dis: 0.740609, reader_cost: 0.00095 s, batch_cost: 0.15022 s, samples: 2560, ips: 1704.17763[2021/12/30 23:27:51] root INFO: epoch: [68/500], iter: 9974, lr: 0.000961, loss: 5.787237, acc: 0.511717, norm_edit_dis: 0.747102, reader_cost: 0.00018 s, batch_cost: 0.05935 s, samples: 1024, ips: 1725.41448[2021/12/30 23:27:51] root INFO: save model in ./output/rec_chinese_lite_v2.0/latest[2021/12/30 23:27:51] root INFO: Initialize indexs of datasets:['/home/aistudio/data/data62842/train.txt'][2021/12/30 23:28:21] root INFO: epoch: [69/500], iter: 9980, lr: 0.000961, loss: 5.801509, acc: 0.517576, norm_edit_dis: 0.749756, reader_cost: 1.10431 s, batch_cost: 1.37585 s, samples: 1536, ips: 111.64048[2021/12/30 23:28:40] root INFO: epoch: [69/500], iter: 9990, lr: 0.000961, loss: 5.548770, acc: 0.533201, norm_edit_dis: 0.762078, reader_cost: 0.00839 s, batch_cost: 0.32035 s, samples: 2560, ips: 799.11578[2021/12/30 23:28:56] root INFO: epoch: [69/500], iter: 10000, lr: 0.000961, loss: 5.449094, acc: 0.537107, norm_edit_dis: 0.762517, reader_cost: 0.00507 s, batch_cost: 0.25845 s, samples: 2560, ips: 990.51517eval model:: 100%|██████████████████████████████| 20/20 [00:15<00:00,  1.98it/s][2021/12/30 23:29:12] root INFO: cur metric, acc: 0.4641999071600186, norm_edit_dis: 0.6980459628854201, fps: 4204.853978632389[2021/12/30 23:29:12] root INFO: best metric, acc: 0.48179990364001923, start_epoch: 12, norm_edit_dis: 0.7096561279006699, fps: 4618.199275059127, best_epoch: 46

3. visualdl可视化

本地安装visualdl pip install visualdl下载日志至本地启动visualdl可视化  visualdl –logdir ./打开浏览器查看  http://localhost:8040/

飞桨常规赛:中文场景文字识别- 12月第8名方案 - 创想鸟

六、模型评估

In [10]

# GPU 评估, Global.checkpoints 为待测权重%cd ~/PaddleOCR/# mobile模型# !python  -m paddle.distributed.launch tools/eval.py -c configs/rec/ch_ppocr_v2.0/rec_chinese_lite_train_v2.0.yml #     -o Global.checkpoints=./output/rec_chinese_lite_v2.0/latest# server模型!python  -m paddle.distributed.launch tools/eval.py -c configs/rec/ch_ppocr_v2.0/rec_chinese_common_train_v2.0.yml     -o Global.checkpoints=./output/rec_chinese_common_v2.0/best_accuracy.pdparams
/home/aistudio/PaddleOCR-----------  Configuration Arguments -----------backend: autoelastic_server: Noneforce: Falsegpus: Noneheter_devices: heter_worker_num: Noneheter_workers: host: Nonehttp_port: Noneips: 127.0.0.1job_id: Nonelog_dir: lognp: Nonenproc_per_node: Nonerun_mode: Nonescale: 0server_num: Noneservers: training_script: tools/eval.pytraining_script_args: ['-c', 'configs/rec/ch_ppocr_v2.0/rec_chinese_common_train_v2.0.yml', '-o', 'Global.checkpoints=./output/rec_chinese_common_v2.0/best_accuracy.pdparams']worker_num: Noneworkers: ------------------------------------------------WARNING 2021-12-31 18:51:19,722 launch.py:423] Not found distinct arguments and compiled with cuda or xpu. Default use collective modelaunch train in GPU mode!INFO 2021-12-31 18:51:19,725 launch_utils.py:528] Local start 1 processes. First process distributed environment info (Only For Debug):     +=======================================================================================+    |                        Distributed Envs                      Value                    |    +---------------------------------------------------------------------------------------+    |                       PADDLE_TRAINER_ID                        0                      |    |                 PADDLE_CURRENT_ENDPOINT                 127.0.0.1:46063               |    |                     PADDLE_TRAINERS_NUM                        1                      |    |                PADDLE_TRAINER_ENDPOINTS                 127.0.0.1:46063               |    |                     PADDLE_RANK_IN_NODE                        0                      |    |                 PADDLE_LOCAL_DEVICE_IDS                        0                      |    |                 PADDLE_WORLD_DEVICE_IDS                        0                      |    |                     FLAGS_selected_gpus                        0                      |    |             FLAGS_selected_accelerators                        0                      |    +=======================================================================================+INFO 2021-12-31 18:51:19,725 launch_utils.py:532] details abouts PADDLE_TRAINER_ENDPOINTS can be found in log/endpoints.log, and detail running logs maybe found in log/workerlog.0launch proc_id:16263 idx:0[2021/12/31 18:51:21] root INFO: Architecture : [2021/12/31 18:51:21] root INFO:     Backbone : [2021/12/31 18:51:21] root INFO:         layers : 34[2021/12/31 18:51:21] root INFO:         name : ResNet[2021/12/31 18:51:21] root INFO:     Head : [2021/12/31 18:51:21] root INFO:         fc_decay : 4e-05[2021/12/31 18:51:21] root INFO:         name : CTCHead[2021/12/31 18:51:21] root INFO:     Neck : [2021/12/31 18:51:21] root INFO:         encoder_type : rnn[2021/12/31 18:51:21] root INFO:         hidden_size : 256[2021/12/31 18:51:21] root INFO:         name : SequenceEncoder[2021/12/31 18:51:21] root INFO:     Transform : None[2021/12/31 18:51:21] root INFO:     algorithm : CRNN[2021/12/31 18:51:21] root INFO:     model_type : rec[2021/12/31 18:51:21] root INFO: Eval : [2021/12/31 18:51:21] root INFO:     dataset : [2021/12/31 18:51:21] root INFO:         data_dir : /home/aistudio/data/data62842/train_images[2021/12/31 18:51:21] root INFO:         label_file_list : ['/home/aistudio/data/data62842/val.txt'][2021/12/31 18:51:21] root INFO:         name : SimpleDataSet[2021/12/31 18:51:21] root INFO:         transforms : [2021/12/31 18:51:21] root INFO:             DecodeImage : [2021/12/31 18:51:21] root INFO:                 channel_first : False[2021/12/31 18:51:21] root INFO:                 img_mode : BGR[2021/12/31 18:51:21] root INFO:             CTCLabelEncode : None[2021/12/31 18:51:21] root INFO:             RecResizeImg : [2021/12/31 18:51:21] root INFO:                 image_shape : [3, 32, 320][2021/12/31 18:51:21] root INFO:             KeepKeys : [2021/12/31 18:51:21] root INFO:                 keep_keys : ['image', 'label', 'length'][2021/12/31 18:51:21] root INFO:     loader : [2021/12/31 18:51:21] root INFO:         batch_size_per_card : 256[2021/12/31 18:51:21] root INFO:         drop_last : False[2021/12/31 18:51:21] root INFO:         num_workers : 8[2021/12/31 18:51:21] root INFO:         shuffle : False[2021/12/31 18:51:21] root INFO: Global : [2021/12/31 18:51:21] root INFO:     cal_metric_during_train : True[2021/12/31 18:51:21] root INFO:     character_dict_path : ppocr/utils/ppocr_keys_v1.txt[2021/12/31 18:51:21] root INFO:     checkpoints : ./output/rec_chinese_common_v2.0/best_accuracy.pdparams[2021/12/31 18:51:21] root INFO:     debug : False[2021/12/31 18:51:21] root INFO:     distributed : False[2021/12/31 18:51:21] root INFO:     epoch_num : 500[2021/12/31 18:51:21] root INFO:     eval_batch_step : [0, 2000][2021/12/31 18:51:21] root INFO:     infer_img : doc/imgs_words/ch/word_1.jpg[2021/12/31 18:51:21] root INFO:     infer_mode : False[2021/12/31 18:51:21] root INFO:     log_smooth_window : 20[2021/12/31 18:51:21] root INFO:     max_text_length : 25[2021/12/31 18:51:21] root INFO:     pretrained_model : ./ch_ppocr_server_v2.0_rec_pre/best_accuracy[2021/12/31 18:51:21] root INFO:     print_batch_step : 10[2021/12/31 18:51:21] root INFO:     save_epoch_step : 3[2021/12/31 18:51:21] root INFO:     save_inference_dir : None[2021/12/31 18:51:21] root INFO:     save_model_dir : ./output/rec_chinese_common_v2.0[2021/12/31 18:51:21] root INFO:     save_res_path : ./output/rec/predicts_chinese_common_v2.0.txt[2021/12/31 18:51:21] root INFO:     use_gpu : True[2021/12/31 18:51:21] root INFO:     use_space_char : True[2021/12/31 18:51:21] root INFO:     use_visualdl : False[2021/12/31 18:51:21] root INFO: Loss : [2021/12/31 18:51:21] root INFO:     name : CTCLoss[2021/12/31 18:51:21] root INFO: Metric : [2021/12/31 18:51:21] root INFO:     main_indicator : acc[2021/12/31 18:51:21] root INFO:     name : RecMetric[2021/12/31 18:51:21] root INFO: Optimizer : [2021/12/31 18:51:21] root INFO:     beta1 : 0.9[2021/12/31 18:51:21] root INFO:     beta2 : 0.999[2021/12/31 18:51:21] root INFO:     lr : [2021/12/31 18:51:21] root INFO:         learning_rate : 0.001[2021/12/31 18:51:21] root INFO:         name : Cosine[2021/12/31 18:51:21] root INFO:         warmup_epoch : 5[2021/12/31 18:51:21] root INFO:     name : Adam[2021/12/31 18:51:21] root INFO:     regularizer : [2021/12/31 18:51:21] root INFO:         factor : 4e-05[2021/12/31 18:51:21] root INFO:         name : L2[2021/12/31 18:51:21] root INFO: PostProcess : [2021/12/31 18:51:21] root INFO:     name : CTCLabelDecode[2021/12/31 18:51:21] root INFO: Train : [2021/12/31 18:51:21] root INFO:     dataset : [2021/12/31 18:51:21] root INFO:         data_dir : /home/aistudio/data/data62842/train_images[2021/12/31 18:51:21] root INFO:         label_file_list : ['/home/aistudio/data/data62842/train.txt'][2021/12/31 18:51:21] root INFO:         name : SimpleDataSet[2021/12/31 18:51:21] root INFO:         transforms : [2021/12/31 18:51:21] root INFO:             DecodeImage : [2021/12/31 18:51:21] root INFO:                 channel_first : False[2021/12/31 18:51:21] root INFO:                 img_mode : BGR[2021/12/31 18:51:21] root INFO:             RecAug : None[2021/12/31 18:51:21] root INFO:             CTCLabelEncode : None[2021/12/31 18:51:21] root INFO:             RecResizeImg : [2021/12/31 18:51:21] root INFO:                 image_shape : [3, 32, 320][2021/12/31 18:51:21] root INFO:             KeepKeys : [2021/12/31 18:51:21] root INFO:                 keep_keys : ['image', 'label', 'length'][2021/12/31 18:51:21] root INFO:     loader : [2021/12/31 18:51:21] root INFO:         batch_size_per_card : 256[2021/12/31 18:51:21] root INFO:         drop_last : True[2021/12/31 18:51:21] root INFO:         num_workers : 8[2021/12/31 18:51:21] root INFO:         shuffle : True[2021/12/31 18:51:21] root INFO: profiler_options : None[2021/12/31 18:51:21] root INFO: train with paddle 2.2.1 and device CUDAPlace(0)[2021/12/31 18:51:21] root INFO: Initialize indexs of datasets:['/home/aistudio/data/data62842/val.txt']W1231 18:51:21.482865 16263 device_context.cc:447] Please NOTE: device: 0, GPU Compute Capability: 7.0, Driver API Version: 10.1, Runtime API Version: 10.1W1231 18:51:21.487445 16263 device_context.cc:465] device: 0, cuDNN Version: 7.6.[2021/12/31 18:51:26] root INFO: resume from ./output/rec_chinese_common_v2.0/best_accuracy[2021/12/31 18:51:26] root INFO: metric in ckpt ***************[2021/12/31 18:51:26] root INFO: acc:0.6035998792800241[2021/12/31 18:51:26] root INFO: norm_edit_dis:0.8053270782756357[2021/12/31 18:51:26] root INFO: fps:438.9587163608945[2021/12/31 18:51:26] root INFO: best_epoch:23[2021/12/31 18:51:26] root INFO: start_epoch:24eval model::   0%|          | 0/20 [00:00<?, ?it/s]eval model::   5%|▌         | 1/20 [00:02<00:54,  2.88s/it]eval model::  10%|█         | 2/20 [00:04<00:43,  2.42s/it]eval model::  15%|█▌        | 3/20 [00:05<00:35,  2.10s/it]eval model::  20%|██        | 4/20 [00:06<00:29,  1.87s/it]eval model::  25%|██▌       | 5/20 [00:08<00:25,  1.71s/it]eval model::  30%|███       | 6/20 [00:09<00:22,  1.60s/it]eval model::  35%|███▌      | 7/20 [00:10<00:19,  1.53s/it]eval model::  40%|████      | 8/20 [00:12<00:17,  1.48s/it]eval model::  45%|████▌     | 9/20 [00:13<00:15,  1.44s/it]eval model::  50%|█████     | 10/20 [00:15<00:14,  1.42s/it]eval model::  55%|█████▌    | 11/20 [00:16<00:12,  1.40s/it]eval model::  60%|██████    | 12/20 [00:17<00:11,  1.39s/it]eval model::  65%|██████▌   | 13/20 [00:19<00:09,  1.38s/it]eval model::  70%|███████   | 14/20 [00:20<00:08,  1.38s/it]eval model::  75%|███████▌  | 15/20 [00:21<00:06,  1.38s/it]eval model::  80%|████████  | 16/20 [00:23<00:05,  1.38s/it]eval model::  85%|████████▌ | 17/20 [00:24<00:04,  1.38s/it]eval model::  90%|█████████ | 18/20 [00:25<00:02,  1.37s/it]eval model::  95%|█████████▌| 19/20 [00:27<00:01,  1.37s/it]eval model:: 100%|██████████| 20/20 [00:28<00:00,  1.17s/it][2021/12/31 18:51:54] root INFO: metric eval ***************[2021/12/31 18:51:54] root INFO: acc:0.6035998792800241[2021/12/31 18:51:54] root INFO: norm_edit_dis:0.8053270782756357[2021/12/31 18:51:54] root INFO: fps:439.3796693669832INFO 2021-12-31 18:51:55,788 launch.py:311] Local processes completed.

七、结果预测

预测脚本使用预测训练好的模型,并将结果保存成txt格式,可以直接送到比赛提交入口测评,文件默认保存在output/rec/predicts_chinese_lite_v2.0.txt

1.提交内容与格式

本次比赛要求参赛选手必须提交使用深度学习平台飞桨(PaddlePaddle)训练的模型。参赛者要求以.txt 文本格式提交结果,其中每一行是图片名称和文字预测的结果,中间以 “t” 作为分割符,示例如下:

new_name value

0.jpg文本0

2. infer_rec.py修改

 with open(save_res_path, "w") as fout: #添加列头 fout.write('new_name' + "t" + 'value' +'n')        for file in get_image_file_list(config['Global']['infer_img']):            logger.info("infer_img: {}".format(file))            with open(file, 'rb') as f:                img = f.read()                data = {'image': img}            batch = transform(data, ops)            if config['Architecture']['algorithm'] == "SRN":                encoder_word_pos_list = np.expand_dims(batch[1], axis=0)                gsrm_word_pos_list = np.expand_dims(batch[2], axis=0)                gsrm_slf_attn_bias1_list = np.expand_dims(batch[3], axis=0)                gsrm_slf_attn_bias2_list = np.expand_dims(batch[4], axis=0)                others = [                    paddle.to_tensor(encoder_word_pos_list),                    paddle.to_tensor(gsrm_word_pos_list),                    paddle.to_tensor(gsrm_slf_attn_bias1_list),                    paddle.to_tensor(gsrm_slf_attn_bias2_list)                ]            if config['Architecture']['algorithm'] == "SAR":                valid_ratio = np.expand_dims(batch[-1], axis=0)                img_metas = [paddle.to_tensor(valid_ratio)]            images = np.expand_dims(batch[0], axis=0)            images = paddle.to_tensor(images)            if config['Architecture']['algorithm'] == "SRN":                preds = model(images, others)            elif config['Architecture']['algorithm'] == "SAR":                preds = model(images, img_metas)            else:                preds = model(images)            post_result = post_process_class(preds)            info = None            if isinstance(post_result, dict):                rec_info = dict()                for key in post_result:                    if len(post_result[key][0]) >= 2:                        rec_info[key] = {                            "label": post_result[key][0][0],                            "score": float(post_result[key][0][1]),                        }                info = json.dumps(rec_info)            else:                if len(post_result[0]) >= 2:                    info = post_result[0][0] + "t" + str(post_result[0][1])            if info is not None:                logger.info("t result: {}".format(info))                # fout.write(file + "t" + info)                # 格式化输出                fout.write(file + "t" + post_result[0][0] +'n')    logger.info("success!")

In [11]

%cd ~/PaddleOCR/# mobile模型# !python tools/infer_rec.py -c configs/rec/ch_ppocr_v2.0/rec_chinese_lite_train_v2.0.yml #     -o Global.infer_img="/home/aistudio/data/data62843/test_images" #     Global.pretrained_model="./output/rec_chinese_lite_v2.0/best_accuracy"# server模型!python tools/infer_rec.py -c configs/rec/ch_ppocr_v2.0/rec_chinese_common_train_v2.0.yml     -o Global.infer_img="/home/aistudio/data/data62843/test_images"     Global.checkpoints=./output/rec_chinese_common_v2.0/best_accuracy

预测日志

[2021/12/30 23:53:50] root INFO:  result: 萧记果点0.66611135[2021/12/30 23:53:50] root INFO: infer_img: /home/aistudio/data/data62843/test_images/9995.jpg[2021/12/30 23:53:50] root INFO:  result: 福0.1693737[2021/12/30 23:53:50] root INFO: infer_img: /home/aistudio/data/data62843/test_images/9996.jpg[2021/12/30 23:53:50] root INFO:  result: 2790.97771764[2021/12/30 23:53:50] root INFO: infer_img: /home/aistudio/data/data62843/test_images/9997.jpg[2021/12/30 23:53:50] root INFO:  result: 公牛装饰开关0.9916236[2021/12/30 23:53:50] root INFO: infer_img: /home/aistudio/data/data62843/test_images/9998.jpg[2021/12/30 23:53:50] root INFO:  result: 专酒0.118371546[2021/12/30 23:53:50] root INFO: infer_img: /home/aistudio/data/data62843/test_images/9999.jpg[2021/12/30 23:53:50] root INFO:  result: 东之家0.871051[2021/12/30 23:53:50] root INFO: success!......

八、基于预测引擎的预测

1.模型大小限制

约束性条件1:模型总大小不超过10MB(以.pdmodel和.pdiparams文件非压缩状态磁盘占用空间之和为准);

2.解决办法

训练过程中保存的模型是checkpoints模型,保存的只有模型的参数,多用于恢复训练等。实际上,此处的约束条件限制的是inference 模型的大小。inference 模型一般是模型训练,把模型结构和模型参数保存在文件中的固化模型,多用于预测部署场景。与checkpoints模型相比,inference 模型会额外保存模型的结构信息,在预测部署、加速推理上性能优越,灵活方便,适合于实际系统集成,模型大小也会小一些。

In [ ]

# 静态模型导出%cd ~/PaddleOCR/# mobile模型# !python tools/export_model.py -c configs/rec/ch_ppocr_v2.0/rec_chinese_lite_train_v2.0.yml -o Global.pretrained_model=./output/rec_chinese_lite_v2.0/best_accuracy.pdparams  Global.save_inference_dir=./inference/rec_inference/# server模型!python tools/export_model.py -c configs/rec/ch_ppocr_v2.0/rec_chinese_common_v2.0.yml -o Global.pretrained_model=./output/rec_chinese_common_train_v2.0/best_accuracy.pdparams  Global.save_inference_dir=./inference/rec_inference/
/home/aistudio/PaddleOCRW1230 23:54:48.747483 13346 device_context.cc:447] Please NOTE: device: 0, GPU Compute Capability: 7.0, Driver API Version: 11.0, Runtime API Version: 10.1W1230 23:54:48.752360 13346 device_context.cc:465] device: 0, cuDNN Version: 7.6.[2021/12/30 23:54:52] root INFO: load pretrain successful from ./output/rec_chinese_lite_v2.0/best_accuracy[2021/12/30 23:54:54] root INFO: inference model is saved to ./inference/rec_inference/inference

In [ ]

%cd ~/PaddleOCR/!du -sh ./inference/rec_inference/
/home/aistudio/PaddleOCR5.2M./inference/rec_inference/

可以看到,当前训练使用的CRNN算法导出inference后,仅有5.2M。导出的inference模型也可以用来预测,预测逻辑如下代码所示。In [ ]

# 使用导出静态模型预测%cd ~/PaddleOCR/!python3.7 tools/infer/predict_rec.py  --rec_model_dir=./inference/rec_inference/  --image_dir="/home/aistudio/data/A榜测试数据集/TestAImages"

预测日志

[2021/12/30 13:20:08] root INFO: Predicts of /home/aistudio/data/A榜测试数据集/TestAImages/TestA_000001.jpg:('MJ', 0.2357887)[2021/12/30 13:20:08] root INFO: Predicts of /home/aistudio/data/A榜测试数据集/TestAImages/TestA_000002.jpg:('中门', 0.7167614)[2021/12/30 13:20:08] root INFO: Predicts of /home/aistudio/data/A榜测试数据集/TestAImages/TestA_000003.jpg:('黄焖鸡米饭', 0.7325407)[2021/12/30 13:20:08] root INFO: Predicts of /home/aistudio/data/A榜测试数据集/TestAImages/TestA_000004.jpg:('加行', 0.06699998)[2021/12/30 13:20:08] root INFO: Predicts of /home/aistudio/data/A榜测试数据集/TestAImages/TestA_000005.jpg:('学商烤面航', 0.40579563)[2021/12/30 13:20:08] root INFO: Predicts of /home/aistudio/data/A榜测试数据集/TestAImages/TestA_000006.jpg:('绿村装机 滋光彩机 CP口出国', 0.38243735)[2021/12/30 13:20:08] root INFO: Predicts of /home/aistudio/data/A榜测试数据集/TestAImages/TestA_000007.jpg:('有酸锁 四好吃', 0.38957664)[2021/12/30 13:20:08] root INFO: Predicts of /home/aistudio/data/A榜测试数据集/TestAImages/TestA_000008.jpg:('婚汽中海', 0.36037388)[2021/12/30 13:20:08] root INFO: Predicts of /home/aistudio/data/A榜测试数据集/TestAImages/TestA_000009.jpg:('L', 0.25453746)[2021/12/30 13:20:08] root INFO: Predicts of /home/aistudio/data/A榜测试数据集/TestAImages/TestA_000010.jpg:('清女装', 0.79736567)[2021/12/30 13:20:08] root INFO: Predicts of /home/aistudio/data/A榜测试数据集/TestAImages/TestA_000011.jpg:('幼小数学视食', 0.50577885)......

九、提交

预测结果保存到配置文件指定的 output/rec/predicts_chinese_lite_v2.0.txt文件,可直接提交即可。

In [12]

%cd ~!head PaddleOCR/output/rec/predicts_chinese_common_v2.0.txt
/home/aistudionew_namevalue0.jpg邦佳洗衣1.jpg不锈钢配件大全10.jpg诊疗科目:中医科100.jpg2101000.jpg电线电缆等1001.jpg201002.jpg进口滤纸 专业制造1003.jpg15065401004.jpgiWoW

1.mobile模型

飞桨常规赛:中文场景文字识别- 12月第8名方案 - 创想鸟

2.server模型

飞桨常规赛:中文场景文字识别- 12月第8名方案 - 创想鸟

大家可以再处理处理,优化优化,多跑几轮。

以上就是飞桨常规赛:中文场景文字识别- 12月第8名方案的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/49905.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月8日 14:22:37
下一篇 2025年11月8日 14:27:22

相关推荐

  • soul怎么发长视频瞬间_Soul长视频瞬间发布方法

    可通过分段发布、格式转换或剪辑压缩三种方法在Soul上传长视频。一、将长视频用相册编辑功能拆分为多个30秒内片段,依次发布并标注“Part 1”“Part 2”保持连贯;二、使用“格式工厂”等工具将视频转为MP4(H.264)、分辨率≤1080p、帧率≤30fps、大小≤50MB,适配平台要求;三、…

    2025年12月6日 软件教程
    400
  • AO3镜像站备用镜像网址_AO3镜像站快速访问官网

    AO3镜像站备用网址包括ao3mirror.com和xiaozhan.icu,当主站archiveofourown.org无法访问时可切换使用,二者均同步更新内容并支持多语言检索与离线下载功能。 AO3镜像站备用镜像网址在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来AO3镜像站快速访问官…

    2025年12月6日 软件教程
    100
  • 天猫app淘金币抵扣怎么使用

    在天猫app购物时,淘金币是一项能够帮助你节省开支的实用功能。掌握淘金币的抵扣使用方法,能让你以更实惠的价格买到心仪商品。 当你选好商品并准备下单时,记得查看商品页面是否支持淘金币抵扣。如果该商品支持此项功能,在提交订单的页面会明确显示相关提示。你会看到淘金币的具体抵扣比例——通常情况下,淘金币可按…

    2025年12月6日 软件教程
    500
  • Pboot插件缓存机制的详细解析_Pboot插件缓存清理的命令操作

    插件功能异常或页面显示陈旧内容可能是缓存未更新所致。PbootCMS通过/runtime/cache/与/runtime/temp/目录缓存插件配置、模板解析结果和数据库查询数据,提升性能但影响调试。解决方法包括:1. 手动删除上述目录下所有文件;2. 后台进入“系统工具”-“缓存管理”,勾选插件、…

    2025年12月6日 软件教程
    100
  • Word2013如何插入SmartArt图形_Word2013SmartArt插入的视觉表达

    答案:可通过四种方法在Word 2013中插入SmartArt图形。一、使用“插入”选项卡中的“SmartArt”按钮,选择所需类型并插入;二、从快速样式库中选择常用模板如组织结构图直接应用;三、复制已有SmartArt图形到目标文档后调整内容与格式;四、将带项目符号的文本选中后右键转换为Smart…

    2025年12月6日 软件教程
    000
  • 《kk键盘》一键发图开启方法

    如何在kk键盘中开启一键发图功能? 1、打开手机键盘,找到并点击“kk”图标。 2、进入工具菜单后,选择“一键发图”功能入口。 3、点击“去开启”按钮,跳转至无障碍服务设置页面。 4、在系统通用设置中,进入“已下载的应用”列表。 j2me3D游戏开发简单教程 中文WORD版 本文档主要讲述的是j2m…

    2025年12月6日 软件教程
    100
  • 怎样用免费工具美化PPT_免费美化PPT的实用方法分享

    利用KIMI智能助手可免费将PPT美化为科技感风格,但需核对文字准确性;2. 天工AI擅长优化内容结构,提升逻辑性,适合高质量内容需求;3. SlidesAI支持语音输入与自动排版,操作便捷,利于紧急场景;4. Prezo提供多种模板,自动生成图文并茂幻灯片,适合学生与初创团队。 如果您有一份内容完…

    2025年12月6日 软件教程
    000
  • Pages怎么协作编辑同一文档 Pages多人实时协作的流程

    首先启用Pages共享功能,点击右上角共享按钮并选择“添加协作者”,设置为可编辑并生成链接;接着复制链接通过邮件或社交软件发送给成员,确保其使用Apple ID登录iCloud后即可加入编辑;也可直接在共享菜单中输入邮箱地址定向邀请,设定编辑权限后发送;最后在共享面板中管理协作者权限,查看实时在线状…

    2025年12月6日 软件教程
    100
  • jm漫画官方正版入口 jm漫画官方网站登录链接

    JM漫画作为一个致力于为广大漫画爱好者服务的全方位的数字漫画阅读平台,凭借其海量的资源储备、卓越的阅读体验和人性化的功能设计,在众多同类平台中脱颖而出。它不仅收录了来自世界各地的热门连载与经典完结作品,更通过智能推荐算法,精准地将符合用户口味的精彩内容呈现眼前,让每一位用户都能在这里找到属于自己的精…

    2025年12月6日 软件教程
    000
  • 怎么下载安装快手极速版_快手极速版下载安装详细教程

    1、优先通过华为应用市场搜索“快手极速版”,确认开发者为北京快手科技有限公司后安装;2、若应用商店无结果,可访问快手极速版官网下载APK文件,需手动开启浏览器的未知来源安装权限;3、也可选择豌豆荚、应用宝等可信第三方平台下载官方版本,核对安全标识后完成安装。 如果您尝试在手机上安装快手极速版,但无法…

    2025年12月6日 软件教程
    000
  • 哔哩哔哩的视频卡在加载中怎么办_哔哩哔哩视频加载卡顿解决方法

    视频加载停滞可先切换网络或重启路由器,再清除B站缓存并重装应用,接着调低播放清晰度并关闭自动选分辨率,随后更改播放策略为AVC编码,最后关闭硬件加速功能以恢复播放。 如果您尝试播放哔哩哔哩的视频,但进度条停滞在加载状态,无法继续播放,这通常是由于网络、应用缓存或播放设置等因素导致。以下是解决此问题的…

    2025年12月6日 软件教程
    000
  • REDMI K90系列正式发布,售价2599元起!

    10月23日,redmi k90系列正式亮相,推出redmi k90与redmi k90 pro max两款新机。其中,redmi k90搭载骁龙8至尊版处理器、7100mah大电池及100w有线快充等多项旗舰配置,起售价为2599元,官方称其为k系列迄今为止最完整的标准版本。 图源:REDMI红米…

    2025年12月6日 行业动态
    200
  • 买家网购苹果手机仅退款不退货遭商家维权,法官调解后支付货款

    10 月 24 日消息,据央视网报道,近年来,“仅退款”服务逐渐成为众多网购平台的常规配置,但部分消费者却将其当作“免费试用”的手段,滥用规则谋取私利。 江苏扬州市民李某在某电商平台购买了一部苹果手机,第二天便以“不想要”为由在线申请“仅退款”,当时手机尚在物流运输途中。第三天货物送达后,李某签收了…

    2025年12月6日 行业动态
    000
  • Linux中如何安装Nginx服务_Linux安装Nginx服务的完整指南

    首先更新系统软件包,然后通过对应包管理器安装Nginx,启动并启用服务,开放防火墙端口,最后验证欢迎页显示以确认安装成功。 在Linux系统中安装Nginx服务是搭建Web服务器的第一步。Nginx以高性能、低资源消耗和良好的并发处理能力著称,广泛用于静态内容服务、反向代理和负载均衡。以下是在主流L…

    2025年12月6日 运维
    000
  • 当贝X5S怎样看3D

    当贝X5S观看3D影片无立体效果时,需开启3D模式并匹配格式:1. 播放3D影片时按遥控器侧边键,进入快捷设置选择3D模式;2. 根据片源类型选左右或上下3D格式;3. 可通过首页下拉进入电影专区选择3D内容播放;4. 确认片源为Side by Side或Top and Bottom格式,并使用兼容…

    2025年12月6日 软件教程
    100
  • Linux journalctl与systemctl status结合分析

    先看 systemctl status 确认服务状态,再用 journalctl 查看详细日志。例如 nginx 启动失败时,systemctl status 显示 Active: failed,journalctl -u nginx 发现端口 80 被占用,结合两者可快速定位问题根源。 在 Lin…

    2025年12月6日 运维
    100
  • 华为新机发布计划曝光:Pura 90系列或明年4月登场

    近日,有数码博主透露了华为2025年至2026年的新品规划,其中pura 90系列预计在2026年4月发布,有望成为华为新一代影像旗舰。根据路线图,华为将在2025年底至2026年陆续推出mate 80系列、折叠屏新机mate x7系列以及nova 15系列,而pura 90系列则将成为2026年上…

    2025年12月6日 行业动态
    100
  • TikTok视频无法下载怎么办 TikTok视频下载异常修复方法

    先检查链接格式、网络设置及工具版本。复制以https://www.tiktok.com/@或vm.tiktok.com开头的链接,删除?后参数,尝试短链接;确保网络畅通,可切换地区节点或关闭防火墙;更新工具至最新版,优先选用yt-dlp等持续维护的工具。 遇到TikTok视频下载不了的情况,别急着换…

    2025年12月6日 软件教程
    100
  • Linux如何防止缓冲区溢出_Linux防止缓冲区溢出的安全措施

    缓冲区溢出可通过栈保护、ASLR、NX bit、安全编译选项和良好编码实践来防范。1. 使用-fstack-protector-strong插入canary检测栈破坏;2. 启用ASLR(kernel.randomize_va_space=2)随机化内存布局;3. 利用NX bit标记不可执行内存页…

    2025年12月6日 运维
    000
  • 2025年双十一买手机选直板机还是选折叠屏?建议看完这篇再做决定

    随着2025年双十一购物节的临近,许多消费者在选购智能手机时都会面临一个共同的问题:是选择传统的直板手机,还是尝试更具科技感的折叠屏设备?其实,这个问题的答案早已在智能手机行业的演进中悄然浮现——如今的手机市场已不再局限于“拼参数、堆配置”的初级竞争,而是迈入了以形态革新驱动用户体验升级的新时代。而…

    2025年12月6日 行业动态
    000

发表回复

登录后才能评论
关注微信