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.6 Entrenamiento de breakpoint
3. Entrena el modelo de reconocimiento de texto
3.3 Descargar el modelo y el archivo de configuración entrenados previamente
3.4 Modificar el archivo de configuración
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.checkpoints
La prioridad es mayor que Global.pretrain_weights
la prioridad, es decir, cuando se especifican dos parámetros al mismo tiempo, el Global.checkpoints
modelo especificado Global.checkpoints
se cargará primero . Si la ruta del modelo especificado es incorrecta, se cargará el Global.pretrain_weights
modelo 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,
y 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: