У вас є набір даних, що містить:
- зображення 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
Щоб тренувати таку мережу, необхідно вказати для кожного зображення, де на зображенні розміщений символ основного тексту правди. Як приклад, придумайте зображення, що містить текст «Привіт». Тепер ви повинні вказати, де починається і закінчується "H" (наприклад, "H" починається з 10-го пікселя і йде до 25-го пікселя). Те саме для "e", "l, ... Це звучить нудно і є важкою роботою для великих наборів даних.
Навіть якщо вам вдалося таким чином анотувати повний набір даних, є ще одна проблема. NN видає бали за кожен символ на кожному етапі, див. Таблицю, яку я показав вище, на прикладі іграшки. Зараз ми можемо взяти найімовірніший символ за крок часу, це "b" і "a" на прикладі іграшки. Тепер придумайте більший текст, наприклад, "Привіт". Якщо у письменника є стиль написання, який використовує багато місця в горизонтальному положенні, кожен персонаж займав би кілька часових кроків. Взявши найімовірніший символ за кожний крок, це може дати нам такий текст, як "HHHHHHHHeeeellllllllllloooo". Як ми повинні перетворити цей текст у правильний вихід? Видалити кожен повторюваний символ? Це дає «Хело», що не правильно. Отже, нам знадобиться якась розумна пост-обробка.
CTC вирішує обидві проблеми:
- Ви можете тренувати мережу з пар (I, T), не вказуючи, в якій позиції персонаж виникає, використовуючи втрату CTC
- вам не доведеться переробляти вихід, оскільки декодер CTC перетворює вихідний сигнал NN у кінцевий текст
Як це досягається?
- введіть спеціальний символ (CTC-пробіл, позначений як "-" у цьому тексті), щоб вказати, що жоден символ не бачиться на заданому кроці часу
- змінити основний текст істини T до T ', вставляючи CTC-пробіли та повторюючи символи усіма можливими способами
- ми знаємо зображення, текст знаємо, але не знаємо, де текст розташований. Отже, давайте просто спробуємо всі можливі позиції тексту "Привіт ----", "-Хі ---", "--Хі--", ...
- ми також не знаємо, скільки місця займає кожен символ у зображенні. Тож давайте також спробуємо всі можливі вирівнювання, дозволяючи символам повторюватись на зразок "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
- і, звичайно, папери Грейвза, Алекса, Сантьяго Фернандеса, Фаустіно Гомеса та Юргена Шмідхубера. " Коннекціоністська часова класифікація: маркування даних несегментованих послідовностей з періодичними нейронними мережами ." У матеріалах 23-ї міжнародної конференції з машинного навчання, с. 369-376. ОСБ, 2006.