以软考成绩查询数字验证码为例,学习如何使用PaddleOCR库调优(fine-tune)模型。
学完本实战后,可以训练以下特定场景任务的OCR模型:
1-8场景,数据标注任务相对较小,因为字符数量较少
数据标注可以使用PaddleOCR自带的PPOCRLabel标注工具
git clone https://github.com/PaddlePaddle/PaddleOCR.git
cd PaddleOCR # 后续工作根目标
export PYTHONPATH=$PYTHONPATH:`pwd` # PaddleOCR源码路径添加到PYTHONPATH环境变量,就不需要安装PaddleOCR
git clone https://github.com/actboy/captcha.git # 代码克隆至PaddleOCR源码根目录
cd captcha
wget -nd -c "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
cd .. # 回到PaddleOCR源代码根目录
#cpu 版本
python -m pip install paddlepaddle==2.2.1 -i https://mirror.baidu.com/pypi/simple
# gpu 版本
pip install paddlepaddle-gpu==2.2.1.post112 -f https://www.paddlepaddle.org.cn/whl/windows/mkl/avx/stable.html
以下命令的执行请回到PaddleOCR源码根目录
验证码下载一般都比较容易。
以软考成绩查询验证为例,下载数字图形验证码,其他网站验证码下载可以参考captcha/download_captcha_image.py代码
python captcha/download_captcha_image.py # 项目实战代码已提供验证码图片,可不执行
该过程不需要标注工具,用电脑自带图片预览功能,根据预览修改图片文件名称,修改为如下形式:
{图片原始名称,不包括后缀名}_{验证码字符}{后缀名}
例如:
python captcha/format_train_data.py # 项目实战代码已提供标注文件,可不执行
本实战为识别数字验证码,仅为“0, 1, 2, 3, 4, 5, 6, 7, 8, 9”10个字符。
见captcha/arbic_number_dic.txt文件。
下载的项目实现代码,已经配置好了训练参数。
开发配置文件:captcha/configs/captcha_num_rec_dev.yml
正式配置文件:captcha/configs/captcha_num_rec_prod.yml
重点介绍一下几个参数
use_gpu: True # 是否使用GPU训练
epoch_num: 100 # 训练轮数
pretrained_model: './captcha/ch_ppocr_server_v2.0_rec_pre/best_accuracy' # 预训练模型路径
character_dict_path: ./captcha/arbic_number_dic.txt # 字典路径
Train.dataset.data_dir: ./captcha/train_data/rec/train # 训练数据图片路径
Train.dataset.label_file_list: ["./captcha/train_data/rec/rec_gt_train.txt"] # 标注文件路径
Train.dataset.transforms.RecResizeImg.image_shape: [3, 40, 220] # 验证码图片通道数、高、宽
Train.loader.batch_size_per_card: 64 # 每轮迭代batch_size大小,非常影响训练速度、内存消耗以及结果的准确性
# 可以测试训练十分能够正常执行
python tools/train.py -c captcha/configs/captcha_num_rec_dev.yml
# 正式执行训练过程。
# 在 nvida 1080 Ti 单块GPU上训练,一轮大约需要18秒
#大约训练16轮后,可达到98%的准确性率
python tools/train.py -m paddle.distributed.launch --gpus '0,1,2,3' -c captcha/configs/captcha_num_rec_prod.yml # 注意--gpus参数
python tools/infer_rec.py -c captcha/configs/captcha_num_rec_prod.yml -o Global.pretrained_model=./captcha/output/rec_num/best_accuracy Global.load_static_weights=false Global.infer_img=./captcha/train_data/rec/test/word_00_9905.jpg
# -c 后面设置训练算法的yml配置文件
# -o 配置可选参数
# Global.pretrained_model 参数设置待转换的训练模型地址,不用添加文件后缀 .pdmodel,.pdopt或.pdparams。
# Global.save_inference_dir参数设置转换的模型将保存的地址。
python3 tools/export_model.py -c captcha/configs/captcha_num_rec_prod.yml -o Global.pretrained_model=./captcha/output/rec_num/best_accuracy Global.save_inference_dir=./captcha/inference/rec_num
接下来可以用调优的模型使用接口方式查询软考成绩
python captcha/query_rk_score_app.py -y '2021年上半年' -id '您的身份证号' -n '您的姓名'
# -y参数一定需要仔细,其形式为{YYYY}年{上|下}半年,目前支持的考试时间为:
# 2009年上半年 至 2021年下半年