详解Python结合Genetic

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

详解Python结合Genetic Algorithm算法破解⽹易易盾拼图验证
⾸先看⼀下⽬标的验证形态是什么样⼦的
是⼀种通过验证推理的验证⽅式,⽤来防⼈机破解的确是很有效果,但是,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:对于极度复杂的原始图⽚创建的拼图,在还原之后,误差会挺⼤的。

到此这篇关于详解Python结合Genetic Algorithm算法破解⽹易易盾拼图验证的⽂章就介绍到这了,更多相关Python Genetic Algorithm内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!。

相关文档
最新文档