Распознавание кириллической Яндекс капчи

Эта статья продолжает цикл об особенностях, слабых сторонах и непосредственно о распознавании популярных капчей.
В предыдущей публикации мы затронули готовое решение KCAPTCHA, которое несмотря на неплохую защищенность было распознано без сколько-нибудь серьезной предварительной обработки и сегментации, обычным многослойным персептроном.

Теперь на очереди кириллическая Яндекс капча, с которой, уверен, многие из нас отлично знакомы.

Итак, мы имеем такую капчу:

imageimageimage

Особенности


  • Переменная длина
  • Искажения
  • Шумы (кривая)
  • Кириллические буквы
  • Модный логотип в правом-верхнем углу


Слабые стороны


  • Искажения незначительны, не препятствуют сегментации
  • Шумы лишь незначительно усложняют распознавание
  • Ограниченный словарь позволяет отсеять неверные варианты и скорректировать ответы сети


Решение


Условно разделим распознавание на следующие этапы:

  • Предварительная обработка
  • Поиск расположения и сегментация текста
  • Распознавание
  • Финальная обработка результата

Предварительная обработка


Убираем логотип Яндекса и автокадрируем изображение:

image

Нормализуем входные данные:

image
Где x — значения цвета пикселей, [a, b] — интервал допустимых значений входных сигналов. В нашем случае от -1 до 1.

Поиск расположения и сегментация текста


За распознавание длины капчи отвечает сеть с 4-мя нейронами выходного слоя, каждый из которых соответствует значению длины от 4 до 7.

Теперь, зная длину капчи, остается лишь разделить изображение на равные части, для дальнейшего распознавания:

image

Распознавание


Для распознавания букв используется сеть из двух слоев.
Первый слой обучаемый и состоит из 600 нейронов, выходной состоит из 31 нейрона, каждому из которых соответствует буква на картинке.

Первоначальная обучающая выборка подготовлена благодаря отряду русскоязычных индусов antigate и составила 2,000 капч, после недолгого обучения сети, в роли учителя выступал уже сам Яндекс и подготовленный ранее словарь из 387,143 слов от 4 до 7 символов, сформированный на основе данных из Яндекс словарей.

Потенциально верные ответы сети, присутствующие в словаре, отправлялись на проверку Яндексу, по результатам которой и происходило обучение, что значительно сократило расходы на дальнейшее формирование выборки.

В течении суток получена точность распознавания каждого символа в 70%.

Финальная обработка результата


После получения результата распознавания проверяется наличие оного в словаре.
Если результат распознавания отсутствует в словаре, скорее всего он не верен.
Часто возникают ошибки между схожими символами, к примеру н — и, с — е, ь — ы, п — л.
В таком случае, исходя из ответов сети, выбираем наиболее вероятные буквы и ищем соответствующие слова в словаре.
Если слов не существует, выбираем варианты с аналогичной длиной и минимальным расстоянием Левенштейна.
Такой вариант дает 18% точность распознавания капчи.
Также можно задействовать частоту распределения букв и их сочетаний в русском языке, не говоря уже о готовых решениях для проверки орфографии, в любом случае вариантов множество.
Даже простое прюнинг результатов, отсутствующих в словаре отбрасывает значительную часть неверных вариантов.

Заключение


Как я говорил ранее, при желании и должном числе примеров, любая понятная [и не только] человеку капча поддается распознаванию. Упор нужно делать не на усложнении самого изображения, а на технологиях выявления ботов, пока они сами не начали выявлять и отсеивать людей.

Кириллическая Яндекс капча довольно слабая, однако порядком более дружелюбна для русскоязычных пользователей, нежели, к примеру, kcaptcha или recaptcha (особенно первой версии).

Я уверен, что в ближайшее время ребята из Яндекса поработают над своей капчей и смогут достичь компромисса между надежностью и удобством для простых людей.

Исходники


Если желаете протестировать или разобраться в работе сети — добро пожаловать на GitHub.

P.S. Если у вас есть интересные задачи в этой области — буду рад помочь.

© Habrahabr.ru