顧名思義,以圖(tu)找圖(tu)就是你定一張圖(tu)片,搜索(suo)引擎幫你搜索(suo)相同或相似的(de)圖(tu)片。以下是在tineye上搜索(suo)美國派演員艾麗森(sen)·漢(han)尼根的(de)結果:
![](/res/201606/12/20160612_1615541_10-1_797398_140493_0.jpg)
類(lei)似的(de)(de)更(geng)神(shen)奇的(de)(de),甚至可以找(zhao)出照片的(de)(de)拍攝背景。
![](/res/201606/12/20160612_1615542_10-2_797398_140493_0.jpg)
這種技術的原(yuan)理是什么?計算機怎么知道兩張圖(tu)片相似呢?
其實(shi)方法(fa)有很(hen)多。我們先來了(le)解一個(ge)快速算法(fa),就(jiu)能達到基本的效果。這個(ge)關(guan)鍵技術叫做"感知哈希算法(fa)"(Perceptualhash algorithm),它的作用是(shi)對每張圖(tu)片生成一個(ge)"指紋(wen)"(fingerprint)字(zi)符串,然后比較不同圖(tu)片的指紋(wen)。結(jie)果越接(jie)近,就(jiu)說明圖(tu)片越相似。
![](/res/201606/12/20160612_1615543_10-3_797398_140493_0.jpg)
下面是一個(ge)最簡單的實(shi)現:
第一步,縮小尺寸。
將圖(tu)片縮(suo)小(xiao)到8x8的尺寸,總共64個(ge)像素(su)。這一(yi)步(bu)的作用是(shi)去除(chu)圖(tu)片的細節,只保留結構、明暗等基本(ben)信息(xi),摒(bing)棄不同尺寸、比例(li)帶來的圖(tu)片差異。
第二步,簡化色彩。
將縮(suo)小后的(de)圖片,轉為64級灰度(du)。也(ye)就是說,所(suo)有像素點總共只有64種顏色。
第三步,計算平均值。
計(ji)算(suan)所有64個像素的灰度平均(jun)值(zhi)。
第四步,比較像素的灰度。
將每個像素的灰度(du),與平均值(zhi)進行(xing)比較。大于(yu)(yu)或等于(yu)(yu)平均值(zhi),記(ji)為1;小于(yu)(yu)平均值(zhi),記(ji)為0。
第五步,計算哈希值。
將上(shang)一(yi)步的(de)比較結果,組合(he)在(zai)一(yi)起,就(jiu)構成了一(yi)個(ge)64位的(de)整數,這(zhe)就(jiu)是這(zhe)張圖片的(de)指紋。組合(he)的(de)次(ci)序(xu)并不(bu)重要(yao),只要(yao)保證所有圖片都采用同樣次(ci)序(xu)就(jiu)行了。
![](/res/201606/12/20160612_1615544_10-4_797398_140493_0.jpg)
得到(dao)指紋以(yi)后,就可(ke)以(yi)對(dui)比不(bu)同(tong)(tong)的(de)圖(tu)片(pian),看(kan)看(kan)64位中(zhong)有(you)多少位是(shi)不(bu)一(yi)樣的(de)。在理論上,這(zhe)等同(tong)(tong)于計算"漢明(ming)距離"(Hamming distance)。如果不(bu)相(xiang)(xiang)同(tong)(tong)的(de)數據位不(bu)超過5,就說明(ming)兩(liang)張圖(tu)片(pian)很相(xiang)(xiang)似;如果大于10,就說明(ming)這(zhe)是(shi)兩(liang)張不(bu)同(tong)(tong)的(de)圖(tu)片(pian)。
這種算法的(de)(de)優(you)點(dian)是簡單快速,不受圖(tu)(tu)(tu)片大小縮放的(de)(de)影(ying)響,缺點(dian)是圖(tu)(tu)(tu)片的(de)(de)內(nei)容不能變更。如(ru)果在(zai)圖(tu)(tu)(tu)片上(shang)加(jia)幾個文字,它就認不出來了。所以,它的(de)(de)最佳用途是根(gen)據縮略圖(tu)(tu)(tu),找出原圖(tu)(tu)(tu)。
實(shi)際應(ying)用(yong)(yong)中,往往采用(yong)(yong)更(geng)強(qiang)大的pHash算法(fa)(fa)(fa)和(he)SIFT算法(fa)(fa)(fa),它(ta)們(men)能(neng)夠識(shi)別圖(tu)(tu)片(pian)的變形(xing)。只要(yao)變形(xing)程度不超(chao)過(guo)25%,它(ta)們(men)就能(neng)匹配原圖(tu)(tu)。這些算法(fa)(fa)(fa)雖(sui)然更(geng)復雜,但是(shi)原理與上面的簡便算法(fa)(fa)(fa)是(shi)一樣的,就是(shi)先將圖(tu)(tu)片(pian)轉化成Hash字符(fu)串(chuan),然后再進行比較(jiao)。
![](/res/201606/12/20160612_1615545_10-5_797398_140493_0.jpg)
另(ling)外類似的軟件還有“百(bai)度魔圖(tu)”的明星臉PK,我用我自己女兒(er)的照片做了實驗(yan),結(jie)果顯示我女兒(er)與一位童星有80%的相(xiang)似度,雖(sui)然她們(men)年齡(ling)有差距,但至少她們(men)都(dou)是小女孩(hai),并且(qie)她們(men)有共(gong)同的特(te)征,小眼睛,小臉盤,尖下巴(ba),小酒(jiu)窩,并且(qie)她們(men)都(dou)正(zheng)在笑(xiao)。
那么百(bai)(bai)度魔圖是(shi)(shi)怎(zen)么做到的(de)(de)?憑我的(de)(de)猜測(ce),可能利用(yong)(yong)了(le)“大(da)數(shu)據(ju)”,大(da)數(shu)據(ju)不僅(jin)是(shi)(shi)軟件,它更(geng)是(shi)(shi)一個(ge)(ge)解決問題的(de)(de)思(si)路,一個(ge)(ge)“將一個(ge)(ge)復雜作業變(bian)成(cheng)(cheng)成(cheng)(cheng)千上(shang)萬(wan)個(ge)(ge)簡單動作,然后讓一群簡單的(de)(de)節點并行(xing)完成(cheng)(cheng)這(zhe)些(xie)動作”的(de)(de)思(si)路”。百(bai)(bai)度魔圖就是(shi)(shi)利用(yong)(yong)了(le)這(zhe)個(ge)(ge)思(si)路,它將一個(ge)(ge)智能比(bi)對的(de)(de)復雜算法分解成(cheng)(cheng)若干個(ge)(ge)簡單特(te)(te)(te)(te)征算法:長臉(lian)or圓臉(lian)、大(da)眼(yan)(yan)睛(jing)or小(xiao)眼(yan)(yan)睛(jing)、黑人or白人、帶(dai)不帶(dai)眼(yan)(yan)鏡、長不長胡(hu)子、是(shi)(shi)笑還是(shi)(shi)哭...等(deng)等(deng),可能有一百(bai)(bai)多(duo)種,它將這(zhe)些(xie)算法分別在你的(de)(de)臉(lian)上(shang)和明(ming)星的(de)(de)臉(lian)上(shang)進(jin)行(xing)計算(明(ming)星的(de)(de)臉(lian)事先已(yi)經計算好,將特(te)(te)(te)(te)征數(shu)據(ju)存在數(shu)據(ju)庫),然后將你的(de)(de)特(te)(te)(te)(te)征集合(he)和明(ming)星的(de)(de)特(te)(te)(te)(te)征集合(he)利用(yong)(yong)分布式計算進(jin)行(xing)逐個(ge)(ge)比(bi)對,算出和你匹配(pei)項(xiang)最多(duo)的(de)(de)那張明(ming)星臉(lian)(就是(shi)(shi)相(xiang)似(si)度,90%、80%、70%...)。
大數據(ju)的好處是,你可以利用(yong)(yong)海量的資(zi)源(yuan)完(wan)(wan)成這件事(shi)情(qing),我們(men)知道(dao)圖(tu)(tu)像(xiang)識(shi)別(bie)算法(fa)(fa)是非常消耗(hao)資(zi)源(yuan)的。上(shang)面的第一(yi)個算法(fa)(fa)例子(zi)還只(zhi)是單機(ji)的實現,那么下面的百度魔圖(tu)(tu)就可以利用(yong)(yong)分布(bu)式(shi)(shi)的計算提(ti)高準(zhun)群率,只(zhi)要不(bu)斷的增加特征識(shi)別(bie)的基(ji)本(ben)算法(fa)(fa),然后增加計算機(ji)源(yuan)完(wan)(wan)成它,理(li)論上(shang)就可以以一(yi)種無限接近方式(shi)(shi)去(qu)搜圖(tu)(tu)了。