使用darknet识别点选验证码详细过程(附带源码)

项目源码:github.com/nickliqian/…python

darknet_captcha

项目基于darknet开发了一系列的快速启动脚本,旨在让图像识别新手或者开发人员可以快速的启动一个目标检测(定位)的项目。 若是有没有讲清楚的地方,欢迎提issue和PR,但愿能和你们共同完善!git

本项目分为两个部分:github

  1. 提供两个目标检测(单分类和多分类点选验证码)的例子,你能够经过例子熟悉定位yolo3定位网络的使用方式
  2. 基于darknet提供一系列API,用于使用本身的数据进行目标检测模型的训练,并提供web server的代码
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

目录

项目结构

项目分为darknet、extent、app三部分web

  1. darknet: 这部分是darknet项目源码,没有做任何改动。
  2. extent: 扩展部分,包含生成配置生成样本训练识别demoapi程序
  3. app: 每个新的识别需求都以app区分,其中包含配置文件、样本和标签文件等。

开始一个例子:单类型目标检测

以点选验证码为例 darknet实际上给咱们提供了一系列的深度学习算法,咱们要作的就是使用比较简单的步骤来调用darknet训练咱们的识别模型。算法

  • 推荐使用的操做系统是ubuntu,遇到的坑会少不少。
  • 若是使用windowns系统,须要先安装cygwin,便于编译darknet。(参考个人博客:安装cygwin

下面的步骤都已经经过ubuntu16.04测试。ubuntu

1.下载项目

git clone https://github.com/nickliqian/darknet_captcha.git
复制代码

2.编译darknet

进入darknet_captcha目录,下载darknet项目,覆盖darknet目录:vim

cd darknet_captcha
git clone https://github.com/pjreddie/darknet.git
复制代码

进入darknet目录,修改darknet/Makefile配置文件api

cd darknet
vim Makefile
复制代码
  • 若是使用GPU训练则下面的GPU=1
  • 使用CPU训练则下面的GPU=0
GPU=1
CUDNN=0
OPENCV=0
OPENMP=0
DEBUG=0
复制代码

而后使用make编译darknetbash

make
复制代码

不建议使用CPU进行训练,由于使用CPU不论是训练仍是预测,耗时都很是久。
若是你须要租用临时且价格低的GPU主机进行测试,后面介绍了一些推荐的GPU云服务。
若是在编译过程当中会出错,能够在darknet的issue找一下解决办法,也能够发邮件找我要旧版本的darknet。网络

3.安装python3环境

使用pip执行下面的语句,并确保你的系统上已经安装了tk:

pip install -r requirement.txt
sudo apt-get install python3-tk
复制代码

4.建立一个应用

进入根目录,运行下面的程序生成一个应用的基本配置:

cd darknet_captcha
python3 extend/create_app_config.py my_captcha 1
复制代码

这里的类别默认生成classes_1,你能够修改类别名称;
打开app/my_captcha/my_captcha.names修改classes_1为主机想要的名称便可。

如何查看create_app_config.py的命令行参数解释?
直接运行python create_app_config.py即可以在控制台查看,下面的程序也是如此。

若是你对darknet相关配置有必定的了解,能够直接打开文件修改参数的值,这里咱们保持原样便可。

5.生成样本

生成样本使用另一个项目 nickliqian/generate_click_captcha
这里我已经集成进去了,执行下面的命令生成样本和对应标签到指定应用中yolo规定的目录:

python3 extend/generate_click_captcha.py my_captcha
复制代码

运行python generate_click_captcha.py查看参数解释。

6.划分训练集和验证集

运行下面的程序,划分训练集和验证集,同时将标签的值转换为yolo认识的格式:

python3 extend/output_label.py my_captcha 1
复制代码

这里填写的种类须要与上面一致。 运行python output_label.py查看参数解释。

7.开始训练

到这里,咱们要准备的东西还差同样,咱们须要下载darknet提供的预训练模型放在darknet_captcha目录下:

wget https://pjreddie.com/media/files/darknet53.conv.74
复制代码

darknet_captcha目录下,执行下面的命令开始训练:

./darknet/darknet detector train app/my_captcha/my_captcha.data app/my_captcha/my_captcha_train.yolov3.cfg darknet53.conv.74
复制代码

训练过程当中模型会每一百次迭代储存一次,储存在app/my_captcha/backup/下,能够进行查看。

8.识别效果

使用GTX 1060训练大概1.5小时,训练迭代到1000次,会有比较明显的效果。

在这里插入图片描述
咱们找一张验证集的图片使用不一样进度下的模型进行识别测试,执行下面的语句开始识别:

python3 extend/rec.py my_captcha 100
复制代码

这里的100是选择app/my_captcha/images_data/JPEGImages目录下的第一百张图片进行识别。
运行python rec.py查看参数解释。

迭代300次:

在这里插入图片描述
迭代800次:
在这里插入图片描述
迭代1000次:
在这里插入图片描述
迭代1200次:
在这里插入图片描述

9.图片切割

这部分比较简单,网上有不少示例代码,能够调用darknet_interface.cut_and_save方法把定位到的字符切割下来。

在这里插入图片描述

10.分类器

到分类这一步就比较容易了,可使用darknet自带的分类器,也可使用cnn_captcha一个使用卷积神经网络识别验证码的项目。

11.总结

咱们识别点选验证码的大体流程以下:

  1. 搜集样本
  2. 打标签(标注坐标和字符)
  3. 训练定位器
  4. 检测位置,切割图片
  5. 训练分类器
  6. 使用定位器+分类器识别点选验证码上字符的位置和字符类别

第二个例子:多类型目标检测

步骤和上面基本上一致,直接把命令列出来:

# 生成配置文件
python3 extend/create_app_config.py dummy_captcha 2
# 生成图片
python3 extend/generate_click_captcha.py dummy_captcha 500 True
# 输出标签到txt
python3 extend/output_label.py dummy_captcha 2
# 开始训练w
./darknet/darknet detector train app/dummy_captcha/dummy_captcha.data app/dummy_captcha/dummy_captcha_train.yolov3.cfg darknet53.conv.74
# 识别测试
python3 extend/rec.py dummy_captcha 100
复制代码

训练本身的数据

下面的过程教你如何训练本身数据。
假定咱们要建立一个识别路上的车和人的应用,所以类别数量为2。
假定你如今有一些原始图片,首先你须要给这些图片打上标签,推荐使用labelImg进行打标工做。
使用教程能够自行谷歌,软件界面大体以下:

在这里插入图片描述

给图片中的人和车分别打上person和car的标签,会生成xml标签文件。
接下来,咱们建立一个应用,应用名称是car,类别为2类,同时生成一些配置文件:

python3 extend/create_app_config.py car 2
复制代码

而后把你的原始图片放到指定的路径app/car/JPEGImages,把xml标签文件放在app/car/Annotations
yolo训练的时候须要图片中目标的相对坐标,因此这里须要把xml的坐标计算为相对坐标的形式。
同时car.data中须要分别定义训练集和验证集的样本路径,这里会划分出训练集和验证集,同时生成两个txt文件记录其路径。

python3 extend/output_label.py car 2
复制代码

要提到的是,这里能够打开car.names,把里面的class_1和class_2分别修改成car和person,这里识别结果就会输出car和person。 而后就能够开始训练了:

./darknet/darknet detector train app/car/car.data app/car/car_train.yolov3.cfg darknet53.conv.74
复制代码

识别测试和上面也没有上面区别:

# 识别测试
python3 extend/rec.py car 100
复制代码

web服务

启动web服务:

python3 extend/web_server.py
复制代码

启动前须要按需修改配置参数:

# 生成识别对象,须要配置参数
app_name = "car"  # 应用名称
config_file = "app/{}/{}_train.yolov3.cfg".format(app_name, app_name)  # 配置文件路径
model_file = "app/{}/backup/{}_train.backup".format(app_name, app_name)  # 模型路径
data_config_file = "app/{}/{}.data".format(app_name, app_name)  # 数据配置文件路径
dr = DarknetRecognize(
    config_file=config_file,
    model_file=model_file,
    data_config_file=data_config_file
)
save_path = "api_images"  # 保存图片的路径
复制代码

使用下面的脚本request_api.py进行web服务的识别测试(注意修改图片路径):

python3 extend/request_api.py
复制代码

返回响应,响应包含目标类别和中心点位置:

接口响应: {
  "speed_time(ms)": 16469, 
  "time": "15472704635706885", 
  "value": [
    [
      "word", 
      0.9995613694190979, 
      [
        214.47508239746094, 
        105.97418212890625, 
        24.86412811279297, 
        33.40662384033203
      ]
    ],
    ...
}
复制代码

API文档

暂无

其余问题

使用阿里云OSS加速下载

若是你使用国外云主机进行训练,训练好的模型的下载速度确实是一个问题。
这里推荐使用阿里云oss,在云主机上把文件上传上去,而后使用oss下载下来。
配置秘钥:

# 从环境变量获取密钥
AccessKeyId = os.getenv("AccessKeyId")
AccessKeySecret = os.getenv("AccessKeySecret")
BucketName = os.getenv("BucketName")
复制代码

上传图片:

python3 extend/upload2oss.py app/my_captcha/images_data/JPEGImages/1_15463317590530567.jpg
python3 extend/upload2oss.py text.jpg
复制代码

GPU云推荐

使用租用 vectordash GPU云主机,ssh链接集成了Nvidia深度学习环境的ubuntu16.04系统
包含如下工具或框架:

CUDA 9.0, cuDNN, Tensorflow, PyTorch, Caffe, Keras
复制代码

vectordash提供了一个客户端,具有远程链接、上传和下载文件、管理多个云主机等。
下面是几种显卡的租用价格:

在这里插入图片描述
建立实例后,面板会提供一个秘钥,输入秘钥后,就可使用客户端操做了:

# 安装客户端
pip install vectordash --upgrade
# 登陆
vectordash login
# 列出主机
vectordash list
# ssh登陆
vectordash ssh <instance_id>
# 打开jupyter
vectordash jupyter <instance_id>
# 上传文件
vectordash push <instance_id> <from_path> <to_path>
# 下载文件
vectordash pull <instance_id> <from_path> <to_path>
复制代码

因为vectordash主机在国外,因此上传和下载都很慢,建议临时租用一台阿里云竞价突发型实例(约7分钱一小时)做为中转使用。

CPU和GPU识别速度对比

GTX 1060, 识别耗时1s

[load model] speed time: 4.691879987716675s
[detect image - i] speed time: 1.002530813217163s
复制代码

CPU, 识别耗时13s

[load model] speed time: 3.313053846359253s
[detect image - i] speed time: 13.256595849990845s
复制代码

报错解决办法

  1. UnicodeEncodeError: 'ascii' codec can't encode character '\U0001f621' in posit
    参考连接
  2. pip install, locale.Error: unsupported locale setting
    参考连接

TODO

  1. 支持多类别检测的识别和训练 Done
  2. WebServer API调用 Done
  3. 分类器
相关文章
相关标签/搜索