У вас есть набор данных, содержащий:
- изображения 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» в примере с игрушкой. Теперь подумайте о тексте большего размера, например, «Привет». Если у писателя есть стиль письма, который использует много места в горизонтальном положении, каждый символ будет занимать несколько временных шагов. Принимая наиболее вероятный символ за временной шаг, это может дать нам текст вроде «HHHHHHHHeeeellllllllloooo». Как мы должны преобразовать этот текст в правильный вывод? Удалить каждый повторяющийся символ? Это дает "Helo", что не правильно. Итак, нам понадобится умная постобработка.
CTC решает обе проблемы:
- Вы можете обучить сеть из пар (I, T), не указывая, в какой позиции персонаж находится, используя потерю CTC
- вам не нужно постобрабатывать вывод, так как декодер CTC преобразует вывод NN в окончательный текст
Как это достигается?
- ввести специальный символ (CTC-пробел, обозначенный в этом тексте как "-"), чтобы указать, что ни один символ не виден в данный момент времени
- изменить основной текст истины T на T ', вставляя пробелы CTC и повторяя символы всеми возможными способами
- мы знаем изображение, мы знаем текст, но мы не знаем, где расположен текст. Итак, давайте просто попробуем все возможные позиции текста "Привет ----", "-Hi ---", "--Hi--", ...
- мы также не знаем, сколько места занимает каждый символ в изображении. Так что давайте попробуем все возможные выравнивания, позволив символам повторяться, например, «HHi ----», «HHHi ---», «HHHHi--», ...
- Вы видите проблему здесь? Конечно, если мы позволим символу повторяться несколько раз, как мы будем обрабатывать настоящие дубликаты символов, такие как «l» в «Hello»? Ну, просто всегда вставляйте пробел между этими ситуациями, например, "Hel-lo" или "Heeellll ------- llo"
- рассчитать оценку для каждого возможного T '(то есть для каждого преобразования и каждой их комбинации), суммировать по всем оценкам, что приводит к потере для пары (I, T)
- расшифровка проста: выбрать символ с наибольшим количеством очков для каждого временного шага, например, «HHHHHH-eeeellll-lll - oo ---», выбросить повторяющиеся символы «H-el-lo», выбросить пробелы «Hello», и мы сделано.
Чтобы проиллюстрировать это, взгляните на следующее изображение. Это в контексте распознавания речи, однако распознавание текста точно такое же. Декодирование дает один и тот же текст для обоих ораторов, даже если выравнивание и положение символа различаются.
Дальнейшее чтение:
- интуитивное введение: https://medium.com/@harald_scheidl/intuitively-understanding-connectionist-temporal-classification-3797e43a86c ( зеркало )
- более подробное введение: https://distill.pub/2017/ctc ( зеркало )
- Реализация Python, которую вы можете использовать, чтобы «поиграть» с CTC-декодерами, чтобы лучше понять, как она работает: https://github.com/githubharald/CTCDecoder
- и, конечно же, бумага Грейвса, Алекса, Сантьяго Фернандеса, Фаустино Гомеса и Юргена Шмидхубера. « Временная классификация Connectionist: маркировка несегментированных последовательных данных с помощью рекуррентных нейронных сетей ». В трудах 23-й международной конференции по машинному обучению, с. 369-376. ACM, 2006.