導語: 本文從從圖檔的dhash,ahash,phash,顔色分布向量到基于語義的sift,surf,gist特征,建構一套分層相似圖檔檢測系統。本文緻力于零基礎單機快速搭建一個可用的相似圖檔識别系統。
相似圖檔檢測的定義是人眼看起來像,比如下面的倆圖。


相似圖檔的檢測廣泛用于圖檔去重,仿冒圖示檢測,圖檔檢索等。本文也是基于圖示相似檢測的需求去做的,本意是用于打假。然而專家老中醫告訴我,打假不如推薦相似app受市場歡迎,并且不同應用場景下我們做事的思路也會不同。不管了,先把相似圖檔識别出來
圖檔相似檢測無非是提取圖檔某個次元的特征,根據算法兩兩計算相似度。(基于機器學習,深度學習的方法則會先建構一個模型,然後将新樣本特征輸入模型即可。)簡單流程可以描述為:
檢測過程中可能用到的7個基礎特征如下:
簡單解釋下,dhash,ahash,phash是根據基于分塊等某種算法得到的基于圖檔RGB值的某個哈希(其較長的描述可參考http://itindex.net/detail/42723 );RGB向量則是将色彩從256256256映射到較小的區間如444,然後計算圖檔在每個區間的分布形成一個數組;
SIFT,SURF,GIST則不再是RGB值的某種統計,而是試圖建構人能了解的圖檔意義,如SIFT,SURF關注圖檔關鍵點(或者了解為重要的點)的資訊,GIST則從自然度,開放度,粗糙度等描述圖像。下圖是這種專業的圖檔處理,很高大上有沒有。
相似圖檔的檢測可以用于去重,圖檔搜尋等。底層技術是基于上文描述的方法,但是在根據目标不同,又有不同的結構。本工程的初衷是檢測圖示仿冒,系統結構如下:
思路:先把已标位正牌的圖示特征(dhash,ahash,phash等)收集起來形成一個特征庫,新圖示來了則提取其特征去特征庫裡比對,如果比對到了相似度極高的則直接認定其為仿冒圖示;如果比對到了相似度較高的則轉入sift,gist進階特征比對。
下面是一些相似圖示示例:
圖示大小縮放,添加元素,添加文字,顔色塊變化等都是可以識别的。仿冒數量不便展示(/ □ )
本工程最終在單機完成了數百萬官方圖示庫,每天新進數十萬圖示的檢測。在建構過程中遇到了不少坑,這些坑一部分是計算速度(單一圖示比對從300秒降低到0.2秒,鬼知道我的小心髒經曆了什麼),還有的是識别效果:
1.官方圖示特征需先聚類,數百萬的特征存儲和比對都比較麻煩。對官方庫聚類後可以形成特征對圖示的一對多關系,而不是維持原有的圖示對特征的一對一關系;
2.比對政策分層,如本工程一開始綜合dhash及sift等,參數和政策調整非常複雜。分為兩層後(哈希政策過濾,sift精确比對),每一層的準确率和參數,政策調整非常友善;
3.哈希值的海明碼距離計算耗時較多,在明确海明碼距離範圍的情況下可以采用分段比對而非計算不同的位數。具體見http://www.cnblogs.com/gantoday/p/6404923.html
4.工程經驗上:opencv-python不直接提供sift,surf算法了。可以用opencv-contrib-python這個庫。gist可以用pyleargist這個庫,其依賴安裝見http://blog.csdn.net/sensicall/article/details/77803915
海量圖檔比對,第一步必須是生成圖檔的特征哈希,且改hash必須是局部敏感hash。局部敏感hash的特點是:原始資料相似的情況下,生成的hash值也會盡可能的保持相似。從圖檔dhash,ahash,phash的算法過程可以認為它們就是一種局部敏感哈希。是以可以用來檢測相似。
但是在gist特征中,即使圖檔相似,生成的960維向量的每一個值幾乎都不同,不直接具備利用它生成局部敏感哈希lsh的條件。這個時候需要對向量元素歸一化,使得相似圖檔的大部分gist特征相同。這一點在pyleargist的官方頁面https://pypi.python.org/pypi/pyleargist 下方有說明,但并沒有講怎麼做。有文章說用simhash,但是對于simhash生成過程中的每個次元的權重一筆帶過。個人很懷疑不采用歸一化就生成simhash的做法。這裡待研究
目前圖像處理發展多年,已經提出了多種特征,算法。在工程應用中需要結合自己的場景選用适當的特征(怎麼适當?不确定的話就多試試(/ □ )),注重底層資料的品質,優化性能以便快速調整比對政策。