1.超参数调整策略
模型训练过程中需要手动调整一些超参数,帮助模型以 最小的代价获得最优指标 。不同的数据量可能需要不同的超参,当您希望在自己的数据上finetune
或对模型效果调优时,有以下几个参数调整策略可供参考:
1.1学习率
学习率是训练神经网络的重要超参数之一,它代表在 每一次迭代中梯度向损失函数最优解移动的步长。 在PaddleOCR中
提供了多种学习率更新策略,可以通过配置文件修改,例如:
Optimizer:
...
lr:
name: Piecewise
decay_epochs : [700, 800]
values : [0.001, 0.0001]
warmup_epoch: 5
Piecewise
代表分段常数衰减,在不同的学习阶段指定不同的学习率,在每段内学习率相同。 warmup_epoc
h 代表在前5个epoch
中,学习率将逐渐从0增加到base_lr
。全部策略可以参考代码:
learning_rate.py
1.2正则化
正则化可以 有效的避免算法过拟合,PaddleOCR
中提供了L1、L2
正则方法,L1 和 L2
正则化是最常用的正则化方法。L1 正则化向目标函数添加正则化项,以减少参数的绝对值总和
;而 L2 正则化中,添加正则化项的目的在于减少参数平方的总和
。配置方法如下:
Optimizer:
...
regularizer:
name: L2
factor: 2.0e-05
1.3评估指标
(1)检测阶段:先按照检测框和标注框的IOU
评估,IOU
大于某个阈值判断为检测准确。这里检测框和标注框不同于一般的通用目标检测框,是采用多边形进行表示。检测准确率:正确的检测框个数在全部检测框的占比,主要是判断检测指标。检测召回率:正确的检测框个数在全部标注框的占比,主要是判断漏检的指标。
(2)识别阶段: 字符识别准确率,即正确识别的文本行占标注的文本行数量的比例,只有整行文本识别对才算正确识别。
(3)端到端统计: 端对端召回率:准确检测并正确识别文本行在全部标注文本行的占比; 端到端准确率:准确检测并正确识别文本行在检测到的文本行数量的占比; 准确检测的标准是检测框与标注框的IOU
大于某个阈值,正确识别的检测框中的文本与标注的文本相同。
2.自己构建数据集
在构建数据集时有几个经验可供参考:
(1) 训练集的数据量:
a. 检测需要的数据相对较少,在
PaddleOCR
模型的基础上进行Fine-tune
,一般需要500
张可达到不错的效果。
b. 识别分英文和中文,一般英文场景需要几十万
数据可达到不错的效果,中文则需要几百万
甚至更多。
(2)当训练数据量少时,可以尝试以下三种方式获取更多的数据:
a. 人工采集更多的训练数据,最直接也是最有效的方式。
b. 基于PIL
和opencv
基本图像处理或者变换。例如PIL
中ImageFont
,Image
,ImageDraw
三个模块将文字写到背景中,opencv
的旋转仿射变换,高斯滤波等。
c. 利用数据生成算法合成数据,例如pix2pix
或StyleText
等算法。
3.常见问题
Q:训练CRNN
识别时,如何选择合适的网络输入shape
?
A:一般高度采用
32
,最长宽度的选择,有两种方法:(1)统计训练样本图像的宽高比分布。最大宽高比的选取考虑满足
80%
的训练样本。
(2)统计训练样本文字数目。最长字符数目的选取考虑满足80%
的训练样本。然后中文字符长宽比近似认为是1
,英文认为3:1
,预估一个最长宽度。
Q:识别训练时,训练集精度已经到达90
了,但验证集精度一直在70
,涨不上去怎么办?
A:训练集精度
90
,测试集70
多的话,应该是过拟合了,有两个可尝试的方法:
Q: 识别模型训练时,loss
能正常下降,但acc
一直为0
A:识别模型训练初期
acc
为0
是正常的,多训一段时间指标就上来了。