当前位置: 首页 > article >正文

PP-OCR系统

我看书上的只到v2系统,所以我这里也只介绍V2,实际上他的包,我看了,已经出到V4了

整个系统包括,文本检测,方向分类,最后进行文本识别

PP-OCRV2改进如下:

• 检测模型优化: (1) 采用 CML 协同互学习知识蒸馏策略;(2) CopyPaste 数据增广策略;
• 识别模型优化: (1) PP-LCNet 轻量级骨干网络;(2) U-DML 改进知识蒸馏策略;(3) Enhanced         CTC loss 损失函数改进。

文本检测

文本检测部分用的还是dbnet,在我之前写的已经有了

基于paddleocr的文本检测-CSDN博客

他这里把mobilenetv3里的se模块去除了,但精度没有下降

模型裁剪策略-FPGM

模型裁剪指的是通过去除网络中冗余的通道(channel)、滤波器(filter)、神经元(neuron)等,来得到一个更轻量的网络,同时尽可能保证模型精度。

他这里是裁剪滤波器,将卷积层中的每个滤波器都作为欧几里德空间中的一个点,它引入了几何中位数这样一个概念,即与所有采样点距离之和最小的点。如果一个滤波器的接近这个几何中位数,那我们可以认为这个滤波器的信息和其他滤波器重合,可以去掉。如下图:

我去看了教程,链接如下:https://github.com/PaddlePaddle/PaddleSlim/blob/release%2F2.0.0/docs/zh_cn/tutorials/pruning/dygraph/filter_pruning.md

在一个卷积内,我们使用filterL1 Norm来代表重要性,L1 Norm越大的filters越重要。在多个卷积间,我们通过敏感度代表卷积的重要性,越敏感的卷积越重要,重要的卷积会被剪掉相对较少的filters。 单个卷积内的filters重要性计算会在剪裁时进行

敏感度定义

如图4-1所示,某个卷积网络包含K个卷积层,每个卷积层有4个filters,原始网络精度为90。

第一步:从『卷积1』中剪裁掉25%的filters,也就是『卷积1』中第2个Filters,然后直接在测试集上评估精度结果为85,得到左边坐标图的第二个红点。恢复模型到初始状态。 第二步:从『卷积1』中裁掉2个卷积,然后在测试集上评估精度为70,得到坐标图的第3个红点。恢复模型到初始状态。 第三步:同理得到第4个红点。把『卷积1』对应的4个红点链接成曲线,即为『卷积1』的敏感度曲线。 第四步:同理得到『卷积K』的敏感度曲线。

敏感度计算

代码如下,人家都弄好了

def eval_fn():
        result = model.evaluate(
            val_dataset,
            batch_size=128)
        return result['acc_top1']
pruner.sensitive(eval_func=eval_fn, sen_file="./sen.pickle")

得到这个文件之后传给下面代码,就能进行裁剪了,裁剪后模型正常来说会变小,但我之前在pytorch弄完模型从4.5M变成10M,离谱,剪枝之后要重新训练模型

plan = pruner.sensitive_prune(0.4, skip_vars=["conv2d_26.w_0"])

还有一个链接可以参考

https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.3/deploy/slim/prune/README.md

通过轻量级骨干网络、轻量级neck结构、SE模块的分析和去除、学习率调整及优化、模型裁剪等策略,DBNet的模型大小从 7M 减少至 1.5M。通过学习率策略优化等训练策略优化,DBNet的模型精度提升超过 1%。

方向分类器

方向分类器的任务是用于分类出文本检测出的文本实例的方向,将文本旋转到0度之后,再送入后续的文本识别器中。PP-OCR中,我们考虑了 0 度和 180 度2个方向。

数据增强

这些数据增广大体分为3个类别:
(1)图像变换类:AutoAugment、RandAugment
(2)图像裁剪类:CutOut、RandErasing、HideAndSeek、GridMask
(3)图像混叠类:Mixup、Cutmix

旋转、透视失真变换、运动模糊变换和高斯噪声变换等,PP-OCR中,统称这些数据增强方法为BDA

书上有不同增强策略组合的结果,如下

在训练时结合BDA和RandAugment,作为方向分类器的数据增强策略。

模型量化

模型量化主要分为离线量化和在线量化。其中,离线量化是指一种利用KL散度等方法来确定量化参数的定点量化方法,量化后不需要再次训练;在线量化是指在训练过程中确定量化参数,相比离线量化模式,它的精度损失更小。

他这里使用的是PACT在线量化,量化教程和端侧部署如下:

https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.4/deploy/slim/quantization/README.md

https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.4/deploy/lite/readme.md

文本识别

我之前弄过了已经,在这个链接:

基于paddleocr的文本识别-CSDN博客

TIA数据增强

大概长下面这样,定了那些红点是基准点,移动这些点使图像扭曲

之后做了跟方向分类器一样的量化

PP-OCRv2优化

• 检测模型优化: (1) 采用 CML 协同互学习知识蒸馏策略;(2) CopyPaste 数据增广策略;
• 识别模型优化: (1) PP-LCNet 轻量级骨干网络;(2) U-DML 改进知识蒸馏策略;(3) Enhanced CTC loss 损失函数改进。

文本检测优化

知识蒸馏

大概分了下面这三种

分了三种损失,

• GT loss
• DML loss
• Distill loss

GT损失,就之前做文本检测,那三个map的损失,DML损失,计算一个对称KL散度,Distill损失,只对特征 Probability map,用了Binary cross-entropy loss 和 Dice loss。最终,将上述三个 loss 相加,就得到了用于 CML 训练的损失函数。

CopyPaste

一种数据增强

他通过一个数据集进行演示,如下,红色框是原始标注信息,蓝色框是经过CopyPaste补充
的标注框。

文本识别优化

PP-LCNet

PP-LCNet基于MobileNetV1改进得到,其结构图如下所示。

相比于MobileNetV1,PP-LCNet中融合了MobileNetV3结构中激活函数、头部结构、SE模块等策略优化技巧,同时分析了最后阶段卷积层的卷积核大小,最终该模型在保证速度优势的基础上,精度大幅超越MobileNet、GhostNet等轻量级模型。
具体地,PP-LCNet中共涉及到下面4个优化点。
• 除了 SE 模块,网络中所有的 relu 激活函数替换为 h-swish,精度提升1%-2%
• PP-LCNet 第五阶段,DW 的 kernel size 变为5x5,精度提升0.5%-1%
• PP-LCNet 第五阶段的最后两个 DepthSepConv block 添加 SE 模块,精度提升0.5%-1%
• GAP 后添加 1280 维的 FC 层,增加特征表达能力,精度提升2%-3%

Udml知识蒸馏

在标准的 DML 知识蒸馏的基础上,新增引入了对于 Feature Map 的监督机制,新增 Feature
Loss。

Enhanced CTC loss

引入 Center loss,进一步增大类间距离


http://www.kler.cn/a/509465.html

相关文章:

  • SimpleHelp远程管理软件存在任意文件读取漏洞(CVE-2024-57727)
  • Java定时任务不明原因挂掉(定时任务挂掉)以及建议
  • 使用 Helm 安装 Redis 集群
  • LLM - 大模型 ScallingLaws 的 CLM 和 MLM 中不同系数(PLM) 教程(2)
  • doc、pdf转markdown
  • SpringBoot+Vue小区智享物业管理系统(高质量源码,可定制,提供文档,免费部署到本地)
  • CloudberryDB(四)并行执行
  • 【Linux系统编程】—— 深入理解Linux中的环境变量与程序地址空间
  • 电路笔记(通信模块): 基于ESP32-S3实现的XVC(Xilinx Virtual Cable) JTAG下载器硬件
  • 【LOJ 6198】谢特 题解(可持久化Trie+后缀数组SA+启发式分裂+RMQ)
  • Jenkins-git配置说明!
  • Android SystemUI——CarSystemBar添加到窗口(十)
  • Debian终端高亮(显示不同颜色)
  • JVM加载
  • Social LSTM:Human Trajectory Prediction in Crowded Spaces | 文献翻译
  • 学生信息管理系统数据库设计(sql server)
  • 【three.js】纹理贴图
  • 1.4走向不同:GPT 与 BERT 的选择——两大NLP模型的深度解析
  • HTML元素新视角:置换元素与非置换元素的区分与理解
  • Golang笔记——常用库reflect和unsafe
  • 今天你学C++了吗?——C++中的STL
  • Docker部署php-fpm服务器详细教程
  • 嵌入式知识点总结(一)-C/C++关键字
  • HunyuanVideo 文生视频模型实践
  • # [游戏开发] [Unity游戏开发]3D滚球游戏设计与实现教程
  • 构建core模块