PaddlePaddle / PaddleOCR

Awesome multilingual OCR toolkits based on PaddlePaddle (practical ultra lightweight OCR system, support 80+ languages recognition, provide data annotation and synthesis tools, support training and deployment among server, mobile, embedded and IoT devices)
https://paddlepaddle.github.io/PaddleOCR/
Apache License 2.0
44.57k stars 7.85k forks source link

折腾了一个月才发现真正的瓶颈是文字检测,清看看我的推论是否正确 #1663

Closed Heidernlee closed 3 years ago

Heidernlee commented 3 years ago

外文,自己准备了全套合成训练数据+实际数据,折腾了有一个月。 最终识别效果还可以,发现一个很重要的问题: 文本检测之后是一条长长的图片,里面大概10个文字, 如果文字边缘留白比较大(5像素左右),那么识别效果很差。如果文字边缘留白是1,2像素,那么识别效果好很多。 推测是因为我的合成训练数据的留白就是1,2像素。

请问推测正确吗?实际识别的时候文字留白是这么重要的因素?

现在我打算用OpenCV把文本检测之后的长图片再做一次最大外矩形切割,强行使之留白为1,2像素,这种思路是否可行?

LDOUBLEV commented 3 years ago

你指的文字边缘留白是上下左右留白呢,还是左右留白呢?如果是文本框不够紧致,可以把unclip_ratio这个参数调小一些;

Heidernlee commented 3 years ago

@LDOUBLEV 除了右边留白还没试,其他三个方向的留白都会影响识别结果,影响的还挺大。。。 请问我的推测是正确的吗?训练样本的留白会影响实际识别效果?

Dajiang1202 commented 3 years ago

@LDOUBLEV 除了右边留白还没试,其他三个方向的留白都会影响识别结果,影响的还挺大。。。 请问我的推测是正确的吗?训练样本的留白会影响实际识别效果?

请问实际效果如何?

Heidernlee commented 3 years ago

@LDOUBLEV @Dajiang1202 效果好很多。。。。神经元一个一个走下去,留白真是相当大的影响因素。 其实识别模型已经是很好了,基本99%,也就是说如果训练样本是1像素留白, 待识别的图片里的文字也是1像素留白(我PS手切的),那99%识别率。 但如果是3像素留白,那识别率能70%就不错了。。。。

瓶颈完全就在检测,检测完它的留白未必就一定是1像素, 跟unclip_ratio没啥关系,unclip_ratio是强行加上去的留白。

我考虑了把0,1,2,3像素四种留白都做成训练样本投入训练,反正凑合吧, 比只投1像素的好不少,大约85%,再多不划算了,训练样本太大了

heyhumor commented 3 years ago

你的推测不完全正确,文字留白只是表象。但是你已经意识到了训练集的特征影响了,这个在模型评估里面叫做泛化。你需要生成更多变的字体类型和大小,来教模型适应留白不同的场景,这样准确率就会大大提升。

Heidernlee commented 3 years ago

@heyhumor 其实字体大小,包括是否粗体都投入样本进行训练了,最终结果就是不好, 结论就是留白(当时的,现在发现还有其他因素),因为留白跟识别没太大关系, 它只跟检测模型有关系,检测完切出来一小条文字带的留白。 按你说的投入更多字体类型和字体大小,其实只是碰巧不同类型,大小的字体检测出来的留白不一样而已。

现在越来越感觉深度学习的关键就是如何选择训练数据,实际样本不可能投入太多的, 最好的样本都是手切的,成千上万的根本切不起。关键就是如何“合成出跟实际场景最相近的训练数据”。

这两天我这儿识别率上到95%了,85%~95%,需要的只是3万的特殊样本你敢信?这3万都是合成的。 现在我觉得是不是代码提供方故意藏着一些东西不说啊。。。那么几句话说了人人都能95%。

heyhumor commented 3 years ago

@Heidernlee
我们训练都在100w数据集以上的,一般正式应用都会用300w左右数据量。 这个模型我没有测试,之前用CRNN模型做过不少测试,印刷体准确率都在98,99以上。 如果你觉得数据量够了效果还不好,看下每层的padding数值,调整一下可能好一些。

Heidernlee commented 3 years ago

@heyhumor

我也是印刷体,就像上面念叨的,一个字体+一个字号投个15万样本进去, 识别同样的字体,同样字号的一张图(20几行文字),检测+识别也就75%左右, 但如果我把这张的图手切之后只跑识别,那肯定95%以上,我这才意识到是检测的问题, 所以才说瓶颈不在识别,而在检测嘛。

真是服气了,满世界的CRNN+CTPN+CTC神经网络都长得差不多,关键还是要看 你投了什么样本进去跑,这些经验我真希望paddleocr能明明白白说出来。。。。

你建议的调整padding,记下了,3q~~

heyhumor commented 3 years ago

@Heidernlee 教会徒弟饿死了师傅,哈哈 文本检测和识别是要需要独立开的,如果你觉得检测效果不好,可以对检测的结果进行归一化。 我之前CRNN训练用固定的280x32,识别的话长度可以不定,里面的字符高度通过opencv投影 进行检测,再补上固定留白,也是OK的。不要用手切了,哈哈~

Heidernlee commented 3 years ago

@heyhumor 是的呗,就是检测,只看识别真的挺好,只要各种字体字号什么的投一些进去就够了。

现在我弄出来的模型在特定字体字号下已经比Tesseract好了, 哎,通用识别最终还是干不过专项的~

chenshanhuo commented 2 years ago

我可能就是留白过大,结果导致预测的结果中有很多很小的文本框????

chenshanhuo commented 2 years ago

我可能就是留白过大,结果导致预测的结果中有很多很小的文本框????

不知道有没有人遇到过这个问题,怎么解决

Heidernlee commented 2 years ago

我可能就是留白过大,结果导致预测的结果中有很多很小的文本框????

不知道有没有人遇到过这个问题,怎么解决

最后我是想办法把多余的留白切掉就好了。。。 各种方法,包括OpenCV,或者直接读取图片然后按像素点切掉什么的,都可以

guanquanchen commented 5 months ago

傻大木心里头疼,也是意识到检测的困难 不过我做的很简单,每次都是特定场景的识别,表格母版都一样,只是存在各种各样的形变。