首頁 > 軟體

詳解Python結合Genetic Algorithm演演算法破解網易易盾拼圖驗證

2022-02-17 16:01:11

首先看一下目標的驗證形態是什麼樣子的

是一種通過驗證推理的驗證方式,用來防人機破解的確是很有效果,但是,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內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com