目录
一、背景
在项目进行中,遇到了一个比较棘手的问题,爬虫遇到网站有验证码识别校验的情况。当时第一步是寻找了相关的python识别包直接去识别,第一个找的就是paddleocr这个包,但效果不是很好。可能是因为验证码图片上的干扰线太多导致的。调研后跟着也官方文档尝试了一下paddleocr的训练。
二、训练流程
2.1、下载paddleocr项目
两种方式,从GitHub上克隆paddleocr的项目到本地或者从GitHub上下载zip包再解压
git clone http://github.com/PaddlePaddle/PaddleOCR.git
2.2、创建相关文件夹
paddleocr
pretrain_models
tranMyOCR
rec
test
xxx.png
train
xxx1.png
xxx2.png
codeChar.txt
rec_gt_train.txt
rec_gt_test.txt
其中:
pretrain_models文件夹存放下载的预训练模型;
paddleocr是克隆下来的项目文件夹;
tranMyOCR是我们训练主文件夹;
rec文件夹用来标识我们训练的模型类别,常用的有det、cls、rec等;
test文件夹下存放验证集;
train文件夹下存放训练集;
codeChar.txt是所有希望能被正确识别的字符;
rec_gt_train.txt列出了所有训练集数据与标签集合;
xxx.jpg 1a4d
rec_gt_test.txt列出了所有测试集数据与标签集合;
test文件夹下存放验证集:
train文件夹下存放训练集:
codeChar.txt文件内容:
./tranMyOCR/rec/train/
rec_gt_train.txt文件内容:
rec_gt_test.txt文件内容:
2.3、下载rec预训练模型
本文示例使用的是en_pp-ocrv3_rec版本的实验的,可能v4版本效果更好,需要自行去尝试。下载后移入到事先建好的pretrain_models文件夹下,再解压即可。
https://paddleocr.bj.bcebos.com/PP-OCRv3/english/en_PP-OCRv3_rec_train.tar
2.4、修改训练配置文件
rec模型训练配置文件路径:./configs/rec/PP-OCRv3 下的en_PP-OCRv3_rec.yml文件,同目录下有中文、英文分别。不明白有什么区别,不过我想既然要训练的是字符验证码,那肯定是要使用英文模型训练配置文件。
配置文件中涉及到修改的参数有:
Global:
use_gpu:是否开启GPU训练
epoch_num:训练轮数
print_batch_step:多少轮输出一次日志
save_model_dir:最终模型保存路径
save_epoch_step:多少轮保存一次模型
eval_batch_step:一个区间,没搞懂
pretrained_model:预训练模型路径
save_inference_dir:导出inference模型路径,导出时候需要用到
character_dict_path:字符字典路径
use_space_char:是否正常识别空格
Train:
dataset:
data_dir:训练集数据文件夹
label_file_list:训练标签文件路径,也就是rec_gt_train.txt文件的路径
loader:
shuffle: false
batch_size_per_card: 每轮训练数量吧
drop_last: false
num_workers: 指定多少个线程训练吧
Eval:
dataset:
data_dir:验证集数据文件夹
label_file_list:验证标签文件路径,也就是rec_gt_test.txt文件的路径
2.5、训练
进入到paddleocr项目文件夹下,打开命令行后执行训练命令。
# 训练
python tools/train.py -c configs/rec/PP-OCRv3/en_PP-OCRv3_rec_new.yml
# 若训练配置文件没有配置pretrained_model
python tools/train.py -c configs/rec/PP-OCRv3/en_PP-OCRv3_rec_zk.yml -o Global.pretrained_model=./pretrain_models/en_PP-OCRv3_rec_train/best_accuracy
# 训练日志(省略中间部分)
(base) Dell:~/GitHub/PaddleOCR$ /home/zhangke/miniconda3/bin/python tools/train.py -c configs/rec/PP-OCRv3/en_PP-OCRv3_rec_zk.yml -o Global.pretrained_model=./pretrain_models/en_PP-OCRv3_rec_train/best_accuracy
[2024/11/26 16:17:29] ppocr INFO: Architecture :
[2024/11/26 16:17:29] ppocr INFO: Backbone :
[2024/11/26 16:17:29] ppocr INFO: last_conv_stride : [1, 2]
[2024/11/26 16:17:29] ppocr INFO: last_pool_kernel_size : [2, 2]
[2024/11/26 16:17:29] ppocr INFO: last_pool_type : avg
[2024/11/26 16:17:29] ppocr INFO: name : MobileNetV1Enhance
[2024/11/26 16:17:29] ppocr INFO: scale : 0.5
[2024/11/26 16:17:29] ppocr INFO: Head :
[2024/11/26 16:17:29] ppocr INFO: head_list :
[2024/11/26 16:17:29] ppocr INFO: CTCHead :
[2024/11/26 16:17:29] ppocr INFO: Head :
[2024/11/26 16:17:29] ppocr INFO: fc_decay : 1e-05
[2024/11/26 16:17:29] ppocr INFO: Neck :
[2024/11/26 16:17:29] ppocr INFO: depth : 2
[2024/11/26 16:17:29] ppocr INFO: dims : 64
[2024/11/26 16:17:29] ppocr INFO: hidden_dims : 120
[2024/11/26 16:17:29] ppocr INFO: name : svtr
[2024/11/26 16:17:29] ppocr INFO: use_guide : True
[2024/11/26 16:17:29] ppocr INFO: SARHead :
[2024/11/26 16:17:29] ppocr INFO: enc_dim : 512
[2024/11/26 16:17:29] ppocr INFO: max_text_length : 25
[2024/11/26 16:17:29] ppocr INFO: name : MultiHead
[2024/11/26 16:17:29] ppocr INFO: Transform : None
[2024/11/26 16:17:29] ppocr INFO: algorithm : SVTR_LCNet
[2024/11/26 16:17:29] ppocr INFO: model_type : rec
[2024/11/26 16:17:29] ppocr INFO: Eval :
[2024/11/26 16:17:29] ppocr INFO: dataset :
[2024/11/26 16:17:29] ppocr INFO: data_dir : ./tranMyOCR/rec/test/
[2024/11/26 16:17:29] ppocr INFO: label_file_list : ['./tranMyOCR/rec/rec_gt_test.txt']
[2024/11/26 16:17:29] ppocr INFO: name : SimpleDataSet
[2024/11/26 16:17:29] ppocr INFO: transforms :
[2024/11/26 16:17:29] ppocr INFO: DecodeImage :
[2024/11/26 16:17:29] ppocr INFO: channel_first : False
[2024/11/26 16:17:29] ppocr INFO: img_mode : BGR
[2024/11/26 16:17:29] ppocr INFO: MultiLabelEncode : None
[2024/11/26 16:17:29] ppocr INFO: RecResizeImg :
[2024/11/26 16:17:29] ppocr INFO: image_shape : [3, 48, 320]
[2024/11/26 16:17:29] ppocr INFO: KeepKeys :
[2024/11/26 16:17:29] ppocr INFO: keep_keys : ['image', 'label_ctc', 'label_sar', 'length', 'valid_ratio']
[2024/11/26 16:17:29] ppocr INFO: loader :
[2024/11/26 16:17:29] ppocr INFO: batch_size_per_card : 1
[2024/11/26 16:17:29] ppocr INFO: drop_last : False
[2024/11/26 16:17:29] ppocr INFO: num_workers : 1
[2024/11/26 16:17:29] ppocr INFO: shuffle : False
[2024/11/26 16:17:29] ppocr INFO: Global :
[2024/11/26 16:17:29] ppocr INFO: cal_metric_during_train : True
[2024/11/26 16:17:29] ppocr INFO: character_dict_path : tranMyOCR/rec/codeChar.txt
[2024/11/26 16:17:29] ppocr INFO: checkpoints : None
[2024/11/26 16:17:29] ppocr INFO: debug : False
[2024/11/26 16:17:29] ppocr INFO: distributed : False
[2024/11/26 16:17:29] ppocr INFO: epoch_num : 100
[2024/11/26 16:17:29] ppocr INFO: eval_batch_step : [0, 2000]
[2024/11/26 16:17:29] ppocr INFO: infer_img : doc/imgs_words/ch/word_1.jpg
[2024/11/26 16:17:29] ppocr INFO: infer_mode : False
[2024/11/26 16:17:29] ppocr INFO: log_smooth_window : 20
[2024/11/26 16:17:29] ppocr INFO: max_text_length : 25
[2024/11/26 16:17:29] ppocr INFO: pretrained_model : ./pretrain_models/en_PP-OCRv3_rec_train/best_accuracy
[2024/11/26 16:17:29] ppocr INFO: print_batch_step : 10
[2024/11/26 16:17:29] ppocr INFO: save_epoch_step : 10
[2024/11/26 16:17:29] ppocr INFO: save_inference_dir : None
[2024/11/26 16:17:29] ppocr INFO: save_model_dir : ./output/v3_en_mobile/rec
[2024/11/26 16:17:29] ppocr INFO: save_res_path : ./output/rec/predicts_ppocrv3_en.txt
[2024/11/26 16:17:29] ppocr INFO: use_gpu : False
[2024/11/26 16:17:29] ppocr INFO: use_space_char : False
[2024/11/26 16:17:29] ppocr INFO: use_visualdl : False
[2024/11/26 16:17:29] ppocr INFO: Loss :
[2024/11/26 16:17:29] ppocr INFO: loss_config_list :
[2024/11/26 16:17:29] ppocr INFO: CTCLoss : None
[2024/11/26 16:17:29] ppocr INFO: SARLoss : None
[2024/11/26 16:17:29] ppocr INFO: name : MultiLoss
[2024/11/26 16:17:29] ppocr INFO: Metric :
[2024/11/26 16:17:29] ppocr INFO: ignore_space : False
[2024/11/26 16:17:29] ppocr INFO: main_indicator : acc
[2024/11/26 16:17:29] ppocr INFO: name : RecMetric
[2024/11/26 16:17:29] ppocr INFO: Optimizer :
[2024/11/26 16:17:29] ppocr INFO: beta1 : 0.9
[2024/11/26 16:17:29] ppocr INFO: beta2 : 0.999
[2024/11/26 16:17:29] ppocr INFO: lr :
[2024/11/26 16:17:29] ppocr INFO: learning_rate : 0.001
[2024/11/26 16:17:29] ppocr INFO: name : Cosine
[2024/11/26 16:17:29] ppocr INFO: warmup_epoch : 5
[2024/11/26 16:17:29] ppocr INFO: name : Adam
[2024/11/26 16:17:29] ppocr INFO: regularizer :
[2024/11/26 16:17:29] ppocr INFO: factor : 3e-05
[2024/11/26 16:17:29] ppocr INFO: name : L2
[2024/11/26 16:17:29] ppocr INFO: PostProcess :
[2024/11/26 16:17:29] ppocr INFO: name : CTCLabelDecode
[2024/11/26 16:17:29] ppocr INFO: Train :
[2024/11/26 16:17:29] ppocr INFO: dataset :
[2024/11/26 16:17:29] ppocr INFO: data_dir : ./tranMyOCR/rec/train/code/
[2024/11/26 16:17:29] ppocr INFO: ext_op_transform_idx : 1
[2024/11/26 16:17:29] ppocr INFO: label_file_list : ['./tranMyOCR/rec/rec_gt_train.txt']
[2024/11/26 16:17:29] ppocr INFO: name : SimpleDataSet
[2024/11/26 16:17:29] ppocr INFO: transforms :
[2024/11/26 16:17:29] ppocr INFO: DecodeImage :
[2024/11/26 16:17:29] ppocr INFO: channel_first : False
[2024/11/26 16:17:29] ppocr INFO: