На основе PaddleOCR2.4 [Регулярный сезон: распознавание текста китайской сцены]

искусственный интеллект глубокое обучение

1. Регулярный сезон: распознавание текста на китайском языке

Адрес конкурса:Студия любви Baidu.com/love studio/co…

1. Введение в конкурс

Технология распознавания текста китайской сцены привлекла большое внимание в повседневной жизни людей и имеет множество сценариев применения, таких как перевод фотографий, поиск изображений, понимание сцены и т. д. Однако текст в сценах на китайском языке сталкивается со сложными ситуациями, включая изменение освещения, низкое разрешение, разнообразие шрифтов и компоновки, а также множество типов китайских иероглифов. Как решить вышеуказанные проблемы становится чрезвычайно сложной задачей.

Регулярный сезон распознавания текста китайской сцены был недавно обновлен, чтобы предоставлять облегченные данные распознавания текста китайской сцены.Игроки должны использовать рамку весла, чтобы предсказывать текстовые строки в области изображения и возвращать содержимое текстовых строк.

2. Описание набора данных

Набор данных для этого конкурса включает в себя в общей сложности 60 000 изображений, из которых 50 000 используются в качестве тренировочного набора, а 10 000 — в качестве тестового набора. Набор данных собирается из просмотра улиц в Китае и формируется путем извлечения областей текстовых строк (таких как вывески магазинов, ориентиры и т. д.) на изображениях просмотра улиц.

Введение конкретных данных

Все изображения в наборе данных прошли некоторую предварительную обработку, как показано на изображении ниже:

https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/f10f5de0c2dc4f848e7ffdc311467983~tplv-k3u1fbpfcp-zoom-1.image

(a) Этикетка: Бильярдный клуб Джойс

https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/70dd2274ef17459dad793ecf9c76527d~tplv-k3u1fbpfcp-zoom-1.image

(b) Этикетка: Shanghai Chuangke Pump Manufacturing Co., Ltd.

Файл аннотации

Файл аннотации, предоставляемый платформой, имеет формат файла .csv, а четыре столбца в файле — это ширина, высота, имя файла и текстовая аннотация изображения соответственно. Пример выглядит следующим образом:

name value
0.jpg текст 0
-------- --------
1.jpg текст 0

2. Параметры среды

PaddleOCR GitHub.com/paddle pad DL…Это самая мощная библиотека инструментов OCR во вселенной, она работает сразу и очень быстро.

# 从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
%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.sh

10 directories, 9 files

3. Подготовка данных

Сообщается, что набор данных поезда содержит в общей сложности 100 000 фрагментов, распакованных и разделенных на 10 000 фрагментов в качестве тестового набора.

1. Загрузка и распаковка данных

#  解压缩数据集
%cd ~
!unzip -qa data/data62842/train_images.zip -d data/data62842/
!unzip -qa data/data62843/test_images.zip -d data/data62843/
/home/aistudio
# 使用命令查看训练数据文件夹下数据量是否是5万张
!cd ~/data/data62842/train_images  &&  ls -l | grep "^-" | wc -l
50000
# 使用命令查看test数据文件夹下数据量是否是1万张
!cd ~/data/data62843/test_images  &&  ls -l | grep "^-" | wc -l
10000

2. Разделение набора данных

# 读取数据列表文件
import pandas as pd
%cd ~
data_label=pd.read_csv('data/data62842/train_label.csv', encoding='gb2312')
data_label.head()
/home/aistudio
.dataframe tbody tr th:only-of-type { vertical-align: middle; } .dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; }
name value
0 0.jpg Лала
1 1.jpg № 6
2 2.jpg толстый
3 3.jpg Главный магазин Цяньмэнь Дашилань
4 4.jpg Вы приходите в пик сезона
# 对数据列表文件进行划分
%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)
# 查看数量
print(train.shape)
print(val.shape)
(45000, 2)
(5000, 2)
!head val.txt
45000.jpg	责任单位:北京市环清环卫设施维修
45001.jpg	眼镜
45002.jpg	光临
45003.jpg	主治
45004.jpg	菜饭骨头汤
45005.jpg	理
45006.jpg	要多者提前预定
45007.jpg	干洗湿洗
45008.jpg	画布咖啡
45009.jpg	电焊、气割、专业自卸车
!head train.txt
0.jpg	拉拉
1.jpg	6号
2.jpg	胖胖
3.jpg	前门大栅栏总店
4.jpg	你来就是旺季
5.jpg	毛衣厂家直销
6.jpg	13761916218
7.jpg	福鼎白茶
8.jpg	妍心美容
9.jpg	童车童床

В-четвертых, настройте параметры тренировки

Настройка на основе PaddleOCR/configs/rec/ch_ppocr_v2.0/rec_chinese_lite_train_v2.0.yml

1. Настройте сеть модели

Используя алгоритм CRNN, магистраль — 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:4
Eval.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.txt


Optimizer:
  name: Adam
  beta1: 0.9
  beta2: 0.999
  lr:
    name: Cosine
    learning_rate: 0.001
    warmup_epoch: 5
  regularizer:
    name: 'L2'
    factor: 0.00001

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

Loss:
  name: CTCLoss

PostProcess:
  name: CTCLabelDecode

Metric:
  name: RecMetric
  main_indicator: acc

Train:
  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: 8

Eval:
  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

6. Используйте предварительно обученную модель

Сообщается, что при использовании предварительно обученной модели скорость обучения выше! ! !

Загружаемые модели из PaddleOCR включают推理模型,训练模型,预训练模型,slim模型, различия моделей объясняются следующим образом:

тип модели Формат модели Введение
модель вывода inference.pdmodel, inference.pdiparams для предиктивного вывода двигателя,Подробности
обучающая модель, предтренировочная модель *.pdparams, *.pdopt, *.states Параметры, состояние оптимизатора и промежуточная обучающая информация модели, сохраненные в процессе обучения, в основном используются для оценки индикаторов модели и обучения восстановлению.
стройная модель *.nb Модель, сжатая с помощью инструмента сжатия модели PaddleSlim, подходит для сквозных сценариев развертывания, таких как мобильные терминалы/терминалы IoT (требуется развертывание Paddle Lite).

Взаимосвязь различных моделей показана на диаграмме ниже.

модель обнаружения текста

наименование модели Введение модели конфигурационный файл Размер модели вывода ссылка для скачивания
ch_ppocr_mobile_slim_v2.0_det Тонкая укороченная версия сверхлегкой модели поддерживает распознавание текста на китайском, английском и нескольких языках. ch_det_mv3_db_v2.0.yml 2.6M модель вывода
ch_ppocr_mobile_v2.0_det Оригинальная сверхлегкая модель поддерживает обнаружение текста на китайском, английском и многоязычном языках. ch_det_mv3_db_v2.0.yml 3M модель вывода / Обучите модель
ch_ppocr_server_v2.0_det Общая модель, поддерживает китайский и английский языки, многоязычное обнаружение текста, больше, чем сверхлегкая модель, но лучше ch_det_res18_db_v2.0.yml 47M модель вывода / Обучите модель

модель распознавания текста

Китайская модель распознавания
наименование модели Введение модели конфигурационный файл Размер модели вывода ссылка для скачивания
ch_ppocr_mobile_slim_v2.0_rec Тонкая и количественная версия сверхлегкой модели, поддержка китайского и английского языков, цифровое распознавание rec_chinese_lite_train_v2.0.yml 6M модель вывода / Обучите модель
ch_ppocr_mobile_v2.0_rec Оригинальная сверхлегкая модель, поддержка китайского и английского языков, распознавание номеров rec_chinese_lite_train_v2.0.yml 5.2M модель вывода / Обучите модель / предварительно обученная модель
ch_ppocr_server_v2.0_rec Универсальная модель, поддержка китайского и английского языков, распознавание номеров rec_chinese_common_train_v2.0.yml 94.8M модель вывода / Обучите модель / предварительно обученная модель

инструкция: 训练模型Это модель, полученная путем точной настройки на основе предварительно обученной модели на реальных данных и вертикальных синтетических текстовых данных, и имеет лучшую производительность в реальных сценариях приложений.预训练模型Он напрямую основан на полном объеме реальных данных и обучении на синтетических данных, что больше подходит для тонкой настройки на собственном наборе данных.

Английская модель распознавания
наименование модели Введение модели конфигурационный файл Размер модели вывода ссылка для скачивания
en_number_mobile_slim_v2.0_rec Тонкая квантованная версия сверхлегкой модели с поддержкой английского и цифрового распознавания. rec_en_number_lite_train.yml 2.7M модель вывода / Обучите модель
en_number_mobile_v2.0_rec Оригинальная сверхлегкая модель, поддерживающая английский язык и цифровое распознавание rec_en_number_lite_train.yml 2.6M модель вывода / Обучите модель

%cd ~/PaddleOCR/
!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
/home/aistudio/PaddleOCR
--2021-12-30 17:57:27--  https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_rec_pre.tar
Resolving paddleocr.bj.bcebos.com (paddleocr.bj.bcebos.com)... 182.61.200.229, 182.61.200.195, 2409:8c04:1001:1002:0:ff:b001:368a
Connecting to paddleocr.bj.bcebos.com (paddleocr.bj.bcebos.com)|182.61.200.229|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 16130750 (15M) [application/x-tar]
Saving to: ‘ch_ppocr_mobile_v2.0_rec_pre.tar’

ch_ppocr_mobile_v2. 100%[===================>]  15.38M  21.9MB/s    in 0.7s    

2021-12-30 17:57:28 (21.9 MB/s) - ‘ch_ppocr_mobile_v2.0_rec_pre.tar’ saved [16130750/16130750]

5. Обучение

%cd ~/PaddleOCR/
!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

1. Выберите подходящий размер партии

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.51517
eval 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 локальноpip install visualdl
  • Загрузить журналы на локальный
  • запустить визуализацию visualdlvisualdl --logdir ./
  • Откройте браузер для просмотра http://localhost:8040/

6. Оценка модели

# GPU 评估, Global.checkpoints 为待测权重
%cd ~/PaddleOCR/
!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
/home/aistudio/PaddleOCR
-----------  Configuration Arguments -----------
backend: auto
elastic_server: None
force: False
gpus: None
heter_devices: 
heter_worker_num: None
heter_workers: 
host: None
http_port: None
ips: 127.0.0.1
job_id: None
log_dir: log
np: None
nproc_per_node: None
run_mode: None
scale: 0
server_num: None
servers: 
training_script: tools/eval.py
training_script_args: ['-c', 'configs/rec/ch_ppocr_v2.0/rec_chinese_lite_train_v2.0.yml', '-o', 'Global.checkpoints=./output/rec_chinese_lite_v2.0/latest']
worker_num: None
workers: 
------------------------------------------------
WARNING 2021-12-31 11:38:43,737 launch.py:423] Not found distinct arguments and compiled with cuda or xpu. Default use collective mode
launch train in GPU mode!
INFO 2021-12-31 11:38:43,740 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:33326               |
    |                     PADDLE_TRAINERS_NUM                        1                      |
    |                PADDLE_TRAINER_ENDPOINTS                 127.0.0.1:33326               |
    |                     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 11:38:43,740 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.0
launch proc_id:3811 idx:0
[2021/12/31 11:38:45] root INFO: Architecture : 
[2021/12/31 11:38:45] root INFO:     Backbone : 
[2021/12/31 11:38:45] root INFO:         model_name : small
[2021/12/31 11:38:45] root INFO:         name : MobileNetV3
[2021/12/31 11:38:45] root INFO:         scale : 0.5
[2021/12/31 11:38:45] root INFO:         small_stride : [1, 2, 2, 2]
[2021/12/31 11:38:45] root INFO:     Head : 
[2021/12/31 11:38:45] root INFO:         fc_decay : 1e-05
[2021/12/31 11:38:45] root INFO:         name : CTCHead
[2021/12/31 11:38:45] root INFO:     Neck : 
[2021/12/31 11:38:45] root INFO:         encoder_type : rnn
[2021/12/31 11:38:45] root INFO:         hidden_size : 48
[2021/12/31 11:38:45] root INFO:         name : SequenceEncoder
[2021/12/31 11:38:45] root INFO:     Transform : None
[2021/12/31 11:38:45] root INFO:     algorithm : CRNN
[2021/12/31 11:38:45] root INFO:     model_type : rec
[2021/12/31 11:38:45] root INFO: Eval : 
[2021/12/31 11:38:45] root INFO:     dataset : 
[2021/12/31 11:38:45] root INFO:         data_dir : /home/aistudio/data/data62842/train_images
[2021/12/31 11:38:45] root INFO:         label_file_list : ['/home/aistudio/data/data62842/val.txt']
[2021/12/31 11:38:45] root INFO:         name : SimpleDataSet
[2021/12/31 11:38:45] root INFO:         transforms : 
[2021/12/31 11:38:45] root INFO:             DecodeImage : 
[2021/12/31 11:38:45] root INFO:                 channel_first : False
[2021/12/31 11:38:45] root INFO:                 img_mode : BGR
[2021/12/31 11:38:45] root INFO:             CTCLabelEncode : None
[2021/12/31 11:38:45] root INFO:             RecResizeImg : 
[2021/12/31 11:38:45] root INFO:                 image_shape : [3, 32, 320]
[2021/12/31 11:38:45] root INFO:             KeepKeys : 
[2021/12/31 11:38:45] root INFO:                 keep_keys : ['image', 'label', 'length']
[2021/12/31 11:38:45] root INFO:     loader : 
[2021/12/31 11:38:45] root INFO:         batch_size_per_card : 256
[2021/12/31 11:38:45] root INFO:         drop_last : False
[2021/12/31 11:38:45] root INFO:         num_workers : 8
[2021/12/31 11:38:45] root INFO:         shuffle : False
[2021/12/31 11:38:45] root INFO: Global : 
[2021/12/31 11:38:45] root INFO:     cal_metric_during_train : True
[2021/12/31 11:38:45] root INFO:     character_dict_path : ppocr/utils/ppocr_keys_v1.txt
[2021/12/31 11:38:45] root INFO:     checkpoints : ./output/rec_chinese_lite_v2.0/latest
[2021/12/31 11:38:45] root INFO:     debug : False
[2021/12/31 11:38:45] root INFO:     distributed : False
[2021/12/31 11:38:45] root INFO:     epoch_num : 500
[2021/12/31 11:38:45] root INFO:     eval_batch_step : [0, 2000]
[2021/12/31 11:38:45] root INFO:     infer_img : doc/imgs_words/ch/word_1.jpg
[2021/12/31 11:38:45] root INFO:     infer_mode : False
[2021/12/31 11:38:45] root INFO:     log_smooth_window : 20
[2021/12/31 11:38:45] root INFO:     max_text_length : 25
[2021/12/31 11:38:45] root INFO:     pretrained_model : ./ch_ppocr_mobile_v2.0_rec_pre/best_accuracy
[2021/12/31 11:38:45] root INFO:     print_batch_step : 10
[2021/12/31 11:38:45] root INFO:     save_epoch_step : 3
[2021/12/31 11:38:45] root INFO:     save_inference_dir : None
[2021/12/31 11:38:45] root INFO:     save_model_dir : ./output/rec_chinese_lite_v2.0
[2021/12/31 11:38:45] root INFO:     save_res_path : ./output/rec/predicts_chinese_lite_v2.0.txt
[2021/12/31 11:38:45] root INFO:     use_gpu : True
[2021/12/31 11:38:45] root INFO:     use_space_char : True
[2021/12/31 11:38:45] root INFO:     use_visualdl : True
[2021/12/31 11:38:45] root INFO: Loss : 
[2021/12/31 11:38:45] root INFO:     name : CTCLoss
[2021/12/31 11:38:45] root INFO: Metric : 
[2021/12/31 11:38:45] root INFO:     main_indicator : acc
[2021/12/31 11:38:45] root INFO:     name : RecMetric
[2021/12/31 11:38:45] root INFO: Optimizer : 
[2021/12/31 11:38:45] root INFO:     beta1 : 0.9
[2021/12/31 11:38:45] root INFO:     beta2 : 0.999
[2021/12/31 11:38:45] root INFO:     lr : 
[2021/12/31 11:38:45] root INFO:         learning_rate : 0.001
[2021/12/31 11:38:45] root INFO:         name : Cosine
[2021/12/31 11:38:45] root INFO:         warmup_epoch : 5
[2021/12/31 11:38:45] root INFO:     name : Adam
[2021/12/31 11:38:45] root INFO:     regularizer : 
[2021/12/31 11:38:45] root INFO:         factor : 1e-05
[2021/12/31 11:38:45] root INFO:         name : L2
[2021/12/31 11:38:45] root INFO: PostProcess : 
[2021/12/31 11:38:45] root INFO:     name : CTCLabelDecode
[2021/12/31 11:38:45] root INFO: Train : 
[2021/12/31 11:38:45] root INFO:     dataset : 
[2021/12/31 11:38:45] root INFO:         data_dir : /home/aistudio/data/data62842/train_images
[2021/12/31 11:38:45] root INFO:         label_file_list : ['/home/aistudio/data/data62842/train.txt']
[2021/12/31 11:38:45] root INFO:         name : SimpleDataSet
[2021/12/31 11:38:45] root INFO:         transforms : 
[2021/12/31 11:38:45] root INFO:             DecodeImage : 
[2021/12/31 11:38:45] root INFO:                 channel_first : False
[2021/12/31 11:38:45] root INFO:                 img_mode : BGR
[2021/12/31 11:38:45] root INFO:             RecAug : None
[2021/12/31 11:38:45] root INFO:             CTCLabelEncode : None
[2021/12/31 11:38:45] root INFO:             RecResizeImg : 
[2021/12/31 11:38:45] root INFO:                 image_shape : [3, 32, 320]
[2021/12/31 11:38:45] root INFO:             KeepKeys : 
[2021/12/31 11:38:45] root INFO:                 keep_keys : ['image', 'label', 'length']
[2021/12/31 11:38:45] root INFO:     loader : 
[2021/12/31 11:38:45] root INFO:         batch_size_per_card : 256
[2021/12/31 11:38:45] root INFO:         drop_last : True
[2021/12/31 11:38:45] root INFO:         num_workers : 8
[2021/12/31 11:38:45] root INFO:         shuffle : True
[2021/12/31 11:38:45] root INFO: profiler_options : None
[2021/12/31 11:38:45] root INFO: train with paddle 2.2.1 and device CUDAPlace(0)
[2021/12/31 11:38:45] root INFO: Initialize indexs of datasets:['/home/aistudio/data/data62842/val.txt']
W1231 11:38:45.574332  3811 device_context.cc:447] Please NOTE: device: 0, GPU Compute Capability: 7.0, Driver API Version: 10.1, Runtime API Version: 10.1
W1231 11:38:45.579066  3811 device_context.cc:465] device: 0, cuDNN Version: 7.6.
[2021/12/31 11:38:50] root INFO: resume from ./output/rec_chinese_lite_v2.0/latest
[2021/12/31 11:38:50] root INFO: metric in ckpt ***************
[2021/12/31 11:38:50] root INFO: acc:0.48179990364001923
[2021/12/31 11:38:50] root INFO: start_epoch:72
[2021/12/31 11:38:50] root INFO: norm_edit_dis:0.7096561279006699
[2021/12/31 11:38:50] root INFO: fps:4618.199275059127
[2021/12/31 11:38:50] root INFO: best_epoch:46

eval model::   0%|          | 0/20 [00:00<?, ?it/s]
eval model::   5%|▌         | 1/20 [00:03<01:12,  3.79s/it]
eval model::  10%|█         | 2/20 [00:04<00:52,  2.92s/it]
eval model::  15%|█▌        | 3/20 [00:05<00:38,  2.29s/it]
eval model::  20%|██        | 4/20 [00:06<00:29,  1.85s/it]
eval model::  25%|██▌       | 5/20 [00:07<00:23,  1.54s/it]
eval model::  30%|███       | 6/20 [00:07<00:18,  1.32s/it]
eval model::  35%|███▌      | 7/20 [00:08<00:15,  1.17s/it]
eval model::  40%|████      | 8/20 [00:09<00:12,  1.07s/it]
eval model::  45%|████▌     | 9/20 [00:10<00:10,  1.00it/s]
eval model::  50%|█████     | 10/20 [00:11<00:09,  1.06it/s]
eval model::  55%|█████▌    | 11/20 [00:12<00:08,  1.10it/s]
eval model::  60%|██████    | 12/20 [00:12<00:07,  1.14it/s]
eval model::  65%|██████▌   | 13/20 [00:13<00:06,  1.16it/s]
eval model::  70%|███████   | 14/20 [00:14<00:05,  1.19it/s]
eval model::  75%|███████▌  | 15/20 [00:15<00:04,  1.20it/s]
eval model::  80%|████████  | 16/20 [00:16<00:03,  1.21it/s]
eval model::  85%|████████▌ | 17/20 [00:16<00:02,  1.21it/s]
eval model::  90%|█████████ | 18/20 [00:17<00:01,  1.22it/s]
eval model::  95%|█████████▌| 19/20 [00:18<00:00,  1.22it/s]
eval model:: 100%|██████████| 20/20 [00:19<00:00,  1.41it/s]
[2021/12/31 11:39:09] root INFO: metric eval ***************
[2021/12/31 11:39:09] root INFO: acc:0.4737999052400189
[2021/12/31 11:39:09] root INFO: norm_edit_dis:0.706719055893877
[2021/12/31 11:39:09] root INFO: fps:4160.243256411111
INFO 2021-12-31 11:39:10,794 launch.py:311] Local processes completed.

7. Прогноз результатов

Сценарий прогнозирования использует предсказанную обученную модель и сохраняет результаты в формате 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!")
%cd ~/PaddleOCR/
!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"
[2021/12/31 11:52:29] root INFO: infer_img: /home/aistudio/data/data62843/test_images/9401.jpg

журнал прогнозов

[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: 279	0.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!
...
...

8. Прогнозирование на основе механизма прогнозирования

1. Ограничение размера модели

Ограничение 1: общий размер модели не превышает 10 МБ (исходя из суммы несжатого дискового пространства файлов .pdmodel и .pdiparams);

2. Решения

Модель, сохраненная в процессе обучения, является моделью контрольных точек, и сохраняются только параметры модели, которые в основном используются для возобновления обучения. По сути, ограничения здесь ограничивают размер модели вывода. Модель логического вывода обычно представляет собой обучение модели, твердую модель, которая сохраняет структуру модели и параметры модели в файле и в основном используется для прогнозирования сценариев развертывания. По сравнению с моделью контрольных точек, модель логического вывода дополнительно сохраняет структурную информацию модели. Она имеет превосходную производительность в прогнозировании развертывания и ускорении логического вывода, а также является гибкой и удобной. Она подходит для фактической системной интеграции, а размер модели будет меньше.

# 静态模型导出
%cd ~/PaddleOCR/
!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/
/home/aistudio/PaddleOCR
W1230 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.1
W1230 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
%cd ~/PaddleOCR/
!du -sh ./inference/rec_inference/
/home/aistudio/PaddleOCR
5.2M	./inference/rec_inference/
  • Можно видеть, что после того, как алгоритм CRNN, используемый в настоящее время для обучения, выводит вывод, остается только 5,2 млн.
  • Экспортированную модель вывода также можно использовать для прогнозирования, а логика прогнозирования показана в следующем коде.
# 使用导出静态模型预测
%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)
...
...

9. Отправить

Результаты прогнозирования сохраняются в файле output/rec/predicts_chinese_lite_v2.0.txt, указанном в файле конфигурации, который можно отправить напрямую.

%cd ~
!head PaddleOCR/output/rec/predicts_chinese_lite_v2.0.txt
/home/aistudio
new_name	value
0.jpg	邦佳洗衣
1.jpg	不锈钢配件大全
10.jpg	诊疗科目:中医科
100.jpg	210
1000.jpg	电线电装等
1001.jpg	20
1002.jpg	进口湖纸 专业制造
1003.jpg	1567C
1004.jpg	iTNoW

Отправьте свой результат. . . Относительно низкий, вы можете ссылаться на предыдущую пост-обработку данных, такую ​​​​как удаление пробелов, использование заглавных букв, а также полную и половинную ширину для оптимизации.