Введение
KCAPTCHA — это готовое решение, написанное на языке PHP, предлагающее программисту решение с одной стороны весьма защищенное, с другой — максимально малотребовательное к ресурсам и конфигурации хостинга.
В этой статье речь пойдет о простом, в некоторой степени универсальном способе распознавания капчи, на примере KCAPTCHA, с реализацией на C#. Стоит заметить, что я ограничился 6-символьным вариантом kcaptcha, но обязательно расскажу о капчах переменной длины в последующих публикациях.
Обзор задачи
Итак мы имеем такую капчу:
Особенности:
- Переменная длина
- Искажения
- Шумы
- Переменный цвет фона
- Латинские буквы и цифры, исключая похожие, всего 23
Слабые стороны:
- Малая длина капчи
- Недостаточные искажения
- Шумы практически не препятствуют распознаванию
- Смысл переменного цвета фона мягко говоря не понятен
- Общедоступность исходников
Впрочем многое можно исправить тонко настроив скрипт, но скажу честно, при желании и должном числе примеров, любая понятная [и не только] человеку капча поддается распознаванию.
Решение
Распознавание текста, в большинстве случаев, можно условно разделить на следующие этапы:
- Предварительная обработка
- Поиск расположения текста
- Сегментация
- Распознавание
Но в этот раз мы сделаем исключение, ведь большинство — не все.
Предварительная обработка
По цвету первого пикселя убираем фон:
Затем преобразуем изображение в оттенки серого.
Теперь каждый пиксель принимает значения от 0 до 255, однако подавать их в таком виде не рекомендуется.
Нормализуем входные данные:
Где 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.
Комментариев нет:
Отправить комментарий