暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

从0学习OCR:阿拉伯语和印地语识别

Coggle数据科学 2022-06-30
673

赛题介绍

阿拉伯语图文识别挑战赛

赛事背景

随着科技与通信技术的发展,全球化进程加快,各国各民族人民之间的往来更加频繁,在经济全球化和消费升级推动下,国际经贸发展、出境游市场等对多语种互通翻译方面提出了更高的需求。

本届“阿拉伯语图文识别”竞赛是一场极具挑战性的自然场景文字识别任务,期待参赛者能在竞赛中相互切磋,共同进步。

比赛报名链接:http://challenge.xfyun.cn/topic/info?type=Arabic&ch=ds22-dw-zmt05

数据说明

赛题数据由训练集和测试集组成,其中训练集10w张文本行图片,测试集5k张文本行图片。train.csv为训练集标注数据,第一列为图片名称,第二列图片对应的文字标注。

name, label
0001.jpg, لغة عربية
0002.jpg, مرحباً
0003.jpg, أتمنى لكم سعادة

印地语图文识别挑战赛

赛事背景

随着科技与通信技术的发展,全球化进程加快,各国各民族人民之间的往来更加频繁,在经济全球化和消费升级推动下,国际经贸发展、出境游市场等对多语种互通翻译方面提出了更高的需求。

本届“印地语图文识别”竞赛是一场极具挑战性的自然场景文字识别任务,期待参赛者能在竞赛中相互切磋,共同进步。

比赛报名链接:http://challenge.xfyun.cn/topic/info?type=Hindi&ch=ds22-dw-zmt05

数据说明

赛题数据由训练集和测试集组成,其中训练集10w张文本行图片,测试集5k张文本行图片。train.csv为训练集标注数据,第一列为图片名称,第二列图片对应的文字标注。

name, label
0001.jpg, हिन्द
0002.jpg, कितने बज रहे हैं?
0003.jpg, पाँच बज रहे हैं 

评价指标

设正确文本词数为N,按照识别结果文本与正确文本根据“最小代价匹配”原则运用动态规划算法,得到正确识别词数H,删除错误词数D、插入错误词数I和替换错误词数S,其中H=N-S-D;通过计算Acc来作为评价指标,具体定义如下:

Acc(word accuracy)词精确率:(H-I) N,其表示为识别正确词数减去插入错误词数所得到的词数,占所有标注词数的比例。

解题思路

赛题是一个典型的字符识别任务,因此我们考虑可以使用字符识别模型来完成。我们选择CRNN
模型,整个CRNN网络可以分为三个部分:

  • Convlutional Layers:普通的CNN网络,用于提取输入图像的Convolutional feature maps;
  • Recurrent Layers:一个深层双向LSTM网络,在卷积特征的基础上继续提取文字序列特征。
  • Transcription Layers:将RNN输出做softmax后转为字符输出。

对于Recurrent Layers,如果使用常见的Softmax cross-entropy loss,则每一列输出都需要对应一个字符元素。那么训练时候每张样本图片都需要标记出每个字符在图片中的位置,再通过CNN感受野对齐到Feature map的每一列获取该列输出对应的Label才能进行训练。

在实际情况中,标记这种对齐样本非常困难(除了标记字符,还要标记每个字符的位置),工作量非常大。另外,由于每张样本的字符数量不同,字体样式不同,字体大小不同,导致每列输出并不一定能与每个字符一一对应。

CTC是一种对不需要对齐的Loss计算方法,用于训练网络,被广泛应用于文本行识别和语音识别中。

步骤1:定义数据集读取

  • paths:所有图片的路径
  • texts:所有图片的标注
  • img_height:图片高度
  • img_width:图片宽度
  • CHARS:数据所有的字符集
class Synth90kDataset(Dataset):
    def __init__(self, paths, texts, img_height=32, img_width=100, CHARS=None):
        self.paths = paths
        self.texts = texts
        self.img_height = img_height
        self.img_width = img_width
        
        self.CHARS = CHARS
        self.CHAR2LABEL = {char: i + 1 for i, char in enumerate(CHARS)}
        self.LABEL2CHAR = {label: char for char, label in self.CHAR2LABEL.items()}
    
    def __len__(self):
        return len(self.paths)

    def __getitem__(self, index):
        path = self.paths[index]
        image = Image.open(path).convert('L')  # gre

        image = image.resize((self.img_width, self.img_height), resample=Image.BILINEAR)
        image = np.array(image)
        image = image.reshape((1, self.img_height, self.img_width))
        image = (image / 127.5) - 1.0

        image = torch.FloatTensor(image)
        text = self.texts[index]
        target = [self.CHAR2LABEL[c] for c in text]
        target_length = [len(target)]

        target = torch.LongTensor(target)
        target_length = torch.LongTensor(target_length)
        return image, target, target_length

步骤2:定义模型

class CRNN(nn.Module):
    def __init__(self, img_channel, img_height, img_width, num_class, map_to_seq_hidden=64, rnn_hidden=256, leaky_relu=False):
        super(CRNN, self).__init__()

        # 定义常见层
        self.cnn, (output_channel, output_height, output_width) = self._cnn_backbone(img_channel, img_height, img_width, leaky_relu)
        self.map_to_seq = nn.Linear(output_channel * output_height, map_to_seq_hidden)
        self.rnn1 = nn.LSTM(map_to_seq_hidden, rnn_hidden, bidirectional=True)
        self.rnn2 = nn.LSTM(2 * rnn_hidden, rnn_hidden, bidirectional=True)
        self.dense = nn.Linear(2 * rnn_hidden, num_class)


步骤3:训练和预测

  • 运行python3 src/train.py,运行多个epoch之后自行停止训练。
  • 修改src/predict.py中定义dataset的方法,得到预测结果;

完整代码链接:https://gitee.com/coggle/crnn-pytorch/

 竞赛交流群 邀请函  #

△长按添加竞赛小助手
添加Coggle小助手微信(ID : coggle666)

私聊小助手领取图嵌入原始论文


每天Kaggle算法竞赛、干货资讯汇总

与 22000+来自竞赛爱好者一起交流~

文章转载自Coggle数据科学,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论