做者:雷經緯
html
本文從從圖片的dhash,ahash,phash,顏色分佈向量到基於語義的sift,surf,gist特徵,構建一套分層類似圖片檢測系統。本文致力於零基礎單機快速搭建一個可用的類似圖片識別系統。python
類似圖片檢測的定義是人眼看起來像,好比下面的倆圖。算法
類似圖片的檢測普遍用於圖片去重,仿冒圖標檢測,圖片檢索等。本文也是基於圖標類似檢測的需求去作的,本意是用於打假。然而專家老中醫告訴我,打假不如推薦類似app受市場歡迎,而且不一樣應用場景下咱們作事的思路也會不一樣。無論了,先把類似圖片識別出來數組
圖片類似檢測無非是提取圖片某個維度的特徵,根據算法兩兩計算類似度。(基於機器學習,深度學習的方法則會先構建一個模型,而後將新樣本特徵輸入模型便可。)簡單流程能夠描述爲:app
檢測過程當中可能用到的7個基礎特徵以下:機器學習
簡單解釋下,dhash,ahash,phash是根據基於分塊等某種算法獲得的基於圖片RGB值的某個哈希(其詳細描述可參考itindex.net/detail/4272… );RGB向量則是將色彩從256性能
SIFT,SURF,GIST則再也不是RGB值的某種統計,而是試圖構建人能理解的圖片意義,如SIFT,SURF關注圖片關鍵點(或者理解爲重要的點)的信息,GIST則從天然度,開放度,粗糙度等描述圖像。下圖是這種專業的圖片處理,很高大上有沒有。學習
類似圖片的檢測能夠用於去重,圖片搜索等。底層技術是基於上文描述的方法,可是在根據目標不一樣,又有不一樣的結構。本工程的初衷是檢測圖標仿冒,系統結構以下:優化
思路:先把已標位正牌的圖標特徵(dhash,ahash,phash等)收集起來造成一個特徵庫,新圖標來了則提取其特徵去特徵庫裏匹配,若是匹配到了類似度極高的則直接認定其爲仿冒圖標;若是匹配到了類似度較高的則轉入sift,gist高級特徵匹配。spa
下面是一些類似圖標示例:
圖標大小縮放,添加元素,添加文字,顏色塊變化等都是能夠識別的。仿冒數量不便展現(/ □ )
本工程最終在單機完成了數百萬官方圖標庫,天天新進數十萬圖標的檢測。在構建過程當中遇到了很多坑,這些坑一部分是計算速度(單一圖標匹配從300秒下降到0.2秒,鬼知道個人當心髒經歷了什麼),還有的是識別效果:
1.官方圖標特徵需先聚類,數百萬的特徵存儲和匹配都比較麻煩。對官方庫聚類後能夠造成特徵對圖標的一對多關係,而不是維持原有的圖標對特徵的一對一關係;
2.匹配策略分層,如本工程一開始綜合dhash及sift等,參數和策略調整很是複雜。分爲兩層後(哈希策略過濾,sift精確匹配),每一層的準確率和參數,策略調整很是方便;
3.哈希值的海明碼距離計算耗時較多,在明確海明碼距離範圍的狀況下能夠採用分段匹配而非計算不一樣的位數。具體見www.cnblogs.com/gantoday/p/…
4.工程經驗上:opencv-python不直接提供sift,surf算法了。能夠用opencv-contrib-python這個庫。gist能夠用pyleargist這個庫,其依賴安裝見blog.csdn.net/sensicall/a…
海量圖片匹配,第一步必須是生成圖片的特徵哈希,且改hash必須是局部敏感hash。局部敏感hash的特色是:原始數據類似的狀況下,生成的hash值也會盡量的保持類似。從圖片dhash,ahash,phash的算法過程能夠認爲它們就是一種局部敏感哈希。因此能夠用來檢測類似。
可是在gist特徵中,即便圖片類似,生成的960維向量的每個值幾乎都不一樣,不直接具有利用它生成局部敏感哈希lsh的條件。這個時候須要對向量元素歸一化,使得類似圖片的大部分gist特徵相同。這一點在pyleargist的官方頁面pypi.python.org/pypi/pylear… 下方有說明,但並無講怎麼作。有文章說用simhash,可是對於simhash生成過程當中的每一個維度的權重一筆帶過。我的很懷疑不採用歸一化就生成simhash的作法。這裏待研究
當前圖像處理髮展多年,已經提出了多種特徵,算法。在工程應用中須要結合本身的場景選用適當的特徵(怎麼適當?不肯定的話就多試試(/ □ )),注重底層數據的質量,優化性能以便快速調整匹配策略。
把照片唱給你聽 :騰訊 AI Lab 國際領先技術邀你「趣」體驗
都是知識點!更簡單的圖像匹配特徵融合法,你 Get 到了嗎?
此文已由做者受權騰訊雲技術社區發佈,轉載請註明文章出處原文連接:https://cloud.tencent.com/community/article/503286