senlinuc / caffe_ocr

主流ocr算法研究实验性的项目,目前实现了CNN+BLSTM+CTC架构
1.26k stars 535 forks source link

任意数量字符训练? #12

Closed dajidali010 closed 6 years ago

dajidali010 commented 6 years ago

您好,训练可以使用任意多的字符吗?训练时可以只固定高度吗?

jxlijunhao commented 6 years ago

@dajidali010 @理论上是可以任意字符的,但是CNN的网络结构决定了输入Batch中图片的大小必须保持一致,所以有些图片还是会被拉伸,如果拉伸形变过大,人眼都无法识别时,训练网络已经没有意义了, 所以在网络上H是固定的32(网络决定),W 可以根据自己数据来设定, @senlinuc 在生成样本是保持固定的H, W , 对字符进行模糊等操作,应该是一种很好的处理方式,小白的看法,欢迎指正。

dajidali010 commented 6 years ago

@jxlijunhao @senlinuc 大神的版本预测时只需固定高度,宽度是任意,这个样子训练时只需固定高度,宽度按原始比例变换就可以了吧,如果输入Batch 的大小必须一致,将Batch数目设为1就好吧,保持原有比例不存在拉伸了,简单的看法,欢迎指正

senlinuc commented 6 years ago

jxlijunhao说的没错,训练时至少要保证每个batch内的图片和label的大小是相同的,所以一般有两种数据生成方式:

  1. 所有样本都固定宽高和字符个数,对于字符总长度过短的图片可通过填充背景色来扩充到固定的宽高,这样可防止拉伸过大的情况,当然最后先做适当拉伸(小范围内随机)后再填背景色扩充,以便引入形变这个变化因素。
  2. 事先设定几种宽高和字符数,每种设定内的数据可按1的方式生成,训练时N种设定看成N个桶,每次可以随机地从一个桶内选一个batch的数据来训练 显然方式1更简单,好实现,训练时batch size=1理论上也是可以的,但对于训练的效果和效率都是不利的。预测时图片宽度难以控制,一般都是一张一张处理。
dajidali010 commented 6 years ago

@senlinuc 非常感谢您的解答。对于方式1,固定样本宽高好办,字符个数也要固定?样本宽度可以边缘扩充得到,但是使用真实场景的样本字符个数没办法控制,或者可以在后面补充0(您label中的blank)解决?

senlinuc commented 6 years ago

字符个数可以不固定,可以在1~N之间随机,训练时label后面补blank。但我个人觉得没必要刻意模拟真实场景中字符个数变化这种情况,字符个数固定为N反倒会使得数据更加充实,学习效率更高,否则你可能会学习到一堆堆的无用的blank。

dajidali010 commented 6 years ago

@senlinuc 谢谢。因为我有一部分真实的数据,想加进去训练,但是字符个数不固定,我在后面补blank尝试下,再次感谢

senlinuc commented 6 years ago

真实数据的话只能补blank了

shaoshuaiche commented 5 years ago

在后面补blank,可以吗?