PaddleOCR基于PPOCRv4的垂类场景模型微调——手写文字识别

PaddleOCR手写文字识别

    • 一. 项目背景
    • 二. 环境配置
    • 三. 数据构造
    • 四. 模型微调
    • 五. 串联推理
    • 六. 注意事项
    • 七. 参考文献

光学字符识别(Optical Character Recognition, OCR),ORC是指对包含文本资料的图像文件进行分析识别处理,获取文字及版面信息的技术,检测图像中的文本资料,并且识别出文本的内容。

在这里插入图片描述
PaddleOCR提供的PP-OCR系列模型在通用场景中性能优异,能够解决绝大多数情况下的检测与识别问题。在垂类场景中,如果希望获取更优的模型效果,可以通过模型微调的方法,进一步提升PP-OCR系列检测与识别模型的精度。

一. 项目背景

目前先进的OCR模型在打印体的识别上已经能获得比较好的效果,但由于手写体的风格各异,提高手写体的识别精度具有比较高的挑战。因此需要基于手写数据微调预训练模型,从而提高手写文字的识别效果。

在这里插入图片描述

二. 环境配置

1. 安装PaddlePaddle 2.0
在官网上找到对应版本的PaddlePaddle进行安装。

2.克隆PaddleOCR repo代码
【推荐】git clone https://github.com/PaddlePaddle/PaddleOCR

如果因为网络问题无法pull成功,也可选择使用码云上的托管:git clone https://gitee.com/paddlepaddle/PaddleOCR

注:码云托管代码可能无法实时同步本github项目更新,存在3~5天延时,请优先使用推荐方式。

3. 安装第三方库

cd PaddleOCR
pip3 install -r requirements.txt

三. 数据构造

AIstudio上有开源的手写OCR识别数据集:https://aistudio.baidu.com/datasetdetail/102884,由中科院手写数据集及网上开源数据组合而成。训练共24w,测试1.7w,可直接使用paddleOCR训练。

在实际的场景中,我们往往有针对特定场景的数据,因此需要对数据进行标注和分割。PPOCRLabel内置了OCR模型,可以辅助标注。
PPOCRLabel官方文档:https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.7/PPOCRLabel/README_ch.md

1. 安装与运行PPOCRLabel

Windows

pip install PPOCRLabel  # 安装# 选择标签模式来启动
PPOCRLabel --lang ch  # 启动【普通模式】,用于打【检测+识别】场景的标签
PPOCRLabel --lang ch --kie True  # 启动 【KIE 模式】,用于打【检测+识别+关键字提取】场景的标签

Ubuntu Linux

pip3 install PPOCRLabel
pip3 install trash-cli# 选择标签模式来启动
PPOCRLabel --lang ch  # 启动【普通模式】,用于打【检测+识别】场景的标签
PPOCRLabel --lang ch --kie True  # 启动 【KIE 模式】,用于打【检测+识别+关键字提取】场景的标签

MacOS

pip3 install PPOCRLabel
pip3 install opencv-contrib-python-headless==4.2.0.32 # 如果下载过慢请添加"-i https://mirror.baidu.com/pypi/simple"# 选择标签模式来启动
PPOCRLabel --lang ch  # 启动【普通模式】,用于打【检测+识别】场景的标签
PPOCRLabel --lang ch --kie True  # 启动 【KIE 模式】,用于打【检测+识别+关键字提取】场景的标签

2. 基于PPOCRLabel的数据标注

下面以五张图片为例介绍一下数据标注过程,首先点击文件->打开目录打开图片所在的文件夹。
在这里插入图片描述
点击PaddleOCR->选择模型选择模型语言(每次打开软件都需要选择),点击自动标注
在这里插入图片描述
然后对识别不准确的部分进行手动调整,可以调整检测框,也可以调整右侧的识别结果。比如图片中的“沧海桑田”识别有误,则我们人为进行修改。调整完毕后点击确认按钮保存。

3. 导出标注结果
点击文件按钮,可以看到导出标记结果导出识别结果两项,分别用于导出文本检测的标签和文本识别的标签。导出后文件内容如图所示:
在这里插入图片描述
请勿手动更改其中内容,否则会引起程序出现异常

文件名说明
Label.txt检测标签,可直接用于PPOCR检测模型训练。用户每确认5张检测结果后,程序会进行自动写入。当用户关闭应用程序或切换文件路径后同样会进行写入。
fileState.txt图片状态标记文件,保存当前文件夹下已经被用户手动确认过的图片名称。
Cache.cach缓存文件,保存模型自动识别的结果。
rec_gt.txt识别标签。可直接用于PPOCR识别模型训练。需用户手动点击菜单栏“文件” - "导出识别结果"后产生。
crop_img识别数据。按照检测框切割后的图片。与rec_gt.txt同时产生。

4. 数据集划分

cd ./PPOCRLabel # 将目录切换到PPOCRLabel文件夹下
python gen_ocr_train_val_test.py --trainValTestRatio 6:2:2 --datasetRootPath ../train_data

参数说明:

  • trainValTestRatio 是训练集、验证集、测试集的图像数量划分比例,根据实际情况设定,默认是6:2:2

  • datasetRootPath 是PPOCRLabel标注的完整数据集存放路径。默认路径是 PaddleOCR/train_data 分割数据集前应有如下结构:

|-train_data|-crop_img|- word_001_crop_0.png|- word_002_crop_0.jpg|- word_003_crop_0.jpg| ...| Label.txt| rec_gt.txt|- word_001.png|- word_002.jpg|- word_003.jpg| ...

在运行前,需要修改gen_ocr_train_val_test.py中第42行:

 imagePath = os.path.join(dataAbsPath, "{}\\{}".format(args.recImageDirName, imageName))

修改为:

 imagePath = os.path.join(dataAbsPath, "{}/{}".format(args.recImageDirName, imageName))

否则图片读取时会报路径错误。

运行结束后,train_data文件夹中会出现名为detrec的文件夹中,文件夹中分别存放文本检测文本识别对应的图片和分割后的训练集、验证集和验证集列表。

|-train_data| ...|-det|- train|- 训练集图片|- val|- 验证集图片|- test|- 测试集图片|- train.txt|- val.txt|- test.txt|-rec| ...| ...

至此,数据集就已经构建完成,根据不同的任务可直接使用paddleOCR训练。

四. 模型微调

OCR识别主要分为三个部分,分别是文本检测文本方向分类文本识别。PPOCR模型在文本检测和文本方向分类已经能达到比较好的效果,因此本文仅针对文本识别进行微调,另外两个任务的微调方法与之相同。本案例采用开源的手写OCR识别数据集:https://aistudio.baidu.com/datasetdetail/102884

1.下载预训练模型
可使用的模型参考模型列表,本文采用PPOCRv4作为预训练模型:

在这里插入图片描述

cd PaddleOCR
# 使用该指令下载需要的预训练模型
wget -P ./pretrained_models/ https://paddleocr.bj.bcebos.com/PP-OCRv4/chinese/ch_PP-OCRv4_rec_train.tar
# 解压预训练模型文件
tar -xf ./pretrained_models/ch_PP-OCRv4_rec_train.tar -C pretrained_models

2.参数配置
由上图可得,该模型所对应的配置文件为ch_PP-OCRv4_rec_distill.yml,但是在运行时发生错误,测试后发现该模型所对应的配置文件实际为ch_PP-OCRv4_rec.yml

主要修改训练轮数学习率参相关参数,设置预训练模型路径设置数据集路径。 另外,batch_size可根据自己机器显存大小进行调整。 具体修改如下几个地方:

  epoch_num: 100 # 训练epoch数save_model_dir: ./output/ch_PP-OCR_v4_recsave_epoch_step: 10eval_batch_step: [0, 100] # 评估间隔,每隔100step评估一次pretrained_model: ./pretrained_models/ch_PP-OCRv4_rec_train/student  # 预训练模型路径lr:name: Cosine # 修改学习率衰减策略为Cosinelearning_rate: 0.0001 # 修改fine-tune的学习率warmup_epoch: 2 # 修改warmup轮数Train:dataset:name: SimpleDataSetdata_dir: ./train_data # 训练集图片路径ext_op_transform_idx: 1label_file_list:- ./train_data/chineseocr-data/rec_hand_line_all_label_train.txt # 训练集标签- ./train_data/handwrite/HWDB2.0Train_label.txt- ./train_data/handwrite/HWDB2.1Train_label.txt- ./train_data/handwrite/HWDB2.2Train_label.txt- ./train_data/handwrite/hwdb_ic13/handwriting_hwdb_train_labels.txt- ./train_data/handwrite/HW_Chinese/train_hw.txtEval:dataset:name: SimpleDataSetdata_dir: ./train_data # 测试集图片路径label_file_list:- ./train_data/chineseocr-data/rec_hand_line_all_label_val.txt # 测试集标签- ./train_data/handwrite/HWDB2.0Test_label.txt- ./train_data/handwrite/HWDB2.1Test_label.txt- ./train_data/handwrite/HWDB2.2Test_label.txt- ./train_data/handwrite/hwdb_ic13/handwriting_hwdb_val_labels.txt- ./train_data/handwrite/HW_Chinese/test_hw.txt

由于数据集大多是长文本,因此需要注释掉下面的数据增广策略,以便训练出更好的模型。

- RecConAug:prob: 0.5ext_data_num: 2image_shape: [48, 320, 3]

3.模型训练
我们使用上面修改好的配置文件configs/rec/PP-OCRv4/ch_PP-OCRv4_rec.yml,预训练模型,数据集路径,学习率,训练轮数等都已经设置完毕后,可以使用下面命令开始训练:

# 开始训练识别模型
python3 tools/train.py -c configs/rec/PP-OCRv4/ch_PP-OCRv4_rec.yml

如果训练中断,可采用checkpoints恢复训练:

# 开始训练识别模型
python3 tools/train.py -c configs/rec/PP-OCRv4/ch_PP-OCRv4_rec.yml -o Global.checkpoints="./output/rec_ppocr_v4/best_accuracy"

4.模型验证
验证模型在验证集上的效果:

python3 tools/eval.py -c configs/rec/PP-OCRv4/ch_PP-OCRv4_rec.yml -o Global.pretrained_model="./output/rec_ppocr_v4/best_accuracy"

5.模型导出
将训练模型导出为推理模型:

python3 tools/export_model.py -c configs/rec/PP-OCRv4/ch_PP-OCRv4_rec.yml -o Global.pretrained_model="./output/rec_ppocr_v4/best_accuracy" Global.save_inference_dir="./inference/ch_PP-OCRv4_rec/"

在这里插入图片描述
6.模型推理

python3 tools/infer/predict_rec.py --image_dir="./train_data/handwrite/HWDB2.0Test_images/104-P16_4.jpg" --rec_model_dir="./inference/ch_PP-OCRv4_rec/"

五. 串联推理

模型推理部分官方文档:基于Python引擎的PP-OCR模型库推理

在分别得到文本检测文本方向分类文本识别的推理模型后,即可将三者串联起来进行模型推理。

在执行预测时,需要通过参数image_dir指定单张图像或者图像集合的路径,也支持PDF文件、参数det_model_dir,cls_model_dirrec_model_dir分别指定检测,方向分类和识别的inference模型路径。参数use_angle_cls用于控制是否启用方向分类模型。use_mp表示是否使用多进程(Paddle Inference并不是线程安全,建议使用多进程)。total_process_num表示在使用多进程时的进程数。可视化识别结果默认保存到 ./inference_results 文件夹里面。

在本案例中我们只微调了识别模型,因此在模型库中下载了基于PPOCRv4的文本检测和方向分类的推理模型。

# 使用方向分类器
python3 tools/infer/predict_system.py --image_dir="./train_data/handwrite/HWDB2.0Test_images/" --det_model_dir="./ch_PP-OCRv4_det_infer/" --cls_model_dir="./ch_ppocr_mobile_v2.0_cls_infer/" --rec_model_dir="./inference/ch_PP-OCRv4_rec/" --use_angle_cls=true

六. 注意事项

模型微调的注意事项和技巧参考:模型微调

在微调过程中,由于无法加载最后一层FC的参数,在迭代初期acc=0是正常的情况,不必担心,加载预训练模型依然可以加快模型收敛。

七. 参考文献

PaddleOCR官方文档
Paddle-OCR根据垂直类场景自定义数据微调PP-OCRv4模型
OCR手写文字识别

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/721985.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

EXTJS实现自定义表格

宽度自适应 width: 100%, 高度自适应 height: 100% 同时设置表格所处页面高度100% html,body,#griddemo{height: 100%;} 自定义显示的文本内容 Ext.onReady(function () {Ext.QuickTips.init()function sexText(val) {if (val 0) {return <span style"color:green…

网络编程的学习

思维导图 多路复用代码练习 select完成TCP并发服务器 #include<myhead.h> #define SER_IP "192.168.125.73" //服务器IP #define SER_PORT 8888 //服务器端口号int main(int argc, const char *argv[]) {//1、创建用于监听的套接字int sfd -1;s…

QPainter::translate: Painter not active

画笔关联画布 就是这里少写了this指针

05_Mongooes

Mongooes Mongoose是通过Node来操作MongoDB的一个模块。是基于Node.js的第三方模块。 一、Node.js安装 1.解压 2.创建文件夹 解压路径下&#xff0c;创建两个文件夹 node_global&#xff1a;全局安装位置 node_cache&#xff1a;缓存 3.配置 配置环境变量 在path路径…

毫秒生成的时间戳如何转化成东八区具体时间

假设现在有一个时间是1709101071419L 后端代码实现 Java代码&#xff08;东八区时间&#xff09; 在Java代码中&#xff0c;我们将时区从UTC调整为东八区&#xff08;UTC8&#xff09;&#xff1a; import java.time.Instant; import java.time.ZoneId; import java.time.Z…

FreeRTOS操作系统学习——FreeRTOS工程介绍

FreeRTOS工程介绍 核心文件 FreeRTOS的最核心文件只有2个&#xff1a; FreeRTOS/Source/tasks.cFreeRTOS/Source/list.c 文件功能如下图&#xff1a; 头文件相关 内存管理文件 文件在 Middlewares\Third_Party\FreeRTOS\Source\portable\MemMang 下&#xff0c;它也是放…

JavaScript的`call`方法:实现函数间的调用!

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

堆和二叉树的动态实现(C语言实现)

✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅ ✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨ &#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1…

BUUCTF-Misc-[SUCTF 2019]Game1

题目链接&#xff1a;BUUCTF在线评测 (buuoj.cn) 下载附件一大堆文件&#xff0c;打开index.html时发现一大串base字符 U2FsdGVkX1zHjSBeYPtWQVSwXzcVFZLu6Qm0To/KeuHg8vKAxFrVQ 写代码和工具解都可以 填进去后错误&#xff0c;发现不是真的flag 查看另外一张照片&#xff0c;…

图像AI换脸软件:AI FaceSwap 中文版

AI FaceSwap 是一款利用人工智能技术进行面部交换的软件。该软件通过先进的人工智能算法&#xff0c;能够将一个人的面部表情、神态和特征准确地映射到另一个人身上&#xff0c;实现面部交换的效果。用户只需要提供两张照片&#xff0c;一张是目标人物的照片&#xff0c;另一张…

数据库进阶——如何提升数据库的安全性,以MySQL和Redis加固为例

目录 引出数据库加固加固思路MySQLRedis Redis冲冲冲——缓存三兄弟&#xff1a;缓存击穿、穿透、雪崩缓存击穿缓存穿透缓存雪崩 总结 引出 数据库进阶——如何提升数据库的安全性&#xff0c;以MySQL和Redis加固为例 数据库加固 加固思路 账号配置 应按照用户分配账号&…

Nginx使用—基础知识

Nginx简介 Nginx优点 高性能、高并发 支持很高的并发&#xff0c;在处理大量并发的情况下&#xff0c;比其他web服务器要高效 轻量且高扩展 功能模块少(源代码仅保留http与核心模块代码&#xff0c;其余不够核心代码会作为插件来安装) 代码模块化&#xff08;易读&#xff0…

C语言:qsort的使用方法

目录 1. qsort是什么&#xff1f; 2. 为什么要使用qsort 3. qsort的使用 3.1 qsort的返回值和参数 3.2 qsort的compare函数参数 3.3 int类型数组的qsort完整代码 4. qsort完整代码 1. qsort是什么&#xff1f; qsort中的q在英语中是quick&#xff0c;快速的意思了&#…

C++基础2:C++基本数据类型和控制结构

此专栏为移动机器人知识体系下的编程语言中的 C {\rm C} C从入门到深入的专栏&#xff0c;参考书籍&#xff1a;《深入浅出 C {\rm C} C》(马晓锐)和《从 C {\rm C} C到 C {\rm C} C精通面向对象编程》(曾凡锋等)。 2.C基本数据类型和控制结构 2.1 C基本数据类型 程序是由算法…

C# 中 Replace 字符串操作方法

在 C# 中&#xff0c;Replace 是一个字符串操作方法&#xff0c;用于替换字符串中的指定字符或子字符串。它接受两个参数&#xff1a;要查找和替换的字符串。Replace 方法在源字符串中查找所有匹配的字符或子字符串&#xff0c;并用指定的替换字符串进行替换。 下面是 Replace…

【论文精读】Mask R-CNN

摘要 基于Faster RCNN&#xff0c;做出如下改变&#xff1a; 添加了用于预测每个感兴趣区域(RoI)上的分割掩码分支&#xff0c;与用于分类和边界框回归的分支并行。mask分支是一个应用于每个RoI的FCN&#xff0c;以像素到像素的方式预测分割掩码&#xff0c;只增加了很小的计…

鸿蒙Harmony应用开发—ArkTS声明式开发(通用属性:点击回弹效果)

设置组件点击时回弹效果。 说明&#xff1a; 从API Version 10开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 clickEffect clickEffect(value: ClickEffect | null) 设置当前组件点击回弹效果。 系统能力&#xff1a; SystemCapabilit…

表达式和语句

本文参考C Primer Plus进行C语言学习 文章目录 表达式语句 副作用和序列点复合语句&#xff08;块&#xff09;类型转换 1.表达式 表达式由运算符和运算对象组成。下面是一些表达式&#xff1a; 4 -6 421 a*&#xff08;bc/d&#xff09;/20 q5*2 xq%3 q>3 每个表达式都有一…

软件测试零基础新手入门必看

软件测试&#xff1a;使用技术手段验证软件是否满足使用需求 目的&#xff1a;减少缺陷&#xff0c;保证质量 一、测试主流技能&#xff1a; 1.功能测试 测试主要验证程序的功能是否满足需求 2.自动化测试 使用工具或代码代替手工&#xff0c;对项目进行测试 3.接口测试 …

Golang 开发实战day02 - Print Formatting

Golang 教程02 - Print&#xff0c;Formatting Strings Go语言提供了丰富的格式化字符串功能&#xff0c;用于将数据格式化为特定格式的字符串。本课程将详细介绍Go语言中Print和Formatting Strings的用法&#xff0c;并提供代码示例供大家参考。 Print 类型及使用 1.Print …