Адрес источника проекта: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 - Добавлен метод расчета точности
содержание
- 2.1 Набор данных
- 2.2 Файл конфигурации
- 2.3 Проверка и разделение набора данных
- 2.4 Обучение модели
- 2.5 Проверка партии
- 2.6 Запустите веб-сервер
- 2.7 Вызов интерфейса
- 2.8 Развертывание
- 2.9 Развертывание нескольких моделей
- 2.10 Стресс-тест
1 Введение в проект
1.1 О распознавании кода подтверждения
Распознавание капчи — это в основном проблема, с которой сталкиваются сканеры, и ее также можно использовать в качестве вводного примера для распознавания изображений. В настоящее время широко используются следующие методы:
имя метода | Связанные моменты |
---|---|
tesseract | Подходит только для распознавания картинок без помех и искажений, что хлопотно тренировать |
Другие библиотеки распознавания с открытым исходным кодом | Недостаточно общий, скорость распознавания неизвестна |
Платный API распознавания текста | Высокие затраты в условиях повышенного спроса |
Обработка изображений + алгоритмы классификации машинного обучения | Включает в себя множество технологий, стоимость обучения высока и не универсальна. |
Сверточная нейронная сеть | Определенная стоимость обучения, алгоритм подходит для нескольких типов проверочных кодов. |
Поговорим об использовании традиционныхАлгоритмы обработки изображений и машинного обученияс применением различных техник:
- Обработка изображения
- Предварительная обработка (оттенки серого, бинаризация)
- Сегментация изображения
- обрезать (удалить границу)
- Фильтрация изображения, шумоподавление
- идти фон
- цветоделение
- вращать
- машинное обучение
- 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 Описание
- В настоящее время нет сохраненных файлов журнала для tensorboard.
4 известные ошибки
- Используйте 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, что приводит к ошибке чтения папки модели относительного пути. Решение: отредактируйте конфигурацию запуска и задайте в качестве рабочей области каталог проекта.
-
FileNotFoundError: [Errno 2] No such file or directory: 'xxxxxx'
Если в каталоге есть несуществующая папка, вы можете создать папку в указанном каталоге. -
Программа API занимает все больше и больше памяти во время работы
Информация о результатах проверки:Ссылка на сайт
При переборе цикла больше нельзя включать какие-либо выражения для тензорных вычислений, иначе произойдет переполнение памяти. После того, как расчетное выражение тензора помещается в инициализацию и выполнение инициализации, скорость распознавания значительно повышается. -
Ошибка при загрузке нескольких моделей Причина в том, что оба объекта Recognizer используют Graph по умолчанию. Решение состоит в том, чтобы не использовать график по умолчанию при создании объекта, а создать новый график, чтобы каждый распознаватель использовал свой график, чтобы не было конфликта.
-
Параллельный запуск программ Flask Временно отсутствует, вы можете использовать flask+uwsgi для достижения