通过opencv与神经网络对滑动验证码的一次深入学习

news2024/11/16 7:47:51

好久没写博客了,人到中年,有点儿犯懒。

从信息安全行业,又去了IT合规领域,与信息安全结合还是两手抓,两手都不硬。

由于工作原因,需要获取一个token来请求接口,奈何没有现成的接口,需要在web端登录才可以获取。既然如此,想要实现这个功能肯定是selenium+识别,如下图

 

 通过对验证码的分析,得到滑块在距离背景图10px的地方开始滑动,也就是说滑动距离是缺口在图片的横坐标 X - 10。纵坐标无需考虑。

一、opencv

参考: python实现过顶象滑块_顶象滑块js_weixin_43419774的博客-CSDN博客

看完这篇文章之后,大量的下载,复原图片的前期工作都已经直接搞定,感谢作者。

按照这篇博客的识别算法

1. 先将背景图与滑块进行灰度处理

2. 将滑块进行reverse

3. 两张图进行高斯模糊,然后以标准相关系数匹配,找到坐标

对我的验证码中只有70%以上的准确率,因为顶象会有一些混淆图片例如

 我们可以看到正确的缺口里面是纯色,而滑块里面是有背景图片内容的,会造成不准确。

改进方法是进行边缘检测,然后进行标准相关系数匹配

方法1: 

def dXImgSlider2(origin, sliderImg, filename='labeled.webp'):
	slider = cv2.imread(sliderImg)
	originImg = cv2.imread(origin, cv2.IMREAD_GRAYSCALE)
	sliderImg = cv2.cvtColor(slider, cv2.COLOR_BGR2GRAY)
	# sliderImg 二值化
	_, th2 = cv2.threshold(sliderImg, 5, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)
	# 梯度处理
	sobelx = cv2.Sobel(th2, cv2.CV_16S, 1, 0, ksize=1)
	sobelx = cv2.convertScaleAbs(sobelx)
	sobely = cv2.Sobel(th2, cv2.CV_16S, 0, 1, ksize=1)
	sobely = cv2.convertScaleAbs(sobely)
	sobelxy = cv2.addWeighted(sobelx, 0.5, sobely, 0.5, 0)
	# 参数微调
	th2 = cv2.Canny(sobelxy, 700, 700)
	# cv2.imwrite('th2.png', th2)

	dstx = cv2.Sobel(originImg, cv2.CV_16S, 1, 0, ksize=1)
	dstxcmp = cv2.convertScaleAbs(dstx)
	dsty = cv2.Sobel(originImg, cv2.CV_16S, 0, 1, ksize=1)
	dstycmp = cv2.convertScaleAbs(dsty)
	dstxy = cv2.addWeighted(dstxcmp, 0.5, dstycmp, 0.5, 0)
	# 参数微调
	dstxy = cv2.Canny(dstxy , 600, 800)
	# cv2.imwrite('th1.png', dstxy)

	w, h = sliderImg.shape[:2]
	new_img = cv2.imread(origin)
	res = cv2.matchTemplate(dstxy, th2, cv2.TM_CCOEFF_NORMED)
	min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
	top_left = max_loc 
	bottom_right = (top_left[0] + w, top_left[1] + h)
	im = cv2.rectangle(new_img, top_left, bottom_right, (0, 0, 255), 2)
	cv2.imwrite(filename, im)
	resObj  = [int(x * 300/400) for x in [top_left[0], top_left[1], bottom_right[0], bottom_right[1]]]
	return resObj

方法2: 

# 滑块识别方法3
def dXImgSlider3(origin, sliderImg, filename='labeled.webp'):
	slider = cv2.imread(sliderImg)
	originImg = cv2.imread(origin)
	bgImg = cv2.cvtColor(originImg, cv2.COLOR_BGR2GRAY)
	sliderImg = cv2.cvtColor(slider, cv2.COLOR_BGR2GRAY)
	# add canny
	bg_edges = cv2.Canny(bgImg, 600, 800)
	slider_edges = cv2.Canny(sliderImg, 700, 700)
	# _, thresh = cv2.threshold(bgImg, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)
	contours, hierarchy = cv2.findContours(bg_edges, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
	res = cv2.matchTemplate(bg_edges, slider_edges, cv2.TM_CCOEFF_NORMED)
	# epsilon = 0.1 * cv2.arcLength(contours[0], True)
	min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
	tl = min_loc
	br = (tl[0] + slider_edges.shape[0], tl[1] + slider_edges.shape[1])
    return tl[0], tl[1], br[0], br[1]

 方法2比方法1代码少了梯度处理,梯度处理能够更好地可视化图像中的边缘信息。但以我自己的case中准确度相差不大。

二、目标检测

 完成这个事情首先观察验证码的背景图片特点,背景图存在2个缺口,一个是正确的,一个是混淆缺口,通过对大量背景图的下载,发现正确缺口比混淆的缺口更清晰。因此,可提前论证神经网络找到缺口位置无需滑块图片。

深度学习技术方案有三种:

1. 使用2个神经网络,第1个神经网络将滑块图片输入进行识别,然后输出形状权重,作为第2个神经网络的输入,然后输出缺口位置坐标。

2. 单分类目标检测,对背景图片进行标注,然后进行训练,并输出正确缺口坐标;

3. 多分类目标检测,对背景图片进行正确缺口的标注,作为correct类别,错误缺口进行标注,作为wrong类别,然后进行训练,并输出正确缺口坐标;

选择第2种方案更简单,也更有效。

训练使用:PyTorch-YOLOv3

权重文件: darknet53.conv.74

类别: 1

标注工具: labelImg

训练集: 160张

验证集: 40张

epoch: 23

Total loss: 1.88

由于训练在M1芯片的机器上,不知道为何出现一些crash的问题。不过还好第23次的结果测试效果已经非常好了,置信度99.9%

现在的训练已经非常无脑了,饭都喂到嘴边了,没有不吃的道理。去B站或者Youtube看一看视频就完全掌握了。接下来我的目标是对一些大佬开源的训练方法进行改进。

最后,测试2种方法返回的滑动距离,结合seleium进行实现,搞定。

最后部署的时候由于云主机安装不上opencv,一直报错,还好有模型backup。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/564125.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

记一次Android页面卡顿排查总结

背景:更新完gosdk(端上的主要逻辑在go层完成)后,冷启动时首页明显会卡一下 问题排查: 1、通过在application onCreate()中设置getMainLooper().setMessageLogging(new LxLogPainter());来查看耗时的日志,…

cfssl使用方法重新整理说明

下载安装: #下载cfssl、cfssl-json、cfssl-certinfo文件 wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 -O /usr/bin/cfssl wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 -O /usr/bin/cfssljson wget https://pkg.cfssl.org/R1.2/cfssl-certinfo…

低代码开发:构建企业数字化生态系统的秘密武器!

目前,我们正处于数字化时代,而企业数字化早已是大势所趋,也是因为企业数字化转型是提高企业效率与竞争力的必经之路。 发展背景 近年来,伴随着人工智能、大数据分析技术、云计算等领域的迅速发展,不少企业开始正视数字…

【How to Design Translation Prompts for ChatGPT: An Empirical Study 论文略读】

How to Design Translation Prompts for ChatGPT: An Empirical Study 论文略读 INFORMATIONAbstract1 Introduction2 Background3 Experiments3.1 Prompt Design3.2 Experimental Setup3.2.1 Datasets3.2.2 Baselines and Evaluation Metrics 3.3 Multilingual Translation3.4…

接入支付宝沙箱环境

1、这里有几个重要数据要拿到,一个是支付宝的公钥和私钥,一个是支付的网关,和支付的APPID。这几个数据是要写到代码中的 官方手册:文档地址 1.1 配置沙箱应用环境 https://openhome.alipay.com/develop/sandbox/app 1.2 配置接口…

Git忽略文件的几种方法,以及.gitignore文件的忽略规则

Git忽略文件的几种方法,以及.gitignore文件的忽略规则 .gitignore文件定义Git全局的.gitignore文件Git 忽略规则Git忽略规则的优先级.gitignore文件忽略规则常用匹配示例: 关于.gitignore规则不生效的问题 不忽略没有后缀名的文件搜索电脑里没有后缀的文…

请问你如何理解以下的歌词“unravel - TK from 凛冽时雨 (TK from 凛として時雨)为什么很多人说崖山海战以后无中国

目录 请问你如何理解以下的歌词“unravel - TK from 凛冽时雨 (TK from 凛として時雨) 为什么很多人说崖山海战以后无中国 请问你如何理解以下的歌词“unravel - TK from 凛冽时雨 (TK from 凛として時雨) 以下是我对《unravel - TK from 凛冽时雨》这首歌词的理解&#xff1…

Hadoop部署伪分布式

伪分布式模式也是只需要一台机器,但是与本地模式的不同,伪分布式使用的是分布式的思想,具有完整的分布式文件存储和分布式计算的思想。只不过在进行存储和计算的时候涉及到的相关的守护进程都运行在同一台机器上,都是独立的Java进…

《LKD3粗读笔记》(15)进程地址空间

进程地址空间:内核除了管理本身的内存外,还必须管理用户空间中进程的内存,这个内存就是进程地址空间,即系统中每个用户空间进程所看到的内存。Linux操作系统采用虚拟内存技术,系统中的所有进程之间以虚拟方式共享内存。…

面试都不会造火箭,还想拿20k,过于离谱

前段时间公司缺人,也面了许多测试,一开始瞄准的就是中级水准,当然也没指望能来大牛,提供的薪资在15-20k这个范围,来面试的人有很多,但是平均水平真的让人很失望。看了简历很多上面都是写有4年工作经验&…

iOS App外包开发的内存泄露解决

在iOS应用开发中,内存泄露是一个常见的问题。内存泄露会导致应用程序占用越来越多的内存,最终可能导致应用程序崩溃。为了解决这个问题,可以使用以下工具和方法来查找和修复内存泄露。今天和大家分享这方面的知识,希望对大家有所帮…

AttributeError: module ‘gym‘ has no attribute ‘benchmark_spec‘解决办法

报错如下: 我安装的gym版本是gym-0.26.2 报错原因:gym版本太高了,需要降低版本 pip install gym0.9.0 -i https://pypi.douban.com/simple

@Qualifier注解详解

本文来说下Qualifier注解使用 文章目录 Autowired注解Qualifier注解Primary注解 Resource注解 Autowired注解 spring Autowire 的注解默认是按类型注入bean 如果存在多个实现类,可以使用 Qualifier注解 Qualifier注解 Primary注解 存在多个实现类,也可以…

支持双向充放电的高效Buck-Boost控制器——TMI5810

传统方案下,MCU需要分别控制“充电电路”和“放电电路”的功能模块实现电池包充放电,整个过程相当复杂,电路设计也比较繁琐。 拓尔微TMI5810是一颗集双向充放电和高效率于一身的同步升降压电源管理芯片,能有效解决多节锂电池充放电…

RAM Sequential

前段时间,在微信公众号上偶然看到一篇很不错的技术分享文章:《南湖处理器DFT设计范例》。文中详细介绍了中科院计算所的RISC-V处理器实施的DFT设计。 去年,也基于一款处理器应用过Share Test Bus技术,但在memory界面fault测试的问…

基于 ESP32 创建 HTTP Server 服务器,支持载入文件到服务器,并对载入文件进行删除管理

软件编程指南参见:HTTP 服务器 测试准备 任意一款 ESP32 系列开发板2.4GHz 路由器热点准备各种格式的文件 测试软件 可基于 esp-idf/examples/protocols/http_server /file_serving 例程进行测试 测试步骤 1、软件配置 只需要设置 ESP32 连接的 2.4GHz 的 WiFi…

linux 部署Nginx

1,进入官网下载Nginx资源: 官网下载:http://nginx.org/en/download.html 2、下载 nginx-1.20.2 3、上传服务器 /opt目录 4、解压nginx-1.20.2.tar.gz 到当前目录 tar -zxvf nginx-1.20.2.tar.gz 5、配置基本信息,命令如下 #配置config…

香港服务器如何操作域名解析让网站上线?

​  网站上线是一个需要多个步骤的过程,其中之一就是解析IP。在这个过程中,您需要将您的网站域名解析到香港服务器IP地址,以便访问者可以通过域名来访问您的网站。 下面是解析IP的一般步骤: 1. 获取服务器IP地址:首先…

回收站文件恢复教程:如何找回误删除的重要文件

在使用电脑的过程中,误删除文件是一件很常见的事情,尤其是对于那些不太熟悉电脑操作的人来说,这种情况更为普遍。当重要文件误删除之后,人们最希望的就是能够快速地找回它。其实,在 Windows 操作系统中,回收…

View的工作原理

View的工作原理 当Activity对象被创建的时候,会将DecorView添加到Window中,同时创建ViewRootImpl对象并将它和DecorView关联起来 ViewRoot对应于ViewRootImpl类,它是连接WindowManager和DecorView的纽带,View的三大流程均是通过ViewRoot完成的 View的绘制是从ViewRoot的perf…