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