PaddleOCR entrena su propio conjunto de datos

Tabla de contenido

Herramienta de etiquetado 1.PPOCRLabel

2. Entrene el modelo de detección de texto

2.1 Preparar los datos de la imagen de entrenamiento y probar los datos de la imagen

2.2 Label.txt para entrenamiento y label.txt para pruebas

2.3 Descargar el modelo previamente entrenado

2.4 Modificar el archivo de configuración

2.5 empezar a entrenar

2.6 Entrenamiento de breakpoint

2.7 Evaluación de indicadores

2.8 Resultados de la prueba

3. Entrena el modelo de reconocimiento de texto

3.1 Preparación de datos

3.2 Preparar el diccionario

3.3 Descargar el modelo y el archivo de configuración entrenados previamente

3.4 Modificar el archivo de configuración

3.5 Iniciar entrenamiento

3.6 Evaluación

3.7 Pronóstico


Herramienta de etiquetado 1.PPOCRLabel

La herramienta de etiquetado PPOCRLabel está en la carpeta github de PaddleOCR y se puede instalar con las instrucciones en github: https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.0/PPOCRLabel/README_ch.md

Una vez completada la instalación, utilice la herramienta para marcar su propio conjunto de datos. Una vez completada la marca, obtendrá principalmente el siguiente contenido.

Label.txt: este es el nombre de la ruta de la imagen, así como las cuatro coordenadas de la etiqueta de texto y el cuadro rectangular, que se utilizan para entrenar el modelo de detección. Tenga en cuenta que todas las imágenes se colocan en un txt, no una imagen corresponde a un txt.

rec_gt.txt: Dentro está cada subimagen recortada y el contenido de texto correspondiente, que se utiliza para entrenar el modelo de reconocimiento.

crop_img: la subimagen recortada se almacena en el interior.

2. Entrene el modelo de detección de texto

2.1 Preparar los datos de la imagen de entrenamiento y probar los datos de la imagen

Aquí coloco todos los datos de entrenamiento de detección de texto en la carpeta det_train_images y los datos de prueba de detección de texto en la carpeta det_test_images.

2.2 Label.txt para entrenamiento y label.txt para pruebas

Aquí nombré el txt correspondiente a la imagen de entrenamiento det_train_label.txt, y el txt correspondiente a la imagen de prueba det_test_label.txt

2.3 Descargar el modelo previamente entrenado

Primero descargue el modelo ba. Primero descargue el modelo de preentrenamiento de la columna vertebral del modelo. El modelo de detección de PaddleOCR actualmente admite dos redes troncales, a saber, MobileNetV3 y ResNet50_vd. Puede usar el modelo en PaddleClas para reemplazar la columna vertebral según sus necesidades .

cd PaddleOCR/
# 下载MobileNetV3的预训练模型
wget -P ./pretrain_models/ https://paddle-imagenet-models-name.bj.bcebos.com/MobileNetV3_large_x0_5_pretrained.tar
# 下载ResNet50的预训练模型
wget -P ./pretrain_models/ https://paddle-imagenet-models-name.bj.bcebos.com/ResNet50_vd_ssld_pretrained.tar
# 解压预训练模型文件,以MobileNetV3为例
tar -xf ./pretrain_models/MobileNetV3_large_x0_5_pretrained.tar ./pretrain_models/
# 注:正确解压backbone预训练权重文件后,文件夹下包含众多以网络层命名的权重文件,格式如下:
./pretrain_models/MobileNetV3_large_x0_5_pretrained/
  └─ conv_last_bn_mean
  └─ conv_last_bn_offset
  └─ conv_last_bn_scale
  └─ conv_last_bn_variance
  └─ ......

Si no puede conectarse a la descarga usando wget anterior, puede copiar directamente la siguiente URL en el navegador y descargarla en el navegador.

2.4 Modificar el archivo de configuración

Aquí tomamos MobileNetV3 como ejemplo. Necesita modificar los datos de entrenamiento y probar las rutas de datos en el archivo configs / det / det_mv3_db.yml a su propia ruta. Si está utilizando el entorno de la ventana acoplable, cuando modifique la ruta, Debería prestar atención a modificarlo al que está en el entorno docke.

Train:
  dataset:
    name: SimpleDataSet
    data_dir: /paddle
    label_file_list:
      - /paddle/det_train_label.txt

2.5 empezar a entrenar

Si está instalando la versión de la CPU, use_gpu modifique el campo en el archivo de configuración  a falso.

python3 tools/train.py -c configs/det/det_mv3_db.yml -o Global.pretrain_weights=./pretrain_models/MobileNetV3_large_x0_5_pretrained/

En las instrucciones anteriores, use -c para seleccionar el archivo de configuración configs / det / det_db_mv3.yml para el entrenamiento. Para obtener una explicación detallada del archivo de configuración, consulte el enlace .

También puede usar el parámetro -o para cambiar los parámetros de entrenamiento sin modificar el archivo yml, por ejemplo, ajustar la tasa de aprendizaje de entrenamiento a 0,0001

python3 tools/train.py -c configs/det/det_mv3_db.yml -o Optimizer.base_lr=0.0001

2.6 Entrenamiento de breakpoint

Si se interrumpe el programa de entrenamiento, si desea cargar el modelo interrumpido para reanudar el entrenamiento, puede especificar la ruta del modelo que se cargará especificando Global.checkpoints:

python3 tools/train.py -c configs/det/det_mv3_db.yml -o Global.checkpoints=./your/trained/model

Nota : Global.checkpointsLa prioridad es mayor que Global.pretrain_weightsla prioridad, es decir, cuando se especifican dos parámetros al mismo tiempo, el Global.checkpointsmodelo especificado Global.checkpointsse cargará primero . Si la ruta del modelo especificado es incorrecta, se cargará el Global.pretrain_weightsmodelo especificado.

2.7 Evaluación de indicadores

python3 tools/eval.py -c configs/det/det_mv3_db.yml  -o Global.checkpoints="./output/db_mv3/best_accuracy" PostProcess.box_thresh=0.6 PostProcess.unclip_ratio=1.5

El comando anterior debe agregar un espacio delante de los dos PostProcesses. No hay espacio en el tutorial del sitio web oficial, y se informará el siguiente error.

Traceback (most recent call last):
  File "tools/eval.py", line 70, in <module>
    config, device, logger, vdl_writer = program.preprocess()
  File "/paddle/PaddleOCR/tools/program.py", line 369, in preprocess
    FLAGS = ArgsParser().parse_args()
  File "/paddle/PaddleOCR/tools/program.py", line 49, in parse_args
    args.opt = self._parse_opt(args.opt)
  File "/paddle/PaddleOCR/tools/program.py", line 60, in _parse_opt
    k, v = s.split('=')
ValueError: too many values to unpack (expected 2)

2.8 Resultados de la prueba

Reporté un error al usar el siguiente comando de prueba dado en el sitio web oficial:

python3 tools/infer_det.py -c configs/det/det_mv3_db.yml -o TestReader.infer_img="./doc/imgs_en/img_10.jpg" Global.checkpoints="./output/det_db/best_accuracy"

Informe el siguiente error:

Traceback (most recent call last):
  File "tools/infer_det.py", line 114, in <module>
    config, device, logger, vdl_writer = program.preprocess()
  File "/paddle/PaddleOCR/tools/program.py", line 371, in preprocess
    merge_config(FLAGS.opt)
  File "/paddle/PaddleOCR/tools/program.py", line 115, in merge_config
    global_config.keys(), sub_keys[0])
AssertionError: the sub_keys can only be one of global_config: dict_keys(['Global', 'Architecture', 'Loss', 'Optimizer', 'PostProcess', 'Metric', 'Train', 'Eval']), but get: TestReader, please check your running command

Después de una mirada general, parece que el parámetro TestReader.infer_img = "./ doc / imgs_en / img_10.jpg" no es compatible, por lo que modifico directamente infer_img en la línea 17 del archivo de configuración det_mv3_db.yml en PaddleOCR / configs / det: doc / imgs_en / img_10.jpg,

  infer_img: doc/imgs_en/img_10.jpg
  save_res_path: ./output/det_db/predicts_db.txt

Después de modificar det_mv3_db.yml en PaddleOCR / configs / det, elimine TestReader.infer_img = "./ doc / imgs_en / img_10.jpg" en el comando de prueba.

python3 tools/infer_det.py -c configs/det/det_mv3_db.yml -o Global.checkpoints="./output/db_mv3/best_accuracy"

Si desea probar todas las imágenes en la carpeta, modifique infer_img: doc / imgs_en / img_10.jpg en det_mv3_db.yml en PaddleOCR / configs / det para infer_img: doc / imgs_en /.

3. Entrena el modelo de reconocimiento de texto

3.1 Preparación de datos

Después de marcar con PPOCRLable, se generará la subimagen correspondiente y el archivo txt.Cada línea en el archivo txt es el nombre de la ruta de la imagen y el contenido de texto de la imagen.

3.2 Preparar el diccionario

Finalmente, se debe proporcionar un diccionario ({word_dict_name} .txt), de modo que cuando se entrene el modelo, todos los caracteres que aparecen se puedan mapear en el índice del diccionario. Por lo tanto, el diccionario debe contener todos los caracteres que desea que se reconozcan correctamente. {Word_dict_name} .txt debe escribirse en el siguiente formato y utf-8 guardarse en un  formato de codificación:

l
d
a
d
r
n

word_dict.txt tiene una sola palabra en cada línea, que asigna el índice de caracteres y números juntos, "y" se asignará a [2 5 1], que ppocr/utils/ppocr_keys_v1.txt es un diccionario chino con 6623 caracteres y un diccionario inglés  ppocr/utils/ic15_dict.txt con 36 caracteres aquí I poner la ppocr_keys_v1.txt和ic15_dict.txt合成一个字典,并命名为chw_dict.txt。然后修改ruta diccionario configuraciones de archivo / rec / rec_chinese_common_train_v2.0.yml es ppocr/utils/chw_dict.txt,character_type para  ch。然后我们querer categoría apoyan el reconocimiento "espacio", por lo que el archivo yml  use_space_char campo a T rue. Nota: use_space_char Solo válido por el  character_type=ch momento.

  # for data or label process
  character_dict_path: ppocr/utils/chw_dict.txt
  character_type: ch
  max_text_length: 25
  infer_mode: False
  use_space_char: True

3.3 Descargar el modelo y el archivo de configuración entrenados previamente

Solo hay un enlace de descarga para el modelo en el sitio web oficial. Fui directamente a github para descargar el modelo previamente entrenado, https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.0/doc/doc_ch/models_list .md # ocr% E6% A8% A1% E5% 9E% 8B% E5% 88% 97% E8% A1% A8v202021% E5% B9% B41% E6% 9C% 8820% E6% 97% A5% E6% 9B % B4% E6% 96% B0

Descargue el modelo previamente entrenado que desee, luego descomprímalo y colóquelo en la carpeta PaddleOCR / pretrain_models. Al mismo tiempo, descargue el archivo de configuración correspondiente y colóquelo en la carpeta PaddleOCR / configs / rec. Lo que uso aquí es rec_chinese_common_train_v2.0.yml y el modelo de preentrenamiento correspondiente.

Modelo de reconocimiento chino

Nombre del modelo Introducción al modelo Archivo de configuración Tamaño del modelo de inferencia enlace de descarga
ch_ppocr_mobile_v2.0_rec Modelo ultraligero original, compatible con chino e inglés, reconocimiento de números rec_chinese_lite_train_v2.0.yml 3,71 millones Modelo de inferencia  /  modelo de formación  /  modelo de pre-entrenamiento
ch_ppocr_server_v2.0_rec Modelo general, compatible con chino e inglés, reconocimiento de números. rec_chinese_common_train_v2.0.yml 94,8 millones Modelo de inferencia  /  modelo de formación  /  modelo de pre-entrenamiento

Nota: Es 训练模型 un modelo obtenido mediante el ajuste fino de datos reales y datos de texto sintético vertical basado en el modelo de preentrenamiento. Tiene un mejor rendimiento en escenarios de aplicación reales. Se 预训练模型entrena directamente con la cantidad total de datos reales y datos sintéticos, que es más adecuado para su uso. Ajuste con precisión su propio conjunto de datos.

Se entrena directamente en función de la cantidad total de datos reales y datos sintéticos, lo que es más adecuado para ajustar con precisión su propio conjunto de datos.

Modelo de reconocimiento de inglés

Nombre del modelo Introducción al modelo Archivo de configuración Tamaño del modelo de inferencia enlace de descarga
en_number_mobile_v2.0_rec Modelo ultraligero original, compatible con reconocimiento digital e inglés rec_en_number_lite_train.yml 2,56 millones Modelo de inferencia  /  modelo de entrenamiento

3.4 Modificar el archivo de configuración

Debe modificar los datos de entrenamiento y las rutas de datos de prueba en el archivo ./configs/rec/rec_chinese_common_train_v2.0.yml a su propia ruta. Si está utilizando el entorno de Docker, cuando modifique la ruta, debe prestar atención a el camino en el entorno de docke.

Train:
  dataset:
    name: SimpleDataSet
    data_dir: /paddle
    label_file_list: ["/paddle/rec_gt_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: /paddle
    label_file_list: ["/paddle/rec_gt_test.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

 El siguiente es un ejemplo de modificación del documento de descripción oficial del sitio web:

Global:
  ...
  # 修改 image_shape 以适应长文本
  image_shape: [3, 32, 320]
  ...
  # 修改字符类型
  character_type: ch
  # 添加自定义字典,如修改字典请将路径指向新字典
  character_dict_path: ./ppocr/utils/ppocr_keys_v1.txt
  # 训练时添加数据增强
  distort: true
  # 识别空格
  use_space_char: true
  ...
  # 修改reader类型
  reader_yml: ./configs/rec/rec_chinese_reader.yml
  ...
...
Optimizer:
  ...
  # 添加学习率衰减策略
  decay:
    function: cosine_decay
    # 每个 epoch 包含 iter 数
    step_each_epoch: 20
    # 总共训练epoch数
    total_epoch: 1000

3.5 Iniciar entrenamiento

# GPU训练 支持单卡,多卡训练,通过CUDA_VISIBLE_DEVICES指定卡号
export CUDA_VISIBLE_DEVICES=0,1,2,3
# 训练icdar15英文数据
python3 tools/train.py -c configs/rec/rec_chinese_lite_train_v2.0.yml

Error:

2021-03-26 03:19:23,583 - ERROR - DataLoader reader thread raised an exception!
Traceback (most recent call last):
  File "tools/train.py", line 124, in <module>
    main(config, device, logger, vdl_writer)
  File "tools/train.py", line 97, in main
    eval_class, pre_best_model_dict, logger, vdl_writer)
  File "/paddle/PaddleOCR/tools/program.py", line 201, in train
Exception in thread Thread-1:
Traceback (most recent call last):
  File "/usr/local/lib/python3.7/dist-packages/paddle/fluid/dataloader/dataloader_iter.py", line 684, in _get_data
    data = self._data_queue.get(timeout=self._timeout)
  File "/usr/lib/python3.7/multiprocessing/queues.py", line 105, in get
    raise Empty
_queue.Empty

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/lib/python3.7/threading.py", line 926, in _bootstrap_inner
    self.run()
  File "/usr/lib/python3.7/threading.py", line 870, in run
    self._target(*self._args, **self._kwargs)
  File "/usr/local/lib/python3.7/dist-packages/paddle/fluid/dataloader/dataloader_iter.py", line 616, in _thread_loop
    batch = self._get_data()
  File "/usr/local/lib/python3.7/dist-packages/paddle/fluid/dataloader/dataloader_iter.py", line 700, in _get_data
    "pids: {}".format(len(failed_workers), pids))
RuntimeError: DataLoader 8 workers exit unexpectedly, pids: 74939, 74940, 74941, 74942, 74943, 74944, 74945, 74946

    for idx, batch in enumerate(train_dataloader):
  File "/usr/local/lib/python3.7/dist-packages/paddle/fluid/dataloader/dataloader_iter.py", line 779, in __next__
    data = self._reader.read_next_var_list()
SystemError: (Fatal) Blocking queue is killed because the data reader raises an exception.
  [Hint: Expected killed_ != true, but received killed_:1 == true:1.] (at /paddle/paddle/fluid/operators/reader/blocking_queue.h:158)

Cambie el tamaño de bachsize en el archivo rec_chinese_lite_train_v2.0.yml de 256 a 64. Luego descubrí que todavía reportaba un error.

Traceback (most recent call last):
  File "tools/train.py", line 124, in <module>
    main(config, device, logger, vdl_writer)
  File "tools/train.py", line 97, in main
    eval_class, pre_best_model_dict, logger, vdl_writer)
  File "/paddle/PaddleOCR/tools/program.py", line 201, in train
    for idx, batch in enumerate(train_dataloader):
  File "/usr/local/lib/python3.7/dist-packages/paddle/fluid/dataloader/dataloader_iter.py", line 779, in __next__
    data = self._reader.read_next_var_list()
  File "/usr/local/lib/python3.7/dist-packages/paddle/fluid/multiprocess_utils.py", line 134, in __handler__
    core._throw_error_if_process_failed()
SystemError: (Fatal) DataLoader process (pid   1. If run DataLoader by DataLoader.from_generator(...), queue capacity is set by from_generator(..., capacity=xx, ...).
  2. If run DataLoader by DataLoader(dataset, ...), queue capacity is set as 2 times of the max value of num_workers and len(places).
  3. If run by DataLoader(dataset, ..., use_shared_memory=True), set use_shared_memory=False for not using shared memory.) exited is killed by signal: 78129.
  It may be caused by insufficient shared storage space. This problem usually occurs when using docker as a development environment.
  Please use command `df -h` to check the storage space of `/dev/shm`. Shared storage space needs to be greater than (DataLoader Num * DataLoader queue capacity * 1 batch data size).
  You can solve this problem by increasing the shared storage space or reducing the queue capacity appropriately.
Bus error (at /paddle/paddle/fluid/imperative/data_loader.cc:161)

Desde el mensaje de error anterior, es porque estoy usando el entorno de la ventana acoplable aquí, y el valor predeterminado de la memoria compartida / dev / shm en la ventana acoplable es 64 m.

#docker环境中df -h
Filesystem      Size  Used Avail Use% Mounted on
overlay         3.5T  1.5T  1.9T  44% /
tmpfs            64M     0   64M   0% /dev
tmpfs           252G     0  252G   0% /sys/fs/cgroup
shm              64M   57M  7.6M  89% /dev/shm
/dev/sda2       3.5T  1.5T  1.9T  44% /paddle
tmpfs           252G   12K  252G   1% /proc/driver/nvidia
udev            252G     0  252G   0% /dev/nvidia0
tmpfs           252G     0  252G   0% /proc/acpi
tmpfs           252G     0  252G   0% /proc/scsi
tmpfs           252G     0  252G   0% /sys/firmware

#非docker环境中 df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            252G     0  252G   0% /dev
tmpfs            51G  2.7M   51G   1% /run
/dev/sda2       3.5T  1.5T  1.9T  44% /
tmpfs           252G     0  252G   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           252G     0  252G   0% /sys/fs/cgroup

Por lo tanto, elimine el contenedor de la ventana acoplable actual y luego use --shm-size = 252G para especificar el tamaño de la memoria compartida cuando vuelva a crear el contenedor de la ventana acoplable.

sudo nvidia-docker run --name ppocr -v $PWD:/paddle --shm-size=252G  --network=host -itd paddlepaddle/paddle:2.0.1-gpu-cuda11.0-cudnn8 /bin/bash

Para ver los comandos específicos de la ventana acoplable, consulte: https://blog.csdn.net/u013171226/article/details/115132594 . Después de configurar la memoria compartida, el tamaño de archivo se vuelve a cambiar a 256 y no se informa de ningún error.

3.6 Evaluación

 

python3 tools/eval.py -c ./configs/rec/rec_chinese_lite_train_v2.0.yml  -o Global.checkpoints=./output/rec_chinese_lite_v2.0/latest

 

3.7 Pronóstico

python3 tools/infer_rec.py -c ./configs/rec/rec_chinese_common_train_v2.0.yml  -o Global.checkpoints=./output/rec_chinese_common_v2.0/best_accuracy Global.infer_img=doc/13_crop_4.jpg

 

referencias:

    https://www.bookstack.cn/read/PaddleOCR/detection.md

    https://www.bookstack.cn/read/PaddleOCR/recognition.md

Supongo que te gusta

Origin blog.csdn.net/u013171226/article/details/115179480
Recomendado
Clasificación