用Python構(gòu)建圖片處理搜索引擎
***公司和反向圖片搜索
有很多***的科技公司把RIQ用得很好。例如,Pinterest 2014年***次實(shí)現(xiàn)視覺(jué)搜索。隨后2015年它發(fā)布了一個(gè)白皮書(shū),揭示了視覺(jué)搜索的結(jié)構(gòu)。反向圖片搜索使得Pinterest能夠從時(shí)尚的東西中提取視覺(jué)元素,然后給消費(fèi)者推薦類(lèi)似的產(chǎn)品。
眾所周知,Google圖片使用反向圖片搜索技術(shù),它允許用戶上傳一張圖片然后搜索相關(guān)的圖片。上傳的圖片通過(guò)算法分析,制作出一個(gè)數(shù)學(xué)模型,然后跟Google數(shù)據(jù)庫(kù)中成千上萬(wàn)的圖片進(jìn)行比較,直到找到匹配的或者相似的圖片。
這是OpenCV2.4.9特性體驗(yàn)報(bào)告的一張圖

算法和Python庫(kù)
在我們動(dòng)手之前,讓我們大致看一下構(gòu)建一個(gè)圖片搜索需要哪些Python元素。
專(zhuān)利算法
SIFT(尺度不變特征變換)
使用圖像標(biāo)識(shí)符來(lái)識(shí)別相似圖像的沒(méi)有費(fèi)用的專(zhuān)利技術(shù)。即使圖片的尺寸、角度、深度不同,這項(xiàng)技術(shù)還是能將內(nèi)容相似的圖片匹配成功。
SIFT以大量的從圖片中提取的特性作為搜索的標(biāo)準(zhǔn)。
能匹配相同物體從不同視角拍攝的圖片,能夠通過(guò)不變的特性進(jìn)行搜索匹配。
SURF(加速魯棒特征)算法
SURF和SIFT一樣也是不收費(fèi)的專(zhuān)利算法,可以說(shuō)是加速版的SIFT。與SIFT不同的是,SURF使用盒過(guò)濾器近似高斯拉普拉斯算子。
SURF使用Hessian矩陣來(lái)判斷圖像的位置和大小。
在許多應(yīng)用中,旋轉(zhuǎn)不變性都不是一個(gè)必要條件,所以不用尋找方向的話算法速度會(huì)快很多。
SURF包含了幾個(gè)特性使得計(jì)算的每一個(gè)步驟都得到了速度上的提升。圖片經(jīng)過(guò)旋轉(zhuǎn)和模糊之后,SURF依舊工作的很好,而且比SIFT快3倍。不過(guò)在光源和視角變換方面SURF不太行。
OpenCV提供了SURF功能,SURF.compute和SURF.detect可以用來(lái)找到描述符和關(guān)鍵點(diǎn)。
開(kāi)源算法
KAZE算法
KAZE是一個(gè)開(kāi)源2D多尺度和新特性探測(cè)和描述算法,它運(yùn)作于非線性尺度空間。添加劑算子分裂(AOS)的有效技術(shù)和可變熱導(dǎo)擴(kuò)散被用來(lái)構(gòu)建非線性尺度空間。
多尺度圖像處理的基礎(chǔ)很簡(jiǎn)單–構(gòu)建一個(gè)圖像的尺度空間,然后用一個(gè)函數(shù)處理圖像,增強(qiáng)圖像的尺度或者時(shí)間。
AKAZE(加速KAZE)算法
從名字可以猜到,這個(gè)算法更快,它能快速找到兩個(gè)圖片之間匹配的關(guān)鍵。AKAZE使用一個(gè)二進(jìn)制描述符和非線性尺度空間來(lái)平衡準(zhǔn)確度和速度。
BRISK(二進(jìn)制魯棒尺度不變關(guān)鍵點(diǎn))算法
BRISK在探測(cè)和匹配描述符和關(guān)鍵點(diǎn)方面很棒。
這個(gè)算法適應(yīng)性很強(qiáng)的、尺度空間基于FAST的、使用bit-string描述符的探測(cè)器,它能夠顯著地加快搜索的速度。
尺度空間關(guān)鍵點(diǎn)探測(cè)和關(guān)鍵點(diǎn)描述有助于性能的優(yōu)化
FREAK(快速視網(wǎng)膜關(guān)鍵點(diǎn))算法
這是一個(gè)由人眼啟發(fā)的新的關(guān)鍵點(diǎn)描述符。根據(jù)圖像強(qiáng)度的比較有效地計(jì)算出一個(gè)二進(jìn)制級(jí)聯(lián)字符串。相比于BRISK, SURF 和 SIFT,F(xiàn)REAK計(jì)算更快,更省內(nèi)存。
ORB(原生的FAST和旋轉(zhuǎn)的BRIEF)
ORB是一個(gè)二進(jìn)制描述符,它能夠抗噪聲并具有旋轉(zhuǎn)不變性。ORB基于FAST關(guān)鍵點(diǎn)探測(cè)和BRIEF描述符,這兩者共同造就了它的低消耗和高性能。
除了快速和準(zhǔn)確的方向組件,計(jì)算原生BRIEF,分析變化以及與原生BRIEF的關(guān)系,是ORB的另一大特色。
Python庫(kù)
OpenCV
OpenCF分學(xué)術(shù)使用版本和商用版本。作為一個(gè)開(kāi)源機(jī)器學(xué)習(xí)和機(jī)器視覺(jué)庫(kù),OpenCV使得各類(lèi)機(jī)構(gòu)能夠很容易地基于OpenCV構(gòu)建自己的版本。
超過(guò)2500個(gè)優(yōu)化的算法,包含目前***進(jìn)的機(jī)器學(xué)習(xí)和機(jī)器視覺(jué)算法,能夠處理各類(lèi)需求:人臉檢測(cè)、物體鑒定、相機(jī)移動(dòng)跟蹤、尋找相似圖片,眼球跟蹤,場(chǎng)景識(shí)別等。
***公司像Google, Yahoo, IBM, Sony, Honda, Microsoft 和 Intel 都大量使用OpenCV庫(kù)。
OpenCV使用Python, Java, C, C++ 和 MATLAB做編程接口,同時(shí)支持Windows, Linux, Mac OS 和 Android平臺(tái)。
Python Imaging Library(PIL)
PIL在做圖像及圖形處理的時(shí)候支持若干種語(yǔ)言格式,它使得你的Python能夠處理圖像。
圖像處理的標(biāo)準(zhǔn)流程包括圖像增強(qiáng),透明度和屏蔽處理,圖像濾波,每像素的操作等。
構(gòu)建圖片搜索引擎
一個(gè)圖片搜索引擎能夠從已有的圖片中挑出相似的圖片,***的就是Google的圖片搜索引擎。對(duì)于新的圖片搜索引擎項(xiàng)目,有很多構(gòu)建的方法,這里列舉一些:
使用圖像提取,圖像描述提取,元數(shù)據(jù)提取和搜索結(jié)果提取,建立一個(gè)圖像搜索引擎。
定義你的圖像描述符,對(duì)數(shù)據(jù)集進(jìn)行索引,定義你的相似讀矩陣,然后搜索并排名。
選擇要搜索的圖片,選擇已有圖片的文件夾,在文件夾中遍歷圖片,創(chuàng)建圖片特征索引,用相同的特征和要搜索的圖片進(jìn)行匹配,獲取能夠匹配的圖片。
我們的做法是一開(kāi)始匹配圖片的灰度版本,逐漸開(kāi)始使用像SIFT 和 SURF這樣復(fù)雜的特征匹配算法,最終使用了開(kāi)源的算法BRISK。這些算法都只需要很小的修改,就能給出有效的結(jié)果。基于這些算法構(gòu)建一個(gè)圖像搜索引擎可以有很多應(yīng)用,例如分析圖像受歡迎程度,圖片內(nèi)物體的鑒定等等。
例子
一個(gè)IT公司需要為客戶構(gòu)建一個(gè)圖像搜索引擎,功能是一個(gè)品牌的Logo提交進(jìn)去,與這個(gè)品牌相關(guān)的圖片都會(huì)顯示出來(lái)。客戶可以根據(jù)搜索的結(jié)果,分析一個(gè)品牌在一個(gè)地區(qū)的受歡迎程度。這項(xiàng)技術(shù)還處于應(yīng)用的早期,RIQ的潛力還沒(méi)有完全被發(fā)覺(jué)出來(lái)。