Распознавание капч – API rucaptcha.com. Описание методов для пересылки изображений для распознавания и получение результата расшифровки. OCR API. Решение ReCaptcha

Содержание

Текстовые капчи легко распознаются нейронными сетями глубокого обучения / Habr

Нейронные сети глубокого обучения достигли больших успехов в распознавании образов. В тоже время текстовые капчи до сих пор используются в некоторых известных сервисах бесплатной электронной почты. Интересно смогут ли нейронные сети глубоко обучения справится с задачей распознавания текстовой капчи? Если да то как?

Что такое текстовая капча?

Капча (англ. “CAPTCHA”) — это тест на “человечность”. То есть задача, которую легко решает человек, в то время как для машины эта задача должна быть сложной. Зачастую используется текст со слипшимися буквами, пример на картинке ниже, также картинку дополнительно подвергают оптическим искажениям.

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

Полносверточная нейронная сеть

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

Количество карт центров равно длине алфавита символов использованных в определенной капче. На картах центров отмечаются центры букв. Масштабное преобразование, которое в сети происходит из-за наличия пуллинг слоев, учитывается. Ниже показан пример карты символа для символа “D”


В данном случае используются сверточные слои с паддингом так, чтобы размер изображений на выходе сверточного слоя равнялся размеру изображений на входном слое. Профиль пятна на карте символа задается двумерной гауссовой функцией с ширинами 1.3 и 2.6 пикселей.
Первоначально полносверточная сеть была проверена на символе “R”:

Для проверки применялась небольшая сеть с 2мя пуллингами, натреннированная на CPU. Убедившись, что идея хоть как то работает, я приобрел б/у видеокарту Nvidia GTX 760, 2GB. Это дало мне возможность тренировать более крупные сети для всех символов алфавита, а также ускорило обучение (примерно в 10 раз). Для тренировки сети использовалась библиотека Theano, на текущий момент уже не поддерживаемая.

Тренировка на генераторе

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

Финальная точность тренировки на сгенерированных капчах, как оказалось, в 2 раза ниже, по сравнению с тренировкой на реальных капчах. Вероятно, такие нюансы как степень пересечения символов, масштаб, толщина линий символов, параметры искажения и т. п., важны, и в генераторе эти нюансы воспроизвести не удалось. Сеть тренированная на сгенерированных капчах давала точность на реальных капчах около 10%, точность — какой процент капч распознался правильно. Капча считается распознанной, если все символы в ней распознаны правильно. В любом случае этот эксперимент показал, что метод рабочий, и требуется повысить точность распознавания.
Тренировка на реальном датасете

Для ручной разметки датасета реальных капч был написан скрипт на Matlab с графическим интерфейсом:

Здесь кружочки можно расставлять и двигать мышкой. Кружочком отмечается центр символа. Ручная разметка занимала 5-15 часов, однако есть сервисы, где за не большую плату размечают вручную датасеты. Однако, как оказалось, сервис Amazon Mechanical Turk не работает с российскими заказчиками. Разместил заказ на разметку датасета на известном сайте фриланса. К сожалению, качество разметки было не идеальным, поправлял разметку самостоятельно. Кроме того, поиск исполнителя занимает время (1 неделя) и также это показалось дорого: 30 долларов за 560 размеченных капч. От данного способа отказался, в итоге пришел к использованию сайтов ручного распознавания капч, где самая низкая стоимость 1 доллар за 2000 капч. Но полученный ответ там — это строка. Таким образом, ручной расстановки центров избежать не удалось. Более того, исполнители в таких сервисах допускают ошибки или вовсе действуют недобросовестно, печатая произвольную строку в ответе. В итоге приходилось проверять и исправлять ошибки.

Более глубокая сеть

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

Таким образом, мы рассматриваем один пиксель на выходном изображении, и есть вопрос: значения каких пикселей на входном изображении влияют на значения этого пикселя? Я рассуждал так: если пиксель видит не весь символ, то используется не вся информация о символе и точность хуже. Для определения размера этой области видимости (будем называть ее так), я провел следующий эксперимент: установил все веса сверточных слоев равным 0.01, а смещения равным 0, на вход сети подается изображение, в котором значения всех пикселей равны 0 кроме центрального. В результате на выходе сети получается пятно:


Форма данного пятна близка к форме гауссовой функции. Форма получившегося пятна вызывает вопрос, почему пятно круглое, тогда как ядра сверток в сверточных слоях квадратные? (В сети использовались ядра сверток 3×3 и 5×5). Мое объяснение такое: это похоже на центральную предельную теорему. В ней, как и здесь, присутствует стремление к гауссовому распределению. Центральная предельная теорема утверждает, что для случайных величин, даже с разными распределениями, распределение их суммы равно свертке распределений. Таким образом, если мы сворачиваем любой сигнал сам с собой много раз, то по центральной предельной теореме результат стремится к гауссовой функции, а ширина гауссовской функции растет как корень из количества сверток (слоев). Если для такой же сети с константными весами посмотреть, где в выходном изображении значения пикселей больше нуля, то получается все таки квадратная область (см. рисунок ниже), размер этой области пропорционален сумме размеров сверток в сверточных слоях сети.


Раньше думал, что из-за ассоциативного свойства свертки две последовательные свертки 3×3 эквивалентны свертке 5×5 и потому, если свернуть 2 ядра 3×3 получится одно ядро 5×5. Однако, потом пришел к выводу, что это не эквивалентно хотя бы потому, что у двух сверток 3×3 9*2=18 параметров, а у одной 5×5 25 параметров, таким образом, у свертки 5×5 больше степеней свободы. В итоге, на выходе сети получается гауссова функция с шириной меньше суммы размеров сверток в слоях. Здесь ответил на вопрос какие пиксели на выходе подвержены влиянию одного пикселя на входе. Хотя изначально вопрос ставился обратный. Но оба вопросы эквивалентны, что можно понять из рисунка:


На рисунке можно представить, что это вид на изображения с боку или, что у нас высота изображений равна 1. Каждый из пикселей A и B имеет свою зону влияния на выходном изображении (обозначены синим цветом): для А это D-C, для B это C-E, на значения пикселя C влияют значения пикселей A и B и значения всех пикселей между A и B. Расстояния равны: AB = DC = CE (с учетом масштабирования: в сети присутствуют пуллинг слои, поэтому входное и выходное изображения имеют разные разрешения). В итоге, получается следующий алгоритм нахождения размера области видимости:

  1. задаем константные веса в сверточных слоях, весам-смещениям задаем значения 0
  2. на вход подаем изображения с одним ненулевым пикселем
  3. получаем размер пятна на выходе
  4. умножаем этот размер на коэффициент учитывающий разное разрешение входного и выходного слоя (например, если у нас 2 пулинга в сети, то разрешение на выходе в 4 раза меньше, чем на входе, значит этот размер надо умножать на 4).

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

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

Для символа “5”:

Для символа “L”:

Для символа “u”:

Изображения слева — исходные изображения капч, изображения справа — это оптимизированное изображение . Квадратом на изображениях обозначена область видимости output>0, окружности на рисунке — это линии уровня Гауссовой функции области видимости. Малая окружность — уровень 35% от максимального значения, большая окружность — уровень 3%. Примеры показывают, что сеть видит в пределах своей области видимости. Однако, у символа “u” наблюдается выход за область видимости, возможно это частичное ложное срабатывание на символ “n”.

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

Синим цветом, поверх стрелок, показано количество изображений (feature maps). c- сверточный слой, p — max-pooling слой, зеленым цветом внизу показаны размеры ядер. В сверточных слоях используются ядра 3×3 и 5×5 без strade, пуллинг слой имеет патч 2×2. После каждого сверточного слоя есть ReLU слой (на рисунке не показан). На вход подается одно изображение, на выходе получется 24 (количество символов в алфавите). В сверточных слоях паддинг подобран таким образом, чтобы на выходе слоя размер изображения был таким же как и на входе. Паддинг добавляет нули, однако это никак не влияет на работу сети, потому что значение фонового пикселя капчи — 0, так как всегда берется негативное изображение (белые буквы по черному фону). Паддинг лишь незначительно замедляет работу сети. Так как в сети 2 пуллинг слоя, то разрешение изображения на выходе в 4 раза меньше разрешения изображения на входе, таким образом каждый пуллинг уменьшает разрешение в 2 раза, например, если на входе у нас капча размером 216×96 то на выходе будет 24 изображения размером 54×24.

Улучшения

Переход от решателя SGD к решателю ADAM дал заметное ускорение обучения, и финальное качество стало лучше. Решатель ADAM импортировал из модуля lasagne и использовал внутри theano-кода, параметр learning rate ставил 0.0005, регуляризация L2 была добавлена через градиент. Было замечено, что от тренировки к тренировке результат получается разный. Объясняю это так: алгоритм градиентного спуска застревает в недостаточно оптимальном локальном минимуме. Частично поборол это следующим образом: запускал тренировку несколько раз и выбирал несколько самых лучших результатов, затем продолжал их тренировать еще несколько эпох, после из них выбирал один лучший результат и уже этот единственный лучший результат долго тренировал. Таким образом удалось избежать застревания в недостаточно оптимальных локальных минимумах и финальное значение функции ошибок (loss) получалась достаточно малым. На рисунке показан график — эволюция значения функции ошибок:

По оси x — число эпох, по оси y — значение функции ошибок. Разными цветами показаны разные тренировки. Порядок обучения примерно такой:

1) запускаем 20 тренировок по 10 эпох
2) выбираем 10 лучших результатов (по наименьшему значению loss) и тренируем их еще 100 эпох
3) выбираем один лучший результат и продолжаем тренировать его еще 1500 эпох.

Это занимает около 12 часов. Конечно, для экономии памяти, данные тренировки проводились последовательно, например, в пункте 2) 10 тренировок проводились последовательно одна за другой, для этого провел модификацию решателя ADAM от Lasagne, чтобы иметь возможность сохранять и загружать состояние решателя в переменные.

Разбиение датасета на 3 части позволяло отслеживать переобучение сети:

1 часть: тренировочный датасет — исходный, на котором сеть обучается
2 часть: тестовый датасет, на котором сеть проверяется в процессе тренировки
3 часть: отложенный датасет, на нем проверяется качество обучения после тренировки

Датасеты 2 и 3 небольшие, в моем случае было по 160 капч в каждом, также по датасету 2 определяется оптимальный порог срабатывания, порог который устанавливается на выходное изображение. Если значение пикселя превышает порог, то в данном месте обнаружен соответствующий символ. Обычно оптимальное значение порога срабатывания находится в диапазоне 0.3 — 0.5. Если точность на тестовом датасете значительно ниже, чем точность на тренировочном датасете — это значит что произошло переобучение и тренировочный датасет необходимо увеличить. В случае, если эти точности примерно одинаковы, но не высокие, то архитектуру нейронной сети нужно усложнять, а тренировочный датасет увеличивать. Усложнять архитектуру сети можно двумя путями: увеличивать глубину или увеличивать ширину.

Предварительная обработка изображений также повышала точность распознавания. Пример предобработки:

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

Эти искажения необходимо компенсировать.

Неудачные идеи

Всегда интересно почитать про чужие неудачи, опишу их здесь.

Существовала проблема малого датасета: для качественного распознавания требовался большой датасет, который требовалось разметить вручную (1000 капч). Мной предпринимались различные попытки каким-то образом обучить сеть качественно на малом датасете. Делал попытку обучать сеть на результатах распознавания другой сети. при этом выбирал только те капчи и те места изображений, в которых сеть была уверена. Уверенность определял по значению пикселя на выходном изображении. Таким образом можно увеличить датасет. Однако идея не сработала, после нескольких итераций обучения качество распознавания сильно ухудшилось: сеть не распознавала некоторые символы, путала их, то есть ошибки распознавания накапливались.

Другая попытка обучиться на малом датасете — использовать сиамские сети, сиамская сеть на входе требует пару капч, если у нас датасет из N капч, то пар будет N2, получаем гораздо больше обучающих примеров. Cеть преобразует капчу в карту векторов. В качестве метрики сходства векторов выбрал скалярное произведение. Предполагалось что сиамская сеть будет работать следующим образом. Сеть сравнивает часть изображения на капче с некоторым эталонным изображением символа, если сеть видит, что символ тот же с учетом искажения, то считается, что в данном месте качи есть соответствующий символ. Сиамская сеть тренировалась с трудом, часто застревала в неоптимальном локальном минимуме, точность была заметно ниже точности обычной сети. Возможно проблема была в неправильном выборе метрики сходства векторов.

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

Пример работы автоэкодера:

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

Также был пример капчи, которая использовала цвет:

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

Результат

Примеры Точность Коментарий


42 % Капча Микрософт
, jpg
61 %
63 %
93 % капча mail.ru, 500×200, jpg
87 % капча mail.ru, 300×100, jpg
65 % Капча Яндекс, русские слова, gif
70 % капча Steam, png
82 % капча World Of Tanks, цифры, png

Что еще можно было бы улучшить

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

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

Однако и такая задача кажется решаемой для сверточной сети. Можно предположить, что в будущем возникнут центры регистрации людей, например, человека по скайпу интервьюирует живой человек, проверяет сканы паспортов и тому подобное, затем человеку выдается цифровая подпись, с которой он может автоматически регистрироваться на любом сайте.
© Максим Веденев

Как работает индустрия по распознаванию CAPTCHA / Habr

Ни одна CAPTCHA не выстоит в противостоянии с армией низкооплачиваемых юзеров, которые готовы сутками распознавать «каптчи» Google и Myspace за скромное вознаграждение $2 за 1000 картинок. В Индии сформировалась целая индустрия «дата-процессинга», которая специализируется именно на этом, там работают тысячи и тысячи индусов.

Эти люди сидят за дисплеями и решают «каптчи» в реальном режиме времени. Их рабочий интерфейс выглядит примерно так.



Подробности о тонкостях бизнеса таких фирм опубликовал Данчо Данчев в блоге ZDNet Zero Day. Их бизнес процветает. Более того, в последнее время отмечаются признаки консолидации крупнейших игроков на этом рынке. Они начинают совместно разрабатывать новые рабочие инструменты, предпринимают шаги по снижению оплаты труда и даже начинают предоставлять бизнес по франшизе зарубежным партнёрам.

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

Например, несколько франшиз в Бангладеше имеют общий штат из 1000 сотрудников (этих «леммингов» ищут через интернет, в том числе в странах СНГ) и гарантируют взлом 250 000 «капчей» в сутки по цене $2 за тысячу. Некоторые фирмы гарантируют заказчикам точность распознавания 90% и максимальную скорость 10 секунд на каждое изображение.

Нижу мы публикуем несколько скриншотов различных веб-интерфейсов, с которыми работают CAPTCHA-взломщики.

Больше скриншотов в лучшем разрешении можно найти здесь.

Распознавание кириллической Яндекс капчи / Habr

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

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

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



Особенности


  • Переменная длина
  • Искажения
  • Шумы (кривая)
  • Кириллические буквы
  • Модный логотип в правом-верхнем углу

Слабые стороны


  • Искажения незначительны, не препятствуют сегментации
  • Шумы лишь незначительно усложняют распознавание
  • Ограниченный словарь позволяет отсеять неверные варианты и скорректировать ответы сети

Решение


Условно разделим распознавание на следующие этапы:
  • Предварительная обработка
  • Поиск расположения и сегментация текста
  • Распознавание
  • Финальная обработка результата

Предварительная обработка


Убираем логотип Яндекса и автокадрируем изображение:

Нормализуем входные данные:


Где x — значения цвета пикселей, [a,b] – интервал допустимых значений входных сигналов. В нашем случае от -1 до 1.

Поиск расположения и сегментация текста


За распознавание длины капчи отвечает сеть с 4-мя нейронами выходного слоя, каждый из которых соответствует значению длины от 4 до 7.

Теперь, зная длину капчи, остается лишь разделить изображение на равные части, для дальнейшего распознавания:

Распознавание


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

Первоначальная обучающая выборка подготовлена благодаря отряду русскоязычных индусов antigate и составила 2,000 капч, после недолгого обучения сети, в роли учителя выступал уже сам Яндекс и подготовленный ранее словарь из 387,143 слов от 4 до 7 символов, сформированный на основе данных из Яндекс словарей.

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

В течение суток получена точность распознавания каждого символа в 70%.

Финальная обработка результата


После получения результата распознавания проверяется наличие оного в словаре.
Если результат распознавания отсутствует в словаре, скорее всего он не верен.
Часто возникают ошибки между схожими символами, к примеру н — и, с — е, ь — ы, п — л.
В таком случае, исходя из ответов сети, выбираем наиболее вероятные буквы и ищем соответствующие слова в словаре.
Если слов не существует, выбираем варианты с аналогичной длиной и минимальным расстоянием Левенштейна.
Такой вариант дает 18% точность распознавания капчи.
Также можно задействовать частоту распределения букв и их сочетаний в русском языке, не говоря уже о готовых решениях для проверки орфографии, в любом случае вариантов множество.
Даже простое прюнинг результатов, отсутствующих в словаре отбрасывает значительную часть неверных вариантов.

Заключение


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

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

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

Исходники


Если желаете протестировать или разобраться в работе сети — добро пожаловать на GitHub.

P.S. Если у вас есть интересные задачи в этой области — буду рад помочь.

Распознавание и взлом CAPTCHA | Капча

Здравствуйте!

В этой статье, пойдет речь, о еще нескольких приемах распознавания captcha защиты. Эти приемы я буду демонстрировать на подопытной капче. В качестве подопытной я выбрал капчу некоего Rafontes на которую я набрел когда искал материалы для предыдущей статьи Анализ алгоритмов генерации CAPTCHA.

Пример сгенерированной капчи:

Фон мне пришлось использовать другой, так как автор не выложил оригинальный (или я не нашел), но это не повлияет на результат.

Препроцесс

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

В первую очередь нам надо отделить фон от текста. Анализируем картинку и код генерации изображения. Налицо первые ошибки:

  • Используется один цвет для всего теста с кодом
  • Цвет для текста генерируется в диапазоне rand(0, 200), 0, rand(0, 200), для R G B соответственно (достаточно выделить цвета только в этом диапазоне)
  • Фон с большим количеством разных цветов (не сможет повлиять на статистику самого часто используемого цвета)

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

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

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

Теперь определяем границы по вертикали:

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

А почему теперь эта линия убралась спросите вы? Потому что теперь анализировалось меньше «столбцов пикселей» и при анализе алгоритмом выявилось что в данном участке слишком много столбцов с одним черным пикселем, а следовательно это шум. Теперь уточняем границу по вертикали:

Так как область определения стала меньше то, теперь тот та линия что была шумом стала недостаточно темным пятном и была удаленна  совсем. Вот мы и получили участок с текстом. Конечно этот алгоритм иногда не совсем верно выделяет нужную область. Но по моим тестам число НЕверных определений не превышает 5%, чем собственно можно пренебречь.

Сегментация

Теперь наша задача разбить полученное изображение на отдельные участки с символами.

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

  • Отступ между каждым символом всегда равен 15 пикселям

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

Теперь как мы видим вокруг некоторых символов есть пустая область. А нам все таки нужен именно сам символ. Применяем функцию обрезки для каждого символа, и полученные изображения вписываем в прямоугольники размером 17×27:

Именно такие изображения по отдельности будут подаваться на распознавание.

Распознавание

Распознавание мы будет производить БЕЗ всяких новомодных нейронных сетей. Почему? Решающую роль сыграло то что, нет ни одной достойной библиотеки под винду. Пользоваться будем обычным распознаванием по маскам символов.

Для этого мы, имея доступ к исходным кодам, нагенерируем кучу черно-белых картинок для каждого символа с разными углами поворотов (от двух до четырех градусов), и разными размерами шрифта (от 20pt до 30pt). Каждую полученную картинку, как вы догадались, вписываем в прямоугольник размером 17×27. Каждое полученное изображение называется маской.

Для каждой буквы я нагенерировал по 10-15 масок. Впринципе этого достаточно, но если увеличить количество масок, то можно увеличить процент распознавания.

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

Результаты

Для теста я получил с помощью генерации картинки и ее разбиения на символы 200 зашумленных символов. И програмно запустил тест. И внимание!
Итог: Удачных: 172 Ошибок: 28 Процент: 86%
То есть каждый символ на капче будет распознан успешно с вероятностью в 86%!

Немного математики. Посчитаем процент вероятности успешного распознавания капчи:
Для 4-символьных капч: 0.86^4=54%
Для 5-символьных капч: 0.86^5=47%

В среднем каждая вторая капча будет успешно распознанна.

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

Исходники

Архив со скриптами (на php):
CaptchaBreaker_scripts
Архив масок (распаковать в папку ./masks/):
CaptchaBreaker_masks

Скрипт сам генерирует, и сам же распознает капчу. Пример работы скрипта на картинке приведенной в качестве примера автором капчи:

(Картинка кликабельна)

Заработок на капче, распознавание, заработать на антикапче

Captcha

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

Также важен регистр — большие и маленькие буквы нужно соблюдать.

Все пробелы между символами и словами важны.

Вводить нужно все слова через пробел, русские слова — в русской раскладке, английские — в английской.

Отказ от разгадывания по любой причине уменьшает КПД.

Оплачиваются все правильно введенные капчи, начисление вознаграждения — 1 раз в час.

Описание сервиса

Начните зарабатывать на капче, даже если у вас нет опыта – для этой работы вам нужна лишь внимательность и усидчивость. Сервис антикапчи Адвего похож на игру в угадывание, только вы еще получаете за это развлечение настоящие деньги.

Как заработать на капче

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

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

Кому подойдет эта работа

Разгадывание капчи станет подходящей работой, если вы ищете работу наборщиком текста – здесь тоже нужно быстро перепечатывать слова без ошибок. Но преимущество заработка на капче в том, что не нужно знать правила грамматики – достаточно печатать буквы и символы так, как их видите.

Сколько можно заработать

Ваш заработок на вводе капчи (антикапче) ограничен лишь временем – в среднем за час начинающий наборщик разгадывает до 300 капч, более опытный – до 500 и больше. За рабочий день можно заработать до 2-3 долларов, а за месяц – до 100 долларов.

Чем больше процент правильных разгадываний – тем выше оплата за 1000 капч, поддерживайте свой КПД выше 90%, чтобы получать максимальный доход.

Рекомендации при распознавании капч:

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

Как заработать на разгадывании капчи

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

Пошаговая инструкция по заработку на разгадывании капчи для новичков

Итак, решив получить приятную подработку онлайн и заработать на разгадывании капчи, вам нужно:

  • Найти подходящий сервис, предлагающий данный вид получения дохода онлайн. Например, Адвего. Это удачный выбор, ведь биржа обладает безупречной репутацией, существует много лет, пользуется авторитетом. Цена на разгаданные капчи на Адвего будет зависеть от вашего КПД, чтобы получать максимально высокий доход нужно поддерживать его на уровне выше 90%;
  • Выбрав сервис, необходимо зарегистрироваться на нём. Предварительно заведите себе электронный кошелёк и банковскую карту. Адвего предлагает выводить полученные деньги на кошельки в Webmoney, Qiwi и карты различных банков;
  • На соответствующей странице сервиса нажимаем кнопку «Получить капчу»;
  • Вот тут вам потребуются внимательность, усидчивость и умение быстро находить нужную клавишу на клавиатуре! Перед вами будут появляться картинки с различными комбинациями букв, цифр, специальных символов. Причём зачастую в сложно различимом, размытом виде. Вводить все знаки нужно правильно, без ошибок;
  • Разгадали, ввели, отправили капчу — получаете следующую. И так, пока глаза не устанут и внимание не притупится;
  • Каждый час средства за разгаданные капчи будут поступать на ваш счёт, откуда вы сможете вывести их на свой кошелёк или карту.

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

На Адвего подсчитали, сколько можно заработать на капче. 100 ye в месяц. Немного, признаём, но ведь и работа считается одной из самых простых. Для студентов и школьников — неплохой вариант получить карманные деньги. На Адвего, кстати, ввод капчи может приносить бесплатные символы для проверки текстов на уникальность онлайн. Некоторые копирайтеры биржи пользуются такой возможностью.

ReCaptcha V2 решение капчи через капча-сервис.

Прохождения ReCaptcha v2 возможно двумя путями:

1) Лёгкий но дорогой
Когда Вы отправляете нам только адрес сайта, где вы проходите капчу и Google-токен с этого сайта. В ответ Вы получаете токен для прохождения рекапчи.
Этот метод лёгок в реализации с Вашей стороны: капча проходится без эмуляции браузера и без кликов по капче, но весьма сложен для нас. Т.к. нам приходится открывать рекапчу на своей стороне и показывать её работнику.
Стоимость: 160 руб за 1000 решений
Подробное описание и API: Прохождение ReCaptcha без эмуляции браузера

Для Владельцев Zennoposter: актуальный шаблон тут

2) Сложный но дешёвый
Наш сервис поддерживает решение новой ReCaptcha v2, где нужно поставить галочку и выбрать изображения.
Мы поддерживаем капчи на 9/16/8 клеток.

Схема работы:

0) Вы в браузере открываете страницу с рекапчей
1) Вы ставите галочку
2) Получаете изображение + инструкцию
3) Отправляете нам изображение + инструкцию
4) Получаете от нас ID капчи
5) Через 5 секунд обращаетесь за ответом на капчу
6) Мы предоставляем номера картинок, которые нужно нажать для прохождения капчи
7) Кликаете по указанным изображениям.

Капча отправляется так же, как и обычные капчи (см. API отправки капч), но с дополнительными полями

  • Капча на 9\16 квадратов + текстовая инструкция Отправьте доп.параметры:
    recaptcha=1
    textinstructions=%TEXT%
    Где %TEXT% — текст того, что нужно указать (дорожные знаки, пальмы, подарок, вывеска и т.д.)
  • Капча на 9\16 квадратов + инструкция в картинке Отправьте доп.параметры:
    recaptcha=1
    imginstructions=img
    где «img» картинка инструкции. Её можно отправить multipart и base64
     

Требования к капче, образцу и тексту:
— Сама капча должна быть либо 300x300px, либо 600x600px, либо 632x632px
— Размер капчи должен быть как есть, на изображения 300х300 мы наложим сетку в 9 квадратов, на изображения 600х600 и  632x632px мы наложим сетку в 16 квадратов
— Капча должна быть меньше 100 Кбайт
-textinstructions должен приходить в кодировке UTF-8
-textinstructions должен содержать только то, что нужно выбрать на капче
-imginstructions должен быть не более 100x100px
-imginstructions должен быть меньше 25Кбайт

API и подробное описание алгоритма: Решение ReCaptcha с пересылкой картинок
Стоимость: 70 руб за 1000 решений

Специалисты научились ломать reCAPTCHA с помощью ИИ и распознавания речи — «Хакер»

За последние дни сразу несколько групп исследователей, независимо друг от друга, представили новые способы взлома систем CAPTCHA, в том числе с использованием ИИ и распознавания речи.

Recursive Cortical Network

На страницах журнала Science был представлен доклад (PDF) сводной группы из 12 специалистов, которые создали новый ИИ алгоритм для взлома систем CAPTCHA. Методика исследователей получила название Recursive Cortical Network Google (RCN). По словам разработчиков, они постарались максимально приблизить работу своего «детища» к принципам работы человеческого глаза и мозга, что дало весьма впечатляющий результат.

RCN справляется с reCAPTCHAs с точностью 66,6%, с BotDetect с точностью 64,4%, защитой Yahoo с точностью 57,4%, и с защитой PayPal в 57,1% случаев.

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

В отличие от похожей методики Convolutional Neural Network, RCN обучается гораздо быстрее и алгоритм способен адаптироваться к новым системам CAPTCHA . Так, для тренировки RCN понадобится лишь несколько тысяч изображений, тогда как CNN нужно «скормить» порядка 2,3 млн.

unCAPTCHA

Эксперты из университета Мэриленда представили собственное решение, ориентированное на взлом reCAPTCHA, созданной компанией Google. Автоматизированная система взлома получила название unCAPTCHA, и она справляется с поставленной задачей просто отлично. Система взламывает 450 reCAPTCHA с точностью 85,15% за 5,42 секунды.

В отличие от вышеописанной разработки, unCAPTCHA не пытается анализировать «увиденное» изображение, но ломает аудиоверсию защиты, добавленную в reCAPTCHA для людей с ограниченными возможностями.

Так, unCAPTCHA скачивает аудиоверсию reCAPTCHA, сегментирует файл на несколько небольших клипов, пропускает полученные фрагменты через системы распознавания речи (text-to-speech), для чего используются решения Bing Speech Recognition, Google Cloud, Google Speech Recognition, Sphinx, и Wit-AI. После этого полученный результат обрабатывается, распознанные фрагменты конвертируются в цифры (к примеру, two или true явно означает 2), и Google предоставляется наиболее вероятный вариант ответа.

Код unCAPTCHA уже был опубликован на GitHub. В отличие от представленного в начале текущего года решения ReBreakCaptcha, в данном случае разработчики заранее уведомили о своем исследовании специалистов Google. В результат компания уже поработала над reCAPTCHA и добавила в систему новые меры защиты от подобных атак.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *