详解Python结合Genetic Algorithm算法破解网易易盾拼图验证
作者:落伍的码农 发布时间:2023-05-22 01:34:36
首先看一下目标的验证形态是什么样子的
是一种通过验证推理的验证方式,用来防人机破解的确是很有效果,但是,But,这里面已经会有一些破绽,比如:
(以上是原图和二值化之后的结果)
(这是正常图片)
像划红线的这些地方,可以看到有明显的突变,并且二值化之后边缘趋于直线,但是正常图像是不会有这种这么明显的突变现象。
初识潘多拉
后来,我去翻阅了机器视觉的相关文章和论文,发现了一个牛逼的算法,这个算法就是——Genetic Algorithm遗传算法,最贴心的的是,作者利用这个算法实现了一个功能,“拼图自动还原”(不是像什么A*算法寻找最优路线解那种哈,就是单纯的拼图)项目仓库地址 首先来介绍下如何使用跑起来这个项目吧,坑是真的很多,接下来感受一下pyCham的一路报错! 这里我用的是python3.10的版本,目前是最新的版本 文档中这一步执行是会报错的
pip3 install -r requirements.txt
解决方案:单独对requirements.txt文件下的每个包单独下载,然后根据当前下载的包的最新版本替换旧版本号。
我目前每个包最新使用的是这些版本号
全部替换完了之后,再执行一次下面的代码,他就不会报错了
pip3 install -r requirements.txt
然后下一步,执行下面代码
pip3 install -e .
进入潘多拉
然后我们按照官网的提示来执行,先创建一个拼图出来,命令是这样的(这里的文件名我改了)
create_puzzle images/starry.jpg --size=60 --destination=puzzle.jpg
会发现,好像不行,因为我们没有在正确的位置上执行,他的脚本位置是在bin文件夹下面,你可能会遇到如下问题
成功之后的话,会在bin目录下生成一个拼图图片
以上是介绍如何生成图片,接下来是重头戏,如何还原图片
gaps --image=puzzle.jpg --generations=20 --population=600
对于参数的解释官网是这样的:
Option :
--image Path to puzzle(需要被还原的图片)
--size Puzzle piece size in pixels (拼图的大小)
--generations Number of generations for genetic algorithm (遗传算法的代数)
--population Number of individuals in population
--verbose Show best solution after each generation (显示每一代后的最佳解决方案)
--save Save puzzle solution as image (拼图结果另存为图像)
先按照官方的走一遍
很好,很舒服,继续报错,而且语法拼写上我们也没有拼写错,没关系!我已经帮你找到解决方案了。
python gaps --image=puzzle.jpg --generations=20 --population=600 --size=60 --save
或者你不指定遗传代数和人口数
python gaps --image=puzzle.jpg --size=60 --save
这是完全还原的结果,至此,我们披荆斩棘从解决项目报错,一路挖坑填坑到demo成功运行,到这里我们已经成功了60%,接下来就是如何利用这个项目,去破解网易易盾的推理拼图验证。
探究潘多拉的秘密
首先看一下项目目录:
gaps文件夹下面是所有模块的源码,作者对各个基础功能做了封装,但是我们想要的功能并不存在,就需要自行阅读和理解源码,然后二开实现自己想要的功能。
我们主要关注这个文件individual.py:
我来用大白话给你翻译一下吧,“在所有排列中,帮你找出最优解”
输出这个映射,结果是这样的,正好是我们想要的东西
下面会有一个创建图像的方法,这是最后得到最优解图像拼接函数
那么,我们将最后的索引映射取到就OK了!
以下为最优解的映射值输出实例:
初始化的时候,新增一个变量用来存储最后的结果
self.pieceMapping = None
自定义一个函数
# 返回映射值
def getPieceMapping(self):
return self.pieceMapping
每次执行的时候,将最优解传递出去
def to_image(self):
"""Converts individual to showable image"""
pieces = [piece.image for piece in self.pieces]
self.pieceMapping = self._piece_mapping
return image_helpers.assemble_image(pieces, self.rows, self.columns)
以上,就把我们想要的结果输出了
调用:
key为最后的结果标志,value为原始标志。
PS:对于极度复杂的原始图片创建的拼图,在还原之后,误差会挺大的。
来源:https://blog.csdn.net/Python_shannian/article/details/122944778


猜你喜欢
- 实验环境:windows 7,anaconda 3(Python 3.5),tensorflow(gpu/cpu)函数介绍:标准化处理可以使
- 本文实例讲述了Golang算法之田忌赛马问题实现方法。分享给大家供大家参考,具体如下:【田忌赛马问题】输入:输入有多组测试数据。 每组测试数
- Selenium 封装了现成的文件上传操作。但是随着现代前端框架的发展,文件上传的方式越来越多样。而有一些文件上传的控件,要做自动化控制会更
- 初始化并封装在main.js中对bus进行初始化, Bus是一个不具备 DOM 的组件,它具有的仅仅只是它实例方法Vue.prototype
- 远程(如通过互联网)连接access数据库的示例:首先,需要使用TCP/IP,ADO及XML(需要安装Microsoft XML 4.0。)
- callable函数可用于判断一个对象是否可以被调用,若对象可以被调用则返回True,反之则返回False。所谓可调用,是指代码里可以在对象
- 本文实例讲述了python使用 cx_Oracle 模块进行查询操作。分享给大家供大家参考,具体如下:# !/usr/bin/env pyt
- 前言:之前,我写笔记的工具一直都是 notion,而且没有写博客的习惯。但是一是由于 notion 的服务器在
- 在我们平时使用PyCharm的过程中,一般都是连接本地的Python环境进行开发,但是如果是离线的环境呢?这样就不好搭建Python开发环境
- 作用装饰器可以用于用于装饰一个函数或方法,使得在不修改原函数、方法代码的前提下,为方法添加前置或后置操作;例如突然想要计算一下各个函数的执行
- 导读:由于banner一般用于专题类网站,在门户网站的二级页面,用户进来之前,在首页已经对主题有一定的了解和认识,所以banner的作用是在
- 本文实例为大家分享了python tkinter实现简单计算器的具体代码,供大家参考,具体内容如下效果图直接上代码import tkinte
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&
- 以去掉去掉<!--和-->为例进行说明:def clearContentWithSpecialCharacter(content
- 这一部分我们将探索 PyQt5 的事件和信号是如何在应用程序中实现的。Events事件所有的GUI应用程序都是事件驱动的。应用程序事件主要产
- 简介XSStrike 是一款用于探测并利用XSS漏洞的脚本XSStrike目前所提供的产品特性:对参数进行模糊测试之后构建合适的payloa
- 本文介绍了redis之django-redis的简单缓存使用,分享给大家,具体如下:自定义连接池这种方式跟普通py文件操作redis一样,代
- 1.最大值max(3,4) ##运行结果为42.最小值min(3,4) ##运行结果为33.求和sum(range
- 解决vscode终端输出中文乱码问题,强推方法二,少走几年弯路解决网上终端chcp65001仍然无效,或者vscode由utf-8改为GBK
- 通过AngularJS实现图片上传及缩略图展示示例,废话不多说了,具体如下:从项目中截出的代码HTML部分:<section>