Определите капчу и создайте API, используя tensorflow и cnn (сверточная нейронная сеть)

TensorFlow

Адрес источника проекта:GitHub.com/Ник Ли Цянь/…Добро пожаловать в звезду и форк~

cnn_captcha

use CNN recognize captcha by tensorflow.
Этот проект использует тензорный поток для реализации сверточной нейронной сети для кода проверки изображения символа для распознавания кода проверки.
Проект заключает в себе более общиеВалидация, обучение, валидация, идентификация, модули API, что значительно сокращает время и усилия, затрачиваемые на определение кодов проверки символов.

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

Если вам нужно идентифицировать щелчок, перетаскивать коды подтверждения или иметь требования к обнаружению цели, вы также можете обратиться к этому проекту.nickliqian/darknet_captcha.

расписание

2018.11.12 - Первая версия Readme.md
21.11.2018 - Добавлены инструкции по распознаванию кода подтверждения
2018.11.24 - Оптимизированы правила проверки изображений в наборах данных
2018.11.26 - Новыйtrain_model_v2.pyфайл, точность тренировочного набора и проверочного набора выводятся одновременно в процессе обучения
2018.12.06 - Добавлена ​​поддержка мультимодального развертывания и исправлены некоторые ошибки.
2018.12.08 - Оптимизирована скорость распознавания модели, поддерживается стресс-тест API и статистические затраты времени
2018.02.19 - Добавлен метод расчета точности

содержание

1 Введение в проект

2 Как использовать

3 Описание

4 известные ошибки

1 Введение в проект

1.1 О распознавании кода подтверждения

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

имя метода Связанные моменты
tesseract Подходит только для распознавания картинок без помех и искажений, что хлопотно тренировать
Другие библиотеки распознавания с открытым исходным кодом Недостаточно общий, скорость распознавания неизвестна
Платный API распознавания текста Высокие затраты в условиях повышенного спроса
Обработка изображений + алгоритмы классификации машинного обучения Включает в себя множество технологий, стоимость обучения высока и не универсальна.
Сверточная нейронная сеть Определенная стоимость обучения, алгоритм подходит для нескольких типов проверочных кодов.

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

  1. Обработка изображения
  • Предварительная обработка (оттенки серого, бинаризация)
  • Сегментация изображения
  • обрезать (удалить границу)
  • Фильтрация изображения, шумоподавление
  • идти фон
  • цветоделение
  • вращать
  1. машинное обучение
  • KNN
  • SVM

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

Здесь перечислены в настоящее времяЧасто используемые коды подтвержденияСгенерировать библиотеку:

Ссылаться на:Семейный сегмент проверки Java

在这里插入图片描述

1.2 Структура каталогов

1.2.1 Базовая конфигурация

серийный номер имя файла инструкция
1 sample.py конфигурационный файл
2 папка с образцами сохранить набор данных
3 папка модели сохранить файл модели

1.2.2 Обучение модели

серийный номер имя файла инструкция
1 verify_and_split_data.py Набор данных проверки и разделение данных на обучающий набор и тестовый набор
2 train_model.py Обучите модель
3 train_model_v2.py Обучите модель, выведите точность тренировочного набора и проверочного набора одновременно в процессе обучения, рекомендуется использовать этот метод для обучения.
4 test_batch.py Пакетная проверка
5 gen_image/gen_sample_by_captcha.py Скрипт для генерации кода подтверждения
6 gen_image/collect_labels.py Используется для меток статистического кода проверки (обычно используется в китайских кодах проверки)

1.2.3 веб-интерфейс

серийный номер имя файла инструкция
1 recognition_object.py Инкапсулированный класс идентификации
2 recognize_api.py Интерфейс, написанный с использованием flask для предоставления функций онлайн-идентификации.
3 recognize_online.py Пример использования распознавания интерфейса
4 recognize_local.py Пример тестирования локальных образов
5 recognize_time_test.py Идентификация стресс-теста занимает много времени, а запрос-ответ требует времени

1.3 Зависимости

pip3 install tensorflow==1.7.0 flask==1.0.2 requests==2.19.1 Pillow==4.3.0 matplotlib==2.1.0 easydict==1.8

1.4 Структура модели

серийный номер Иерархия
входить input
1 Сверточный слой + слой пула + слой понижающей дискретизации + ReLU
2 Сверточный слой + слой пула + слой понижающей дискретизации + ReLU
3 Сверточный слой + слой пула + слой понижающей дискретизации + ReLU
4 Полное подключение + слой понижающей дискретизации + Relu
5 Полностью подключен + софтмакс
вывод output

2 Как использовать

2.1 Набор данных

Исходный набор данных может быть сохранен в./sample/originв каталоге
Для простоты обработки изображения лучше всего2e8j_17322d3d4226f0b5c5a71d797d2ba7f7.jpgФормат именования (метка_серийный номер.суффикс)

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

2.2 Файл конфигурации

Перед созданием нового проекта необходимоИзменить связанные файлы конфигурации

图片文件夹
sample_conf.origin_image_dir = "./sample/origin/"  # 原始文件
sample_conf.train_image_dir = "./sample/train/"   # 训练集
sample_conf.test_image_dir = "./sample/test/"   # 测试集
sample_conf.api_image_dir = "./sample/api/"   # api接收的图片储存路径
sample_conf.online_image_dir = "./sample/online/"  # 从验证码url获取的图片的储存路径

# 模型文件夹
sample_conf.model_save_dir = "./model/"  # 训练好的模型储存路径

# 图片相关参数
sample_conf.image_width = 80  # 图片宽度
sample_conf.image_height = 40  # 图片高度
sample_conf.max_captcha = 4  # 验证码字符个数
sample_conf.image_suffix = "jpg"  # 图片文件后缀

# 验证码字符相关参数
# 验证码识别结果类别
sample_conf.char_set = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i',
                        'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']

# 验证码远程链接
sample_conf.remote_url = "https://www.xxxxx.com/getImg"

Роль конкретной конфигурации будет указана в процессе использования соответствующего скрипта. о验证码识别结果类别, если ваш образец представляет собой китайский проверочный код, вы можете использоватьgen_image/collect_labels.pyСкрипт выполняет статистику тегов. файл будет сгенерированgen_image/labels.jsonХранить все теги, заданные в конфигурационном файлеuse_labels_json_file = Trueвключить чтениеlabels.jsonсодержание как结果类别.

2.3 Проверка и разделение набора данных

Эта функция проверяет размер исходного набора изображений и возможность открытия тестового изображения, а также разделяет обучающий набор и тестовый набор в соответствии с соотношением 19:1.
Итак, вам нужно создать и указать три папки: origin, train и test для хранения связанных файлов.

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

python3 verify_and_split_data.py

Обычно будет подсказка, похожая на следующую

Total image count: 10094
====以下4张图片有异常====
[第2123张图片] [325.txt] [文件后缀不正确]
[第3515张图片] [_15355300508855503.gif] [图片标签异常]
[第6413张图片] [qwer_15355300721958663.gif] [图片尺寸异常为:(50, 50)]
[第9437张图片] [abcd_15355300466073782.gif] [图片无法正常打开]
========end
开始分离原始图片集为:测试集(5%)和训练集(95%)
共分配10090张图片到训练集和测试集,其中4张为异常留在原始目录
测试集数量为:504
训练集数量为:9586

2.4 Обучение модели

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

第10次训练 >>> 准确率为 1.0 >>> loss 0.0019966468680649996

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

python3 train_model.py

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

from train_model import TrainModel
from sample import sample_conf

# 导入配置
train_image_dir = sample_conf["train_image_dir"]
char_set = sample_conf["char_set"]
model_save_dir = sample_conf["model_save_dir"]

# verify参数默认为False,当verify=True则会在训练前校验所有图片格式时候为指定的后缀
tm = TrainModel(train_image_dir, char_set, model_save_dir, verify=False)

tm.train_cnn()  # 执行训练

tm.recognize_captcha()  # 识别演示

2018.11.26новыйtrain_model_v2.pyдокумент
Он же является скриптом для обучения модели, в процессе обучения добавляется процесс идентификации набора тестов и вывода показателя точности, например:

第480次训练 >>> [训练集] 准确率为 1.0 >>> loss 0.0017373242881149054
            >>> [验证集] 准确率为 0.9500000095367432 >>> loss 0.0017373242881149054
验证集准确率达到99%,保存模型成功

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

2.5 Проверка партии

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

python3 test_batch.py

Вы также можете вызвать класс для проверки

from test_batch import TestBatch
from sample import sample_conf

# 导入配置
test_image_dir = sample_conf["test_image_dir"]
model_save_dir = sample_conf["model_save_dir"]
char_set = sample_conf["char_set"]
total = 100  # 验证的图片总量

tb = TestBatch(test_image_dir, char_set, model_save_dir, total)
tb.test_batch()  # 开始验证

2.6 Запустите веб-сервер

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

python3 recognize_api.py

URL-адрес интерфейсаhttp://127.0.0.1:6000/b

2.7 Вызов интерфейса

Вызов интерфейса с помощью запросов:

url = "http://127.0.0.1:6000/b"
files = {'image_file': (image_file_name, open('captcha.jpg', 'rb'), 'application')}
r = requests.post(url=url, files=files)

Возвращаемый результат - json:

{
    'time': '1542017705.9152594',
    'value': 'jsp1',
}

документrecognize_online.pyпример онлайн-идентификации с использованием интерфейса

2.8 Развертывание

При развертывании поставитьrecognize_api.pyИзмените последнюю строку файла, чтобы она читалась следующим образом:

app.run(host='0.0.0.0',port=5000,debug=False)

Затем откройте разрешение на доступ к порту, вы можете получить доступ через внешнюю сеть.
Кроме того, чтобы включить многопроцессорную обработку запросов, вы можете использовать комбинацию uwsgi+nginx для развертывания.
Эта часть может относиться к:Варианты развертывания фляги

2.9 Развертывание нескольких моделей

Разверните несколько моделей: существуетrecognize_api.pyРезюме файла, создайте новый объект Recognizer;
и обратитесь к оригиналуup_imageЛогика маршрутизации и распознавания, написанная функцией.

Q = Recognizer(image_height, image_width, max_captcha, char_set, model_save_dir)

Примечание, чтобы изменить эту строку:

value = Q.rec_image(img)

2.10 Стресс-тестирование и статистика

Предоставляется простой сценарий стресс-теста, который может подсчитывать данные, требующие затрат времени и запросов, во время работы API, но график должен быть вытянут с помощью Excel.
открыть файлrecognize_time_test.py,Исправлятьmainпод функциейtest_fileПуть здесь будет повторно использовать изображение для доступа к интерфейсу.
Окончательные данные будут храниться в файле test.csv.
Запустите с помощью следующей команды:

python3 recognize_time_test.py
----输出如下
2938,5150,13:30:25,总耗时:29ms,识别:15ms,请求:14ms
2939,5150,13:30:25,总耗时:41ms,识别:21ms,请求:20ms
2940,5150,13:30:25,总耗时:47ms,识别:16ms,请求:31ms

Вот набор данных test.csv после того, как модель была протестирована 20 000 раз. Проанализировав test.csv с помощью boxplot, вы увидите:

在这里插入图片描述

  • Общее время, затраченное на один запрос к API (в среднем): 27 мс
  • Однократное время распознавания (среднее): 12 мс
  • Время на запрос (среднее): 15 мс
    Среди них: общее время, затраченное на запрос API = время, затраченное на идентификацию + время, затраченное на запрос

3 Описание

  1. В настоящее время нет сохраненных файлов журнала для tensorboard.

4 известные ошибки

  1. Используйте pycharm, чтобы запустить файл распознать_api.py и сообщить об ошибке
2018-12-01 00:35:15.106333: W T:\src\github\tensorflow\tensorflow\core\framework\op_kernel.cc:1273] OP_REQUIRES failed at save_restore_tensor.cc:170 : Invalid argument: Unsuccessful TensorSliceReader constructor: Failed to get matching files on ./model/: Not found: FindFirstFile failed for: ./model : ϵͳ�Ҳ���ָ����·����
; No such process
......
tensorflow.python.framework.errors_impl.InvalidArgumentError: Unsuccessful TensorSliceReader constructor: Failed to get matching files on ./model/: Not found: FindFirstFile failed for: ./model : ϵͳ\udcd5Ҳ\udcbb\udcb5\udcbdָ\udcb6\udca8\udcb5\udcc4·\udcbe\udcb6\udca1\udca3
; No such process
	 [[Node: save/RestoreV2 = RestoreV2[dtypes=[DT_FLOAT, DT_FLOAT, DT_FLOAT, DT_FLOAT, DT_FLOAT, DT_FLOAT, DT_FLOAT, DT_FLOAT, DT_FLOAT, DT_FLOAT], _device="/job:localhost/replica:0/task:0/device:CPU:0"](_arg_save/Const_0_0, save/RestoreV2/tensor_names, save/RestoreV2/shape_and_slices)]]

Рабочая область устанавливается по умолчанию pycharm, что приводит к ошибке чтения папки модели относительного пути. Решение: отредактируйте конфигурацию запуска и задайте в качестве рабочей области каталог проекта.

在这里插入图片描述

  1. FileNotFoundError: [Errno 2] No such file or directory: 'xxxxxx'
    Если в каталоге есть несуществующая папка, вы можете создать папку в указанном каталоге.

  2. Программа API занимает все больше и больше памяти во время работы
    Информация о результатах проверки:Ссылка на сайт
    При переборе цикла больше нельзя включать какие-либо выражения для тензорных вычислений, иначе произойдет переполнение памяти. После того, как расчетное выражение тензора помещается в инициализацию и выполнение инициализации, скорость распознавания значительно повышается.

  3. Ошибка при загрузке нескольких моделей Причина в том, что оба объекта Recognizer используют Graph по умолчанию. Решение состоит в том, чтобы не использовать график по умолчанию при создании объекта, а создать новый график, чтобы каждый распознаватель использовал свой график, чтобы не было конфликта.

  4. Параллельный запуск программ Flask Временно отсутствует, вы можете использовать flask+uwsgi для достижения