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
在一个卷积内,我们使用filter
的L1 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,进一步增大类间距离