詳解Python結(jié)合Genetic?Algorithm算法破解網(wǎng)易易盾拼圖驗證
首先看一下目標(biāo)的驗證形態(tài)是什么樣子的
是一種通過驗證推理的驗證方式,用來防人機(jī)破解的確是很有效果,但是,But,這里面已經(jīng)會有一些破綻,比如:
(以上是原圖和二值化之后的結(jié)果)
(這是正常圖片)
像劃紅線的這些地方,可以看到有明顯的突變,并且二值化之后邊緣趨于直線,但是正常圖像是不會有這種這么明顯的突變現(xiàn)象。
初識潘多拉
后來,我去翻閱了機(jī)器視覺的相關(guān)文章和論文,發(fā)現(xiàn)了一個牛逼的算法,這個算法就是——Genetic Algorithm遺傳算法,最貼心的的是,作者利用這個算法實現(xiàn)了一個功能,“拼圖自動還原”(不是像什么A*算法尋找最優(yōu)路線解那種哈,就是單純的拼圖)項目倉庫地址 首先來介紹下如何使用跑起來這個項目吧,坑是真的很多,接下來感受一下pyCham的一路報錯! 這里我用的是python3.10的版本,目前是最新的版本 文檔中這一步執(zhí)行是會報錯的
pip3 install -r requirements.txt
解決方案:單獨對requirements.txt文件下的每個包單獨下載,然后根據(jù)當(dāng)前下載的包的最新版本替換舊版本號。
我目前每個包最新使用的是這些版本號
全部替換完了之后,再執(zhí)行一次下面的代碼,他就不會報錯了
pip3 install -r requirements.txt
然后下一步,執(zhí)行下面代碼
pip3 install -e .
進(jìn)入潘多拉
然后我們按照官網(wǎng)的提示來執(zhí)行,先創(chuàng)建一個拼圖出來,命令是這樣的(這里的文件名我改了)
create_puzzle images/starry.jpg --size=60 --destination=puzzle.jpg
會發(fā)現(xiàn),好像不行,因為我們沒有在正確的位置上執(zhí)行,他的腳本位置是在bin文件夾下面,你可能會遇到如下問題
成功之后的話,會在bin目錄下生成一個拼圖圖片
以上是介紹如何生成圖片,接下來是重頭戲,如何還原圖片
gaps --image=puzzle.jpg --generations=20 --population=600
對于參數(shù)的解釋官網(wǎng)是這樣的:
Option :
--image Path to puzzle(需要被還原的圖片)
--size Puzzle piece size in pixels (拼圖的大?。?/p>
--generations Number of generations for genetic algorithm (遺傳算法的代數(shù))
--population Number of individuals in population
--verbose Show best solution after each generation (顯示每一代后的最佳解決方案)
--save Save puzzle solution as image (拼圖結(jié)果另存為圖像)
先按照官方的走一遍
很好,很舒服,繼續(xù)報錯,而且語法拼寫上我們也沒有拼寫錯,沒關(guān)系!我已經(jīng)幫你找到解決方案了。
python gaps --image=puzzle.jpg --generations=20 --population=600 --size=60 --save
或者你不指定遺傳代數(shù)和人口數(shù)
python gaps --image=puzzle.jpg --size=60 --save
這是完全還原的結(jié)果,至此,我們披荊斬棘從解決項目報錯,一路挖坑填坑到demo成功運行,到這里我們已經(jīng)成功了60%,接下來就是如何利用這個項目,去破解網(wǎng)易易盾的推理拼圖驗證。
探究潘多拉的秘密
首先看一下項目目錄:
gaps文件夾下面是所有模塊的源碼,作者對各個基礎(chǔ)功能做了封裝,但是我們想要的功能并不存在,就需要自行閱讀和理解源碼,然后二開實現(xiàn)自己想要的功能。
我們主要關(guān)注這個文件individual.py:
我來用大白話給你翻譯一下吧,“在所有排列中,幫你找出最優(yōu)解”
輸出這個映射,結(jié)果是這樣的,正好是我們想要的東西
下面會有一個創(chuàng)建圖像的方法,這是最后得到最優(yōu)解圖像拼接函數(shù)
那么,我們將最后的索引映射取到就OK了!
以下為最優(yōu)解的映射值輸出實例:
初始化的時候,新增一個變量用來存儲最后的結(jié)果
self.pieceMapping = None
自定義一個函數(shù)
# 返回映射值 def getPieceMapping(self): return self.pieceMapping
每次執(zhí)行的時候,將最優(yōu)解傳遞出去
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)
以上,就把我們想要的結(jié)果輸出了
調(diào)用:
key為最后的結(jié)果標(biāo)志,value為原始標(biāo)志。
PS:對于極度復(fù)雜的原始圖片創(chuàng)建的拼圖,在還原之后,誤差會挺大的。
到此這篇關(guān)于詳解Python結(jié)合Genetic Algorithm算法破解網(wǎng)易易盾拼圖驗證的文章就介紹到這了,更多相關(guān)Python Genetic Algorithm內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python web.py開發(fā)httpserver解決跨域問題實例解析
這篇文章主要介紹了python web.py開發(fā)httpserver解決跨域問題實例解析,分享了相關(guān)代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下2018-02-02python 制作自定義包并安裝到系統(tǒng)目錄的方法
今天小編就為大家分享一篇python 制作自定義包并安裝到系統(tǒng)目錄的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-10-10Python中json.load()和json.loads()有哪些區(qū)別
json.loads()用于解析一個有效的JSON字符串并將其轉(zhuǎn)換為Python字典,json.load——()用于從一個文件讀取JSON類型的數(shù)據(jù),然后轉(zhuǎn)轉(zhuǎn)換成Python字典,本文講解下python中兩者的使用2021-06-06Python3實現(xiàn)爬取指定百度貼吧頁面并保存頁面數(shù)據(jù)生成本地文檔的方法
這篇文章主要介紹了Python3實現(xiàn)爬取指定百度貼吧頁面并保存頁面數(shù)據(jù)生成本地文檔的方法,涉及Python基于urllib模塊的頁面爬取與文件讀寫相關(guān)操作技巧,需要的朋友可以參考下2018-04-04tensorflow實現(xiàn)測試時讀取任意指定的check point的網(wǎng)絡(luò)參數(shù)
今天小編就為大家分享一篇tensorflow實現(xiàn)測試時讀取任意指定的check point的網(wǎng)絡(luò)參數(shù),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-01-01pytorch實現(xiàn)用Resnet提取特征并保存為txt文件的方法
今天小編大家分享一篇pytorch實現(xiàn)用Resnet提取特征并保存為txt文件的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-08-08實例講解Python腳本成為Windows中運行的exe文件
在本篇文章里小編給大家分享了關(guān)于Python腳本成為Windows中運行的exe文件的相關(guān)知識點內(nèi)容,有興趣的朋友們學(xué)習(xí)下。2019-01-01Python中OpenCV?Tutorials?20??高動態(tài)范圍成像的實現(xiàn)步驟
這篇文章主要介紹了OpenCV?Tutorials?20?-?高動態(tài)范圍成像,本文還給大家展示了一種稱為曝光融合的替代方法,它可以產(chǎn)生低動態(tài)范圍的圖像,需要的朋友可以參考下2022-06-06