歡迎大家前往騰訊雲社區,獲取更多騰訊海量技術實踐干貨哦~
作者:雷經緯
導語: 本文從從圖片的dhash,ahash,phash,顏色分布向量到基於語義的sift,surf,gist特征,構建一套分層相似圖片檢測系統。本文致力於零基礎單機快速搭建一個可用的相似圖片識別系統。
1 背景
相似圖片檢測的定義是人眼看起來像,比如下面的倆圖。
![]() |
![]() |
相似圖片的檢測廣泛用於圖片去重,仿冒圖標檢測,圖片檢索等。本文也是基於圖標相似檢測的需求去做的,本意是用於打假。然而專家老中醫告訴我,打假不如推薦相似app受市場歡迎,並且不同應用場景下我們做事的思路也會不同。不管了,先把相似圖片識別出來
2 檢測的原理
圖片相似檢測無非是提取圖片某個維度的特征,根據算法兩兩計算相似度。(基於機器學習,深度學習的方法則會先構建一個模型,然后將新樣本特征輸入模型即可。)簡單流程可以描述為:
檢測過程中可能用到的7個基礎特征如下:
簡單解釋下,dhash,ahash,phash是根據基於分塊等某種算法得到的基於圖片RGB值的某個哈希(其詳細描述可參考http://itindex.net/detail/42723 );RGB向量則是將色彩從256256256映射到較小的區間如444,然后計算圖片在每個區間的分布形成一個數組;
SIFT,SURF,GIST則不再是RGB值的某種統計,而是試圖構建人能理解的圖片意義,如SIFT,SURF關注圖片關鍵點(或者理解為重要的點)的信息,GIST則從自然度,開放度,粗糙度等描述圖像。下圖是這種專業的圖片處理,很高大上有沒有。
3 如何搭建一個仿冒圖標檢測系統
相似圖片的檢測可以用於去重,圖片搜索等。底層技術是基於上文描述的方法,但是在根據目標不同,又有不同的結構。本工程的初衷是檢測圖標仿冒,系統結構如下:
思路:先把已標位正牌的圖標特征(dhash,ahash,phash等)收集起來形成一個特征庫,新圖標來了則提取其特征去特征庫里匹配,如果匹配到了相似度極高的則直接認定其為仿冒圖標;如果匹配到了相似度較高的則轉入sift,gist高級特征匹配。
4 show me the 效果
下面是一些相似圖標示例:
圖標大小縮放,添加元素,添加文字,顏色塊變化等都是可以識別的。仿冒數量不便展示(/ □ )
5 提升性能和效果的關鍵點,坑
本工程最終在單機完成了數百萬官方圖標庫,每天新進數十萬圖標的檢測。在構建過程中遇到了不少坑,這些坑一部分是計算速度(單一圖標匹配從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
6 潛在的改進點
海量圖片匹配,第一步必須是生成圖片的特征哈希,且改hash必須是局部敏感hash。局部敏感hash的特點是:原始數據相似的情況下,生成的hash值也會盡可能的保持相似。從圖片dhash,ahash,phash的算法過程可以認為它們就是一種局部敏感哈希。所以可以用來檢測相似。
但是在gist特征中,即使圖片相似,生成的960維向量的每一個值幾乎都不同,不直接具備利用它生成局部敏感哈希lsh的條件。這個時候需要對向量元素歸一化,使得相似圖片的大部分gist特征相同。這一點在pyleargist的官方頁面https://pypi.python.org/pypi/pyleargist 下方有說明,但並沒有講怎么做。有文章說用simhash,但是對於simhash生成過程中的每個維度的權重一筆帶過。個人很懷疑不采用歸一化就生成simhash的做法。這里待研究
7 總結
當前圖像處理發展多年,已經提出了多種特征,算法。在工程應用中需要結合自己的場景選用適當的特征(怎么適當?不確定的話就多試試(/ □ )),注重底層數據的質量,優化性能以便快速調整匹配策略。
相關閱讀
此文已由作者授權騰訊雲技術社區發布,轉載請注明原文出處
原文鏈接:https://cloud.tencent.com/community/article/682834?fromSource=gwzcw.632104.632104.632104