圖像驗證碼的前世今生

jopen 8年前發布 | 27K 次閱讀 驗證碼
 

12306 購票系統的圖片識別驗證碼最近引起了很多的熱議,一方面是對其中的一些難題的吐槽,一方面又有人號稱能夠破解,甚至有人透露有一些高科技搶票軟件能夠自動 識別這些圖像。目前圖片的自動識別技術到底有沒有可能破解這個驗證碼?有沒有更好的方法防止搶票軟件,而不影響真人的購票體驗?今天我們一起來探討一下這 個問題。

驗證碼的由來

驗證碼的學名叫做 CAPTCHA ,是 Completely Automated Public Turing test to tell Computers and Humans Apart 縮寫,意為“全自動區分計算機和人類的公開圖靈測試”,也就是一種用來區分人類和計算機的方法(在12306,就是用來區分搶票軟件和真實購票人,從而防 治黃牛黨)。通常是由計算機生成一個對人類而言很容易而對電腦而言非常困難的問題,能回答者被判定為人。

驗證碼測試其實不是標準的圖靈測試,因為標準圖靈測試是人類來考計算機的。通常的人工智能研究者的目標是讓他們設計的系統通過圖靈測試,讓人類無 法區分對方是人還是機器,從而說明人工智能能夠接近人類的智慧。常用的圖靈測試是對話,當然不是面對面對話,而是“鍵盤對話”,不然當然知道對方是人是機 器了。通過這個測試當然并非易事。直到 2014 年 6 月份,英國雷丁大學宣布來自俄國的 Eugene Goostman 聊天機器人在倫敦皇家學會舉辦的 2014 年圖靈測試大賽中,首次通過圖靈測試,騙過人類,讓人類認為“他”是一個 13 歲的男孩。其判斷標準是:5 分鐘內的一連串鍵盤對話,讓 30%的人認為它是真人。

與之相對,驗證碼是計算機出題來考人類(當然,這個題目怎么出,也是由人來設計,然后計算機自動產生的)。驗證碼的目的是不讓計算機通過驗證,從 而阻止人們用計算機做其不應該做的事情。通常這些事情如果用計算機程序來做,可以做到數量很大,或者速度很快,或者兼而有之,從而破壞正常用戶的使用秩 序。例如注冊大量免費電子郵箱來發廣告郵件,在微博等社會化媒體中注冊大量虛假用戶作為某人的 “僵尸粉”,以及火車票自動搶票軟件,等等。

早期的驗證碼大多用扭曲的文字來實現,用以避開 OCR(自動光學字符識別技術)的自動識別,例如 Yahoo 早期的驗證碼版本 EZ-Gimpy。后來,又有在扭曲字符上加曲線,以及將字符擁擠在一起,有時讓真人也難以識別。

圖像驗證碼的前世今生

圖 1:不同的字符驗碼(Credit: Wikipedia)

驗證碼的基本要求

一個好的驗證碼方案的特點很簡單:人容易識別,而機器無法識別。嚴格來說,驗證碼產生的算法應該公開,但實際使用中一般鮮有這樣做的。在電子郵箱 申請等這種典型的需要驗證碼的場景,還要求驗證碼的答案可能性(解空間)足夠大,從而讓猜測的成功率也極低。例如,如果有哪怕 1%甚至更小的幾率能猜對,也不能有效防止機器自動注冊大量郵箱來發送垃圾廣告郵件。例如,一個四個數字的驗證碼,10000 種可能的結果,在沒有任何智能的情況下,計算機能猜中的概率是 0.01%,如果再加上一些智能,把猜中 的幾率提升到 1%,則不能有效防止機器自動注冊電子郵箱。如果是 16 個英文字母,則解空間的大小是 52 的 16 次方,這時能猜中的概率就極低極低了。

當然,象 12306 購火車票這樣的場景,驗證碼并不需要太大的解空間,因為破解程序比較難以在短時間內 產生高 QPS 的攻擊。不過,解空間太小,可能會被事先離線窮舉,而在線則通過匹配就可以找到答案。對 此,我們后續再進一步討論如何設計更好的驗證碼,我們先看看為何用圖像識別做驗證碼。

關于圖像識別驗證碼

圖像識別驗證碼不是 12306 首創,應該在十幾年前就有人嘗試了。其關鍵就是要解空間足夠大,并且機器 算法基本無法完成。例如,在 2003 年, 微軟研究院提出一種利用人類對人臉區域的敏感性,將人臉進行 變化,包括頭部的旋轉、變化的光線、復雜的背景等等,使得計算機人臉檢測算法會失敗,而人類可以輕松的框出人臉的位置[1]。這個技術似乎沒有被產品化, 至于其有沒有被破解,筆者不得而知。

圖像驗證碼的前世今生

圖 2:人臉驗證碼(Credit: Yong Rui, etc.)

2009 年,有一個叫做 VidoopCAPTCHA 的圖片驗證碼,很接近 12306 的驗證碼,其區別是每個圖片中有個 字母,要求用戶按提示輸入與提示詞對應的圖片的字母。不過,當年就被哥倫比亞大學的一個學生破解 了,現在已經沒有人使用了,這個叫做 Vidoop 的公司也不存在了。2010 年前后一個叫 Confident Technologies 的公司研發出了和 12306 驗證碼更為相似的圖片識別驗證碼。不同的是,它要求用戶進行三次識別,每次只有一個答案是對的。目前互聯網上有 139 家網站使用的是這個技術。

圖像驗證碼的前世今生

圖 3:Confident Technologies 的圖片識別驗證碼

那么計算機自動圖像識別技術到底能否破解這種驗證碼呢?如果可以,是如何實現的呢?在討論這個問題之前,我們看一下圖像識別技術到底發展到了什么境地。

什么是自動圖像識別技術

圖像識別在學術界已經被研究了幾十年,從大約 50 年前就有人提出讓計算機外接相機來識別相機看到的東西(圖靈獎得主 Marvin Minsky)。這個見地在今天似乎沒有什么,但是在 50 年前提出則相當不易 - 試想,如果讓我們預測 50 年后的技術,甚至 5 年后的技術都不太容易的。

圖像識別方法可以分為兩大類,模型的方法和搜索的方法。模型的方法是在業界研究和使用最多的方法。 模型的方法是試圖通過一些已知“標簽”(也就是這個圖像是什么,例如圖 3 中的第一幅圖的標簽是“小汽車”)的圖像,通過機器學習的各種方法來學習一個描述這些標簽的“模型”,從而,對于一個新的未知圖像,經過這個模型判斷出其 應該具有的標簽。

圖像驗證碼的前世今生

圖 4:基于模型的圖像識別示意圖

基于搜索的方法是在大數據時代才出現的方法,其基礎是將已知標簽的圖像數據建成一個可以進行高效率 檢索的數據庫,稱為圖像索引。通常需要大量的圖像來建索引,但圖像的標簽可以有少量的噪聲。那么, 對一副待測圖像,我們到這個數據庫中去找與其相同或者相似的若干圖像,然后綜合這些圖像的標簽來預 測待測圖像的標簽。

當然,這兩類方法究其本質并無差別,只是搜索的方法利用了大規模圖像索引的技術,不去建立模型,而 是直接用這些數據來進行匹配,所以我們可以認為這個大的索引就是一個特殊的模型。在大數據的時代, 識別和搜索已經密不可分,精準的搜索離不開識別,廣泛的識別也離不開搜索。筆者在很多報告中也經常 把識別和搜索放在一起來講。

自動圖像識別有多牛

比較靠譜的圖像識別方法是從上個世紀末 SIFT 圖像特征的提出開始。在之后的十幾年里,研究者們大多是 從特征和模型來進攻這個難題。例如,特征上,SIFT 和 HOG 等,模型上 SVM,Boosting, DPM 等。2012 年 前后,深度卷積神經網絡在圖像識別領域開始應用,則是同時去解決模型和特征的問題。也就是,既可以 通過深度學習直接從圖像像素開始訓練圖像識別模型,也可以通過同樣的訓練得到圖像的更有效的特征描 述,然后采用傳統的機器學習模型來訓練識別模型。基本上,深度學習的方法擊敗了所有傳統的方法,使 得圖像識別的準確率向前邁了一大步。

ImageNet 圖像識別(分類)是最有影響力的一個公開 PK 圖像識別算法的比賽,其最基本的任務是訓練一個1000 類的圖像識別器。在深度學習方式使用之前,最好的識別“前 5 準確率”(也就是給待測圖像預 測出的前 5 個標簽中有一個是對的)只有 74%左右,而深度學習第一次就將這個結果提升了將近 10 個百 分點,到達 83.6%。而最新的 2015 年的最好結果達到了 96.3%。

但是對于一個希望能實際應用中使用的圖像識別系統,還有三個方面:數據、系統和用戶反饋。真實世界 不只是 1000 類圖像,如果每一類都需要大量的標注圖像,這個工作量還是相當大的。例如,世界上大概 有 900 多種不算很難見的花卉,有 500 種左右純種的狗,大約 50000 個城市,淘寶上有超過 10000 種實物 商品。因此,也有研究者開始著手如何高效甚至自動或半自動創建數據集。而系統方面的要求,是保證模 型的訓練在可控的時間內完成,并且圖像識別則可以在非常快的時間(例如數十毫秒)內完成。用戶反饋 的使用,則是一個識別系統在使用的過程中,不斷吸收用戶的使用行為數據來逐步改進識別系統的準確率和覆蓋率。

總結起來,衡量一個圖像識別系統的性能可以從如下四個方面來看:

(1)準確率:衡量是否能正確識別圖像中的內容,這也是多數人關注的目標,包括 ImageNet 比賽;

(2)覆蓋率:衡量能識別多少種語義,這個在學術界比較少有人關注,卻對一個識別系統能否在真實場 景中應用起著很關鍵的作用。工業界,例如各大搜索引擎公司(微軟、谷歌和百度)提供的識別 API 則能 識別更多的內容(大概在萬這個量級上);

(3)效率:主要是衡量多快能夠識別出結果,也包括多快能夠訓練或更新一個識別器;

(4)用戶體驗:在產品和用戶界面上的考慮,如何彌補識別的準確率、覆蓋率或效率的不足。

舉個例子:筆者一年前曾經研發了一個稱為 Prajna 的系統[2],用自動訓練數據獲取和清洗的方法,自動 快速訓練過很多的圖像識別器,包括狗的品種,花卉,植物,地標,食物等等。其自動數據獲取的方法比 較有利于解決覆蓋率的問題,而不需人來標注數據,使得產生一個新的識別器的周期變得很短,只要數小 時到兩三天的時間。有一次,筆者去參加朋友家里的一個聚會,主人家里有一株很漂亮的花,參與聚會的朋友們這都想知道花的名字,可惜主人也忘了。于是,我啟 動我研發的花卉識別器,成功地識別出了這株花(見下圖)。迄今谷歌和百度引擎均不能識別 :) 這個也說明了實際應用系統中,覆蓋率是相當重要的。

圖像驗證碼的前世今生

圖 5:筆者的圖像識別系統 Prajna 識別出這是“Amaryllis(孤挺花)”

那么,有了這些圖像識別領域的最新進展,是不是就能破解 12306 網站的驗證碼呢?在討論這個問題之前,我們看看圖像識別除了可能可以破解驗證碼,以及在某些場合能夠識別人不能識別的物種,還能干什么更有意義的事情呢?

圖像識別還能做什么

筆者在圖像識別和搜索領域摸爬滾打近二十年,以此經驗,筆者認為目前最有實際用戶需求的圖像識別應 用之一應該是商品的識別和搜索(如前所述,如今識別和搜索常常是密不可分)。其中典型的應用場景就 是通過拍照的方式尋找需要的商品,例如亞馬遜的 FireFly 和阿里巴巴的拍立淘。筆者是拍立淘算法的研發 主管,在此簡要介紹一下圖像識別在拍照商品搜索中的應用。限于篇幅,只能非常簡略地介紹一下,希望有機會另文介紹圖像搜索技術的前世今生,以及拍立淘中的 前沿技術和有趣應用。

在拍立淘中,對于用戶拍的商品照片,我們首先要識別其大概的類別,例如,是上裝,還是褲子,還是箱 包,還是零食,等等。然后我們需要知道用戶關注的商品在圖像中的位置,通常稱為“主體檢測”。再然 后,就是產生一個該主體的描述,也就是特征,通常是一個高位向量。這個向量的產生方法則是通過訓練 一個多類商品的識別器來實現的。最后,我們用這個特征到一個建好索引的大商品庫中去找與此相同或相 似的產品,返回給用戶。這些關鍵步驟,包括商品識別,主題檢測,和特征提取,都是基于深度學習的方法來完成的。

為什么說這個應用場景是個“剛需”場景呢?一方面,確實有很多情況下,用戶用文字無法描述心中所需,只能通過樣例的方式來查找;另一方面,這個仍在不斷改進中的產品每天已經有數百萬的活躍用戶, 每天在之上產生的交易量近千萬。

圖像驗證碼的前世今生

圖 6:拍立淘商品搜索一例。左:用戶拍的商品和自動框出的商品區域;右:識別結果(箱包)和搜索結果。

圖像驗證碼真能被破解嗎?

什么叫破解呢?是不是完全能識別所有的圖片才能叫破解呢?其實不需要,如果能使識別準確率達到一定 的數值就可以了,例如對于郵箱注冊,一個很低的準確率就足以構成威脅,例如 10%,甚至更低。對于火車票來說,大概 10%左右也能構成很大威脅了(有網站統計表明,目前真人的一次識別成功率只有 8%)。

目前的 12306 驗證碼的解空間有多大呢?現在是 8 個圖片,通常是 1 個到 3 個答案是對的(不知道有沒有 4 個的),那么可能的答案組合一共只有 圖像驗證碼的前世今生 種可能,如果任意回答,由 1/92(1.1%)的 概率能答對(如果增加到 1 到 4 個答案可能對,則此概率降為 0.06%)。也就是說,搶票軟件如果沒有任 何智能,92 次中才能有一次機會通過認證。當然這種概率如果用來防止郵箱注冊大概不太有效,但對于火車票購買這種秒殺場景,還是有效的。

如果有自動識別程序幫助呢?如果類目數不是太多(有資料顯示在某個時間段,12306 驗證碼有 500 多種物體),我們找到這些可能的物體類別后,訓練一個對于圖像的自動識別器并不是太難(在此就不詳述方法了)。當然,前提是 能自動識別提示文字,不過這個問題比圖像更為容易,雖然提示文字也有些變形。假定我們的“前 1 識別率”(就是第一個識別出來的物體名稱就是對的)是 30%,那么 3 到 4 次就有 一次能識別對,這個成功率足以對驗證碼系統造成威脅。用谷歌、百度或微軟的識別 API,也是一種方法,但這些 API 并沒有優化到這些類別上,應該不會有專門為這些類別訓練的識別器準確率高。

有人提到過用圖像比較的方法破解,也就是通過多次試用,將驗證碼后臺的所有或大多數物體圖像爬下來,人工標注,然后在線驗證時直接比對即可。這種 方法也是不錯的思路,但也是需要由圖像檢索的專業 人士才能真正實現,因為這里涉及到兩件事情,一是合適圖像的特征描述(如果直接用圖像像素,圖像加 噪聲后,比對方法就失效了),二是索引技術,以保證快速的查找(如果后臺圖像不太多,則此步可 免)。

那么,圖像驗證碼就沒有出路了嗎?當然,上面提到的方法只是對理想情況下的破解思路,一個驗證碼系統可以增加很多變數和限制,使得破解更為困難。不過,增加題目難度的方法是違背驗證碼初衷的,試想 如果普通人也難以識別的東西如何用來區分計算機和人呢?

筆者憑經驗給 12306 驗證碼支些招,基本的思路仍然是:(1)題目對人容易,對機器難;(2)解空間足夠大;(3)當前的圖像識別方法不能很好解決。方法是:

(1)將待識別小圖加復雜背景,并融合成一張無縫的圖;

(2)多用識別算法容易混淆的相似物品;

(3)不斷改變背景的模式和拼圖的方法;

(4)物品前景加一些干擾;

(5)增加一些細分物體類別。

(6)除物品識別外,引入屬性識別要素。

相信如果驗證碼采用上述幾個大招,破解的難度會增加很多倍,即使是圖像自動識別專家也要脫一層皮才能解決,或者幾年內根本無法解決,也就沒有去攻 關解決的價值。等技術進步了,就再更新換代,讓破解 者跟不上出題人的步伐。舉個例子,只使用其中部分方法,大家可以看看,如果驗證碼長成下圖這樣,人 應該還能識別(我找我 8 歲的兒子測試,大概 2 秒鐘都能正確識別),反正機器大概是不容易搞定了(當然不是只是這一個情形,而是類似的大量情形) :)

圖像驗證碼的前世今生

圖 7:驗證碼問題:點擊坐著的人的紅色上衣。什么,不夠難?那就點擊圖中看起來最小的那個水杯。

圖像識別的未來

我們再回到圖像識別的正向使用上來。雖然圖像識別有了很大的進展,但是真實世界的圖像識別仍然有很 多困難。如前所述,在相對不大的集合上(例如 ImageNet 一千類識別),經過幾年的努力,其識別準確 率提升很快。但是,真實世界是很復雜的,在更多的場合下需要識別的覆蓋率、準確率都要高,而且速度要快。那么,只靠模型和特征的方法是不能完全解決的,未 來的解決方法應該是模型、特征、數據、系統 以及用戶反饋這五個要素的綜合作用,才能逐步達到理想的識別效果。

引用文獻:

[1]Yong Rui, Zicheng Liu. Excuse me, but are you human? ACM Mulitmedia 2003

[2]Xian-Sheng Hua, Jin Li. Prajna: Towards Recognizing Whatever You Want from Images without Image Labeling. AAAI 2015.

作者簡介:

華先勝,IEEE Fellow,ACM 杰出科學家,TR35 獲得者,阿里巴巴研究員/資深總監。2015 年加入阿里巴巴搜索事業部,負責大數據多媒體內容分析及圖像搜索算法團隊。在此之前先后在微軟中國研究院、微軟總部 Bing 搜索引擎以及微軟美國研究院任主管研究員、首席研發主管以及資深研究員。

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!