Используйте OpenCV+Keras, чтобы легко взломать проверочный код

искусственный интеллект Keras Нейронные сети OpenCV

из среды

Автор: Адам Гейтгей

Сборник "Сердце машины"

Участие: Ли Цзэнань, Цзян Сыюань


Код подтверждения изображения, который необходимо ввести при входе на веб-сайт, может использоваться для определения того, является ли посетитель человеком или машиной — это тоже в определенной степени своего рода «тест Тьюринга».Исследователи искусственного интеллекта ищут направление взлома и пусть компьютер учится взламывать проверочный код, мы на шаг ближе к общему интеллекту (Не так давно Vicarious опубликовал статью в журнале Science, в которой представил новую модель машинного обучения для взлома кодов проверки изображений.). Сколько времени сегодня требуется, чтобы взломать самый популярный в мире код подтверждения изображения? Автор этой статьи, Адам Гейтгей, говорит вам: это займет всего 15 минут.


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

Недавно я читал «Глубокое обучение компьютерному зрению с Python» Адриана Роуза Брока. В этой книге Адриан использует машинное обучение для взлома кода CAPTCHA на веб-сайте E-ZPass в Нью-Йорке:

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

Но что, если мы хотим взломать систему CAPTCHA с открытым исходным кодом, где у нас есть доступ ко всему исходному коду?

я навестилWordPress.org (wordpress.org/) сайт регистрации плагина, и ищите в нем «CAPTCHA». Первый контент, показанный в результатах, — это «Really Simple CAPTCHA», который имеет более 1 миллиона активных установок:WordPress.org/plugins/Горячие….

Дело в том, что вот исходный код! С исходным кодом для создания изображения CAPTCHA мы можем легко взломать капчу. Здесь, чтобы усложнить задачу, добавим себе небольшое ограничение: сможем ли мы взломать его за 15 минут? Давай попробуем!

Примечание: это не означает, что мы критикуем плагин «Really Simple CAPTCHA» и его авторов. В настоящее время автор плагина заявил, что проверочный код больше не является безопасным, и рекомендует пользователям искать другие более безопасные методы аутентификации. Но если вы действительно один из тех 1 миллиона пользователей, возможно, вам следует быть настороже :)


вызов

Во-первых, нам нужно спланировать, давайте посмотрим, как выглядят изображения, сгенерированные Really Simple CAPTCHA. На демо-станции мы видели такой сценарий:

Образец изображения CAPTCHA


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

public function __construct() {
        /* Characters available in images */
        $this->chars = 'ABCDEFGHJKLMNPQRSTUVWXYZ23456789';
        /* Length of a word in an image */
        $this->char_length = 4;
        /* Array of fonts. Randomly picked up per character */
        $this->fonts = array(
            dirname( __FILE__ ) . '/gentium/GenBkBasR.ttf',
            dirname( __FILE__ ) . '/gentium/GenBkBasI.ttf',
            dirname( __FILE__ ) . '/gentium/GenBkBasBI.ttf'
        );

Да, он сгенерирует проверочный код CAPTCHA, состоящий из четырех букв/цифр. Шрифт каждого символа разный. В коде мы также видим, что проверочный код не будет содержать "O" или "I", потому что это два буквы могут сбить людей с толку цифрами. Итак, нам нужно распознать 32 цифры или буквы. нет проблем!

Пока время: 2 минуты


инструменты, которые нам нужны

Прежде чем мы начнем взламывать, давайте представим инструменты, необходимые для операции:


Python 3

Python в настоящее время является самым популярным языком программирования в области искусственного интеллекта и включает в себя множество библиотек машинного обучения и компьютерного зрения.


OpenCV

OpenCV — популярный фреймворк для задач компьютерного зрения и обработки изображений. Здесь нам нужно использовать OpenCV для обработки изображения, созданного с помощью CAPTCHA, OpenCV имеет API Python, поэтому мы можем вызывать его напрямую с помощью Python.


Keras

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


TensorFlow

TensorFlow — это библиотека машинного обучения, запущенная и поддерживаемая Google, а также самый популярный фреймворк в области искусственного интеллекта. Мы бы написали код поверх Keras, но у Keras на самом деле нет способа реализовать операции нейронной сети — ему нужно использовать TensorFlow в качестве бэкэнда для выполнения конкретной работы.


Ладно, вернемся к задаче.


Создать набор данных

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

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

После нескольких минут взлома исходного кода (путем простого добавления цикла for) у нас есть обучающий набор из 10 000 изображений PNG, и правильный ответ для каждого изображения — это имя файла каждого изображения:

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

Пока время: 5 минут


упростить проблему

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

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

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

Мы не можем разделить их вручную с помощью программного обеспечения для обработки изображений, такого как Photoshop, потому что всего имеется 10 000 обучающих изображений. Кроме того, мы не можем разделить изображение на четыре плитки одинакового размера, потому что CAPTCHA случайным образом размещает эти разные символы на разных горизонтальных линиях, например:


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

Итак, наше исходное изображение CAPTCHA выглядит так:



Затем мы преобразуем изображение в чистые черно-белые пиксели (т. е. с использованием цветового порога), поэтому мы легко найдем непрерывные границы контура:

Ниже мы используем функцию findContours() OpenCV для обнаружения отдельных частей, содержащих последовательные идентичные блоки пикселей:

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

Но есть еще одна проблема, некоторые изображения CAPTCHA содержат перекрывающиеся символы:

Это означает, что мы, вероятно, извлечем два символа в виде разделенной области:

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

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

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

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

На изображении выше показано извлечение символа «W», и мы получили 1147 различных «W» из 10 000 изображений CAPTCHA. После обработки этих изображений у нас ушло в общей сложности около 10 минут.


Построить и обучить нейронную сеть

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

Если бы мы использовали Keras, мы могли бы построить архитектуру нейронной сети всего несколькими строками кода:

# Build the neural network!
model = Sequential()
# First convolutional layer with max pooling
model.add(Conv2D(20, (5, 5), padding="same", input_shape=(20, 20, 1), activation="relu"))
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))
# Second convolutional layer with max pooling
model.add(Conv2D(50, (5, 5), padding="same", activation="relu"))
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))
# Hidden layer with 500 nodes
model.add(Flatten())
model.add(Dense(500, activation="relu"))
# Output layer with 32 nodes (one for each possible letter/number we predict)
model.add(Dense(32, activation="softmax"))
# Ask Keras to build the TensorFlow model behind the scenes
model.compile(loss="categorical_crossentropy", optimizer="adam", metrics=["accuracy"])

Начать обучение сейчас

# Train the neural network
model.fit(X_train, Y_train, validation_data=(X_test, Y_test), batch_size=32, epochs=10, verbose=1)

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


Решить задачу распознавания CAPTCHA с помощью обученной модели

Теперь мы можем легко идентифицировать CAPTCHA с обученной нейронной сетью:

  1. Используйте плагин WordPress на своем веб-сайте, чтобы получить реальные коды CAPTCHA;
  2. Разделите изображение CAPTCHA на четыре отдельных блока символов, используя тот же метод, который использовался для создания обучающего набора;
  3. Вызовите нейронную сеть, чтобы предсказать эти четыре независимых блока символов;
  4. Расположите четыре предсказания, которые будут возвращены для этой CAPTCHA.

Или мы можем запустить прямо из командной строки:

Попробуйте!

Если вы хотите попробовать это сами, вот код:это 3-US-west-2.Amazon AWS.com/UScube-exam PL…

Этот zip-файл содержит 10 000 примеров изображений и код для каждого шага, описанного в этой статье. Существует также файл README, в котором рассказывается, как его запустить.

Если вы хотите углубиться в знания, лежащие в основе кода, лучше всего прочитать книгу «Глубокое обучение для компьютерного зрения с помощью Python». Он охватывает множество деталей и представляет множество примеров, и если вас интересуют примеры, решающие сложные проблемы из реальной жизни, он может быть для вас.



Оригинальная ссылка:medium.com/@Ах, дайте мне немного масла/Также…