Нейронные сети, Искусственный Интеллект
0,0
рейтинг
20 июля 2015 в 20:08

Разработка → Распознавание KCAPTCHA из песочницы

Введение


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 дело не ограничится, дальше будет много интересного :)
Виктор Шевченко @GNC
карма
15,0
рейтинг 0,0
Нейронные сети, Искусственный Интеллект
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Спецпроект

Самое читаемое Разработка

Комментарии (20)

  • –19
    А расскажете, зачем вам это надо, пока рука еще только тянется к минусу? Я для распознавателей капчи вижу только одно применение — обходить защиту и создавать ботов, спамить на форумах и в комментариях. Но это потому что я темный такой, правда?

    • +7
      Можно спамить на форумах и в комментариях фоточки котиков.
    • –4
      уже очень давно понял, что капчю создают не для людей а для таких вот «решений»… И просто кликаю несколько раз на обновить до тех пор пока капча не становиться «человечной».
      А если капча продолжает быть как вторая картинка пример, то вообще закрываю сайт. Именно для таких вот сайтов думаю очень бы пригодилась такая программа.
      Согласитесь — сломанные глаза не стоят лишних 2 минут на поиски альтернативного сайта без капчи.
      • 0
        >> И просто кликаю несколько раз на обновить до тех пор пока капча не становиться «человечной».

        Вы путаете причину со следствием. Капча именно потому настолько сложна для чтение человеком, что автоматические алгоритмы распознавания столь эффективны. Я тоже далеко не фанат капчи, и именно поэтому против распространения инструментов по ее обходу для всех спаммеров-недоучек в мире (те что поумнее, и сами смогут их написать).
        Чем умнее будут боты, тем сложнее капча.

        >>Согласитесь — сломанные глаза не стоят лишних 2 минут на поиски альтернативного сайта без капчи.

        На нормальном сайте при обычном использовании вы капчу и не увидите — она включается как защита от перебора пароля, например. А ненормальными зачем пользоваться?
        • 0
          >> Вы путаете причину со следствием.
          Это вы путаете. Это потому боты столь эффективны — что сайты не позволяют простому человеку получить желаемое. И одно дело когда действительно желаемым является массовая рассылка рекламы — и совсем другое когда пользователь просто хочет спросить в комментарии о чём либо.
          Я говорю о user friendly. Боты так или иначе всё равно будут продолжать появляться какие бы капчи не придумали. А вот количество пользователей будет только уменьшаться — когда на каждый чих нужно будет ввести капчу.
          >> Капча потому сложна для чтение человеком, что алгоритмы столь эффективны…
          А если они на порядки эффективнее человека — что тогда? Как быть если может распознать только робот?

          А что по вашему делать если нужная информация находиться на «ненормальном» сайте?
          Сколько сайтов вы знаете на которых для регистрации не нужно вводить капчу (или иной защиты)?
          • +1
            >>Это вы путаете. Это потому боты столь эффективны — что сайты не позволяют простому человеку получить желаемое.

            Что за ерунда? Боты эффективны потому что люди на взломе защиты зарабатывают деньги.

            >> и совсем другое когда пользователь просто хочет спросить в комментарии о чём либо.

            99.9% случаев «взлома» капчи — это не пользователь хочет спросить что-то, это спаммеры и ботоводы. Если бы последних не было, не было бы и капчи, ваш кэп.

            >> А если они на порядки эффективнее человека — что тогда?

            Тогда придется придумывать что-то другое. И может статься, вы будете вспоминать капчу добрым словом, на фоне тех новых методов защиты.

            >>А что по вашему делать если нужная информация находиться на «ненормальном» сайте?
            >>Сколько сайтов вы знаете на которых для регистрации не нужно вводить капчу (или иной защиты)?

            Вы предлагаете оставлять сайты без защиты и потом руками чистить сотни спама в час?
    • 0
      Можно автоматически смс отправлять себе например отгадывая капчу оператора.
  • 0
    Нормализуем входные данные

    Здесь вы просто сжимаете / растягиваете изображение до нормализованной ширины? Что означают a и b?

    Переменная длина.

    всего 6 символов по 23 варианта итого: 6*23=138

    А как вы обходитесь с 5 буквенными вариантами?
    Один из 23 символов зарезервирован под пустой?
    А нормализованное изображение не мешает в этом случае?
  • +1
    Благодарю, соответствующий пункт немного дополнил.
    Цвета принимают значения от 0 до 255. В таком виде подавать их на вход не рекомендуется.
    Нормализация приводит входные данные в заданный интервал [a,b]. В нашем случае от 0 до 1.

    Kcaptcha довольно широко применяется, поэтому в данном случае затронут только 6-символьный вариант, не хочется, что бы пример использовался с сомнительными целями.
    Впрочем, при должном размере выборки, как Вы заметили, ничего не мешает зарезервировать один из символов под пустой.
    Или же учитывая, что текущая сеть в целом справляется с 4-5 символьными вариантами, можно реализовать вторую сеть, распознающую длину капчи и зная длину уже отсеивать результаты последних нейронов.
    Оба варианта (и не только) я затрону в последующих публикациях :)
  • 0
    Действительно хорошие результаты распознавания для такой капчи. Можно даже сказать что отличные
  • 0
    Я не против каптчи но и не сторонник, по мне так должна быть проверка на «человека» намного дружелюбнее, чем распознавание текста.
    Ну и для хорошего настроения: www.youtube.com/watch?v=WqnXp6Saa8Y
    • 0
      Ну варианты есть, хоть те же honeypot или микроплатежи. Или более продвинутое, вроде поведенческого анализа (не так давно была статья вроде бы на ГТ, или даже здесь).
  • 0
    Раз уж вы используете C#, то, возможно, в следующий раз вам будет интересно поработать с вот этой каптчой. В своё время, для этого проекта я взял за основу именно KCaptcha.
  • 0
    Скажите, пожалуйста, есть ли сейчас весомые причины использовать «встраиваемые» каптчи (типа kcaptcha), в то время как есть reCaptcha от Гугла, которую пилят сотни людей уже несколько лет (и которую, кстати, часто даже не надо вводить, а достаточно просто нажать чекбокс «я не робот», т.к. Гугл и так знает многое о человеке, идентифицируя его по своим кукам)? Это правда интересно, вопрос не праздный, а сугубо практический (иногда встает вопрос выбора той или иной каптчи, хочется аргументов).
    • 0
      Плюс reCaptcha помогает распознавать текст в книгах/на зданиях/искать сару конор
  • 0
    а где вы взяли 150к распознанных каптч?
    • 0
      Исходники есть. Что мешает нагенерировать выборки?
      • 0
        а ну да точно, сорцы жеж, туплю -)

        я как то фрилансил подобную задачку, без сорцов, пришлось нанять ряд китайцев что бы трейн сет негенерили
  • 0
    Вот если-бы кто-то написал про reCaptcha (новая от гугла), было-бы интересно почитать =)
  • –1
    Алгоритмы на уровне д/c

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