Как стать автором
Обновить

Комментарии 68

Ломать не строить
На самом деле к captcha это не относится. Т.к. сделать сложную captcha гораздо проще, чем разработать алгоритм распознавания.
Капчи существуют только для того, что бы их кто-то взламывал)
В этом и есть смысл капчи =)
в случае капчи уместнее сказать: строить — не ломать :)
Статьи про распознавание как всегда очень познавательные. Пишите еще
Возможно следующая статья будет по детекту объектов (машина, лицо, оружие) на изображении с применением алгоритмов boosting'a
Очень-очень интересно)
И мне, и мне! :)
Так каков процент распознавания?
простите за невнимательность. нашел в статье
Почитал статью, решился все-таки попробовать «по питонить». Спасибо.
НЛО прилетело и опубликовало эту надпись здесь
точняк =)
В распознавании образов алгоритмы на основе нейронных сетей использовались давно, и показали себя с хорошей стороны. Распознавание каптчи — абсолютно та же задача распознания образов. В связи с этим разгадывание каптчи ботами — лишь вопрос времени распространения алгоритмов нейронных сетей среди веб-программистов. Так что пора использовать более продвинутую защиту, в которой для решения задачи недостаточно входных параметров, а также требуется интеллект. Например мне нравится защита вопрос-ответ при большой базе вопросов, разумеется.
Большая — сколько? Допустим 1000 пар вопрос-ответ (попробуйте ещё придумайте хотя-бы столько!). Тогда распознавальщику достаточно будет знать 60 пар чтобы получить те-же 6% эффективности. А это гораздо проще, чем распознать капчу.
Согласен. Вопрос-ответ конечно не выстоит, если его специально будут подбирать. Но он вполне для малопосещаемых ресурсов — форумов, персональных страниц. Попробуйте поставить форум phpbb3 самой последней версии с каптчей — на нем в первый же день появятся боты. Почему? Потому потому что каптча повсюду и по инету гуляют спамерские боты, которые щелкают капчти как орехи. А вопрос-ответ не популярен (по-моему его вобще нигде нет). Пытался ставить различные каптчи на свои проекты (менял алгоритм формирования картинок) и все равно всегда некоторый процент ботов проходил. После установки вопрос-ответ — ни единого бота. Ну конечно, повторюсь, мои сайты никто специально не подбирал, посещаемость у них 100-150 человек и мало кому нужно их ломать, но от примитивных спамеров обезопасился.

Сложную защиту с интеллектом я пока не разрабатывал, если будут идеи, отпишусь. Я вобщем не продвигал вопрос-ответ как панацею, а лишь сказал, что в задаче подбора должно не хватать входных данных. В каптче вот все входные данные на картинке. Нужно только подстроить под нее нейронную сеть и прогнать. А вопрос-ответ это задача, в которой требуются «знания», т.е. что-то помимо самого вопроса.
> Сложную защиту с интеллектом я пока не разрабатывал, если будут идеи, отпишусь.

Как вариант, можно отображать свои вопросы в виде несильно зашумленной капчи.
Только чтобы не в формате bmp ))
Варианты — «выберите 3 изображения живой природы» (видел в работе — довольно интересно) либо «укажите картинку, на которой изображен такой-то предмет»

Только эффективность у них не высокая. Все упирается в размер базы таких картинок.
Но у такого типа каптч есть будущее, если научится генерировать картинки автоматически.
Ну, знаете, когда у вас народу мало, можно их вообще капчами не мучать. Достаточно в клиенте джаваскриптом вычислять какую-то функцию, а на сервере проверять. Если функцию сделать не тривиальную и обернуть её пакером, то желающих не много найдется разбираться в этом коде. Я так делал для одного сайта — вполне нормально защищало (ни одного пробоя).
А я в скрытый средствами css div — включал поле «ConfirmEmail». Боты его старательно заполняют, а люди — нет. www.recoilme.ru/register/register_form
> Ну, знаете, когда у вас народу мало, можно их вообще капчами не мучать. Достаточно в клиенте джаваскриптом вычислять какую-то функцию, а на сервере проверять.

Ммм, не сказал бы, что все так просто. Часто встречаются роботы на основе браузеров :)
Знаете систему тестирования SeleniumRC (http://seleniumhq.org/projects/remote-control/)? Вот на ее основе можно спамеру делать ботов и жить припеваючи.

Основная моя мысль — что каптча задача устаревшая, надо придумывать что-то другое, причем что-то, где требуются «мозги». Вот например с картинками — шаг в эту сторону. Роботу нужно уметь сопостовлять изображения и понятия — это уже «кусок» искусственного интеллекта.
Кстати если думать совсем абстрактно о далеком будущем, то с изобретением искусственного интеллекта борьба со спамом станет невозможным :D
> и все равно всегда некоторый процент ботов проходил
Это наверняка был спам вручную. Некоторые спаммеры даже начинают разговаривать в комментах, если их потравить. Обижаются. Школьникам летом нечего делать, вот и занимаются «SEO».
> лишь вопрос времени распространения алгоритмов нейронных сетей среди веб-программистов
Так и представляю толпы студентов прочитавших Пых-Пых за 21 день и ломающих каптчу.
Не будет этого. Возможно появятся библиотеки заточеные под конкретные виды каптчи, но масового не будет потому что образовательный уровень масы веб-разработчиков в части математики и обработки сигналов нулевой, а без него даже простую каптчу не разпознаешь.
Основная маса разработчиков «Где найти библиотеку на Пых-Пых которая делает то-то».
Основная маса разработчиков «Где найти библиотеку на Пых-Пых которая делает то-то».

в мое время самым популярным вопросам было «где найти компонент для дельфи» :-)
вопросом, конечно же. Миль пардон, милостивые судари.
И ведь не поленились же вы написать.)
Вообще подобный материал очень увлекателен. Я года 4 назад изучал труды нейронных сетей Кохонена и тогда не хватало примера для наглядности. Теперь и на моей улице праздник =)
Спасибо.
Спасибо, очень познавательно.
Сегодня обнаружил в качалке jDownloader возможности распознания капч.
о, спасибо. чую нужная вещь.
> Кратко, смысл алгоритма заключается в том, что любая прямая на плоскости может быть задана двумя переменными – углом наклона и расстоянием от начала координат (theta, r)

Может, Любая точка а не прямая? Идея мне понравилась, перевод в другую систему координат :) Оригинально!
Через эту точку может быть проведено множество прямых.

Одна прямая конечно задана быть не может.
Ну так я и пишу что это точка задан 2 координатами :) Для прямой надо минимум 4 я догадываюсь.
Почему же? Хватит и двух координат — угол наклона прямой (в примере из статьи — от вертикали считается) и длины перпендикуляра от центра координат (начала, левый верхний там же) до прямой.
Ой, туплю, в смысле для отрезка надо 4 координаты :)
>в примере из статьи — от вертикали считается

Лучше трактовать не как угол между прямой и осью ординат, а как угол между нормалью и осью абсцисс.
Дождался новой серии, спасибо)
Вам впору написать книжку, посвященную подобным вещам) Наверняка будет классикой для интересующихся)
Так чем дело-то кончилось, удалось добиться распознавания или нет?

После всех статей про распознавание CAPTCHA неизменно возникает вопрос: какая CAPTCHA, на ваш взгляд, самая стойкая?
Как со стойкостью, к примеру, у ReCAPTCHA?
Удалось. Обученую нейросеть выкладывать не стал. Кто заинтересовался сможет воспроизвести результат.

Помнится на рапидшаре была каптча с котятами и собачками. Там я с 5го раза угадывал :)
Вот например такая:

habrahabr.ru/ blogs/php/28151/
Насколько я знаю у рекапчи всё хорошо. Они используют базу слов, которые заведомо не осилило OCR при оцифровке старых книг. В любом случае нужно понимать, что чем популярнее защита, тем больше желающих её сломать. Лучше использовать свои методы :)
Хороший повод для развития OCR. Оцифровщики книг будут рады тому, кто сделает прорыв в этой области :-)
Спасибо большое! Черезвычайно интересно!
А исходники скачали только первые 10 счастливчиков?
надо было выкладывать на iFolder, ага
Перезалейте, s'il vous plaît.
очень круто и увлекательно. спасибо.
Автору большой респект за подробно расписанное сообщение :)
читать легко и приятно, так же как программировать на Python!
Полгода назад тоже писал подобное только без нейросетей, алгоритм был следующим:
Разделение -> очистка и векторизация символов -> нахождение наиболее похожих в базе.

Правда забросил это дело, возможно если исходники разищу тоже выложу.
Было бы замечательно. Особенно интересны разделения сложных «слипшихся» символов. Да и по векторизации материал не будет лишним.
В крайнем случае по памяти попробую восстановить, там ничего сложного не было:

Разделял примерно так же как и здесь (данные о предварительном разделении сохранялись для последующего откидывания помеховых линий).
Потом просто откидывались ровные длинные линии (>1 знака или явно выходящие за рамки основного текста), а при векторизации бралась любая точка и от нее просматривало периметр(при перегибе более вероятным считался плавный изгиб), отметки о наличии точки писались как угол, потом это все склеивалось(т.е. проход в одну и другую сторону).

Хотел еще вероятностную карту создавать по типу (Ж60%; Ш90%; Щ95%), а пртом сверять по словарю на чем и забросил это дело.
Хороший подход.
> На вход подаём массив из 18*24 = 432 пикселей (точнее передаём 1 если пиксель значащий и 0 если фон), на выходе получаем массив из 10 чисел

Вот никогда не понимал. Массив из 432 пикселей линейный? Нейросетка никак не знает, что каждые 18 пикселей «пристыковываются» снизу? Если так, то результат будет весьма посредственный. А если не так, то объясните, каким образом нейросетка рассматривает двумерное изображение действительно как двумерное изображение?

> Создаётся ещё один скрытый слой с числом нейронов == 432 / 3.

Что означает это число? Из каких соображений взято?
НЛО прилетело и опубликовало эту надпись здесь
1. Не знает и ей не надо. Если вас научить таким последовательностям:

100 — человек
101 — кошка
110 — собака

Потом вы сможете «распознавать» эти объекты по «кодам» :) Только наш мозг не в состоянии воспринять 432 бита, а искусственной нейросети всё равно сколько бит.

2. Если упрощённо, то промежуточный слой берётся для того, чтобы сеть сходилась более плавно, что повышает устойчивость сети. Число получено эмпирически. Единого ответа на вопрос «сколько брать скрытых слоёв и сколько ставить нейронов», насколько мне известно, не существует.
> 1. Не знает и ей не надо. Если вас научить таким последовательностям:
> 100 — человек
> 101 — кошка
> 110 — собака
> Потом вы сможете «распознавать» эти объекты по «кодам» :) Только наш мозг не в состоянии воспринять 432 бита, а искусственной нейросети всё равно сколько бит.

Вы сейчас говорите о линейных цифровых образах. Такие образы да, хорошо обрабатываются нейросеткой с линейным входом. А мы говорим о распознавании символов, которые являются двумерными объектами.

Я слабо разбираюсь в нейросетях, но мне представляется, что для хорошего распознавания двумерных объектов нужна двумерная нейросетка (а существует ли такие?).

Либо исходное изображение символа надо переводить в какое-то промежуточное представление, которое «транслирует» объект из двумерного представления в естественное для такого объекта одномерное представление. Например, букву «A» можно написать обычным образом, сильно вытянутым, наклонным, изогнутым. Если, например смотреть на «А» сверху вниз, то как бы не была написана буква, можно сказать что образ описывается по строкам

пусто
пусто, точка, пусто
пусто, точка, пусто, точка, пусто
пусто, линия, пусто
пусто, точка, пусто, точка, пусто
пусто

далее по вертикальным строкам тоже самое. Таким образом, двумерное представление преобразовано в линейное, сохранив совокупную информацию об образе не в виде разрозненных пикселей, а в виде взаимосвязей между основными точками и линиями. Понятно, что для одной буквы «A» может быть несколько «преобразованных» таким (или подобным) методом образов. Но нейросетку надо обучать именно на таких данных, а не просто на наборе абстрактных нулей и единиц (что тоже впринципе даст результат).

Вообще думаю, что как минимум, нужно каким-то образом рассказать нейросетке какой размер в пикселях по вертикали и горизонтали имеется, что бы как-то сбалансировать связи между соседними точками в одной строке и в одном столбце.
Ура! Кто теперь сделает скрипт для greasemonkey? :)
НЛО прилетело и опубликовало эту надпись здесь
Очень интересно. Спасибо за статью.
Вся проблема каптчей в том, что мы пытаемся программно с генерировать нечто, что программно бы не взламывалось…
Какая же в этом проблема то? Асимметричное шифрование вполне себе живо.
Ассиметричное шифрование в смысле MD5 хэширование и тому подобное?
Асимметричное шифрование в смысле криптография с открытым ключом.
Кто успел скачать FANN, может перезалить куда-нибудь? Или Indalo.
Обновил ссылку.
Картинки поломались :(
ann = libfann.neural_net()

ann.create_standard(num_layers, num_input, num_neurons_hidden, num_output)
ann.set_activation_function_hidden(libfann.SIGMOID_SYMMETRIC_STEPWISE)
ann.set_activation_function_output(libfann.SIGMOID_SYMMETRIC_STEPWISE)

ann.train_on_file('samples.txt', max_epochs, epochs_between_reports, desired_error)


— В каком месте тут идет обучение ни как не пойму?
— Где входные данные для обучения и желаемый результат?
— Или они в фале «samples.txt» — тогда поясните пожалуйста, что мне туда писать?

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