Віктор Андрійович Шевченко, Виктор Андреевич Шевченко, Victor Andriyovich Shevchenko

Авг 09

Распознавание KCAPTCHA [habrahabr]

Автор: admin | Категория: Наука и Размышления, Прочее | Опубликовано: 09-08-2015

Введение

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

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

Обзор задачи

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

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

  • Переменная длина
  • Искажения
  • Шумы
  • Переменный цвет фона
  • Латинские буквы и цифры, исключая похожие, всего 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 дело не ограничится, дальше будет много интересного :)

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