Пользователь
0,0
рейтинг
25 марта 2011 в 21:37

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

Именно так называлась работа, представленная мной на Балтийском научно-инженерном конкурсе, и принёсшая мне очаровательную бумажку с римской единичкой, а также новенький ноутбук.

Работа заключалась в распознавании CAPTCHA, используемых крупными операторами сотовой связи в формах отправки SMS, и демонстрации недостаточной эффективности применяемого ими подхода. Чтобы не задевать ничью гордость, будем называть этих операторов иносказательно: красный, жёлтый, зелёный и синий.



Проект получил официальное название Captchure и неофициальное Breaking Defective Security Measures. Любые совпадения случайны.

Как ни странно, все (ну, почти все) эти CAPTCHA оказались довольно слабенькими. Наименьший результат — 20% — принадлежит жёлтому оператору, наибольший — 86% — синему. Таким образом, я считаю, что задача «демонстрации неэффективности» была успешно решена.

Причины выбора именно сотовых операторов тривиальны. Уважаемому Научному Жюри я рассказывал байку о том, что «сотовые операторы имеют достаточно денег, чтобы нанять программиста любой квалификации, и, в то же время, им необходимо минимизировать количество спама; таким образом, их CAPTCHA должны быть довольно мощными, что, как показывает моё исследование, совсем не так». На самом же деле всё было гораздо проще. Я хотел набраться опыта, взломав распознав какую-нибудь простую CAPTCHA, и выбрал жертвой CAPTCHA красного оператора. А уже после этого, задним числом родилась вышеупомянутая история.

Итак, ближе к телу. Никакого мегапродвинутого алгоритма для распознавания всех четырёх видов CAPTCHA у меня нет; вместо него я написал 4 различных алгоритма для каждого вида CAPTCHA по отдельности. Однако, несмотря на то, что алгоритмы в деталях различны, в целом они оказались очень похожими.

Как и многие авторы до меня, я разбил задачу распознавания CAPTCHA на 3 подзадачи: предварительную обработку (препроцесс), сегментацию и распознавание. На этапе препроцесса из исходного изображения удаляются различные шумы, искажения и пр. В сегментации из исходного изображения выделяются отдельные символы и производится из постобработка (например, обратный поворот). При распознавании символы по одному обрабатываются предварительно обученной нейросетью.

Существенно различался только препроцесс. Это связано с тем, что в различных CAPTCHA применяются различные методы искажения изображений, соответственно, и алгоритмы для удаления этих искажений сильно различаются. Сегментация эксплуатировала ключевую идею поиска компонентов связности с незначительными наворотами (значительными их пришлось сделать только у жёлто-полосатых). Распознавание было абсолютно одинаковым у трёх операторов из четырёх — опять-таки, отличался только жёлтый оператор.

Код написан на Python с применением библиотек OpenCV и FANN, которые не ставятся без напильника приличных размеров и бубна впридачу. Поэтому мои результаты будет воспроизвести непросто — по крайней мере, до тех пор, пока авторы вышеупомянутых библиотек не сделают нормальные привязки для Python.

Red


Как я уже сказал, первым кроликом я выбрал именно эту CAPTCHA. Думаю, несколько примеров прояснят ситуацию:

image image image

Вот-вот, и мне тоже сначала показалось, что она очень простая… Однако, это впечатление возникло не на пустом месте. Итак:
  • Цвета исчерпываются градациями серого, причём символы — светлые, фон — тёмный
  • Отсутствует дополнительный шум
  • Постоянные искажения (то есть не изменяющиеся от картинки к картинке)
  • Символов всегда ровно пять
  • Размеры символов приблизительно одинаковы
  • Символы почти всегда связны

Казалось, всё это сводит на нет достоинства этой CAPTCHA:
  • Слипающиеся буквы
  • Мерзкий дырявый шрифт
  • Очень маленький размер (83x23 px)

Естественно, эти «достоинства» являются таковыми только с точки зрения сложности автоматического распознавания. В соответствии с трёхэтапной схемой, упомянутой мной ранее, начнём с предварительной обработки изображения, а именно увеличения в 2 раза.

image image image

Как я уже упоминал, искажения здесь постоянны, и, даже несмотря на то, что они не являются линейными, избавиться от них нетрудно. Параметры были подобраны эмпирически.

image

image image image

Далее я применяю пороговое преобразование (в народе Threshold) с t=200 и инвертирую изображение:

image image image

Наконец, белым закрашиваются мелкие (меньше 10px) чёрные связные области:

image image image

Далее следует сегментация. Как я уже сказал, здесь применяется поиск компонентов связности:

image image image

Иногда (редко, но бывает) буква распадается на несколько частей; для исправления этого досадного недоразумения я применяю довольно простую эвристику, оценивающую принадлежность нескольких компонентов связности к одному символу. Эта оценка зависит только от горизонтального положения и размеров описывающих прямоугольников (bounding boxes) каждого символа.

image image image

Нетрудно заметить, что многие символы оказались объединены в один компонент связности, в связи с чем надо их разделять. Здесь на помощь приходит тот факт, что на изображении всегда ровно 5 символов. Это позволяет с большой точностью вычислять, сколько символов находится в каждом найденном компоненте.

Для объяснения принципа работы такого алгоритма придётся немного углубиться в матчасть. Обозначим количество найденных сегментов за n, а массив ширин (правильно сказал, да?) всех сегментов за widths[n]. Будем считать, что если после вышеупомянутых этапов n > 5, изображение распознать не удалось. Рассмотрим все возможные разложения числа 5 на целые положительные слагаемые. Их немного — всего 16. Каждое такое разложение соответствует некоторой возможной расстановке символов по найденным компонентам связности. Логично предположить, что чем шире получившийся сегмент, тем больше символов он содержит. Из всех разложений пятёрки выберем только те, в которых количество слагаемых равно n. Поделим каждый элемент из widths на widths[0] — как бы нормализуем их. То же самое проделаем со всеми оставшимися разложениями — поделим каждое число в них на первое слагаемое. А теперь (внимание, кульминация!) заметим, что получившиеся упорядоченные n-ки можно мыслить как точки в n-мерном пространстве. С учётом этого, найдём ближайшее по Евклиду разложение пятёрки к нормализованному widths. Это и есть искомый результат.

Кстати, в связи с этим алгоритмом мне в голову пришёл ещё один интересный способ искать все разложения числа на слагаемые, который я, правда, так и не реализовал, закопавшись в питоновских структурах данных. Вкратце — он довольно очевидно вылезает, если заметить, что количество разложений определённой длины совпадает с соответствующим уровнем треугольника Паскаля. Впрочем, я уверен, что этот алгоритм давным-давно известен.

Так вот, после определения количества символов в каждом компоненте наступает следующая эвристика — мы считаем, что разделители между символами тоньше, чем сами символы. Для того чтобы воспользоваться этим сокровенным знанием, расставим по сегменту n-1 разделителей, где n — количество символов в сегменте, после чего в небольшой окрестности каждого разделителя посчитаем проекцию изображения вниз. В результате этого проецирования мы получим информацию о том, сколько в каждом столбце пикселей принадлежат символам. Наконец, в каждой проекции найдём минимум и сдвинем разделитель туда, после чего покромсаем изображение по этим разделителям.

image image image

image

Наконец, распознавание. Как я уже говорил, для него я применяю нейросеть. Для её обучения сначала я прогоняю две сотни изображений под общим заголовком trainset через уже написанные и отлаженные первые два этапа, в результате чего получаю папку с большим количеством аккуратно нарезанных сегментов. Затем руками вычищаю мусор (результаты неправильной сегментации, например), после чего результат привожу к одному размеру и отдаю на растерзание FANN. На выходе получаю обученную нейросеть, которая и используется для распознавания. Эта схема дала сбой только один раз — но об этом позже.

image

В результате на тестовом наборе (не использованном для обучения, кодовое имя — testset) из 100 картинок были правильно распознаны 45. Не слишком высокий результат — его, конечно, можно улучшить, например, уточнив препроцесс или переделав распознавание, но, честно говоря, мне было лень с этим возиться.

Кроме того, я использовал ещё один критерий оценки производительности алгоритма — средняя ошибка. Вычислялся он следующим образом. Для каждого изображения находилось расстояние Левенштейна между мнением алгоритма об этом изображении и правильным ответом — после чего бралось среднее арифметическое по всем изображениям. Для этого вида CAPTCHA средняя ошибка составила 0.75 символа/изображение. Мне кажется, что это более точный критерий, нежели просто процент распознавания.

Кстати говоря, почти везде (кроме жёлтого оператора) у меня использовалась именно такая схема — 200 картинок в trainset, 100 — в testset.

Green


Следующей целью я выбрал зелёных — хотелось взяться за что-то более серьёзное, чем подбор матрицы искажений.

image image

Достоинства:
  • Эффект трёхмерности
  • Поворот и смещение
  • Неравномерная яркость

Недостатки:
  • Символы заметно темнее фона
  • Верхнюю сторону прямоугольника хорошо видно — можно использовать для обратного поворота

Оказалось, что даже несмотря на то, что эти недостатки, казалось бы, незначительны, их эксплуатация позволяет весьма эффективно расправиться со всеми достоинствами.

Опять начнём с предварительной обработки. Сначала оценим угол поворота прямоугольника, на котором лежат символы. Для этого применим к исходному изображению оператор Erode (поиск локального минимума), затем Threshold, чтобы выделить остатки прямоугольника и, наконец, инверсию. Получим симпатичное белое пятно на чёрном фоне.

Далее начинается глубокая мысль. Первое. Для оценки угла поворота всего прямоугольника достаточно оценить угол поворота его верхней стороны. Второе. Можно оценить угол поворота верхней стороны поиском прямой, параллельной этой стороне. Третье. Для описания любой прямой, кроме строго вертикальной, достаточно двух параметров — смещения по вертикали от центра координат и угла наклона, причём нас интересует только второй. Четвёртое. Задачу поиска прямой можно решить не очень большим перебором — слишком больших углов поворота там не бывает, да и сверхвысокая точность нам не нужна. Пятое. Для поиска необходимой прямой можно сопоставить каждой прямой оценку того, насколько она близка к искомой, после чего выбрать максимум. Шестое. Самое Важное. Чтобы оценить некоторый угол наклона прямой, представим, что изображения сверху касается прямая с таким углом наклона. Понятно, что из размеров изображения и угла наклона можно однозначно вычислить смещение прямой по вертикали, так что она задаётся однозначно. Далее, постепенно будем двигать эту прямую вниз. В какой-то момент она коснётся белого пятна. Запомним этот момент и площадь пересечения прямой с пятном. Напомню, что прямая имеет 8ми-связное представление на плоскости, поэтому гневные выкрики из зала о том, что прямая имеет одно измерение, а площадь — понятие двумерное, здесь неуместны. Затем ещё некоторое время будем двигать эту прямую вниз, на каждом шаге запоминая площадь пересечения, после чего просуммируем полученные результаты. Эта сумма и будет оценкой данного угла поворота.

image image

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

Итак, угол поворота найден. Но не следует спешить тут же применить полученное знание. Дело в том, что это испорит связность изображения, а она нам ещё понадобится.

Следующий шаг — отделение символов от фона. Здесь нам здорово поможет тот факт, что символы значительно темнее фона. Вполне логичный шаг со стороны разработчиков — иначе картинку было бы очень сложно прочитать. Кто не верит — может попробовать самостоятельно бинаризовать изображение и убедиться воочию.

Однако, подход «в лоб» — попытка отсечь символы пороговым преобразованием — здесь не работает. Наилучший результат, которого мне удалось добиться — при t=140 — выглядит весьма плачевно. Остаётся слишком много мусора. Поэтому пришлось применить обходной путь. Идея здесь следующая. Символы, как правило, связны. Причём им часто принадлежат самые тёмные точки на изображении. А что если попробовать применить заливку из этих самых тёмных точек, а затем выкинуть слишком маленькие залитые области — очевидный мусор?

Результат, честно говоря, поразителен. На большинстве изображений удаётся избавиться от фона полностью. Впрочем, бывает, что символ распадается на несколько частей — в этом случае может помочь один костыль в сегментации — но об этом чуть позже.

image image

Далее, произведём поворот на найденный ранее угол.

image image

Наконец, комбинация операторов Dilate и Erode избавляет нас от мелких дырок, оставшихся в символах, что помогает упростить распознавание.

image image

Сегментация здесь значительно проще, чем препроцесс. В первую очередь ищем компоненты связности.

image image

Затем объединяем близкие по горизонтали компоненты (процедура ровно та же, что и ранее):

image image

image

Собственно, всё. Далее следует распознавание, но оно ничем не отличается от вышеупомянутого.

Этот алгоритм позволил достичь результата в 69% успешно распознанных изображений и получить среднюю ошибку 0.3 символа/изображение.

Blue


Итак, третьим статус «defeated» получил синий оператор. Это была, так сказать, передышка перед действительно крупной рыбой…

image image image

Здесь сложно что-то записать в достоинства, но я, всё же, попробую:
  • Поворот символов — единственное более-менее серьёзное препятствие
  • Фоновый шум в виде символов
  • Символы иногда касаются друг друга

В противовес этому:
  • Фон значительное светлее символов
  • Символы хорошо вписываются в прямоугольник
  • Разный цвет символов позволяет легко отделять их друг от друга

Итак, препроцесс. Начнём с отсечения фона. Поскольку изображение трёхцветное, порежем его на каналы, а затем выбросим все точки, которые ярче 116 по всем каналам. Получим вот такую симпатичную маску:

image image image

Затем преобразуем изображение в цветовое пространство HSV (Википедия). Это сохранит информацию о цвете символов, а заодно и уберёт градиент с их краёв.

image image image

Применим к результату полученную ранее маску:

image image image

На этом препроцесс заканчивается. Сегментация также весьма тривиальна. Начнём, как всегда, с компонентов связности:

image image image

image

Можно было бы на этом и остановиться, но так получается всего 73%, что меня совсем не устраивает — всего на 4% лучше, чем результат заведомо более сложной CAPTCHA. Итак, следующим шагом будет обратный поворот символов. Здесь нам пригодится уже упомянутый мной факт о том, что местные символы хорошо вписываются в прямоугольник. Идея состоит в том, чтобы найти описывающий прямоугольник для каждого символа, а затем по его наклону вычислить наклон собственно символа. Здесь под описывающим прямоугольником понимается такой, что он, во-первых, содержит в себе все пиксели данного символа, а, во-вторых, имеет наименьшую площадь из всех возможных. Я пользуюсь готовой реализацией алгоритма поиска такого прямоугольника из OpenCV (MinAreaRect2).

image

Дальше, как всегда, следует распознавание.

Этот алгоритм успешно распознаёт 86% изображений при средней ошибке в 0.16 символа/изображение, что подтверждает предположение о том, что эта CAPTCHA — действительно самая простая. Впрочем, и оператор не самый крупный…

Yellow


Наступает самое интересное. Так сказать, апофеоз моей творческой деятельности :) Эта CAPTCHA — действительно самая сложная как для компьютера, так и, к сожалению для человека.

image image image

Достоинства:
  • Шум в виде пятен и линий
  • Поворот и масштабирование символов
  • Близкое расположение символов

Недостатки:
  • Очень ограниченная палитра
  • Все линии очень тонкие
  • Пятна часто не пересекаются с символами
  • Угол поворота всех символов приблизительно одинаков

Над первым шагом я думал долго. Первое, что приходило в голову — поиграться с локальными максимумами (Dilate), чтобы удалить мелкий шум. Однако, такой подход приводил к тому, что и от букв мало что оставалось — только рваные очертания. Проблема усугублялась тем, что текстура самих символов неоднородная — это хорошо видно при большом увеличении. Чтобы от неё избавиться, я решил выбрать самый тупой способ — открыл Paint и записал коды всех цветов, встречающихся в изображениях. Оказалось, что всего в этих изображениях встречаются четыре различных текстуры, причём на три из них приходится по 4 различных цвета, а на последнюю — 3; более того, все компоненты этих цветов оказались кратными 51. Далее я составил таблицу цветов, при помощи которой удалось избавиться от текстуры. Впрочем, перед этим «ремапом» я ещё затираю все слишком светлые пиксели, которые обычно находятся по краям символов — иначе приходится помечать их как шум, а потом с ними бороться, в то время как информации в них содержится немного.

Итак, после этого преобразования на изображении находится не более 6 цветов — 4 цвета символов (будем их условно называть серым, синим, светло-зелёным и тёмно-зелёным), белый (цвет фона) и «неизвестный», обозначающий, что цвет пикселя на его месте не удалось отождествить ни с одним из известных цветов. Называть условно — потому что к этому моменту я избавляюсь от трёх каналов и перехожу к привычному и удобному монохромному изображению.

image image image

Следующим шагом стала очистка изображения от линий. Здесь ситуацию спасает тот факт, что эти линии очень тонкие — всего 1 пиксель. Напрашивается простой фильтр: пройтись по всему изображению, сравнивая цвет каждого пикселя с цветами его соседей (парами — по вертикали и горизонтали); если соседи по цвету совпадают, и при этом не совпадают с цветом самого пикселя — сделать его таким же, как и соседи. Я применяю чуть более навороченную версию того же фильтра, который работает в два этапа. На первом он оценивает соседей на расстоянии 2, на втором — на расстоянии 1. Это позволяет добиться вот такого эффекта:

image image image

Далее я избавляюсь от большинства пятен, а также от «неизвестного» цвета. Для этого я сначала ищу все мелкие связные области (меньшие 15 по площади, если быть точным), наношу их на чёрно-белую маску, после чего результат объединяю с областями, занятыми «неизвестным» цветом.

image image image

При помощи этих масок я натравливаю на изображение алгоритм Inpaint (а точнее, его реализацию в OpenCV). Это позволяет весьма эффективно вычистить большую часть мусора из изображения.

image image image

Однако, реализация этого алгоритма в OpenCV была создана для работы с фотографиями и видео, а не распознавания искусственно созданных изображений с зашумлённым текстом. После его применения появляются градиенты, чего хотелось бы избежать, чтобы упростить сегментацию. Таким образом, приходится производить дополнительную обработку, а именно — повышение резкости. Для цвета каждого пикселя я вычисляю ближайший к нему из вышеупомянутой таблицы (напомню, там 5 цветов — по одному на каждую из текстур символов и белый).

image image image

Наконец, последним шагом препроцесса будет удаление всех оставшихся мелких связных областей. Появляются они после применения Inpaint, поэтому никакого повторения здесь нет.

image image image

Переходим к сегментации. Её сильно усложняет тот факт, что символы находятся очень близко друг к другу. Может случиться такая ситуация, что за одним символом не видно половину другого. Совсем плохо становится, когда эти символы ещё и одного цвета. Кроме того, остатки мусора также играют свою роль — может случиться так, что на исходном изображении линии в большом количестве пересекались в одном месте. В этом случае тот алгоритм, который я описал ранее, окажется неспособным от них избавиться.

После недели, проведённой в бесплодных попытках написать сегментацию так же, как и в предыдущих случаях, я забил на это дело и сменил тактику. Моя новая стратегия заключалась в том, чтобы разделить весь процесс сегментации на две части. В первой оценивается угол поворота символов и выполняется обратный поворот. Во второй из уже развёрнутого изображения заново выделяются символы. Итак, приступим. Начнём, как всегда, с поиска компонентов связности.

image image image

Затем нужно оценить угол поворота каждого символа. Ещё при работе с оператором-фанатом-гринписа я придумал алгоритм для этого, но написал и применил его только здесь. Для того чтобы проиллюстрировать его работу, проведу аналогию. Представьте себе поршень, который движется на чёрно-белое изображение символа снизу вверх. Ручка поршня, за которую его толкают, расположена вертикально, рабочая площадка, которой он толкает — горизонтально, параллельно нижней части изображения и перпендикулярно ручке. Ручка прикреплена к площадке посередине, и в месте присоединения находится подвижное сочленение, в результате чего площадка может поворачиваться. Да простят меня специалисты по терминологии.

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

image

Этот алгоритм довольно точен, но заведомо слишком большие результаты (больше 27 градусов) я не учитываю. Из оставшихся я нахожу среднее арифметическое, после чего целиком всё изображение поворачиваю на минус этот угол. Затем выполняю поиск компонентов связности ещё раз.

image image image

Дальше становится всё интереснее и интереснее. В предыдущих примерах я начинал различные махинации с полученными сегментами, после чего передавал их нейросети. Здесь всё иначе. Сначала, для того чтобы хотя бы частично восстановить информацию, утраченную после разделения изображения на компоненты связности, я на каждом из них тёмно-серым цветом (96) дорисовываю «фон» — то, что было рядом с вырезанным сегментом, но в него не попало, после чего сглаживаю очертания символов, применяя ту же процедуру, что и в препроцессе для линий (с расстоянием до соседа, равным единице).

image

Формально (с точки зрения модулей программы) здесь сегментация заканчивается. Внимательный читатель, должно быть, заметил, что нигде не упоминалось разделение слипшихся символов. Да, это так — на распознавание я их передаю именно в таком виде, а допиливаю уже на месте.

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

В самом начале я описывал алгоритм, позволяющий найти количество символов в сегменте при известой ширине этого сегмента и общем количестве символов. Этот же алгоритм используется и здесь. Для каждого сегмента вычисляется количество символов в нём. Если он там один — ничего допиливать не нужно, и этот сегмент сразу отправляется >>= в нейросеть. Если же символ там не один, то вдоль сегмента на равных расстояниях расставляются потенциальные разделители. Затем каждый разделитель двигается в своей небольшой окрестности, и попутно вычисляется реакция нейросети на символы около этого разделителя, после чего остаётся лишь выбрать максимум (на самом деле, там всё это делает довольно тупой алгоритм, но, в принципе, всё действительно приблизительно так).

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

Есть ещё одна тонкость, связанная с использованием нейросети в этом алгоритме. В предыдущих примерах нейросеть обучалась на почти необработанных результатах препроцесса и сегментации. Здесь это позволяло получить не более 12% успешного распознавания. Меня это категорически не устраивало. Поэтому, прежде чем начинать очередную эпоху обучения нейросети, я вносил в исходные изображения различные искажений, грубо моделирующие реальные: добавить белых/серых/чёрных точек, серых линий/кругов/прямоугольников, повернуть. Также я увеличил trainset с 200 изображений до 300 и добавил так называемый validset для проверки качества обучения во время обучения на 100 изображений. Это позволило добиться увеличения производительности где-то процентов на пять, а вкупе с сегментацией нейросетью как раз и дало тот результат, о котором я говорил в начале статьи.

Предоставление статистики осложнено тем, что у меня в итоге получилось две нейросети: одна давала больший процент распознавания, а другая — меньшую ошибку. Здесь я привожу результаты первой.

Всего, как я уже говорил неоднократно, в testset насчитывалось 100 изображений. Из них успешно распознано было 20, неудачно, соответственно, 80, а ошибка составила 1.91 символа на изображение. Заметно хуже, чем у всех других операторов, но и CAPTCHA соответствующая.

Вместо заключения


Всё, что относится к этой работе, я выложил в специальной ветке форума на своём сайте, в частности: исходный код, файлы нейросетей и изображения.

Хотелось бы и в следующем году в чём-нибудь поучаствовать — хотя бы в том же Балтийском конкурсе (а после него, желательно, и в Intel ISEF), но творческий кризис даёт о себе знать — не получается придумать вменяемую тему для проекта, а продолжать возиться с капчами нет никакого желания. Возможно, хабрасообщество сможет мне помочь…

Идеи, которые у меня были, но ни одна из которых мне не нравится — эти функциональная ОС и распределённые (и/или анонимные) сети. К сожалению, первое, вероятно, для меня будет слишком сложно (да и кому они нужны, эти функциональные оси?), а второе уже сделано, и сделано неплохо (I2P, Netsukuku). В то же время, хочется чего-то, что, во-первых, возможно сделать за год (хотя бы вдвоём), и во-вторых, серьёзно претендовало бы на высокое место на том же ISEF. Может быть, вы сможете подсказать, в каком направлении мне следует двигаться?

UPD 2015-04-09: репозиторий на Github.
@Pastafarianist
карма
95,0
рейтинг 0,0
Пользователь
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

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

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

  • +3
    Спасибо, отличная статься!
    p.s. пошёл настраивать sms уведомления об поступивших email (оператор red).
    • 0
      Научите?
      • –1
        C моим, относительно небольшим количеством email, меня бы быстро задолбало. А их всего то порядка сотни-полутора в день.
    • +3
      Не забудь запастить списком качественных прокси, иначе сразу забанят.
      Проверено.
    • 0
      Напишите статью ;)
    • 0
      ээмм, велосипеТ. Я пользуюсь услугой е-майл на смс. Услуга бесплатна. Я живу на урале и мой почтовый смс ящик вида 7XXXXXXXXXX@sms.ural.mts.ru. В интернет помощнике можно подключить также бесплатно.
      А за статью автору спасибо огромное!
      ps: в моду входят капчи вот такого вида как здесь keycaptcha.com, как говорится «а вам слабо» ;)
      • 0
        Не у всех операторов и не во всех регионах работают почтовые шлюзы.
        Многие пашут только в Москве/Питере, некоторые операторы данную услугу включают по заявлению, порой даже за $$.
  • +2
    Никогда не приходило в голову, что все наши крупнейшие операторы аккуратно заняли 4 основных цвета хотя это и довольно очевидно.
    За теорию спасибо, поздравляю с победой!
    • +2
      «4 основных цвета»

      Yellow = Red + Green как бы.
      • +2
        так то в специальном цветовом пространстве — RGYB
        • 0
          может GRYB?
  • +12
    Статья хорошая, но повторяет ошибки предыдущих статей, которые публиковались на Хабре.
    Зачем использовать нейросеть с сравнением с шаблонами изображений цифр? Можно для большинства из приведённых случаев (кроме последнего) использовать математический анализ. Он даст более высокий коэффициент угадывания и алгоритмы будут легче.
    Суть математического анализа сводится к подсчёту количества точек разного цвета. То есть изображение делиться сеткой на 4-9 участков и подсчитывается количество белых точек + общее количество точек. Для каждой цифры соотношение количества точек в разных участках уникально, что позволяет легко довести коэффициент угадывания до хороших результатов.
    Этот метод хорошо работает, если цифры имеют наклон не более 30 градусов и не пересекаются.

    Особое спасибо за алгоритмы выделения отдельных цифр — это хорошая работа.
    • –3
      Если у вас термин «математический анализ» ассоциируется с подсчётом точек — я Вам искренне сочувствую.
      Этот метод не будет работать в более-менее сложных случаях. Скажем, в первом — там размер символов слишком мал, чтобы производить подобные спекуляции.
      • 0
        Да не, я бы тоже не заморачивался с нейросетями и сравнивал тупо по шаблону (с разным наклоном). Да, грубо и немного затратно по времени выполнения, зато результат был бы около 100% + пишется за пять минут.
        • +5
          А автор — «заморочился», и именно за это получил бумажку с римской цифрой.
          Но Вы, конечно, смогли бы сделать его работу за пять минут, просто «не заморачивались».
        • +3
          Можно попросить вас на выходных потратить пять минут своего времени и показать вашу идею в виде кода? Мне интересно посмотреть, как можно добиться таких высоких темпов в разработке.
          • 0
            Увы, в выходные я работаю. Вот сейчас уже выхожу из дома и буду только поздно вечером. Но намек я понял, попробую «заморочиться» в понедельник-вторник.
            • 0
              Среда подходит к концу, а «заморачивания» не видать…
      • +6
        он прав. это подход вобщем математического, а в частности статистического анализа. так вполне можно сказать.
        и в противовес итерационной магии нейросети, при таком подходе используются более быстрые, точные и простые вычисления.
        • +4
          Которые, однако, вряд ли дадут приемлемый результат в условиях большого алфавита (заметьте, «только цифры» — один раз из четырёх) и слишком маленького размера изображений.

          Если интересует — попробуйте применить этот метод и сравните его эффективность с нейросетями. Зачем начинать холивары на пустом месте?
          • 0
            Я с вами однозначно согласен в одном. Самое правильное завершение спора — ещё две статьи.
            1. С описанием математики
            2. Сравнение
  • 0
    Отличная статья! Одназначно в избранное! Выходные предстоят занимательные)
  • +9
    Ура! Ну хоть кто-то присоединился ко мне в использовании лицензий Creative Commons на Хабре!

    На счёт запрета коммерческого использования. Действительно ли вам нужен этот запрет? Ведь никто не сможет, например, перевести вашу статью на английский язык для какого-нибудь сайта с рекламой (но из-за SA ваше произведение и на английском языке осталось бы свободным). Вашу статью даже нельзя скопировать в ЖЖ, потому что там тоже висит реклама. В общем, посмотрите почему запрет коммерческого использования — это плохо и запрещайте только если вам это очень нужно.
    • +2
      Понимаете, это тонкий намёк на то, что я не одобряю спам.
      • 0
        Совершенно не понял что вы имели ввиду. Это вы свободные лицензии спамом назвали или ссылки, которые я привёл?
        • +4
          Спамом я называю одно из потенциально возможных применений моей программы.
          • +11
            Спамеры, соблюдающие лицензии? Оригинально.
      • +8
        Вы указали только лицензию на сам текст, в то время как читатель имеет право использовать полученную в результате чтения вашей статьи информацию в любых целях. Сам код вы раздаёте под GPL, так что спаммеры могут его спокойно использовать (соблюдая условия, конечно).

        Статья мне очень понравилась. Поздравляю с победой!
        • +2
          Нормально ли писать, что лицензия распространяется на «текст, а также всю информацию, в нём содержащуюся»? А также изменять условия лицензирования после публикации статьи? :)
          • +3
            А как вы определите, что такая-то информация у меня в голове сформировалась именно только после прочтения вашей статьи?)
            Изменять условия можно, вы же автор, но все те кто успел скопировать текст до этого, получается получили его на старых условиях.
          • +4
            Информация не защищается законодательством об авторском праве. Законодательством защищаются лишь произведения.

            Увы, автор с этим ничего поделать не может. Пусть думает что хочет, но юридически он не прав.
          • НЛО прилетело и опубликовало эту надпись здесь
            • +3
              Благодарю за разъяснения. Сменил лицензию на CC BY-SA.
    • –1
      На хабре тоже есть реклама. Pastafarianist нарушает лицензию собственного текста? :)
      • –1
        Да? Странно. Сайтом пользуюсь уже полгода, ни разу никакой рекламы не видел.
        Меня посещают смутные подозрения. AdBlock?
      • +4
        Автор может делать со своим произведением всё что угодно и в том числе размещать на сайте с рекламой. Лицензия на автора не распространяется. Лицензия — это для других.
        • 0
          Логично. Пардон.
    • 0
      Ура! Ну хоть кто-то присоединился ко мне в использовании лицензий Creative Commons на Хабре!

      У меня к вам прямой вопрос. Я туго разбираюсь в лицензиях, но давно хотел найти какую-нибудь свободную лицензию для текстов. Что-то типа LGPL или MIT. То есть близкая к полной свободе, но не «передача в публичное достояние». Типа, «за мной сохраняются авторские права, но можете делать со статьёй все, что угодно».

      Что посоветуете?
      • +1
        Creative Commons Attribution-ShareAlike (CC BY-SA) — её, в частности, использует Википедия (можно увидеть в подвале любой статьи).
        • 0
          Спасибо)
      • 0
        Судя по таблице у MIT совсем нет копилефта, тогда вам подходит её аналог в мире контента — безкопилефтная Creative Commons Attribution (CC-BY). Она как бы говорит нам: «делайте всё что угодно, только указывайте моё авторство». Кстати, для России что общественное достояние, что CC-BY — фактически одинаковы, по закону всегда надо указывать автора (а вот в США для произведения в ОД можно не указывать).

        LGPL имеет слабый копилефт. Больше свободных лицензий имеющих слабый копилефт я и таблица не знаем. Но нормальный копилефт имеет Creative Commons Attribution ShareAlike (CC-BY-SA).
        • 0
          А что у этой статьи была за лицензия раньше? Которая запрещает комерческое использование?
          Спасибо за ликбез)
  • +3
    А я капчу красного оператора предварительно трансформировал по постоянному шаблону.
    3D-капч я также преобразовывал к прямоугольному виду. Так распознавать было проще и процент ошибок заметно сокращался.
    • –4
      Это вы пересказываете собственный опыт или предлагаете правки к тексту статьи?
  • +10
    Зачем все эти ссылки на lurkmore?
    • +5
      Так и знал, что кому-то не понравится :(
      • 0
        Но вы так и не ответили, зачем? Чему в них нравиться вообще? =\

        Вы лишь заставляете читателя прерываться на определение адреса ссылки и отвлекаете его от главного.
        • +4
          Ну давайте разбираться, где же я отвлекаю этого бедного читателя.

          Всего в тексте 5 ссылок на лурк. Из них три во вступлении, одна в заключении и одна — в самом начале текста про первую капчу. Таким образом, получается, что от технической части (в которой находятся все Глубокие Идеи (тм)) я читателя не отвлекаю вообще, и в то же время менее значимые части разбавляются этими самыми ссылками. Видите ли, я старался писать так, чтобы это читать было интересно.

          Я ответил на Ваш вопрос?
          • 0
            Неа. И что интересного добавили эти ссылки? Их все желающие уже видели, лурк для хабра — не новость.

            Лично мне после первых трёх вообще уже ни на какие ссылки смотреть не захотелось, но была бы там ценная информация — прочёл бы всё.
            • –2
              Если для Вас лурк — не новость, Вы должны быть прекрасно знакомы с тамошним стилем статей, где за невинными на первый взгляд заголовками ссылок часто скрывается неожиданное содержание. Причём чтение статей подразумевает, что вы наводите мышку на все ссылки подряд, но переходите лишь по единицам из них. Здесь я подразумевал то же самое — после первой же ссылки на лурк читатель должен был понять, что его ждёт в дальнейшем, и просто не переходить по ссылкам на вышеупомянутый сайт.

              Режим Капитана отключён.
              • +5
                Вы и комментатор ниже меня немного не так поняли. Я действовал соответственно вашему плану:
                1. навёл мышку на первую ссылку, увидел лурк;
                2. навёл мышку на вторую ссылку, увидел лурк;
                3. навёл мышку на третью ссылку, увидел лурк;
                4. попытался понять зачем они там, не получилось;
                5. решил до конца статьи на ссылки не отвлекаться вообще тк. опыт мне уже говорил, что там ничего нового не увижу.

                Но всё же, зачем ссылки если вы планировали, что на них переходить не нужно? Это ещё менее логично. Честно, когда моя логика говорит «нет», то я таких вещей просто не понимаю. Хотя против статьи в целом ничего не имею, она — торт.
            • +2
              Подсказка: при наведении мышки видно куда ссылка указывает, если лурк не нравиться — не переходите, из-за чего сыр бор?
      • +4
        Опа. Я эти ссылки банально не заметил при чтении. Разве что заинтересовался политикой лицензирования.

        По теме ссылок — это плоский не смешной юмор. Конечно лучше, чем если все в сухом стиле преподносить. Но можно было бы и поинтереснее пошутить.
        • –4
          Предложения, примеры?
  • 0
    Спасибо, добавил в избранное!
  • +2
    Любопытно, что многие капчаборцы используют нейронные сети для борьбы с поворотом изображений символов по сравнению с «эталоном».
    Если сравнивать не обзбражение и эталон, а результаты применения к ним каких-либо преобразований нечувствительных к повроту — то результаты будут лучше а нейронные сети могут и не понадобится.

    Беглое гугление по поводу преобразований нечувствительных к повороту выдаёт нам например слова «лог-полярное преобразование» + «вейвлет преобразование»
    • +1
      Любопытно, что в комментариях к любой толковой статье найдётся пачка теоретиков, знающих (понаслышке) 100500 методов, которые решили бы задачу в два счёта и со стопроцентной точностью.
      Каким-либо обоснованием своих утверждений теоретики не утруждаются, ведь «беглое гугление» Гения куда значительнее, чем экспериментальные результаты черни…

      Если Вы считаете, что «результаты будут лучше» — докажите, в противном случае это пустая болтовня.
      • +2
        за 5 минут получить 100% результат для любой капчи — не проблема.
        Проблема только в том, что считать 5ю минутами, 100% результатом и любой капчей.
  • 0
    За статью спасибо, весьма познавательно. А насчет распознавания слипшихся символов (особенно в последнем случае) — первое, что мне пришло в голову, попробовать распознавать сразу пары или даже тройки. Конечно, возможных вариантов получится намного больше, но есть подозрение, что и качество заметно подрастет.
    • 0
      Возникает естественная проблема — а где брать образцы для обучения? Там алфавит на 22 символа, если хотим распознавать пары, понадобится, по крайней мере, 484 сегмента по 2 символа в каждом — в идеальном случае это 194 картинки, но идеальных случае в природе не бывает. Покажите мне человека, который добровольно согласится распознавать такое количество капч (китайских студентов и декапчер.ком не предлагать!). Я руками переименовывал все эти изображения, и, честно говоря, удовольствия мало. Это первое.

      Второе — что-то я сомневаюсь, что при таком количестве различных образцов сеть сможет сделать вменяемое обобщение. Однако, проверке это утверждение не поддаётся из-за п.1.
      • +1
        Ну, для обучения можно нагенерить пары самостоятельно из одиночных символов — ведь примерный их вид известен. Думаю, должно прокатить. А вот со сложностью сети могут быть проблемы, это да. Но я бы попробовал.
  • 0
    подкинули бы пару идей о эффективной борьбе с авто-распознаванием
    • 0
      Для каждой из каптч, автор описал плюсы и минусы. Если сложить плюсы и убрать минусы, то получится почти идеальная капча )
      • 0
        Ага, Ucoz к ней неплохо приблизился.
        • 0
          Там человек то хер поймет, что написано.
          • 0
            Да, я это и имел в виду.
    • 0
      Сделайте N наборов «порчи картинки» и накладывайте их случайным образом.
      Из вышеперечисленного выделяется:
      * разные цвета для букв
      * разные аффинные преобразования для букв
      * аффинные преобразования для всей строки
      * 3d выпуклость
      * пустые квадраты между буквами, буквами не являющиеся
      * мусор
      * переменное количество букв
      * переменное направление чтения
      * тестовый вопрос (введите каждую пятую букву на экране)

      Идеальная капча должна выдавать строку подвергнувшуюся случайному набору преобразований. Так в один момент времени такая капча выдаст цветные буквы в 3d, в другой раз мусор и скривленную строку с вопросом и тп.
      • 0
        Если не ошибаюсь, что-то подобное реализовано у Webmoney.
        • 0
          У них много различных вариантов генерации, но практически все распознаются проще простого.
      • 0
        > Идеальная капча должна выдавать строку подвергнувшуюся случайному набору преобразований.

        И в результате будет у вас 10% капч которые распознаются с полпинка, потому что такие преобразования выпали. И этого будет более чем достаточно.
        • 0
          ага, если знать как распознавать конкретную капчу, есть много способов обдурить написаный кем-нибудь «детектор наложенных преобразований»
    • 0
      Показывайте не цифры/буквы, а фрукты-овощи, ну или фотографии знаменитостей :)
    • 0
      Кошки
    • НЛО прилетело и опубликовало эту надпись здесь
      • +6
        image
        • 0
          Два чудища в масках скинхедов разрывают девушку с поднятыми руками пополам. Каков мой диагноз? :)
          • +2
            Segmentation fault.
          • +2
            Годен. Вот если бы в вашем описании фигурировали хотя бы демоны и девственница, а также употреблялись слова «срущие» и «насилуют»… )
            • 0
              Ну монстры — это и есть демоны :D, а девственница ли девушка не известно, как и дальнейшие их действия.

              Но я действительно сказал о том, что увидел на пятне :). И это меня беспокоит, хочу об этом поговорить :).
          • 0
            Черт, увидел то же самое. Там ещё сиськи торчат. А точка посередине — это бляха от пояса.
            • 0
              Ещё у неё одна нога или она бежит
        • НЛО прилетело и опубликовало эту надпись здесь
      • 0
        Распознать текст тут не сложно, потому что он не искажен. А потом заправляем сюда.
        • НЛО прилетело и опубликовало эту надпись здесь
        • +5
          image
      • +1
        По-моему капча должна быть невыполнима для бота и не навязчива для человека (может так), не все же Онотолии в третьем поколении.

        image
        • +1
          Капча для xUSSR:

          image
  • +1
    Для детекта ограниченного набора образов с неизвестными аффиными преобразоваиями лучше всего использовать сверточные нейронные сети (они фактически разбивают картинку на набор признаков и по ним детект уже гораздо эффективней)
    • +1
      Сначала прочитал эпитет насчёт нейросетей как «сверхточные», много думал…

      Да, я хотел их использовать. Но, к сожалению, FANN их не поддерживает, адекватных альтернатив (в первую очередь, по скорости) я не нашёл, а писать что-то своё — слишком сложно и долго.

      P.S.: если кто-то заинтересуется темой, то в интернете проще найти информацию по запросу «convolutional neural networks».
  • 0
    Раньше, что бы защитится от ботов использовал капчу, но она не спасает. Спасло знание олбанского и проверка по словарю. Только живой человек сможет понять фразу «Сем памножыть натры».
    • +2
      Пробовали reCAPTCHA? Насколько я знаю, одна из самых сложных на текущий момент.

      Насчёт олбанского — уверен, хороший парсер и словарь сломят и такую защиту :)
  • 0
    При использовании reCAPTCHA боты пробивались только так, а при таком варианте защиты ботов почти нет, т.е. есть подозрение, что рекламных ботов все таки регистрируют в ручную, но их так мало, что можно сказать, что их нет.
    • 0
      не туда )
      • 0
        Возможно, дело в том, что защита типа капчи слишком хорошо изучена, и для того, чтобы её пробить, используют негров бедных китайских студентов? В интернете же полно сайтов, предлагающих «вводить символы с картинок 1$/1000 шт.». То есть проблема не в устойчивости капч к распознаванию, а в людях, соглашающихся выполнять настолько бесполезную работу.
        • 0
          Проблема в том, что капчу с цифрами поймет даже бездушная машина, а высокослоговые предложения Русского языка поймет только НАШ человек )
        • 0
          Слышал, что в последнем Хрумере reCAPTCHA автоматически распознаётся.
          • НЛО прилетело и опубликовало эту надпись здесь
  • +3
    Вот что обидно — в конце статьи содержится Вопрос Жизни, Вселенной и проч., а ни один из комментариев даже не затронул эту тему. Неужели никто ничего не подскажет? :(
    • +2
      Могу предложить две мысли (оценки трудоемкости не с меня :))

      Первая, с минимальным научным компонентом. Интеграция большинства сторонних обновлений в Windows Update. Уверен, это было бы полезно сотням миллионов. Не знаю, как монетизировать, правда, но должен быть способ :) И подходит ли это под нужные конкурсы.

      Вторая. Экономический анализ мира.
      Компании, Люди, Государства. Тратят и получают деньги. Производят и потребляют товары и услуги. Добывают сырье. Находятся в постоянных отношениях друг с другом. В Сети, и не только, есть множество информации, иногда прямой, иногда косвенной — объемы продаж, цены, оценки стоимости компаний, сделки, прогнозы, уровни добычи. Задача — построить модель, которая находилась бы в состоянии постоянного уточнения с новыми данными. И позволяла увидеть экономику мира, с возможностью zoom in/ zoom out. Дальше — прогнозирование :)
      • 0
        Реализация первой значительно осложняется тем печальным фактом, что у меня, к сожалению, нет доступа к внутренностям Windows Update. Даже если бы я сделал аналогичный сервис, кто даст гарантию, что меня послушает M$?

        Вторую вы описали весьма расплывчато (по крайней мере, для меня), хотя, конечно, звучит захватывающе. Но вот первая же мысль в связи с реализацией — нужно собирать статистику по интернету -> нужно аккуратно парсить содержимое статей по этой теме -> нужно понимать это содержимое -> нужно пройти тест Тьюринга :(
        • 0
          В зависимости от страны, в которой вы находитесь, могут быть юридически чистые способы получения доступа к внутренностям на клиенте. Сервер, конечно, понадобится свой :)

          Вторая — реализация точно не будет простой :)
  • +1
    а какой хоть ноутбук?
    интересно ведь.
  • 0
    Спасибо за статью, отлично написано. Вот вопрос возник по последней капче, там где цифры загораживали соседей. Нельзя ли на вход нейронной сети подавать +1, где чёрный пиксель, -1, где белый, и 0, где серый (иными словами, где он загорожен соседней цифрой)? Может ли нейронная сеть воспринимать среднее нейтральное значение как «неизвестность» и принимать решение на основе только тех пикселей, которые ей известны?
    • 0
      Вы не поверите…
  • +1
    • +3
      Да, я это раньше читал. Попутно подумал, что новую «святую» капчу я смогу распознать где-то на уровне 30-40%, ибо свято верю в мощь нейросетей, а препроцесс и сегментация там весьма тривиальны. Впрочем, печально, конечно, что администрация позволяет себе такое.
  • +1
    Спасибо, статья интересная и легко читается.
    Автор, а вы не хотите поучаствовать в Инетрнет-Математике 2011? Там вроде как раз про работу с изображениями в этом году.
    • 0
      Первый раз слышу об этом конкурсе.

      Думаю, нет. До дедлайна два месяца, а дел по горло, тем более что придётся разбираться в новой для себя теме. Не успею.
  • 0
    Идеальная капча блаблабла, пока есть индусы, любая капча обходится в такие копейки, что спам будет процветать. Я вообще удивлен, что многие монстры индустрии до сих пор пытаются капчами что-то закрывать. Эта защита устарела лет на десять.
    • 0
      Если нет под рукой Wolfram Mathematica, с матан-капчами они повозятся =)
      • 0
        Бррр, куда они повозятся? Если человек не в состоянии распознать капчу без дополнительных средств, то зачем такая капча?

        А я понял, вы не так поняли мое упоминание об индусах :)
    • 0
      С вами несогласны Google, Yahoo, Wikipedia, Windows Live и ещё тысячи сайтов поменьше.
      • +1
        Ага, я именно про этих монстров индустрии и говорю, хотя в свое время мы легко сотнями регистрировали аккаунты на gmail обходя капчу именно дешевыми человеческими ресурсами, а не сложными и громоздкими система на основе нейронных сетей и прочего.

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

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

        Это не пришлось бы объяснять людям, которым хоть раз понадобилось бы зарегистрировать в какой-либо системе с капчами больше сотни аккаунтов. Основная проблема современных систем защиты в том числе и у монстров индустрии состоит в том, что у них на работу приняты крутые спецы по защите, которые никогда не работали по другую сторону. Они борются с проблемой, которая им кажется, а не с той, которая есть на самом деле.
      • 0
        Да, а на тему альтернативного мнения, миллионов, которые не могут ошибаться и блаблабла, именно благодаря этому деньги в мире делятся 80/20, а не наоборот :) Пока ставятся защиты типа капчи, спамеры будут грести миллионы лопатами :)
  • 0
    Господа, «взламывающие» капчи. Вам сей мессадж.

    Капча — это штука позволяющая отсеивать низкопрофессиональных спаммеров. Это первая линия обороны от спама на ваш сотовый телефон, ваш форум, в вашу гостевую. К сожалению она не совершенна, и совершенной быть не может. Но ничего лучше пока не придумали.

    Поэтому помните, что выкладывая в паблик вот такие статьи с исходниками вы делаете ровно одну вещь — уменьшаете входной порог для всевозможных спамеров. Думаю это единственные люди, которые скажут вам спасибо.
    • +1
      А вторая линия обороны точно существует?
      • 0
        У оператора green вторая линия точно есть. Насчет остальных не знаю.
    • +1
      С таким подходом вообще треть интернета можно снимать с публикации ;)
    • +2
      Капча — это морально устаревшая защита, мешающая нормальным людям. Меня вот вымораживают капчи с разными оттенками, как человека, не различающего некоторые оттенки зеленого, для меня это катастрофа. Я встречал сайты, где не регался по причине того, что с трех раз не смог правильно ввести капчу и т.д. Есть намного более интересные и серьезные варианты защиты, которые не избавят от спама целиком и полностью, но сделают его настолько дорогим, что встанет вопрос а надо ли оно. Но чтобы их придумать и понять надо сначала попробовать поработать с другой стороны.

      А эта статья интересна не с точки зрения капч, а с точки зрения распознавания символов, мне вот таких статей не хватало в институте на занятиях по нейронным сетям. А с точки зрения информационной безопасности — статья не несет серьезной смысловой нагрузки.
      • +2
        Есть намного более интересные и серьезные варианты защиты, которые не избавят от спама целиком и полностью, но сделают его настолько дорогим, что встанет вопрос а надо ли оно.

        Не будьте голословными. Объясните хотя бы в общих чертах, что вы имеете в виду.

        А с точки зрения информационной безопасности — статья не несет серьезной смысловой нагрузки.

        Предлагаете перенести в другой блог?
        • НЛО прилетело и опубликовало эту надпись здесь
          • –1
            Уговорили. Перенесу по истечении 24 часов с момента публикации.
        • 0
          Насчет неголословности обязательно объясню, но чуть попозже, когда у себя на сайте оттестируем защиту и убедимся в достаточной эффективности, чтобы действительно не быть голословными. С другой стороны в паблике это точно не будет выкладываться, потому что до появлени в паблике это будет как раз эффективной защитой :)

          вот ниже правильно предложили в обработку изображений. я бы там такую статью скорее стал искать.
      • 0
        > Есть намного более интересные и серьезные варианты защиты, которые не избавят от спама целиком и полностью, но сделают его настолько дорогим, что встанет вопрос а надо ли оно.

        Поделитесь информацией. Спасёте интернет от капчи.

        • 0
          Ага или помогу спамерам в очередной раз модернизировать свой софт :) Не для паблика и после тестов.
  • 0
    Ну рас пошла такая тема, выложил свой ммс флудер зеленого оператора с автораспознаванием капчи.
    • –1
      Там сейчас другая капча, почти нечитабельная.
      • 0
        Ну вот, слишком поздно кинул в паблик:(
        Но в любом случае можно декомпильнуть и посмотреть что-как.
        • –1
          Да ладно, судя по скрину, в старой капче ничего сложного не было :)
          Кстати, по-моему, новая тоже сложная только для человека, компьютер с ней легко разберётся.
  • 0
    хорошая работа.

    я не буду писать про то, что распознавать капчу автоматическими методами нерентабельно уже года 3:)
    • –1
      В таком случае воспринимайте статью просто как описание подхода к распознаванию символов.
  • 0
    Скажите, я правильно понял, что в каждом случае во втором слое вы использовали ровно три нейрона?
    • +1
      Нет. Просто иллюстрация неудачная :)

      Я экспериментировал с различным количеством нейронов во втором слое, и остановился на одной трети от числа нейронов первого слоя.
      • 0
        При условии, что на вход подавалась ч/б картинка 30 x 30? Ее никак перед этим не изменяли (усреднение цвета по соседним пикселям и тп)?
        • 0
          Вообще-то, статья как раз и посвящена тому, что делается с этой картинкой до передачи её в нейросеть. В статье были примеры изображений перед самой передачей:

          image
  • –1
    Уважаемый минусатор. Скажите, вы испытываете какое-то особое удовольствие от того, что у всех моих последних комментариев ровно по одному минусу?
  • 0
    А не проще ли воспользоваться пиксодромовским сервисом антикапчи Pixodrom? ( pixodrom.com )
    • 0
      Задача была именно написать программу распознавания, а не спамить.
  • 0
    Буду очень благодарен, если кто-нибудь объяснит, как это запустить.Перепробовал штуки 3 разных версий питона, ещё 3 разных opencv, но запустить не смог.Желателен ответ в духе «поставить такую-то версию питона, такую-то openc, скопировать то-то туда-то, затем там-то нажать такую-то кнопку».
    • +1
      Всё писалось под Python 2.6.6, OpenCV 2.1, FANN 2.1.0beta. Но установка OpenCV и FANN — это весьма трудоёмкий процесс, и 2 года спустя я уже не смогу описать вам все детали. Впрочем, что касается FANN: где-то в интернете я видел хорошую инструкцию по его установке под Linux, попробуйте погуглить.

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