什么是联结主义时间分类 (CTC)?

机器算法验证 机器学习 深度学习 卷积神经网络 循环神经网络
2022-02-02 14:13:39

我正在寻找一个光学字符识别(OCR)项目。在做了一些研究之后,我发现了一个看起来很有趣的架构:CNN+RNN+CTC。我熟悉卷积神经网络 (CNN) 和循环神经网络 (RNN),但什么是连接主义时间分类 (CTC)?我想要通俗易懂的解释。

1个回答

您有一个数据集,其中包含:

  • 图像 I1、I2、...
  • 地面实况文本 T1、T2、... 用于图像 I1、I2、...

所以你的数据集可能看起来像这样:

在此处输入图像描述

神经网络 (NN) 为图像的每个可能的水平位置(在文献中通常称为时间步长t)输出一个分数。对于宽度为 2(t0,t1)和 2 个可能的字符(“a”,“b”)的图像,这看起来像这样:

| t0 | t1 --+-----+---- a | 0.1 | 0.6 b | 0.9 | 0.4

要训​​练这样的 NN,您必须为每个图像指定地面实况文本的字符在图像中的位置。例如,考虑一个包含文本“Hello”的图像。您现在必须指定“H”开始和结束的位置(例如,“H”从第 10 个像素开始,一直到第 25 个像素)。"e", "l, ... 这听起来很无聊,对于大型数据集来说是一项艰巨的工作。

即使您设法以这种方式注释了完整的数据集,还有另一个问题。NN 在每个时间步输出每个字符的分数,请参阅上面显示的表格以获取玩具示例。我们现在可以在每个时间步长中选取最有可能的字符,即玩具示例中的“b”和“a”。现在考虑一个更大的文本,例如“Hello”。如果作者的写作风格在水平位置使用大量空间,则每个字符将占用多个时间步长。取每个时间步最可能的字符,这可以给我们一个像“HHHHHHHHeeeellllllllloooo”这样的文本。我们应该如何将此文本转换为正确的输出?删除每个重复的字符?这会产生“Helo”,这是不正确的。所以,我们需要一些巧妙的后处理。

CTC 解决了这两个问题:

  • 您可以从对 (I, T) 中训练网络,而无需使用 CTC 损失指定字符出现在哪个位置
  • 您不必对输出进行后处理,因为 CTC 解码器会将 NN 输出转换为最终文本

这是如何实现的?

  • 引入一个特殊字符(CTC-blank,在本文中表示为“-”)以表示在给定时间步没有看到任何字符
  • 通过插入 CTC 空白并以所有可能的方式重复字符,将基本事实文本 T 修改为 T'
  • 我们知道图像,我们知道文本,但我们不知道文本的位置。所以,让我们尝试文本“Hi----”,“-Hi---”,“--Hi--”,...的所有可能位置
  • 我们也不知道每个字符在图像中占据多少空间。因此,让我们通过允许字符重复来尝试所有可能的对齐方式,例如“HHi----”、“HHHi---”、“HHHHi--”...
  • 你看到这里有问题吗?当然,如果我们允许一个字符重复多次,我们如何处理真正的重复字符,比如“Hello”中的“l”?好吧,在这些情况之间总是插入一个空格,例如“Hel-lo”或“Heeellll-------llo”
  • 计算每个可能的 T' 的分数(即每个转换和这些的每个组合),对所有分数求和,从而产生对 (I, T) 的损失
  • 解码很简单:选择每个时间步得分最高的字符,例如“HHHHHH-eeeellll-lll--oo---”,丢弃重复字符“H-el-lo”,丢弃空白“Hello”,然后我们完成。

为了说明这一点,请看下图。它是在语音识别的上下文中,但是,文本识别是一样的。即使字符的对齐方式和位置不同,解码也会为两个说话者生成相同的文本。

在此处输入图像描述

进一步阅读: