Эта статья продолжает цикл об особенностях, слабых сторонах и непосредственно о распознавании популярных капчей.
В предыдущей публикации мы затронули готовое решение KCAPTCHA, которое несмотря на неплохую защищенность было распознано без сколько-нибудь серьезной предварительной обработки и сегментации, обычным многослойным персептроном.
Теперь на очереди кириллическая Яндекс капча, с которой, уверен, многие из нас отлично знакомы.
Итак, мы имеем такую капчу:
![image](https://habrastorage.org/getpro/habr/post_images/ff8/955/883/ff8955883f344fe11ad719c88a8fcb37.gif)
![image](https://habrastorage.org/getpro/habr/post_images/9aa/086/988/9aa0869881c0acc5a15bd8fd51fa949d.gif)
![image](https://habrastorage.org/getpro/habr/post_images/b7f/80c/1f7/b7f80c1f7dee457ee34710a9b74fe841.gif)
Условно разделим распознавание на следующие этапы:
Убираем логотип Яндекса и автокадрируем изображение:
![image](https://habrastorage.org/getpro/habr/post_images/7ff/ff5/103/7ffff5103b958a7e36474736bdb00bcd.gif)
Нормализуем входные данные:
Где x — значения цвета пикселей, [a,b] – интервал допустимых значений входных сигналов. В нашем случае от -1 до 1.
За распознавание длины капчи отвечает сеть с 4-мя нейронами выходного слоя, каждый из которых соответствует значению длины от 4 до 7.
Теперь, зная длину капчи, остается лишь разделить изображение на равные части, для дальнейшего распознавания:
![image](https://habrastorage.org/getpro/habr/post_images/b58/f68/e42/b58f68e42ffeae0ecff92bc773f4c7f1.gif)
Для распознавания букв используется сеть из двух слоев.
Первый слой обучаемый и состоит из 900 нейронов, выходной состоит из 31 нейрона, каждому из которых соответствует буква на картинке.
Первоначальная обучающая выборка подготовлена благодаряотряду русскоязычных индусов antigate и составила 2,000 капч, после недолгого обучения сети, в роли учителя выступал уже сам Яндекс и подготовленный ранее словарь из 387,143 слов от 4 до 7 символов, сформированный на основе данных из Яндекс словарей.
Потенциально верные ответы сети, присутствующие в словаре, отправлялись на проверку Яндексу, по результатам которой и происходило обучение, что значительно сократило расходы на дальнейшее формирование выборки.
В течение суток получена точность распознавания каждого символа в 70%.
После получения результата распознавания проверяется наличие оного в словаре.
Если результат распознавания отсутствует в словаре, скорее всего он не верен.
Часто возникают ошибки между схожими символами, к примеру н — и, с — е, ь — ы, п — л.
В таком случае, исходя из ответов сети, выбираем наиболее вероятные буквы и ищем соответствующие слова в словаре.
Если слов не существует, выбираем варианты с аналогичной длиной и минимальным расстоянием Левенштейна.
Такой вариант дает 18% точность распознавания капчи.
Также можно задействовать частоту распределения букв и их сочетаний в русском языке, не говоря уже о готовых решениях для проверки орфографии, в любом случае вариантов множество.
Даже простое прюнинг результатов, отсутствующих в словаре отбрасывает значительную часть неверных вариантов.
Как я говорил ранее, при желании и должном числе примеров, любая понятная [и не только] человеку капча поддается распознаванию. Упор нужно делать не на усложнении самого изображения, а на технологиях выявления ботов, пока они сами не начали выявлять и отсеивать людей.
Кириллическая Яндекс капча довольно слабая, однако порядком более дружелюбна для русскоязычных пользователей, нежели, к примеру, kcaptcha или recaptcha (особенно первой версии).
Я уверен, что в ближайшее время ребята из Яндекса поработают над своей капчей и смогут достичь компромисса между надежностью и удобством для простых людей.
Если желаете протестировать или разобраться в работе сети — добро пожаловать на GitHub.
P.S. Если у вас есть интересные задачи в этой области — буду рад помочь.
В предыдущей публикации мы затронули готовое решение KCAPTCHA, которое несмотря на неплохую защищенность было распознано без сколько-нибудь серьезной предварительной обработки и сегментации, обычным многослойным персептроном.
Теперь на очереди кириллическая Яндекс капча, с которой, уверен, многие из нас отлично знакомы.
Итак, мы имеем такую капчу:
![image](https://habrastorage.org/getpro/habr/post_images/ff8/955/883/ff8955883f344fe11ad719c88a8fcb37.gif)
![image](https://habrastorage.org/getpro/habr/post_images/9aa/086/988/9aa0869881c0acc5a15bd8fd51fa949d.gif)
![image](https://habrastorage.org/getpro/habr/post_images/b7f/80c/1f7/b7f80c1f7dee457ee34710a9b74fe841.gif)
Особенности
- Переменная длина
- Искажения
- Шумы (кривая)
- Кириллические буквы
- Модный логотип в правом-верхнем углу
Слабые стороны
- Искажения незначительны, не препятствуют сегментации
- Шумы лишь незначительно усложняют распознавание
- Ограниченный словарь позволяет отсеять неверные варианты и скорректировать ответы сети
Решение
Условно разделим распознавание на следующие этапы:
- Предварительная обработка
- Поиск расположения и сегментация текста
- Распознавание
- Финальная обработка результата
Предварительная обработка
Убираем логотип Яндекса и автокадрируем изображение:
![image](https://habrastorage.org/getpro/habr/post_images/7ff/ff5/103/7ffff5103b958a7e36474736bdb00bcd.gif)
Нормализуем входные данные:
![image](https://habrastorage.org/getpro/habr/post_images/a15/087/20a/a1508720a306166efa8d7f5f8bdebfed.png)
Где x — значения цвета пикселей, [a,b] – интервал допустимых значений входных сигналов. В нашем случае от -1 до 1.
Поиск расположения и сегментация текста
За распознавание длины капчи отвечает сеть с 4-мя нейронами выходного слоя, каждый из которых соответствует значению длины от 4 до 7.
Теперь, зная длину капчи, остается лишь разделить изображение на равные части, для дальнейшего распознавания:
![image](https://habrastorage.org/getpro/habr/post_images/b58/f68/e42/b58f68e42ffeae0ecff92bc773f4c7f1.gif)
Распознавание
Для распознавания букв используется сеть из двух слоев.
Первый слой обучаемый и состоит из 900 нейронов, выходной состоит из 31 нейрона, каждому из которых соответствует буква на картинке.
Первоначальная обучающая выборка подготовлена благодаря
Потенциально верные ответы сети, присутствующие в словаре, отправлялись на проверку Яндексу, по результатам которой и происходило обучение, что значительно сократило расходы на дальнейшее формирование выборки.
В течение суток получена точность распознавания каждого символа в 70%.
Финальная обработка результата
После получения результата распознавания проверяется наличие оного в словаре.
Если результат распознавания отсутствует в словаре, скорее всего он не верен.
Часто возникают ошибки между схожими символами, к примеру н — и, с — е, ь — ы, п — л.
В таком случае, исходя из ответов сети, выбираем наиболее вероятные буквы и ищем соответствующие слова в словаре.
Если слов не существует, выбираем варианты с аналогичной длиной и минимальным расстоянием Левенштейна.
Такой вариант дает 18% точность распознавания капчи.
Также можно задействовать частоту распределения букв и их сочетаний в русском языке, не говоря уже о готовых решениях для проверки орфографии, в любом случае вариантов множество.
Даже простое прюнинг результатов, отсутствующих в словаре отбрасывает значительную часть неверных вариантов.
Заключение
Как я говорил ранее, при желании и должном числе примеров, любая понятная [и не только] человеку капча поддается распознаванию. Упор нужно делать не на усложнении самого изображения, а на технологиях выявления ботов, пока они сами не начали выявлять и отсеивать людей.
Кириллическая Яндекс капча довольно слабая, однако порядком более дружелюбна для русскоязычных пользователей, нежели, к примеру, kcaptcha или recaptcha (особенно первой версии).
Я уверен, что в ближайшее время ребята из Яндекса поработают над своей капчей и смогут достичь компромисса между надежностью и удобством для простых людей.
Исходники
Если желаете протестировать или разобраться в работе сети — добро пожаловать на GitHub.
P.S. Если у вас есть интересные задачи в этой области — буду рад помочь.