圖像搜索引擎 - 特徵篇

在簡介篇中我們簡單說過圖像特徵,圖像特徵的提取有兩種常用方式,一是提取例如SIFT特徵,手工進行特徵的篩選等,需要計算機視覺方面的先驗性知識;二是使用當前很火的深度學習,訓練出基於卷積神經網絡模型的特徵提取算子,某寶和某度用的就是這種方法。本文只涉及基於卷積神經網絡提取出的特徵。

關於特徵

特徵是計算機視覺的原材料,對最終模型的影響是毋庸置疑的。如果數據被很好的表達成了特徵,通常線性模型就能達到滿意的精度。那對於特徵,我們需要考慮什麼呢?

特徵表示的粒度

就一個圖片來說,像素級的特徵根本沒有價值。例如下面的摩托車,從像素級別,根本得不到任何信息,其無法進行摩托車和非摩托車的區分。而如果特徵是一個具有結構性(或者說有含義)的時候,比如是否具有車把手(handle),是否具有車輪(wheel),就很容易把摩托車和非摩托車區分,計算機視覺和深度學習算法才能發揮作用。
這裏寫圖片描述

初級(淺層)特徵表示

計算機視覺領域的大牛們很早發現,複雜圖形往往由一些基本結構組成。比如下圖:一個圖可以通過用64種正交的edges(可以理解成正交的基本結構)來線性表示。比如樣例的x可以用1-64個edges中的三個按照0.8,0.3,0.5的權重調和而成。而其他基本edge沒有貢獻,因此均爲0。
這裏寫圖片描述

另外,大牛們還發現,不僅圖像存在這個規律,聲音也存在。他們從未標註的聲音中發現了20種基本的聲音結構.
這裏寫圖片描述
其餘的聲音可以由這20種基本結構合成。
這裏寫圖片描述

結構性特徵表示

小塊的圖形可以由基本edge構成,更結構化,更復雜的,具有概念性的圖形如何表示呢?這就需要更高層次的特徵表示,比如V2,V4。因此V1看像素級是像素級。V2看V1是像素級,這個是層次遞進的,高層表達由底層表達的組合而成。專業點說就是基basis。V1取提出的basis是邊緣,然後V2層是V1層這些basis的組合,這時候V2區得到的又是高一層的basis。即上一層的basis組合的結果,上上層又是上一層的組合basis……。
這裏寫圖片描述

直觀上說,就是將有意義的小圖塊進行combine,就得到了上一層的feature,遞歸地向上learning feature。在不同object上做training是,所得的edge basis 是非常相似的,但object parts和object models 就會completely different了(那咱們分辨car或者face是不是容易多了):
這裏寫圖片描述

全局特徵

用 pre-trained googlenet 模型提取池化層pool5/7x7_s1的特徵,該池化層之後則是分類器了,也就是說池化層pool5/7x7_s1是我們在神經網絡中能夠提取到的最高層次的feature了,姑且稱之爲全局特徵吧。然後通過計算兩幅圖片的歐式距離確定其是否相似,感覺效果不錯,至少能達到公司線上圖像搜索引擎效果的90%。

全局特徵來自神經網絡的最高層,理論上表示的的不是edge basis 和object parts,而是高度抽象後的object models。爲了驗證全局特徵是否表示高度抽象的object models, 也是爲了驗證全局特徵在圖像搜索引擎上的可行性,其中一次實驗我以下面這幅圖作爲搜索圖片(數據搞沒了,這部分的demo沒法截圖……):
這裏寫圖片描述
搜索到兩幅圖片如下:
這裏寫圖片描述
這裏寫圖片描述
這三幅圖都是相似圖片,但搜索結果中第一幅圖的相似度遠大於第二幅圖。並且相似度高得搜索結果趨向於與第一幅一樣的人物分佈(左右各有一個人物)。經過大量實驗對比發現:採用全局特徵得到的相似圖片都有一個共性,就是相似圖片中的物體佈局非常相似,趨向於在圖片整體上有相似的結構。這個結果已經基本驗證全局特徵表示的是高度抽象的object models的猜想了。當然我們也可以通過可視化feature map驗證全局特徵的抽象層次。

局部特徵

隨着卷積神經網絡層的深入,特徵的抽象層次越高、局部表現力也越強,也即從無意義的像素級特徵抽象到edge basis,再到object parts;但隨着層的繼續深入,特徵逐漸丟失局部信息,趨向於表示object models、即趨向於從全局角度描述圖片。卷積神經網絡有很多隱層,不同數據集上同一隱層的特徵抽象層次的表現力也不相同,所以我們沒法準確的指明哪一中間層是最有表現力的,也即最能表現object parts的。最具表現力的中間層的選取可以參考論文《Exploiting Local Features From Deep Networks for Image Retrieval》。

我以 pre-trained googlenet的全連接層inception_4c/output作爲特徵提取層,提取出的特徵稱之爲局部特徵。理想狀況下應該是分類目提特徵,但由於同事準備的數據集沒有做分類工作,也沒法做分類工作,所以只能全部放一塊兒進行搜索了。

搜索兒童自行車效果如下:
這裏寫圖片描述

搜索女裝效果如下:
這裏寫圖片描述

對圖像進行遮擋後搜索效果如下:
這裏寫圖片描述
由於沒有做分類工作,導致有手錶亂入……

總結

上面的截圖只是部分搜索結果,通過對大量搜索結果的分析發現:使用 pre-trained googlenet 模型作爲特徵算子,全局特徵的搜索效果略優於局部特徵的搜索效果。雖然全局特徵的搜索效果是優於局部特徵的,但全局特徵向量由於其數據維度低、局部信息丟失、抽象層次太高,故很難適用在大規模數據的場景、很難實現更高要求的搜索效果;

其實最終的效果並不意外,pre-trained googlenet 模型主要用來對物體進行分類,其學習到的更多是如何識別物體的形狀。使用該模型作爲特徵提取算子,提取的特徵更多的是在形狀層面上對圖像進行描述。 對於一件連衣裙而言,pre-trained googlenet模型是沒有學習到裙子的紋理、長度、腰型、風格等細節信息的,關於pre-trained googlenet 是否學習到這些信息,我們也可以通過可視化feature map來直觀的看到。

我們有必要根據自己的數據集訓練一個能夠識別細節信息的模型。具體點說就是爲每個類別的圖片訓練一個專用的模型,該模型只用來學習該類別圖片的細節信息.,那麼相應的提取出的特徵也具有豐富的細節信息了。某寶就採用的是這種方式,爲每個類目(例如連衣裙、羽絨服等)單獨訓練一個專用的模型作爲特徵提取算子。

參考資料

《Deep Learning(深度學習)學習筆記整理系列》
《Exploiting Local Features From Deep Networks for Image Retrieval》
《Deep Learning of Binary Hash Codes for Fast Image Retrieval》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章