CRNN_Chinese_Characters_Rec icon indicating copy to clipboard operation
CRNN_Chinese_Characters_Rec copied to clipboard

关于demo.py中resize问题,

Open zcswdt opened this issue 4 years ago • 55 comments

您好,我发现您的demo.py中的resize,有点不对,首先在训练的时候,您对图片宽度先进行了280到160的放缩,放缩因子为1.75。所以我们在测试图片处理 第一步,也应该要进行图片宽度除以这个放缩因子。 第二步,图片高度要放缩到固定的高度32,所以同时宽度在此基础上也要同比例缩放。 假如一张416乘86的图片,经过第一步会缩放到237乘以86的尺寸。然后在经过第二步,同比例缩放,缩放完以后宽度应该是88,高度为32。但是您的代码我单独打印出来,您的宽度仍然是237,高度是32。所以并没有按照同比例缩放?是我的理解错了吗?希望得到您的回复,谢谢。 微信图片_20200427172027

zcswdt avatar Apr 27 '20 09:04 zcswdt

我这里是宽高一起放缩, 416x86 --> 237x32

Sierkinhane avatar Apr 27 '20 23:04 Sierkinhane

如果测试的时候您将宽和高一起放缩,那么和您训练时候数据放缩倍数不一样,因为您训练的时候宽度280,高度32,您会放缩到宽度160,高度32,所以图片仅仅通过了宽度放缩,(这个时候图片会变形),但是在测试的时候不应该是先经过在保持高度不变,在宽度上进行280-160的放缩,然后在经过同比例将高度放缩到32的同时,宽度第二次经过放缩吗?

在2020年04月28日 07:32,WoodGhost. 写道:

我这里是宽高一起放缩, 416x86 --> 237x32

— You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub, or unsubscribe.

zcswdt avatar Apr 28 '20 00:04 zcswdt

应该是按你这样操作,先同比例缩放至高度为32,然后再放缩宽度!

Sierkinhane avatar Apr 28 '20 01:04 Sierkinhane

应该是按你这样操作,先同比例缩放至高度为32,然后再放缩宽度!

好的,多谢,还有我看到您使用360万定长10字的图片进行训练的,您的训练代码可以直接训练不定长的文字图吗?

zcswdt avatar Apr 28 '20 01:04 zcswdt

修改一下dataloader,字符数不定,但是分辨率要固定

Sierkinhane avatar Apr 28 '20 01:04 Sierkinhane

修改一下dataloader,字符数不定,但是分辨率要固定

我刚看了一下您的train.py代码,没看懂怎么修改dataloader,可以告知一下如何修改吗?谢谢!

zcswdt avatar Apr 28 '20 02:04 zcswdt

lib/Dataset/ 代码在这里

Sierkinhane avatar Apr 28 '20 02:04 Sierkinhane

lib/Dataset/ 代码在这里

image 谢谢,我太笨了,很抱歉啊,我只看到有resize的地方,没看到如何修改dataloader字符数不固定,可以写一下在哪里修改代码吗?十分感谢

zcswdt avatar Apr 28 '20 02:04 zcswdt

这个就是数据导入类,你按你的需求修改

Sierkinhane avatar Apr 28 '20 02:04 Sierkinhane

这个就是数据导入类,你按你的需求修改

谢谢回复,self.labels就是我们需要的导入的图片名称和标签,但是我不知道哪里修改不定长的,字符数不固定。

zcswdt avatar Apr 28 '20 02:04 zcswdt

这个就是数据导入类,你按你的需求修改

谢谢回复,self.labels就是我们需要的导入的图片名称和标签,但是我不知道哪里修改不定长的,字符数不固定。

你的这个问题,我这边的处理方式是batch_size = 1就能解决不定长的训练。

ChenHuaYou avatar May 22 '20 14:05 ChenHuaYou

就能解决不定长的训练

谢谢回复,batch_size=1那不得训练很长时间吗?

zcswdt avatar May 29 '20 08:05 zcswdt

@zcswdt 你说的是应该是每个batch的数据之间的宽度可以不一样,支持不定长吧。但是每个batch之内的图片还是会缩放到同一尺寸的,可以通过对batch的数据进行填充或者resize

DuckJ avatar Jun 03 '20 06:06 DuckJ

@zcswdt 你说的是应该是每个batch的数据之间的宽度可以不一样,支持不定长吧。但是每个batch之内的图片还是会缩放到同一尺寸的,可以通过对batch的数据进行填充或者resize

谢谢回复,对,就是原始图片的长度是不定长,而且字数也是不定字数,这样的话,有好的处理方法吗?

zcswdt avatar Jun 03 '20 07:06 zcswdt

@zcswdt 有啊,就是通过对每个batch图片resize或者填充到指定大小即可,不同batch之间可以不一样,你可以参考这个https://github.com/Holmeyoung/crnn-pytorch/blob/master/dataset.py#L117

DuckJ avatar Jun 05 '20 06:06 DuckJ

@zcswdt 有啊,就是通过对每个batch图片resize或者填充到指定大小即可,不同batch之间可以不一样,你可以参考这个https://github.com/Holmeyoung/crnn-pytorch/blob/master/dataset.py#L117

It doesn't keep the ratios.

abcxs avatar Jun 10 '20 06:06 abcxs

@abcxs 他这个是resize 破坏了ratio,但是你可以改代码进行填充而不是resize的啊

DuckJ avatar Jun 10 '20 06:06 DuckJ

@DuckJ I agree with you.

abcxs avatar Jun 10 '20 06:06 abcxs

应该是按你这样操作,先同比例缩放至高度为32,然后再放缩宽度!

请问一个问题,您第二步resize操作的时候,直接强行放缩宽度值,不会使图片中的字符变形严重吗(当输入图片宽高比与训练图差别较大时)? 我刚接触ocr没多久,crnn中不是说可以只统一高度,宽度任意吗? 您这个网络支持这种输入方式吗?

chen1234520 avatar Jun 24 '20 06:06 chen1234520

应该是按你这样操作,先同比例缩放至高度为32,然后再放缩宽度!

请问一个问题,您第二步resize操作的时候,直接强行放缩宽度值,不会使图片中的字符变形严重吗(当输入图片宽高比与训练图差别较大时)? 我刚接触ocr没多久,crnn中不是说可以只统一高度,宽度任意吗? 您这个网络支持这种输入方式吗?

感觉后面补0效果更好

abcxs avatar Jun 24 '20 06:06 abcxs

应该是按你这样操作,先同比例缩放至高度为32,然后再放缩宽度!

请问一个问题,您第二步resize操作的时候,直接强行放缩宽度值,不会使图片中的字符变形严重吗(当输入图片宽高比与训练图差别较大时)? 我刚接触ocr没多久,crnn中不是说可以只统一高度,宽度任意吗? 您这个网络支持这种输入方式吗?

感觉后面补0效果更好 如果测试图宽度比训练图宽度小可以直接填充补白,但是如果测试图宽度比训练图长好多时,直接压缩形变比较严重吧? 不是可以支持只固定图像高度吗? 请问您知道如何操作吗?

chen1234520 avatar Jun 24 '20 07:06 chen1234520

@chen1234520 测试时候一般都是任意宽度的,保证cnn出来的特征高是1就行,由于后面是lstm这种rnn结构,宽度的不同其实只是送到lstm的序列时间步不同

DuckJ avatar Jun 24 '20 07:06 DuckJ

@chen1234520 保持宽高比就行,高度到32,宽度按照一样的比例进行 padding是为了好计算,这是和最长的保持一样就行

abcxs avatar Jun 24 '20 07:06 abcxs

@chen1234520 保持宽高比就行,高度到32,宽度按照一样的比例进行 padding是为了好计算,这是和最长的保持一样就行

宽高比是训练数据的宽高比吗?我训练时尺寸32032,但是实际测试时有些图片宽度过长,例如64032。这中情况,输入时图片需要resize到多少?是强行压缩到32032,还是网络直接可以接受64032的输入尺寸?

chen1234520 avatar Jun 24 '20 07:06 chen1234520

@chen1234520 cnn对于输入大小是没有限制的,这里用32,主要是为了lstm的使用,一个词一个向量(如果不用32也可以,不过得加些处理,例如add或者concat)。lstm对于长度是没有限制的,每次输入一个特征向量就行。 这里一个batch的图片保持宽高一样,是为了好计算。 所以,你这里处理的时候,比如pytroch dataloader有个collate函数,你可以在那里处理,计算最长的(假定之前之前按比例缩放高度为32了),对于不够的padding补0,剩下的应该就可以直接送入网络就行了。。

abcxs avatar Jun 24 '20 07:06 abcxs

@chen1234520 cnn对于输入大小是没有限制的,这里用32,主要是为了lstm的使用,一个词一个向量(如果不用32也可以,不过得加些处理,例如add或者concat)。lstm对于长度是没有限制的,每次输入一个特征向量就行。 这里一个batch的图片保持宽高一样,是为了好计算。 所以,你这里处理的时候,比如pytroch dataloader有个collate函数,你可以在那里处理,计算最长的(假定之前之前按比例缩放高度为32了),对于不够的padding补0,剩下的应该就可以直接送入网络就行了。。

您这里指的是训练过程吗? 那测试过程呢?假使训练阶段我的训练图片,宽高比为10:1,320×32。那么再测试时,一张例如1000×64尺寸的图像,是仅需要将高度缩放到32,即500*32作为输入,还是需要强行改变宽高比缩放到320×32?

chen1234520 avatar Jun 24 '20 07:06 chen1234520

@chen1234520 如果测试中batch > 1的话,也是做一样的操作,如果一张图片,直接500 * 32就行

abcxs avatar Jun 24 '20 07:06 abcxs

@chen1234520 如果测试中batch > 1的话,也是做一样的操作,如果一张图片,直接500 * 32就行

500 * 32之后 宽度再 500 * (160 / 280)吧?

CabbageWust avatar Jun 24 '20 07:06 CabbageWust

@CabbageWust 还需要这个吗,原因呢。。

abcxs avatar Jun 24 '20 07:06 abcxs

@CabbageWust 还需要这个吗,原因呢。。

因为训练的时候是这样处理的,这个issu前面不是在说这个吗。

看前面的作者回复:

“应该是按你这样操作,先同比例缩放至高度为32,然后再放缩宽度!”

CabbageWust avatar Jun 24 '20 07:06 CabbageWust