...

понедельник, 20 июля 2015 г.

[Из песочницы] Распознавание KCAPTCHA

Введение


KCAPTCHA — это готовое решение, написанное на языке PHP, предлагающее программисту решение с одной стороны весьма защищенное, с другой — максимально малотребовательное к ресурсам и конфигурации хостинга.

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

Обзор задачи


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

Особенности:


  • Переменная длина
  • Искажения
  • Шумы
  • Переменный цвет фона
  • Латинские буквы и цифры, исключая похожие, всего 23

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


  • Малая длина капчи
  • Недостаточные искажения
  • Шумы практически не препятствуют распознаванию
  • Смысл переменного цвета фона мягко говоря не понятен
  • Общедоступность исходников

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

Решение


Распознавание текста, в большинстве случаев, можно условно разделить на следующие этапы:
  1. Предварительная обработка
  2. Поиск расположения текста
  3. Сегментация
  4. Распознавание

Но в этот раз мы сделаем исключение, ведь большинство — не все.

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


По цвету первого пикселя убираем фон:
image

Затем преобразуем изображение в оттенки серого.
Теперь каждый пиксель принимает значения от 0 до 255, однако подавать их в таком виде не рекомендуется.

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

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


Никакой локации и сегментации текста не предусмотрено.
Имея должное число примеров мы просто отказываемся от этих этапов и переходим к самому интересному.

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


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

Размер изображений поступающих на вход 100*50=5000 пикселей.

Первый слой обучаемый и состоит из 2000 нейронов.

Каждому нейрону выходного слоя соответствует буква/цифра на картинке, всего 6 символов по 23 варианта итого: 6*23=138 нейронов.

Обучающая и тестовая выборка составила 140,000 и 10,000 капч соответственно.

Итоги


После ночи обучения, точность распознавания каждого символа, на тестовой выборке, составила 61.4%, верно распознанных капч — 7.2%.

Мне этого оказалось более чем достаточно и обучение было остановлено.

Дальнейшего роста точности можно достичь предварительной обработкой изображения (даже простой отсев шумов наверняка будет иметь результат), дообучением, увеличением количества примеров (инвариантность по обучению) и изменением архитектуры (структурная инвариантность), в последнем случае я бы рекомендовал обратить внимание на Space Displacement Neural Network.

Исходники


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

P.S. Одной kcaptcha дело не ограничится, дальше будет много интересного :)

This entry passed through the Full-Text RSS service - if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.

Комментариев нет:

Отправить комментарий