YCG09 / chinese_ocr

CTPN + DenseNet + CTC based end-to-end Chinese OCR implemented using tensorflow and keras
Apache License 2.0
2.73k stars 1.08k forks source link

识别部分的一些使用心得 #363

Open shining-love opened 3 years ago

shining-love commented 3 years ago

首先很感谢repo主无私的分享,该repo非常经典。在使用该repo过程中走过很多坑以下简要介绍:(1)模型推断阶段BN层未关闭,(2)模型推断时dropout未关闭(但测试了很多,发现未关闭也没有出现影响),(3)模型中图像宽度缩小8倍进入ctc loss计算这一点限制很大,使得你训练使用的图像宽度和图像中的文字序列长度有较好的比例,不然就会导致ctc loss无法计算出现ctc loss 为inf的情况,即模型结构使得图像宽度缩小8倍很坑,(4)模型采用的原始训练数据是很规整的同一32*280的图片,统一的10个字符长度,但如果我们拿自己的图像(或者开源的数据)是不定长图像宽度以及字符长度,所以为了保证我们同一个batch中图像的宽度是一致的,我们有2种策略选择:一是直接统一resize成同一高和宽(一定要确保宽度满足条件:宽//8>=字符长度+连续字符重复总个数);二是在每个batch中以最大宽度为基准进行pad。这两种策略我测试了在一些图像宽度变化较大,仿射变换严重的数据集上都不太好,首先策略1直接resize会造成图像中文字发生变形,其次策略2在每个batch中以最大宽度为基准进行pad会造成原始图像(特别是一些图与具有最大宽度的图之间宽度相差较大)出现较多非文字空白区域,使得模型难以识别这样的图。 综上:如果想要在宽度一致性较差,宽高比例不好以及图像倾斜度较大的数据集上进行训练建议放弃该repo,选择其他的repo(比如crnn的)

piaobuliao commented 3 years ago

想问下模型推断阶段BN层怎么关闭?

看这里好像说是调用predict自动关闭的,怪不得之前我不用关闭 预测也都没问题 https://zhuanlan.zhihu.com/p/56225304 Keras用learning_phase机制来告诉模型当前的所处的模式。假如用户没有手工指定的话,使用fit()时,网络默认将learning_phase设为1,表示训练模式。在预测时,比如调用predict()和evaluate()方法或者在fit()的验证步骤中,网络将learning_phase设为0,表示测试模式。用户可以静态地,在model或tensor添加到一个graph中之前,将learning_phase设为某个值(虽然官方不推荐手动设置),设置后,learning_phase就不可以修改了。

praymich commented 3 years ago

十分感谢分享心得

rsqai commented 3 years ago

这个使用中会不会有问题啊,比如图像旋转了180度,这个时候需要先检测旋转角度再矫正,最后再进行文字检测和识别。我看有另外一个项目,就在前面加了个角度识别90度180度270度,想自己搞一个但是没数据。。。

fire717 commented 3 years ago

这个使用中会不会有问题啊,比如图像旋转了180度,这个时候需要先检测旋转角度再矫正,最后再进行文字检测和识别。我看有另外一个项目,就在前面加了个角度识别90度180度270度,想自己搞一个但是没数据。。。

数据不是很容易生成吗?

Cocoalate commented 3 years ago

你好,请问crnn对输入文本图像的处理不也是需要resize成相同长款么,为什么选择crnn会更好?