yizt / crnn.pytorch

crnn实现水平和垂直方向中文文字识别, 提供在3w多个中文字符训练的水平识别和垂直识别的预训练模型; 欢迎关注,试用和反馈问题... ...
Apache License 2.0
241 stars 52 forks source link

请教 #19

Closed kaixinbaba closed 4 years ago

kaixinbaba commented 4 years ago

我修改了Word对象的all_word的返回,我的目标字符只有英文和数字 加上 逗号 空格 减号一些简单的符号,训练完200epoch 之后使用这个模型预测的时候发现 无论识别什么图片(先不管最终结果的正确),在结果的label中的各个字符前后都有很多0 比如: 我的图片中是 hello world 识别出来的是 h0e0l0l0o0 0w0o0r0l0d0 类似于这样的。 然后我尝试修改all_word的返回 把空格放在第一个字符位 -, 123456... (原先是0123456...abc...) 之后训练出来模型的结果也是类似的情况,只是0变成了空格 hello world就会变成 h e l l o w o r l d 请问为什么会这样,为什么会和all_word的第一个字符有关系呢 现在代码截图 image

还有一个问题是怎么在训练中加入验证集的验证,以及metric的指标还有准确率acc(现在只有一个loss,也不区分训练loss还是验证的loss)

希望得到您的回复,万分感激!

kaixinbaba commented 4 years ago

比如: image 识别出来的是: image

前后都有 '0'(数字零)。不是很懂 为什么会这样

yizt commented 4 years ago

@kaixinbaba 您好,第一个字母必须是空白符;pytorch 的ctc默认类别0代表空白。

yizt commented 4 years ago

@kaixinbaba 您好,预测后空白会替换掉,不会有空白呀;

    label = [k for k, g in itertools.groupby(list(label))]
    label = ''.join(label).replace(' ', '')     #空白替换掉了
    return label
kaixinbaba commented 4 years ago

这一段我注释掉了。。。soga。。。但是我的图片里 就是有空白的,需要怎么修改训练脚本呢? 请教大佬 感谢

yizt commented 4 years ago

@kaixinbaba 这个需要特殊处理一下; 1) 在类别字符中包含空白符(这里的空白符是真正的空白符) 2) 在gen_image函数中,增加一行indices+=1(将0留个ctc的空白符) 3) 预测时,注意预测的class_ids已经是真实的类别id值加1了。

yizt commented 4 years ago

@kaixinbaba 预测代码修改参考如下:

def inference_image(net, alpha, image_path):
    image = load_image(image_path)
    image = torch.FloatTensor(image)

    predict = net(image)[0].detach().numpy()  # [W,num_classes]
    # label = np.argmax(predict[:], axis=1)
    # label = [alpha[class_id] for class_id in label]
    label = np.argmax(predict[:], axis=1) - 1
    label = [alpha[class_id] if class_id >= 0 else '' for class_id in label]
    label = [k for k, g in itertools.groupby(list(label))]
    # label = ''.join(label).replace(' ', '')
    label = ''.join(label)
    return label
kaixinbaba commented 4 years ago

@kaixinbaba 这个需要特殊处理一下;

  1. 在类别字符中包含空白符(这里的空白符是真正的空白符)
  2. 在gen_image函数中,增加一行indices+=1(将0留个ctc的空白符)
  3. 预测时,注意预测的class_ids已经是真实的类别id值加1了。

    不好意思,我想知道具体点,实在是麻烦您了

      1. 这样可以不? 真正的空白符,我直接使用空格
        def get_all_words(self):
        # words = string.whitespace + string.digits + string.ascii_letters + ',-'
        words = ' ' + string.digits + string.ascii_letters + ',-'
        # words = string.digits + string.ascii_letters + ',- '
        return words
    • 2.
      indices = np.array([self.alpha.index(c) + 1 for c in text])
    • 3.我已经修改为大佬您提供的代码片段了

我先试试

kaixinbaba commented 4 years ago

..报错了0 0.。。

Epoch: 1/70 loss: nan
Traceback (most recent call last):
  File "app/ocr/scripts/text_recognize_train.py", line 189, in <module>
    train(arguments)
  File "app/ocr/scripts/text_recognize_train.py", line 135, in train
    utils.add_weight_history_on_master(writer, model_without_ddp, epoch + 1)
  File "/data/junjiexun/intelligent_platform/app/ocr/text_reco/utils.py", line 48, in add_weight_history_on_master
    _add_weight_history(writer, net, epoch)
  File "/data/junjiexun/intelligent_platform/app/ocr/text_reco/utils.py", line 43, in _add_weight_history
    writer.add_histogram(name, param.clone().cpu().data.numpy(), epoch)
  File "/home/dev/anaconda3/envs/intelligent_platform/lib/python3.6/site-packages/tensorboardX/writer.py", line 503, in add_histogram
    histogram(tag, values, bins, max_bins=max_bins), global_step, walltime)
  File "/home/dev/anaconda3/envs/intelligent_platform/lib/python3.6/site-packages/tensorboardX/summary.py", line 210, in histogram
    hist = make_histogram(values.astype(float), bins, max_bins)
  File "/home/dev/anaconda3/envs/intelligent_platform/lib/python3.6/site-packages/tensorboardX/summary.py", line 248, in make_histogram
    raise ValueError('The histogram is empty, please file a bug report.')
ValueError: The histogram is empty, please file a bug report.
yizt commented 4 years ago

@kaixinbaba 模型的类别数也需要加1, model = crnn.CRNN(len(data_set.alpha)+1)

kaixinbaba commented 4 years ago

image image 预测的label还是没有空格,不过之前多余的空格是没有了,实在是麻烦您了。。

yizt commented 4 years ago

主要修改生成器,使生成的图像与预测的图像更相似

易作天

邮箱:csuyzt@163.com |

签名由 网易邮箱大师 定制

在2020年10月30日 17:44,Jeff Xun 写道:

预测的label还是没有空格,不过之前多余的空格是没有了,实在是麻烦您了。。

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

kaixinbaba commented 4 years ago

了解~ 感谢

kaixinbaba commented 4 years ago

抱歉又来打扰了,现在有两个问题

耽误你时间了,实在是抱歉,因为我并不太懂,只能大概看懂一些算法或代码

yizt commented 4 years ago

@kaixinbaba a) 参照eval.py中的评估,将评估代码加入训练中即可 b) crnn是文本行识别,只能识别单行文字,多行情况,需要做文字检测,然后再做文字识别;或者直接使用端到端ocr网络

kaixinbaba commented 4 years ago

谢谢~