chenjun2hao / Attention_ocr.pytorch

This repository implements the the encoder and decoder model with attention model for OCR
354 stars 109 forks source link

不定长的识别问题 #8

Open Hubert2102 opened 5 years ago

Hubert2102 commented 5 years ago

你好,用您提供的开源模型进行不定长测试,有这两种问题: 1.图片不定长: transformer = dataset.resizeNormalize((280, 32)),非280会报错,CRNN的处理是按照32的高然后同比例缩放图片的宽,因此输入是(x,32) 2.文字不定长: 可能是因为训练的时候都是10个字,预测的时候不管图片里面几个字,预测结果还都是10个字左右?

举个例子,把图片 20436312_1683447152 中的字去掉几个后,还是280*32输入识别, 2043 结果是这样: predict_str:,_不愿意意意资(9个字) => prob:0.002346405293792486 ![20437421](https://user-images.githubusercontent.com/29619323/54267706-aa978f80-45b4-11e9-8837-8f83854d9ad9.jpg) predict_str:中国通信信位主办、《 (10个字) => prob:0.05960559844970703 20437421_21 predict_str:,(通信学会主主府 (9个字) => prob:0.000349084148183465 204 predict_str:叶国通信学会主里”《 (10个字) => prob:0.01799328438937664

想问如何解决?是不是训练需要不定长训练啊?谢谢~

chenjun2hao commented 5 years ago

@Hubert2102 针对图片不定长的问题,后面会更新一个版本的。文字不定长,理论上改标注就行了。

Hubert2102 commented 5 years ago

改标注指的是不定长文字训练嘛@chenjun2hao

zuokai commented 5 years ago

@chenjun2hao 我尝试了不定长训练,包括几种方式: 1)batch内定长,不同batch之间不定长 2)所有batch都定长,通过pad的方式 3)cnn阶段不定长,在输入lstm的时候加pad 这3种方式都无法收敛,我想问下你是怎么实现不定长图片训练的啊?

Lanme commented 5 years ago

这个是不定长训练可以解决的么?我看ctc解码是定长训练可以不定长预测来着

Lanme commented 5 years ago

@chenjun2hao 我尝试了不定长训练,包括几种方式: 1)batch内定长,不同batch之间不定长 2)所有batch都定长,通过pad的方式 3)cnn阶段不定长,在输入lstm的时候加pad 这3种方式都无法收敛,我想问下你是怎么实现不定长图片训练的啊?

请问你是pad了图片还是文字还是两者呢?不定长那么图片的大小也会不一样吧

chenjun2hao commented 5 years ago

@Lanme ,针对不定长的文本,你需要:1. 在batch内将图片统一宽度或者整个数据集用同样的宽度。2. 为了batch训练,你需要将标注的label填充为统一的长度(用blank进行填充)。

Lanme commented 5 years ago

那这确定是不定长训练能解决么? 我定长训练了,之后我输入的图片也是这么多字符,但是图片被拉长了,字符间距变大,resize成固定高度,这个时候宽度和原来训练的不一样,就识别不出来了。

zuokai commented 5 years ago

@Lanme 训练时输入图像分桶,保证同一个batch内的长度一样就可以

Lanme commented 5 years ago

@Lanme 训练时输入图像分桶,保证同一个batch内的长度一样就可以

你试过这样不定长训练就能解决不定长预测的问题么?

zuokai commented 5 years ago

@Lanme 可以,我尺度用的range(64,4,516),超过512缩放到512,低于64的缩放到64,效果和训练几个定长模型差不多

wenston2006 commented 5 years ago

@zuokai 将图像缩放到统一高度,长度不够的话进行padding; 这样做进行不定长训练可否? 我的想法是这样就不用对数据分桶了; 另外请问你数据分桶用的什么函数?

zuokai commented 5 years ago

@wenston2006考虑到训练耗时,我没有加pad啊,你可以试试,我觉得应该是可以的,不过这样你要把sequence_length传给dynamic_rnn,分桶我就是随机random.choice(range(64,516,4))

wenston2006 commented 5 years ago

@zuokai 了解了,我以为用的pytorch自带的bucket函数; 你训练不定长图片,最后在测试集上识别精度如何?

zuokai commented 5 years ago

@wenston2006 精度和训练多个定长的attention模型几乎一样,具体和你测试集难度有关

wenston2006 commented 5 years ago

@zuokai tensorflow因为用的静态图, 对于不定长的训练数据, 由于相应的RNN的参数也会改变, 导致需要构建多个静态图, 所以推出了dynamic_rnn; pytorch本身就是构建的动态图,应该没有dynamic_rnn这个函数吧?我现在用的这个git里面的第二版本, 作者对每个batch求得最长的文本长度max_length, 然后构建图时图的长度就是max_length, batch里面长度较短的文本,会填充若干个blank字符进行对齐. 不知道他的做法是否跟你前面讲的思路一致?

wenston2006 commented 5 years ago

@zuokai 我梳理了一下,本git第二版图片的长度统一resize到高32, 长280, 对于文本标签也进行了对齐; 根据你前面讲的,你是将图片分桶, 我的理解是不改变原图的宽和高的比例, 但将高度统一缩放到某个固定高度(如32?), 然后不断从训练数据中抽取相同宽度的图片,直到获得batch_size张图片,然后进行训练; 我现在还有三点存疑: 1)请问你对文本标签怎么处理的,是否进行了对齐呢?同时确保图片尺寸和文本标签长度一致似乎较难; 2)分桶以后要针对每种图片宽度构建一个模型吗?;3)在2)的基础上, loss也要针对每种模型进行计算,最终将不同模型的loss累加起来?

zuokai commented 5 years ago

@wenston2006 是一个模型啊,cnn和dynamic_rnn本来就支持动态大小的图片,只是因为需要batch训练,才通过分桶保证图像在一个batch内宽度是一样的,但是文本长度是不一样的,用补齐就行了

wenston2006 commented 5 years ago

@zuokai 我现在也尝试了bucket的思路,不过我是根据训练文本长度来区分的, 训练的loss很低,但在测试集上loss很高, 训练出来的模型泛化性能不强, 应该是过拟合了; 把训练数据用来测试都是对的,换成别的数据,就不行了,对测试文本长度也比较敏感

wenston2006 commented 4 years ago

@kellylin841015 请问你的训练和测试代码可以分享一下吗? 你上面提到训练都用的10个字,那么cnn阶段不定长是指的训练还是测试?

kellylin841015 commented 4 years ago

@Lanme ,针对不定长的文本,你需要:1. 在batch内将图片统一宽度或者整个数据集用同样的宽度。2. 为了batch训练,你需要将标注的label填充为统一的长度(用blank进行填充)。

你好,請問,blank填充是指你的字典裡有一個字符是" "空格嗎?還是你以其他字符代表?