赞
踩
前言:当写上这个标题,你可能就知道,估计是又用上工具了,不然怎么可能自己不写个网络去训练呢,是的,本文的讲解目的,就是善于工具去更方便的完成我们的工具,众所周知,ddddocr提供了一键识别预测框的功能,即识别出所有文字和图标的位置,但是无法识别具体位置是哪个类别,所以本文主要讲解识别类型的简便训练用法
本文方法类似于以下文章:
四六位、不定长、计算题等验证码,一款工具全部搞定,简单方便还开箱即用,精度高达96%!!
Pytorch利用ddddocr辅助识别点选验证码
但区别于以上文章,更简洁或工具不同,有兴趣的也可以扩展延读一下,接下来是正文部分
先讲解下大致流程,因为我们只需要实现将对应的文字或图标(以下都简称为点选)的位置识别出对应的分类,所以我们只需要找一个分类模型即可,接触过深度学习的小伙伴可能就会想到了,目前也有很多分类模型也可供使用(例如resnet、mobilenet等),这些模型结构是不用从头写了,但是损失函数、优化器、训练步骤以及数据集预处理,也还是要处理的,到这里,有想法的小伙伴可能就想到了,只要解决上述所说的问题基本就成了,所以这里选择采用预处理、训练等一体化的训练工具:PaddleClas
paddleclas是由百度飞桨提供的一个图像识别和图像分类任务的工具集
paddleclas本身不仅提供resnet、mobilenet等主流分类模型的一键训练,同时自身也提供了PP-LCNet等自研模型的一键训练,这里可以根据自己的喜好来选择对应的模型训练,我这里直接使用PP-LCNetV2自研模型作为训练讲解演示,这里完全可以不用考虑模型的准确率,只需要考虑数据集的质量,因为使用的官方模型,肯定比自己手写一些模型要强的,具体可以参考模型介绍
前置条件,因为我们已经具备了ddddocr提供的检测,我们只需要做分类识别,所以这里,可以把ddddocr提供的预测框全部切割保存下来,以便下一步处理,大致展示如下:
然后我们找到官方数据集分类的帮助地址PaddleClas数据准备
从文章链接中可以看到需要准备的训练集train和验证集val为一级目录,具体类别n01440764为二级目录,图片编号名称n01440764_10023.JPEG为三级目录,这里的val只有两层目录,经过本人实测,val也可以像train一样改为三级目录,只需要在训练配置中修改好对应路径即可
接下来需要准备两份标签文件train_list.txt和val_list.txt用于记录每个图片的路径地址和对应的标签,在准备这份标签文件前,需要有一个文字字典,因为对应的标签为数字,这里,我的字典文件格式如下:
我准备了5000多个文字种类,如果你需要这份字典,可以私信我免费发你,接下来,写一段简单的代码来编写标签文件
import os font_lib = eval(open("../font_lib_new.txt", "r").read()) #字典 path = "train" fonts = os.listdir(path) sums = 0 with open("train_list.txt", "w", encoding="utf8") as f: for font in fonts: imgs = os.listdir(os.path.join(path, font)) for img in imgs: im_path = os.path.join(path, font, img) im_index = font_lib.index(font) f.write(im_path + " " + str(im_index) + "\n") sums += 1 print("共写入数量", sums)
这里的代码仅供参数,具体以实际情况而定,我这里准备了1000万训练集和50万验证集,均由代码生成
注意:初始情况下,你可能不知道扣下来的每个字是什么类别,你可以使用第三方打码平台进行标注,我这里是通过代码自动生成文字,如果你对生成文字感兴趣,可以参考captcha和pillow第三方库
train_list.txt、val_list.txt 格式参考如下
训练之前,需要先把官方代码clone下来,放到训练的机器上
因为训练采用的官方预训练模型,所以这里也先参考一下官方训练教程
进入该目录
cd /mnt/disk1/PaddleClas/PaddleClas-release-2.5
在 ppcls/configs/ImageNet/PPLCNetV2/PPLCNetV2_base.yaml 中提供了 PPLCNetV2_base 训练配置,可以通过如下脚本启动训练:
export CUDA_VISIBLE_DEVICES=0,1,2,3
python3 -m paddle.distributed.launch \
--gpus="0,1,2,3" \
tools/train.py \
-c ppcls/configs/ImageNet/PPLCNetV2/PPLCNetV2_base.yaml
这里可以配置一些全局配置,例如训练的gpu对应的配置文件等,也可以设置配置文件里面的参数,我的配置参数如下:
因为我的数据集略大,所以我这里调整了一下学习率,你可以根据自己情况调整,然后,你需要调整一下训练集和验证集的目录地址和标签文件目录地址,如下:
正常情况下,你的模型就会开始如下训练了,在命令行界面中,会提示当前epoch、学习率,top1和top5的准确率以及损失函数的数值
备注:当前精度最佳的模型会保存在 output/PPLCNetV2_base/best_model.pdparams,你会在这里看到当前最佳模型,最后一次训练的模型以及每次训练的模型
关于模型评估和预测,其实paddleclas官方也提供了方法,我们这里先参考一下(如果对自己的模型准确率自信,也可以跳过这一步,直接导出模型和推理)
训练好模型之后,可以通过以下命令实现对模型指标的评估。
python3 tools/eval.py \
-c ppcls/configs/ImageNet/PPLCNetV2/PPLCNetV2_base.yaml \
-o Global.pretrained_model=output/PPLCNetV2_base/best_model
其中 -o Global.pretrained_model=“output/PPLCNetV2_base/best_model” 指定了当前最佳权重所在的路径,如果指定其他权重,只需替换对应的路径即可。
模型训练完成之后,可以加载训练得到的预训练模型,进行模型预测。在模型库的 tools/infer.py 中提供了完整的示例,只需执行下述命令即可完成模型预测:
python3 tools/infer.py \
-c ppcls/configs/ImageNet/PPLCNetV2/PPLCNetV2_base.yaml \
-o Global.pretrained_model=output/PPLCNetV2_base/best_model
输出结果如下:
[{'class_ids': [8, 7, 86, 82, 83], 'scores': [0.8859, 0.07156, 0.00588, 0.00047, 0.00034], 'file_name': 'docs/images/inference_deployment/whl_demo.jpg', 'label_names': ['hen', 'cock', 'partridge', 'ruffed grouse, partridge, Bonasa umbellus', 'prairie chicken, prairie grouse, prairie fowl']}]
Paddle Inference 是飞桨的原生推理库, 作用于服务器端和云端,提供高性能的推理能力。相比于直接基于预训练模型进行预测,Paddle Inference可使用MKLDNN、CUDNN、TensorRT 进行预测加速,从而实现更优的推理性能。更多关于Paddle Inference推理引擎的介绍,可以参考Paddle Inference官网教程。
当使用 Paddle Inference 推理时,加载的模型类型为 inference 模型。本案例提供了两种获得 inference 模型的方法,如果希望得到和文档相同的结果,请选择直接下载 inference 模型的方式。
此处,我们提供了将权重和模型转换的脚本,执行该脚本可以得到对应的 inference 模型:
python3 tools/export_model.py \
-c ppcls/configs/ImageNet/PPLCNetV2/PPLCNetV2_base.yaml \
-o Global.pretrained_model=output/PPLCNetV2_base/best_model \
-o Global.save_inference_dir=deploy/models/PPLCNetV2_base_infer
执行完该脚本后会在 deploy/models/ 下生成 PPLCNetV2_base_infer 文件夹,models 文件夹下应有如下文件结构:
├── PPLCNetV2_base_infer
│ ├── inference.pdiparams
│ ├── inference.pdiparams.info
│ └── inference.pdmodel
至此,模型导出就完毕了,这里导出的模型可以直接上生产环境了
模型推理有两种方法,一种是用官方的推理方法,一种也是官方的第三方库,我们先来看官方的推理方法
返回 deploy 目录:
cd ../
运行下面的命令,对图像 ./images/ImageNet/ILSVRC2012_val_00000010.jpeg 进行分类。
# 使用下面的命令使用 GPU 进行预测
python3 python/predict_cls.py -c configs/inference_cls.yaml -o Global.inference_model_dir=models/PPLCNetV2_base_infer
# 使用下面的命令使用 CPU 进行预测
python3 python/predict_cls.py -c configs/inference_cls.yaml -o Global.inference_model_dir=models/PPLCNetV2_base_infer -o Global.use_gpu=False
输出结果如下。
ILSVRC2012_val_00000010.jpeg: class id(s): [332, 153, 229, 204, 265], score(s): [0.28, 0.25, 0.03, 0.02, 0.02], label_name(s): ['Angora, Angora rabbit', 'Maltese dog, Maltese terrier, Maltese', 'Old English sheepdog, bobtail', 'Lhasa, Lhasa apso', 'toy poodle']
基于文件夹的批量预测,如果希望预测文件夹内的图像,可以直接修改配置文件中的 Global.infer_imgs 字段,也可以通过下面的 -o 参数修改对应的配置。
# 使用下面的命令使用 GPU 进行预测,如果希望使用 CPU 预测,可以在命令后面添加 -o Global.use_gpu=False
python3 python/predict_cls.py -c configs/inference_cls.yaml -o Global.inference_model_dir=models/PPLCNetV2_base_infer -o Global.infer_imgs=images/ImageNet/
终端中会输出该文件夹内所有图像的分类结果,如下所示。
ILSVRC2012_val_00000010.jpeg: class id(s): [332, 153, 229, 204, 265], score(s): [0.28, 0.25, 0.03, 0.02, 0.02], label_name(s): ['Angora, Angora rabbit', 'Maltese dog, Maltese terrier, Maltese', 'Old English sheepdog, bobtail', 'Lhasa, Lhasa apso', 'toy poodle']
ILSVRC2012_val_00010010.jpeg: class id(s): [626, 531, 761, 487, 673], score(s): [0.64, 0.06, 0.03, 0.02, 0.01], label_name(s): ['lighter, light, igniter, ignitor', 'digital watch', 'remote control, remote', 'cellular telephone, cellular phone, cellphone, cell, mobile phone', 'mouse, computer mouse']
ILSVRC2012_val_00020010.jpeg: class id(s): [178, 209, 246, 181, 211], score(s): [0.97, 0.00, 0.00, 0.00, 0.00], label_name(s): ['Weimaraner', 'Chesapeake Bay retriever', 'Great Dane', 'Bedlington terrier', 'vizsla, Hungarian pointer']
ILSVRC2012_val_00030010.jpeg: class id(s): [80, 143, 81, 137, 98], score(s): [0.91, 0.01, 0.00, 0.00, 0.00], label_name(s): ['black grouse', 'oystercatcher, oyster catcher', 'ptarmigan', 'American coot, marsh hen, mud hen, water hen, Fulica americana', 'red-breasted merganser, Mergus serrator'
另外,还有基于c++的预测引擎推理,以及转成onnx模型,这里就不放出来了,详情可见官方文档模型推理部署
FastDeploy是一款全场景、易用灵活、极致高效的AI推理部署工具, 支持云边端部署。提供超过
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。