自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

僅需15分鐘,使用OpenCV+Keras輕松破解驗(yàn)證碼

安全 黑客攻防
人工智能研究者們尋求破解的方向,讓計(jì)算機(jī)學(xué)會(huì)破解驗(yàn)證碼,我們就距離通用智能更近了一步(前不久 Vicarious 發(fā)表在 Science 上的論文就介紹了一種用于破解圖片驗(yàn)證碼的機(jī)器學(xué)習(xí)新模型)。今天,破解全世界最為流行的圖片驗(yàn)證碼需要多久?本文作者 Adam Geitgey 告訴你:僅需 15 分鐘。

登錄網(wǎng)站時(shí)必須輸入的圖片驗(yàn)證碼可以用來(lái)識(shí)別訪問(wèn)者到底是人還是機(jī)器——這同時(shí)也是某種程度上的「圖靈測(cè)試」,人工智能研究者們尋求破解的方向,讓計(jì)算機(jī)學(xué)會(huì)破解驗(yàn)證碼,我們就距離通用智能更近了一步(前不久 Vicarious 發(fā)表在 Science 上的論文就介紹了一種用于破解圖片驗(yàn)證碼的機(jī)器學(xué)習(xí)新模型)。今天,破解全世界最為流行的圖片驗(yàn)證碼需要多久?本文作者 Adam Geitgey 告訴你:僅需 15 分鐘。

每個(gè)人都討厭 CAPTCHA——這些惱人的圖片中包含你必須輸入的文字,正確地填寫(xiě)它你才能訪問(wèn)網(wǎng)站。CAPTCHA 全稱「全自動(dòng)區(qū)分計(jì)算機(jī)和人類的公開(kāi)圖靈測(cè)試(Completely Automated Public Turing test to tell Computers and Humans Apart)」,旨在確認(rèn)訪問(wèn)者是真正的人類,防止惡意程序的入侵。然而,隨著深度學(xué)習(xí)和計(jì)算機(jī)視覺(jué)技術(shù)的發(fā)展,現(xiàn)在這些認(rèn)證方法可以被我們輕松破解了。

最近,我正在讀 Adrian RoseBrock 撰寫(xiě)的《Deep Learning for Computer Vision with Python》。在這本書(shū)中,Adrian 利用機(jī)器學(xué)習(xí)破解了 E-ZPass New York 網(wǎng)站上的 CAPTCHA 驗(yàn)證碼:

僅需15分鐘,使用OpenCV+Keras輕松破解驗(yàn)證碼

在這里,Adrian 沒(méi)有接入生成 CAPTCHA 圖片應(yīng)用源代碼的權(quán)限。為了破解這樣的系統(tǒng),我們必須找到數(shù)百?gòu)埵纠龍D片,然后訓(xùn)練機(jī)器學(xué)習(xí)模型來(lái)破解它。

但是如果我們想要破解開(kāi)源的 CAPTCHA 系統(tǒng)——在這里我們擁有所有源代碼的訪問(wèn)權(quán),事情又會(huì)如何呢?

我訪問(wèn)了 WordPress.org (http://wordpress.org/) 插件登記網(wǎng)站,在其中搜索「CAPTCHA」。結(jié)果中顯示的第一個(gè)內(nèi)容是「Really Simple CAPTCHA」,已經(jīng)擁有超過(guò) 100 萬(wàn)次活躍安裝了:https://wordpress.org/plugins/really-simple-captcha/。

僅需15分鐘,使用OpenCV+Keras輕松破解驗(yàn)證碼

重點(diǎn)在于,這里有它的源代碼!有了生成 CAPTCHA 圖片的源代碼,我們就可以輕松破解驗(yàn)證碼了。在這里,為了讓任務(wù)更具挑戰(zhàn)性,我們先給自己添加一點(diǎn)限制:我們能不能在 15 分鐘內(nèi)破解它?Let's try it!

Note:這并不意味著我們?cè)谂u(píng)「Really Simple CAPTCHA」插件及其作者。目前,插件的作者已表示該款驗(yàn)證碼已經(jīng)不再安全,并推薦用戶尋找其他更加具有安全性的認(rèn)證方式。但如果你真的是這 100 萬(wàn)用戶中的一員,或許你應(yīng)該有所防備了:)

挑戰(zhàn)

首先,我們需要做好計(jì)劃,讓我們看看 Really Simple CAPTCHA 生成的圖片是什么樣子。在 Demo 站中,我們看到了這樣的情景:

僅需15分鐘,使用OpenCV+Keras輕松破解驗(yàn)證碼

一個(gè) CAPTCHA 圖片范例

看起來(lái)它會(huì)生成由四個(gè)字符組成的圖片。讓我們?cè)谶@個(gè)插件的 PHP 源代碼里面確認(rèn)一下:

 

  1. public function __construct() { 
  2.      /* Characters available in images */ 
  3.      $this->chars = 'ABCDEFGHJKLMNPQRSTUVWXYZ23456789'
  4.      /* Length of a word in an image */ 
  5.      $this->char_length = 4; 
  6.      /* Array of fonts. Randomly picked up per character */ 
  7.      $this->fonts = array( 
  8.          dirname( __FILE__ ) . '/gentium/GenBkBasR.ttf'
  9.          dirname( __FILE__ ) . '/gentium/GenBkBasI.ttf'
  10.          dirname( __FILE__ ) . '/gentium/GenBkBasBI.ttf'
  11.          dirname( __FILE__ ) . '/gentium/GenBkBasB.ttf'
  12.      ); 

沒(méi)錯(cuò),它會(huì)生成四個(gè)字母/數(shù)字組成的 CAPTCHA 驗(yàn)證碼,每個(gè)字符的字體各不相同,在代碼中我們也可以看出驗(yàn)證碼中不會(huì)包含「O」或者「I」,因?yàn)檫@兩個(gè)字母很可能會(huì)讓人與數(shù)字產(chǎn)生混淆。所以,我們共有 32 個(gè)數(shù)字或字母需要識(shí)別。沒(méi)問(wèn)題!

至此用時(shí):2 分鐘

我們需要的工具

在開(kāi)始破解之前,我們先要介紹一下行動(dòng)所需的工具:

Python 3

Python 是目前人工智能領(lǐng)域中最為流行的編程語(yǔ)言,包含多種機(jī)器學(xué)習(xí)和計(jì)算機(jī)視覺(jué)庫(kù)。

OpenCV

OpenCV 是計(jì)算機(jī)視覺(jué)和圖像處理任務(wù)上的流行框架。在這里,我們需要使用 OpenCV 來(lái)處理 CAPTCHA 生成的圖像,OpenCV 擁有 Python API,所以我們可以直接使用 Python 調(diào)用它。

Keras

Keras 是一個(gè)使用 Python 編寫(xiě)的深度學(xué)習(xí)框架。他可以讓我們更加輕松地定義、訓(xùn)練和使用深度神經(jīng)網(wǎng)絡(luò)——僅需編寫(xiě)很少的代碼。

TensorFlow

TensorFlow 是谷歌推出與維護(hù)的機(jī)器學(xué)習(xí)庫(kù),也是目前人工智能領(lǐng)域里最為流行的框架。我們會(huì)在 Keras 之上寫(xiě)代碼,但 Keras 實(shí)際上并沒(méi)有實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)運(yùn)算的方法——它需要使用 TensorFlow 作為后端來(lái)完成具體的工作。

好了,讓我們回到挑戰(zhàn)之中。

創(chuàng)立數(shù)據(jù)集

想要訓(xùn)練任何機(jī)器學(xué)習(xí)系統(tǒng),我們都需要相應(yīng)的數(shù)據(jù)集。為了破解 CAPTCHA 驗(yàn)證碼系統(tǒng),我們需要這樣的訓(xùn)練數(shù)據(jù):

僅需15分鐘,使用OpenCV+Keras輕松破解驗(yàn)證碼

看起來(lái)少不了大量的標(biāo)注工作。不過(guò)在這里我們有了 WordPress 插件的源代碼,我們可以稍稍修改插件,讓它自動(dòng)輸出 10,000 個(gè) CAPTCHA 圖片,以及相應(yīng)的正確答案。

在對(duì)源代碼的幾分鐘破解之后(只要簡(jiǎn)單地加個(gè)『for』循環(huán)),我們就擁有了一個(gè)內(nèi)含 10,000 張 PNG 圖片的訓(xùn)練集,而圖片的正確答案就是每張圖片的文件名:

僅需15分鐘,使用OpenCV+Keras輕松破解驗(yàn)證碼

Note:在這部分我不會(huì)給你示例代碼。因?yàn)楸疚拿嫦蚪虒W(xué),希望各位不會(huì)真的去破解各家 WordPress 網(wǎng)站。不過(guò)這里我會(huì)給你 10,000 張生成的圖片讓大家用于復(fù)現(xiàn)。

至此用時(shí):5 分鐘

簡(jiǎn)化問(wèn)題

現(xiàn)在我們已經(jīng)有了訓(xùn)練數(shù)據(jù),我們可以直接用它來(lái)訓(xùn)練一個(gè)簡(jiǎn)單的神經(jīng)網(wǎng)絡(luò):

僅需15分鐘,使用OpenCV+Keras輕松破解驗(yàn)證碼

因?yàn)橛辛俗銐虻臄?shù)據(jù),這種方法將能很好地工作,但我們可以使問(wèn)題變得更簡(jiǎn)單。因?yàn)閱?wèn)題越簡(jiǎn)單、訓(xùn)練數(shù)據(jù)越少,我們解決問(wèn)題所需要的計(jì)算力就越少,畢竟我們總共只有 15 分鐘的時(shí)間。

幸運(yùn)的是,一個(gè) CAPTCHA 圖像由四個(gè)符合組成,因此我們可以以某種方式將圖像分割開(kāi)以令每張圖像只有一個(gè)符號(hào)。這樣的話我們只需訓(xùn)練神經(jīng)網(wǎng)絡(luò)識(shí)別單個(gè)字符就行了。

僅需15分鐘,使用OpenCV+Keras輕松破解驗(yàn)證碼

我們并不能手動(dòng)地用 Photoshop 等圖像軟件將它們分割開(kāi),因?yàn)橛?xùn)練圖像總共有 1 萬(wàn)張。此外,我們也不能將圖像切分為四個(gè)等大小的圖像塊,因?yàn)? CAPTCHA 會(huì)隨機(jī)地將這些不同的字符放置在不同的水平線上,如下所示:

僅需15分鐘,使用OpenCV+Keras輕松破解驗(yàn)證碼

幸運(yùn)的是,我們能使用已有的方法自動(dòng)完成這一部分。在圖像處理中,我們經(jīng)常需要檢測(cè)有相同色彩的像素塊,這些連續(xù)像素塊的邊界可以稱之為輪廓。而 OpenCV 有一個(gè)內(nèi)置的 findContours() 函數(shù)可以檢測(cè)這些輪廓的區(qū)域。

所以我們?cè)嫉?CAPTCHA 圖像為如下所示:

僅需15分鐘,使用OpenCV+Keras輕松破解驗(yàn)證碼

然后我們將該圖像轉(zhuǎn)換為純凈的黑白像素點(diǎn)(即采用色彩閾值的方法),因此我們將很容易尋找到連續(xù)的輪廓邊界:

僅需15分鐘,使用OpenCV+Keras輕松破解驗(yàn)證碼

下面我們使用 OpenCV 的 findContours() 函數(shù)以檢測(cè)包含連續(xù)相同像素塊的分離部分:

僅需15分鐘,使用OpenCV+Keras輕松破解驗(yàn)證碼

隨后將每個(gè)區(qū)域保存為一個(gè)單獨(dú)的圖像文件就非常簡(jiǎn)單了,而且我們也知道每張圖像從左到右有四個(gè)字符,因此我們可以在保存的時(shí)候使用這種知識(shí)標(biāo)注各個(gè)字符。我們只需要按順序保存它們,并將每一張圖像保存為對(duì)應(yīng)的字符名。

但是還有一個(gè)問(wèn)題,有些 CAPTCHA 圖像包含重疊的字符:

僅需15分鐘,使用OpenCV+Keras輕松破解驗(yàn)證碼

這就意味著我們很可能會(huì)將兩個(gè)字符抽取為一個(gè)分割區(qū)域:

僅需15分鐘,使用OpenCV+Keras輕松破解驗(yàn)證碼

如果我們不解決這個(gè)問(wèn)題,那么我們最后就會(huì)創(chuàng)建一個(gè)非常糟糕的訓(xùn)練集。我們需要解決這個(gè)問(wèn)題,以免模型會(huì)將兩個(gè)重疊的字符識(shí)別為一個(gè)。

這里有一個(gè)簡(jiǎn)單的解決方案,如果字符輪廓的寬要比高長(zhǎng)一些,那

僅需15分鐘,使用OpenCV+Keras輕松破解驗(yàn)證碼

么很有可能這一個(gè)切分內(nèi)就包含了兩個(gè)字符。因此我們可以將這種連體的字符拆分為兩半,并將它們視為單獨(dú)的字符。

 


我們將寬度大于高度一定數(shù)值的圖像拆分為兩個(gè)數(shù)值,雖然這種方法非常簡(jiǎn)單,但在 CAPTCHA 上卻十分有效。

現(xiàn)在我們有方法抽取獨(dú)立的字符,因此我們需要將所有的 CAPTCHA 圖像都執(zhí)行這種處理。我們的目標(biāo)是收集每個(gè)字符的不同變體,并將單個(gè)字符的所有變體保留在一個(gè)文件夾中。

僅需15分鐘,使用OpenCV+Keras輕松破解驗(yàn)證碼

上圖展示了字符「W」的抽取情況,我們最后從 1 萬(wàn)張 CAPTCHA 圖像中獲取了 1147 張不同的「W」。處理完這些圖像后,我們總共大約花了 10 分鐘。

構(gòu)建并訓(xùn)練神經(jīng)網(wǎng)絡(luò)

因?yàn)槲覀円淮沃恍枰R(shí)別單個(gè)字符,所以并不需要一個(gè)復(fù)雜的神經(jīng)網(wǎng)絡(luò)架構(gòu),且識(shí)別這種字母與數(shù)字的任務(wù)要比其它識(shí)別復(fù)雜圖像的任務(wù)簡(jiǎn)單地多。因此我們使用了一個(gè)簡(jiǎn)單的卷積神經(jīng)網(wǎng)絡(luò),它一共包含兩個(gè)卷積層與兩個(gè)全連接層。

僅需15分鐘,使用OpenCV+Keras輕松破解驗(yàn)證碼

如果我們使用的是 Keras,那么只需要幾行代碼就能構(gòu)建一個(gè)神經(jīng)網(wǎng)絡(luò)架構(gòu):

 

  1.  # Build the neural network! 
  2. model = Sequential() 
  3. First convolutional layer with max pooling 
  4. model.add(Conv2D(20, (5, 5), padding="same", input_shape=(20, 20, 1), activation="relu")) 
  5. model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2))) 
  6. Second convolutional layer with max pooling 
  7. model.add(Conv2D(50, (5, 5), padding="same", activation="relu")) 
  8. model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2))) 
  9. # Hidden layer with 500 nodes 
  10. model.add(Flatten()) 
  11. model.add(Dense(500, activation="relu")) 
  12. Output layer with 32 nodes (one for each possible letter/number we predict) 
  13. model.add(Dense(32, activation="softmax")) 
  14. # Ask Keras to build the TensorFlow model behind the scenes 
  15. model.compile(loss="categorical_crossentropy", optimizer="adam", metrics=["ac 

現(xiàn)在開(kāi)始訓(xùn)練

 

  1. # Train the neural network 
  2. model.fit(X_train, Y_train, validation_data=(X_test, Y_test), batch_size=32, 

在經(jīng)過(guò) 10 個(gè) Epoch 的訓(xùn)練后,我們的訓(xùn)練準(zhǔn)確度可以到達(dá) 100%,因此我們就能終止程序以完成整個(gè)模型的訓(xùn)練。所以最后我們一共花了 15 分鐘。

使用訓(xùn)練后的模型解決 CAPTCHA 識(shí)別問(wèn)題

現(xiàn)在我們利用已訓(xùn)練的神經(jīng)網(wǎng)絡(luò)可以輕松識(shí)別 CAPTCHA 驗(yàn)證碼:

  1. 在網(wǎng)站上使用 WordPress 插件獲取真正的 CAPTCHA 驗(yàn)證碼;
  2. 將 CAPTCHA 圖像分割為四個(gè)獨(dú)立的字符塊,這里使用的方法和創(chuàng)建訓(xùn)練集的方法一樣;
  3. 調(diào)用神經(jīng)網(wǎng)絡(luò)對(duì)這四個(gè)獨(dú)立的字符塊進(jìn)行預(yù)測(cè);
  4. 將四個(gè)預(yù)測(cè)結(jié)果排列以作為該 CAPTCHA 驗(yàn)證碼的返回結(jié)果。

僅需15分鐘,使用OpenCV+Keras輕松破解驗(yàn)證碼

或者我們可以直接使用命令行運(yùn)行:

僅需15分鐘,使用OpenCV+Keras輕松破解驗(yàn)證碼

試試看!

如果你想自己試驗(yàn)一下,這里有代碼:https://s3-us-west-2.amazonaws.com/mlif-example-code/solving_captchas_code_examples.zip

這個(gè)壓縮文件包中包含 10,000 張實(shí)例圖片以及本文中涉及的每一步的代碼。其中還有 README 文件告訴你如何運(yùn)行它。

如果你想要深入了解代碼背后的知識(shí),那么最好讀一讀那本《Deep Learning for Computer Vision with Python》。它涵蓋了很多細(xì)節(jié),并介紹了大量示例,如果你對(duì)解決現(xiàn)實(shí)生活中困難問(wèn)題的示例感興趣,那么它或許很適合你。

責(zé)任編輯:未麗燕 來(lái)源: 機(jī)器之心
相關(guān)推薦

2017-12-19 09:05:39

2023-04-04 09:13:15

2023-10-06 19:21:49

Initializr應(yīng)用Spring

2009-02-09 14:17:36

2023-09-11 13:08:26

2019-06-05 09:42:53

Kafka App 消息隊(duì)列

2017-07-24 09:02:27

2022-06-17 08:05:28

Grafana監(jiān)控儀表盤(pán)系統(tǒng)

2020-12-29 05:33:03

Serverless驗(yàn)證碼架構(gòu)

2009-03-23 09:07:04

2015-05-27 16:40:33

2015-03-17 09:28:04

2014-04-08 11:28:52

驗(yàn)證碼破解

2013-06-27 09:41:19

LuaLua語(yǔ)言Lua語(yǔ)言快速入門(mén)

2024-12-09 10:21:30

2014-04-22 09:42:12

Bash腳本教程

2020-05-15 07:30:08

黑客Thunderbolt漏洞

2023-10-27 08:53:13

Python驗(yàn)證碼圖片識(shí)別

2021-05-21 06:44:43

AI人工智能GPU

2020-10-19 18:07:00

云計(jì)算技術(shù)應(yīng)用
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)