这是爬虫专栏第「28」篇原创

上一节咱们运用 OpenCV 辨认了图形验证码躯壳欧。这时分就有朋友可能会说了,现在深度学习不是对图画辨认很准吗?那深度学习能够用在辨认滑动验证码缺口方位吗?

当然也是能够的,本节咱们就来了解下运用深度学习辨认滑动验证码的办法。

1.字符 预备工作

相同地,本节还是首要侧重于完结使用深度学习模型来辨认验证码缺口字符常量的进程,所以不会侧重于讲解深度学习模型的算法,别的由于整个模型完成较为复杂,本节也不会从零开始编写代码,而是倾向于把代码提早下载下来进行实操操练。

所以在终究,请提早代码下载下来,仓库地址为:git字符型变量hub.com/Python3WebS… Git 把它克隆下来:

git clone https://github.com/Python3WebSpider/DeepLearningSlideCaptcha2.git

运转结束之后,本地就会呈现一个字符型变量 DeepLearningImopencv目标检测ageCaptcha2 的文件夹,就证明克隆成功了。

克隆结束之后像素射击下载,请切换到 DeepLearningImageCaptcha2 文件夹,装置必要的依靠库:

pip3 install -r requirements.txt

运转结束之后,本项目运转字符间距怎么加宽所需求的依靠库就全部装置好了。

以上预备工作都完结之后字符型变量,那就让咱们就开始本节正式的学习吧。

2. 方针检测

辨认滑动验证码缺口的这个问题,其实能够归结为方针检测问题。那什么叫方针检测呢?架构在这里简略作下像素射击介绍。

opencv是软件还是库针检测,顾名思义,便是把咱们想找的东西找出来。比方给一张「狗」的图片,如图所示:

【2022 年】崔庆才 Python3 爬虫教程 - 深度学习辨认滑动验证码缺口

咱们想知道这只狗在像素勇士大创造攻略哪,它的舌头在哪opencv和yolo的区别,找到了就字符型变量把它们框选出来,这便是方针检测。

经过方针检数据处理活动不包括以下测算法处理之后,咱们希望得到的图片是这样的:

【2022 年】崔庆才 Python3 爬虫教程 - 深度学习辨认滑动验证码缺口

能够看到这只狗和它的舌头就被框选出来了,这就完结架构图怎么制作了一个不错的方针检测。

现在比较盛行的方针架构图怎么画检测算法有 R-CNN、Fast R-CNN、Faster R-CNN、SSD、YOLO 等,感兴趣能够了解一下,当然不太了解对本节要完结的方针也没有什么影响。

当时做方像素涂色针检测的算法首要有两种办法,有一阶段式字符间距怎么加宽和两阶段式,英文叫做 One stage 和 Two stage,简述如下:

  • Two Stage:算法首要生成一系列方针所在方位的候选框,然后再对这些框选出来的成果进行样本分类,即先找出来在哪像素勇士大创造攻略,然后再分出来是啥,俗话说叫「看两眼」,这种算法有 R-CNN、Fast R-C像素工厂NN、Faster R-CNN 等,这些算法架构相对复杂,但精确率上有优势。
  • One Stage:不需求发生候选框,直接将方针字符间距加宽2磅怎么设置定位和分类的问题转化为回归问题,俗话说叫「看一眼」,这种算法有 YOLO、S字符间距加宽2磅怎么设置SD,这些算法虽然精确率上不及 Two stage,但架像素生存者2构相对简略,检测速度更快。

所以这次咱们选用 One Stage 的有代表性的方针检测算法 YOLO 来完成滑动验证码缺口的辨认。

YOLO,英文全称叫做 You Only Look Once,取了它们的首字母就构成了算法名,

目前 YOLO 算法最新的版别是 V5 版别,应用比较广泛的是 V3 版别,这里算法数据处理能力的具体流程咱们就不过多介绍了,感兴趣的能够搜一下相关资料了解下,别的也能够了解下 YOLO V1-V3 版别的不同和改善之处,这里列几个参阅字符串是什么意思链接:

  • YOLO V3 论文:pjreddie.com/media/files…
  • YOLO V3 介绍:zhuanlan.zhihu.com/p/34997279
  • YOLO V1-V3 对比介绍:www.cnblogs.com/makefile/p/…

3. 数据预备

像上一节介绍的相同,要练习深度学习模型也需求预备练习数据,数据也是分为两部分,一部分是验证码图画,另一部分是数据处理的最小单位数据标示,即缺口的方位。但和上一节不相同的是,这次标示字符间距加宽2磅怎么设置不再是单纯的验证码文本了,由于这次咱们需求表明的是缺口的方位,缺口对应的是一个矩形框,要表明一个矩形框,至少需求四个数据,如左上角点的横纵坐标 x、y,矩形的宽高 w、h,所以标示数据就变成了四个数字。

所以,接下来咱们就需求预备一些验证码图片和对应的四位数字的标示了,比方下图的字符间距滑动验证码:

【2022 年】崔庆才 Python3 爬虫教程 - 深度学习辨认滑动验证码缺口

好,那opencv和yolo的区别接下来字符串逆序输出咱们就完结这两步吧,第一步便是收集验证码图片,第二步便是标示缺口的方位并转为咱们想要的四位数字。

在这里咱们的示例网站是 captcha1.scrape.center/,翻开之后点击登录按钮…

【2022 年】崔庆才 Python3 爬虫教程 - 深度学习辨认滑动验证码缺口

咱们需求做的便是单独将滑动验证码的图画保存下来,也便是这个区域:

【2022 年】崔庆才 Python3 爬虫教程 - 深度学习辨认滑动验证码缺口

opencv和yolo的区别么做字符间距呢?靠手工截图肯定不太可靠,费时吃力,并且不好精确定位边界,会导致存下来的图片有大有小。为了解决这个问题,咱数据处理英文们能够简略写一个脚本来完成下自动化裁切和保存,便是仓库中的 collect.py 文件,代码如下:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import WebDriverException
import time
from loguru import logger
COUNT = 1000
for i in range(1, COUNT + 1):
    try:
        browser = webdriver.Chrome()
        wait = WebDriverWait(browser, 10)
        browser.get('https://captcha1.scrape.center/')
        button = wait.until(EC.element_to_be_clickable(
            (By.CSS_SELECTOR, '.el-button')))
        button.click()
        captcha = wait.until(
            EC.presence_of_element_located((By.CSS_SELECTOR, '.geetest_slicebg.geetest_absolute')))
        time.sleep(5)
        captcha.screenshot(f'data/captcha/images/captcha_{i}.png')
    except WebDriverException as e:
        logger.error(f'webdriver error occurred {e.msg}')
    finally:
        browser.close()

在这里咱们先界说了一个循环,循环opencv轮廓提取次数为 COUNT 次数据处理的最小单位,每次循环都运用 Selenium 发动一个浏览器,然后翻开数据处理包括数据的收集存储使用方针网站,模拟点击登录按钮触发验证码弹出,然后截取验证码对应的节点,再用 screenshot 办法将其保存下来。

咱们将其运转:

python3 collect.py

运转完了之后咱们就能够在 data/captcha/ima数据处理活动不包括以下哪种情形ges/ 目录取得很多验证码图片了,样例如图数据处理活动不包括以下哪种情形所示:

【2022 年】崔庆才 Python3 爬虫教程 - 深度学习辨认滑动验证码缺口

取得验证码图片之后,咱们就需求进行数据标示了,这里引荐的东西是 labelImg,字符型变量GitHub 地址为 github.com/tzut架构工程师alin/la… pip3 装置即可:

pip3 install labelImg

装置完结之后能够直接指令行运数据处理转:

labelImg

这样就成功发动了 labelImg:

【2022 年】崔庆才 Python3 爬虫教程 - 深度学习辨认滑动验证码缺口

点击 Open D像素ir 翻开 data/字符间距在哪里设置captcha/im架构图怎么制作ages像素游戏/ 目录,然后点击左下角的 C像素射击下载reate RectBox 创立一个标示框,咱们能够将缺口所在的矩形框框选出来,框选结束之后 labelImg 就会提示保存一个名称,咱们将其命名为 target,然后点击 OK,如图所示:

【2022 年】崔庆才 Python3 爬虫教程 - 深度学习辨认滑动验证码缺口

这时分咱们能够发现其保存了一个 xmOpenCVl 文件,内容如下:

<annotation>
	<folder>images</folder>
	<filename>captcha_0.png</filename>
	<path>data/captcha/images/captcha_0.png</path>
	<source>
		<database>Unknown</database>
	</source>
	<size>
		<width>520</width>
		<height>320</height>
		<depth>3</depth>
	</size>
	<segmented>0</segmented>
	<object>
		<name>target</name>
		<pose>Unspecified</pose>
		<truncated>0</truncated>
		<difficult>0</difficult>
		<bndbox>
			<xmin>321</xmin>
			<ymin>87</ymin>
			<xmax>407</xmax>
			<ymax>167</ymax>
		</bndbox>
	</object>
</annotation>

其间能够看到 size 节点里有三个节点,别离是 width、height、depth,别离代表原验证码图片的宽度、字符串逆序输出高度、通道数。别的 object 节点下的 bn像素勇士大创造攻略dbox 节点就包含了标示缺口的方位,经过调查对比能够知道 xm数据处理包括数据的收集存储使用in、ymiopencv教程n 指的便是左上角的坐标,xmax、ymax 指的便是右下角的坐标。

咱们能够用下面的办法简略字符间距加宽2磅怎么设置进行下数据处理:

import xmltodict
import json
def parse_xml(file):
    xml_str = open(file, encoding='utf-8').read()
    data = xmltodict.parse(xml_str)
    data = json.loads(json.dumps(data))
    annoatation = data.get('annotation')
    width = int(annoatation.get('size').get('width'))
    height = int(annoatation.get('size').get('height'))
    bndbox = annoatation.get('object').get('bndbox')
    box_xmin = int(bndbox.get('xmin'))
    box_xmax = int(bndbox.get('xmax'))
    box_ymin = int(bndbox.get('ymin'))
    box_ymax = int(bndbox.get('ymax'))
    box_width = (box_xmax - box_xmin) / width
    box_height = (box_ymax - box_ymin) / height
    return box_xmin / width, box_ymin / height, box_width / width, box_height / height

这里咱们界说了一个 parse_xml 办法,这个办法首要读取了 xml 文件,然后运用 xmltodict 库就能够将 XML 字符串转为 JSON,然后顺次读取出验证码的宽高信息,字符间距加宽2磅怎么设置缺口的方位信数据处理活动不包括以下哪种情形息,终究回来了想要的数据格式—— 缺口左上角的坐数据处理软件有哪些标和宽高相对值,以元组的形式回来。

都标示完结之后,对每个 xml 文件调用此办法便能够生成想要的标示成果了。

在这里,我现已将对应的标示成果都处理好了,能够直接运用,路径为 data/captcha/labels,如图所示:

【2022 年】崔庆才 Python3 爬虫教程 - 深度学习辨认滑动验证码缺口

每个 txt 文件对应一张验证码图的标示成果,内容相似如下数据处理活动不包括以下哪种情形

0 0.6153846153846154 0.275 0.16596774 0.24170968

第一位 0 代表标示方针的索引,由于咱们只需求检测一个缺口,所以索引便是 0;第 2、3 位代表缺口的左上角的方位,比方 0.615 则代表缺口左上角的横坐标在相对验证码的 61.5% 处,乘以验证码的字符间距加宽2磅宽度 520,成果大约便是 320,即左上角偏移值是 320 像素;第 4、5 代表缺口的宽高相对验证码图片的占比,比方第 5 位 0.24 乘以验证码的高度 320,成果大约是 77,即缺口的高度大约为 77 像素。

好了,到此为止数据预备阶段就完结了。

4. 练习

为了更好的练习作用,咱们还需求下载一些预练习模型。预练习的意思便是现已有一数据处理个提早练习过的基础模型了架构图,咱们能够直接运用提早练习好的模型里面的权重文件,咱们就不必从零开始练习了,只需求根据之前的模型进行微调就好了,这样既能够节省练习时刻,又能够有比较好的作用。

YOLOV3 的练习要加载预练习模型才能有不错的练习作用,预练习模型下载指令如下:

bash prepare.sh

留意:在 Windows 下请运用 Bash 指令行东西如 Git Bash 来运转此指令。

履行这个脚本,就能下载 YOLO V3 模型的一些权重文件,包含 yolo字符是什么v3 和 weights 还数据处理活动不包括以下有 dar架构师和程序员的区别knet 的 weights,在练习之前咱们需求用像素生存者2这些权重文件初始化 YOLO V3 模型。

接下来就能够开始练习了,履行如下脚本:

bash train.sh

留意:在 Windows 下请像素涂色相同运用 Bash 指令行东西如 Git Bash 来运转此指令。

相同引荐运用 GPU 进行练习,练习进程中咱们能够运用 TensorBoard 来看看 loss 和 mA像素画生成器P 的改变,运转 TensorBoard:

tensorboard --logdir='logs' --port=6006 --host 0.0.0.0

留意:请确保现已正字符间距怎么加宽确装置了本项意图一切依靠库,数据处理工程师其间就包含 Tensor架构图Board,装置成功之后便能够运用 tensorboard 指令。

运转此指令后能够在 http://localhost:6006 调查到练习进程中的 loss 改变。

loss_1 改变相似如下:

【2022 年】崔庆才 Python3 爬虫教程 - 深度学习辨认滑动验证码缺口

val_mAP 改变相似如下:

【2022 年】崔庆才 Python3 爬虫教程 - 深度学习辨认滑动验证码缺口

能够看到 loss 从最初的十分高低降到了很低,精确率也逐步接近 100%。

这是练习进程中的指令行的一些输出成果:

---- [Epoch 99/100, Batch 27/29] ----
+------------+--------------+--------------+--------------+
| Metrics    | YOLO Layer 0 | YOLO Layer 1 | YOLO Layer 2 |
+------------+--------------+--------------+--------------+
| grid_size  | 14           | 28           | 56           |
| loss       | 0.028268     | 0.046053     | 0.043745     |
| x          | 0.002108     | 0.005267     | 0.008111     |
| y          | 0.004561     | 0.002016     | 0.009047     |
| w          | 0.001284     | 0.004618     | 0.000207     |
| h          | 0.000594     | 0.000528     | 0.000946     |
| conf       | 0.019700     | 0.033624     | 0.025432     |
| cls        | 0.000022     | 0.000001     | 0.000002     |
| cls_acc    | 100.00%      | 100.00%      | 100.00%      |
| recall50   | 1.000000     | 1.000000     | 1.000000     |
| recall75   | 1.000000     | 1.000000     | 1.000000     |
| precision  | 1.000000     | 0.800000     | 0.666667     |
| conf_obj   | 0.994271     | 0.999249     | 0.997762     |
| conf_noobj | 0.000126     | 0.000158     | 0.000140     |
+------------+--------------+--------------+--------------+
Total loss 0.11806630343198776

这里显现了练习进程中各个指标的改变情况,如 loopencv是软件还是库ss、recall、precision、con像素射击下载fidence 等,别离代表练习进程的损失(越小越好)、召回率(能辨认出的成果占应该辨认出成果的比例,越高越好)、精确率(辨认出的成果中正确的比率,越高越好)、置信度(模型有把握辨认对的概率,越高越opencv安装好),能够作为参阅。

5. 测验

字符型变量习结束之后会在 checkpoints 文件夹生成 pth 文件,这便是一些模型文件,和上一节的 best_model.pkl 是相同的原理,只字符型变量不过表明形式略有不同,咱们可直接运用这些模型来猜测生成标示成果。

要运转测验,咱们能够先在测验文件夹 data/cap数据处理活动不包括以下哪种情形tcha/test 放入一些验证码图片:

样例验证码如下:

【2022 年】崔庆才 Python3 爬虫教程 - 深度学习辨认滑动验证码缺口

要运转测验,履行如下脚本:

bash detect.sh

该脚本会读取测验文件夹一切图片,并将处理后的成果输出到 data/captcha/re数据处理活动不包括以下哪种情形sult 文件夹,控制台输出了一些验证码的辨认像素画成果。

架构师工资时在 data/captcha/resu数据处理的最小单位lt 生成了标示的成果,样例如下:

【2022 年】崔庆才 Python3 爬虫教程 - 深度学习辨认滑动验证码缺口

能够看到,缺口就opencv是软件还是库被精确辨认出来了。

实际上,detect.sh 是履行了 detect.py 文件,在代码中有一个要害的输出成果如下:

bbox = patches.Rectangle((x1 + box_w / 2, y1 + box_h / 2), box_w, box_h, linewidth=2, edgecolor=color, facecolor="none")
print('bbox', (x1, y1, box_w, box_h), 'offset', x1)

这里 bbox 指的便是终究缺口的轮廓方位,同时 x1 便是指的轮廓最左边间隔整个验证码最左边的横向偏字符间距怎么加宽移量,即 offset。经过这两个数据处理包括哪些内容信息,咱们就能得到缺opencv是什么口的要害方位了。

有了方针滑块方位之后,咱们便能够进行一些模拟滑动操作从而完成经过验证码的检测了。

6. 总结

本节首要介绍了练习深度学习模型来辨认滑动验证码缺口的全体流程,终究咱们成功完成了模型练习进程,并得到了一个深度学习模架构图型文件。

使用这个模型,咱们能够输入一张滑动验证码,模型便会猜测出其间的缺口的方位,包数据处理包括哪些内容含偏移量、宽度等数据处理活动不包括以下,终究能够经过缺口的信息制作出对应的方位。

当然本节介绍的内容也能够进一步优化:

  • 当时模型像素画生成器的猜测进程是经过指令行履行的,但在实际运用的时分可能并不太方便,能够考虑将猜测进程对接 API 服务器暴露出来,比方对接 F字符常量lask、Django、FastAPI 等把猜测进程完成为一个支撑 POST 恳求的接口,接口能够接收一张验证码图片,回来验证码的文本信息,这样会使得模型更加方便易用。

本节代码:githopencv人员技术ub.com/Python3WebS…

十分感谢你的阅读,更多精彩内容,请重视我的大众号「进击的 Coder」和「崔庆才丨静觅」。