Чем машинное обучение отличается от CAPTCHA?

Посмотрим, смогут ли CNN и Tesseract взломать CAPTCHA!

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

1] Что такое Captcha?

Как уже упоминалось, Captcha - это средство проверки личности (человека или бота), выполняющего действие, в которое встроена captcha, вот официальное определение:

Компьютерная программа или система, предназначенная для различения данных, вводимых человеком, от машинного, как правило, для предотвращения спама и автоматического извлечения данных с веб-сайтов. (из Google)

Для более наглядного определения, вот тип Captcha (рис.1).

2] Наш набор данных для Captcha

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

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

gray = cv2.threshold(X_l[0], 50, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]
plt.imshow(gray)
plt.title('Example of letter {}'.format(y_l[0]))
plt.show()

Смотрите результат здесь (рис.2):

3] Решение с Tesseract

Вот результаты (рис.3) и код, который мы использовали для тестирования Tesseract на Captcha.

i = random.randint(0,len(X)-1)
gray = X[i].copy()
gray = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]
gray = cv2.medianBlur(gray, 3)
#if len(pytesseract.image_to_string(gray).strip()) == 0: continue
label = pytesseract.image_to_string(gray)
plt.imshow(X[i])
plt.show()
print('Originally {} and recognized is {}'.format(y[i],label))

valid = 0
for i in tqdm(range(100)):
    if type(X[i])==type(None): continue
    gray = X[i].copy()
    gray = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]
    gray = cv2.medianBlur(gray, 3)
    label = pytesseract.image_to_string(gray)
    valid += (y[i] == label)
    
print('Result of Tesseract among 100 points {}'.format(valid))

На наборе из 100 капч результат Tesseract - 4. Излишне говорить, что создатели Captcha могут просто оставить эту модель в покое, поскольку она никоим образом не представляет угрозы .

4] Решение с нашей собственной разработанной архитектурой CNN

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

Для этого мы выполняем два шага:

Определение контура букв

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

Вот одна буква, найденная на этой капче (рис.5):

Узнаем букву

Мы используем следующую архитектуру CNN для этих задач (обратите внимание, что размер букв примерно 16x14, размер, который мы не хотим слишком сильно изменять):

  • Два 2-мерных слоя свертки с 64 фильтрами и размером фильтра 3x3
  • Два слоя 2d MaxPool размером 2x2
  • Один слой FC размера 64

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

Мы получаем следующую хорошую точность и потерю только после 10 эпох обучения.

Вот пример прогноза для капчи (рис.8):

Что касается производительности, эта модель имеет приблизительную производительность в 50%, что в основном подбрасывает монетку. Таким образом, этот тип Captcha определенно разрешим и не защищен от ботов.

Вы можете попросить меня предоставить полный исходный код.

Ссылки на такие темы также можно найти здесь (кредиты автору).

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