Тема капч не нова, в том числе и для Хабра.
Однако алгоритмы капч меняются, как и алгоритмы их решения.
Поэтому предлагается вспомнить былые времена и действовать следующим вариантом капчи:
попутно разобраться в работе простой нейронной сети на практике, а также улучшить ее результаты.
Сразу оговоримся, что мы не будем погружаться в размышления о том, как работает нейрон и что со всем этим делать; статья не претендует на научность, а лишь представляет собой небольшой урок.
Танцы у печки.
Вместо вступления Это можно повторить, но большинство книг по глубокому обучению на самом деле начинаются с предоставления читателю заранее подготовленных данных, с которыми он начинает работать.
Как-то MNIST - 60 000 рукописных цифр, CIFAR-10 и т. д. После прочтения человек выходит подготовленным.
к этим наборам данных.
Совершенно непонятно, как использовать ваши данные и, главное, как что-то улучшить при построении собственной нейросети.
Поэтому очень кстати, что вышла статья на pyimagesearch.com о том, как работать с собственными данными, а также их перевод .
Но, как говорится, хрен не слаще редиски: даже при переводе разжеванной статьи с помощью кераса все равно остается много белых пятен.
И снова предлагается заранее подготовленный набор данных, только на этот раз с кошками, собаками и пандами.
Вам придется заполнить пустоты самостоятельно.
Однако за основу будет взята эта статья и кодекс.
Сбор данных с помощью капчи
Здесь нет ничего нового.Нам нужны образцы капчи, потому что.
сеть будет учиться на них под нашим руководством.
Вы можете найти капчу самостоятельно или получить ее здесь - 29 000 капч .
Теперь вам нужно вырезать цифры из каждой капчи.
Не обязательно вырезать все 29 000 капч, тем более что 1 капча дает 5 цифр.
500 капч будет более чем достаточно.
Как резать? Можно это сделать в Фотошопе, но лучше иметь нож получше.
Итак, вот код ножа на Python: скачать .
(для Windows. Сначала создайте папки C:\1\test и C:\1\test-out).
На выходе будет дамп цифр от 1 до 9 (нулей в капче нет).
Далее вам нужно рассортировать эту путаницу цифр по папкам от 1 до 9 и положить их в каждую папку по соответствующему номеру.
Так себе работа.
Но за день можно разобрать до 1000 цифр.
Если при выборе цифры возникают сомнения в том, какая именно цифра, лучше этот образец удалить.
И ничего страшного, если цифры зашумлены или не до конца укладываются в «рамку»:
Вам нужно набрать по 200 образцов каждого числа в каждую папку.
Вы можете доверить эту работу сторонним сервисам, но лучше сделать все самостоятельно, чтобы потом не искать неправильно коррелированные номера.
Нейронная сеть.
Тест Папа, папа, наши сети принесли мертвеца.
Прежде чем приступить к работе с собственными данными, лучше просмотреть приведенную выше статью и запустить код, чтобы понять, что все компоненты (keras, tensorflow и т. д.) установлены и работают корректно.
Мы будем использовать простую сеть, синтаксис ее запуска из командной (!) строки такой:
*Tensorflow может писать об ошибках в собственных файлах и устаревших методах при работе; вы можете исправить это вручную или просто проигнорировать это.python train_simple_nn.py --dataset animals --model output/simple_nn.model --label-bin output/simple_nn_lb.pickle --plot output/simple_nn_plot.png
Главное, что после запуска программы в выходной папке проекта появятся два файла: simple_nn_lb.pickle и simple_nn.model, а на экране отобразится изображение животного с надписью и процентом распознавания, например:
Нейронная сеть – собственные данные
Теперь, когда проверка работоспособности сети проверена, вы можете подключить свои собственные данные и начать обучение сети.Разместим в папке dat папки с номерами, содержащие выбранные образцы для каждого номера.
Для удобства поместим папку dat в папку с проектом (например, рядом с папкой животные).
Теперь синтаксис запуска обучения сети будет таким: python train_simple_nn.py --dataset dat --model output/simple_nn.model --label-bin output/simple_nn_lb.pickle --plot output/simple_nn_plot.png
Однако начинать тренировки пока рано.
Необходимо исправить файл train_simple_nn.py.
1. В самом конце файла: #model.summary()
score = model.evaluate(testX, testY, verbose=1)
print("\nTest score:", score[0])
print('Test accuracy:', score[1])
Это добавит информативности.
2. image = cv2.resize(image, (32, 32)).
flatten()
изменить на image = cv2.resize(image, (16, 37)).
flatten()
Здесь мы изменяем размер входного изображения.
Почему именно этот размер? Потому что большинство вырезанных чисел имеют этот размер или уменьшаются до него.
Если масштабировать до 32x32 пикселей, изображение будет искажено.
И зачем это делать?
Кроме того, мы внесли это изменение в try:
try:
image = cv2.resize(image, (16, 37)).
flatten()
except:
continue
Т.
к.
программа не может переварить некоторые картинки и отображает None, поэтому они пропускаются.
3. Теперь самое главное.
Где комментарий в коде?
давайте определим архитектуру 3072-1024-512-3 с помощью KerasСетевая архитектура в статье определена как 3072-1024-512-3. Это означает, что сеть получает на входе 3072 (32 пикселя * 32 пикселя * 3), затем слой 1024, слой 512 и на выходе 3 варианта — кот, собака или панда.
В нашем случае на входе 1776 (16 пикселей * 37 пикселей * 3), затем слой 1024, слой 512, на выходе 9 вариантов чисел.
Поэтому наш код: model.add(Dense(1024, input_shape=(1776,), activation="sigmoid"))model.add(Dense(512, activation="sigmoid"))
*9 дополнительных выходов указывать не нужно, поскольку программа сама определяет количество выходов исходя из количества папок в наборе данных.
Давайте запустим
python train_simple_nn.py --dataset dat --model output/simple_nn.model --label-bin output/simple_nn_lb.pickle --plot output/simple_nn_plot.png
Так как картинки с номерами маленькие, то сеть обучается очень быстро (минут 5-10) даже на слабом железе, используя только процессор.
После запуска программы в командной строке посмотрим результаты:
Это значит, что достигнутая точность на обучающей выборке составила 82,19%, на контрольной — 75,6%, а на тестовой — 75,59%.
Нам необходимо сосредоточиться в большей степени на последнем показателе.
Почему остальные также важны, будет объяснено ниже.
Давайте также рассмотрим графическую часть работы нейросети.
Он находится в выходной папке проекта simple_nn_plot.png:
Быстрее выше сильнее.
Улучшение результатов Очень кратко можно посмотреть про настройку нейросети Здесь .
Более достоверный вариант следующий.
Добавим эпохи.
В коде меняем EPOCHS = 75
на EPOCHS = 200
Давайте увеличим «количество раз», которое сеть будет проходить обучение.
Результат:
Итак 93,5%, 92,6%, 92,6%.
На картинках:
Здесь заметно, что синяя и красная линии после 130 эпохи начинают удаляться друг от друга, а это говорит о том, что дальнейшее увеличение количества эпох ничего не даст. Давайте проверим это.
В коде меняем EPOCHS = 200
на EPOCHS = 500
и мы снова уезжаем.
Результат:
Итак, у нас есть:
99%,95,5%,95,5%.
И на графике:
Что ж, увеличение количества эпох явно пошло сети на пользу.
Однако этот результат обманчив.
Проверим работу сети на реальном примере.
Для этих целей в папке проекта есть скрипт Predict.py. Давайте подготовимся к запуску.
В папку images проекта мы поместим файлы с изображениями цифр из капчи, которые ранее не встречались сети в процессе обучения.
Те.
вам нужно брать числа не из набора данных dat.
В самом файле исправим две строчки под размер изображения по умолчанию: ap.add_argument("-w", "--width", type=int, default=16, help="target spatial dimension width")
ap.add_argument("-e", "--height", type=int, default=37, help="target spatial dimension height")
Запустите из командной строки: python predict.py --image images/1.jpg --model output/simple_nn.model --label-bin output/simple_nn_lb.pickle --flatten 1
И видим результат:
Другая картинка:
Однако это работает не со всеми зашумленными числами:
Что вы можете сделать здесь?
- Увеличьте количество копий номеров в обучающих папках.
- Попробуйте другие методы.
Давайте попробуем другие методы
Как видно на последнем графике, синяя и красная линии расходятся около 130-й эпохи.Это означает, что обучение после 130-й эпохи неэффективно.
Запишем результат на эпохе 130: 89,3%,88%,88% и посмотрим, сработают ли другие методы улучшения производительности сети.
Давайте уменьшим скорость обучения.
INIT_LR = 0.01
на INIT_LR = 0.001
Результат:
41%,39%,39%
Ну, давайте пройдем.
Давайте добавим дополнительный скрытый слой.
model.add(Dense(512, activation="sigmoid"))
на model.add(Dense(512, activation="sigmoid"))
model.add(Dense(258, activation="sigmoid"))
Результат:
56%,62%,62%
Лучше, но нет.
Однако если мы увеличим количество эпох до 250:
84%,83%,83%
При этом красная и синяя линии не отрываются друг от друга после 130-й эры:
Давайте сохраним 250 эпох и применим прореживание : from keras.layers.core import Dropout
Вставим прореживание между слоями:
model.add(Dense(1024, input_shape=(1776,), activation="sigmoid"))
model.add(Dropout(0.3))
model.add(Dense(512, activation="sigmoid"))
model.add(Dropout(0.3))
model.add(Dense(258, activation="sigmoid"))
model.add(Dropout(0.3))
Результат:
53%,65%,65%
Первое значение ниже остальных, что указывает на то, что сеть не обучается.
Для этого рекомендуется увеличить количество эпох.
model.add(Dense(1024, input_shape=(1776,), activation="sigmoid"))
model.add(Dropout(0.3))
model.add(Dense(512, activation="sigmoid"))
model.add(Dropout(0.3))
Результат:
88%,92%,92%
С 1 дополнительным слоем, децимацией и 500 эпохами: model.add(Dense(1024, input_shape=(1776,), activation="sigmoid"))
model.add(Dropout(0.3))
model.add(Dense(512, activation="sigmoid"))
model.add(Dropout(0.3))
model.add(Dense(258, activation="sigmoid"))
Результат:
92,4%,92,6%,92,58%
Несмотря на меньший процент по сравнению с простым увеличением эпох до 500, график выглядит более плавным:
И сеть обрабатывает ранее сброшенные изображения:
Давайте теперь соберем все в один файл, который разрежет изображение с введенной капчей на 5 цифр, пропустит каждую цифру через нейросеть и выведет результат в интерпретатор Python.
Здесь проще.
К файлу, который вырезал для нас цифры из капчи, мы добавим файл, который занимается предсказаниями.
Теперь программа не только разрежет капчу на 5 частей, но и выведет в интерпретатор все распознанные цифры:
Опять же надо иметь в виду, что программа не дает 100% результатов и часто одно из 5 чисел неверное.
Но это тоже хороший результат, учитывая, что обучающий набор содержит всего 170-200 копий каждого числа.
Распознавание капчи длится 3-5 секунд на компьютере средней мощности.
О том, как еще можно попытаться улучшить производительность сети, можно прочитать в книге «Библиотека Керас — инструмент глубокого обучения» А.
Джулли, С.
Пала.
Итоговый скрипт, который вырезает капчу и распознает ее: Здесь .
Запускается без параметров.
Переработаны скрипты для тренировка И тест сети.
Капчи для теста, в том числе с ложными срабатываниями - Здесь .
Модель для работы - Здесь .
Числа разложены по папкам - Здесь .
Теги: #Машинное обучение #python #искусственный интеллект #нейронные сети #python3 #CAPTCHA #captcha #салют юристам
-
Обзор Ip-Телефона Snom D717
19 Oct, 24 -
Блогеров Связали Четыре Рукопожатия
19 Oct, 24 -
Фракталы В Иррациональных Числах. Часть 2
19 Oct, 24