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

本届“阿拉伯语图文识别”竞赛是一场极具挑战性的自然场景文字识别任务,期待参赛者能在竞赛中相互切磋,共同进步。
比赛报名链接: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/
# 竞赛交流群 邀请函 #

私聊小助手领取图嵌入原始论文
每天Kaggle算法竞赛、干货资讯汇总
与 22000+来自竞赛爱好者一起交流~





