0
本文作者: AI科技評(píng)論 | 編輯:郭奕欣 | 2018-07-16 09:42 |
雷鋒網(wǎng) AI 科技評(píng)論按:本文為專欄作者兔子老大為 AI 科技評(píng)論撰寫的獨(dú)家稿件,未經(jīng)許可不得轉(zhuǎn)載。
圖片檢索是計(jì)算機(jī)視覺,數(shù)字圖像處理等領(lǐng)域常見的話題,在我學(xué)習(xí)相關(guān)知識(shí)的過程中,圖像檢索算是我第一個(gè)學(xué)習(xí)的 demo,該過程都記錄在 利用python進(jìn)行識(shí)別相似圖片(一) 和 利用python進(jìn)行識(shí)別相似圖片(二) 兩篇文章,分別記錄了直方圖匹配,phash/average hash/dhash 三種基于哈希的方法。
圖片檢索的的大體框架大致可以分成兩步,抽取某種特征,計(jì)算相似度。其中像上述提及的幾種方法,都是對(duì)應(yīng)抽取特征這一步,而計(jì)算相似度,則常使用歐式距離/漢明距離/Triplet 等方法。顯然的,上述方法都屬于人工設(shè)計(jì)的方法來進(jìn)行抽取特征,很自然的就想到使用當(dāng)今很火熱的深度學(xué)習(xí)來代替人工的設(shè)計(jì)的方法,所以這篇文章主要介紹的就是基于深度學(xué)習(xí)的圖片檢索。
本文主要介紹的文章有以下幾篇:
Deep Learning of Binary Hash Codes for Fast Image Retrieval -- CVPR WORKSHOP 2015
DEEP SUPERVISED HASHING FOR FAST IMAGE RETRIEVAL -- CVPR 2016
Feature Learning based Deep Supervised Hashing with Pairwise Labels -- IJCAI 2016
提及到使用深度學(xué)習(xí)提取圖像特征,業(yè)界一般認(rèn)為現(xiàn)有的圖像模型中,前面的卷積層負(fù)責(zé)提取相關(guān)特征,最后的全連接層或者 globel pooling 負(fù)責(zé)分類,因此一般的做法是直接取前幾層卷積的輸出,然后再計(jì)算相似度。
但這樣涉及到一個(gè)問題,首先一個(gè)是數(shù)據(jù)精度問題,因?yàn)橹苯尤√卣鬏敵龆嗍歉↑c(diǎn)數(shù),且維度高,這會(huì)導(dǎo)致儲(chǔ)存這些圖像的特征值會(huì)耗費(fèi)大量空間,第二個(gè)因?yàn)榫暥雀?,所以用歐式距離這種方式計(jì)算相似度,可能會(huì)觸發(fā)維度災(zāi)難,令使用歐式距離代表相似度這種方法失效。
其中一種解決方法是使用 Triplet 函數(shù)構(gòu)造一個(gè)能夠?qū)W習(xí)如何計(jì)算相似度的神經(jīng)網(wǎng)絡(luò)。雖然 Triplet 這個(gè)方法并不在本文介紹范圍,但為了讀者可以橫向?qū)Ρ认嚓P(guān)方法,這里粗略的介紹以下基于 Triplet 的做法。
Triplet 的做法很簡(jiǎn)單,人工構(gòu)建一個(gè)三元集合,該三元集合包括(圖片 A,與 A 相似的圖片 B,與 A 不相似的圖片 C),期望該神經(jīng)網(wǎng)絡(luò)接受兩個(gè)圖片輸入,若為相似,則輸出一個(gè)較高的分?jǐn)?shù),若不相似則輸出一個(gè)較低的分?jǐn)?shù)。
Triplet Loss 的構(gòu)造如上式所示,其中 f(xi) 為原圖在神經(jīng)網(wǎng)絡(luò)輸出的分?jǐn)?shù),f(xj) 相似圖在神經(jīng)網(wǎng)絡(luò)輸出的分?jǐn)?shù),f(xk) 為不相似圖片的輸出分?jǐn)?shù),在這條表達(dá)式中,我們期待相似圖片的分?jǐn)?shù)之間,盡量接近,而不相似圖片的分?jǐn)?shù)盡量遠(yuǎn)離。在不考慮α?xí)r有個(gè)問題,顯然,
在時(shí),L=0,
這樣就沒有達(dá)到我們希望相似圖片和不相似圖片的分?jǐn)?shù)在空間上存在一定的間隔這個(gè)目標(biāo),而 α 的設(shè)定,就是這個(gè)間隔。
顯然,α 設(shè)定太小,神經(jīng)網(wǎng)絡(luò)不太容易區(qū)分相似圖片,而設(shè)定太大,則相當(dāng)于對(duì)神經(jīng)網(wǎng)絡(luò)提出更高的要求,神經(jīng)網(wǎng)絡(luò)的收斂會(huì)更加不穩(wěn)定。
Triplet 適合圖片檢索時(shí)每個(gè)類別的樣本不大的情況下,比如人臉檢測(cè)。但有研究指出,Triplet 集合的構(gòu)建會(huì)影響訓(xùn)練的效果,也就是該如何人工的定義相似和不相似,所以也有相關(guān)工作在構(gòu)建 Triplet 上展開,但本文主要說的是另一種方法,即基于哈希的三種方法。
Deep Learning of Binary Hash Codes for Fast Image Retrieval -- CVPR WORKSHOP 2015
之所以先選擇這篇文章先作討論,是因?yàn)檫@篇文章的工作的思想和上文提及的方法,和下文要提到的文章思想過度的比較自然,方便讀者理解。
上文提及,最為簡(jiǎn)單的方式是使用神經(jīng)網(wǎng)絡(luò)特征層的輸出用于計(jì)算空間距離來判斷相似度,但這樣會(huì)導(dǎo)致浮點(diǎn)型數(shù)據(jù)儲(chǔ)存消耗和維度災(zāi)難。針對(duì)這兩個(gè)問題,這篇文章提出的方法較為直接。
浮點(diǎn)數(shù)據(jù)怎么辦?將他離散成二值型數(shù)據(jù),也就是一串 0 和 1 的哈希,這樣只需要幾個(gè) byte 就能儲(chǔ)存一個(gè)數(shù)據(jù)了。
維度高怎么辦?把他壓縮成低維唄。
所以我才說這篇文章的思路是十分直接和易于理解的,十分適合放在第一篇用于過渡。
下面說說文章的具體做法:
既然我們希望特征的輸出可以離散化成 0 和 1,那就希望特征的分布是關(guān)于某個(gè)值對(duì)稱的,然后只要根據(jù)該值作為閾值二值化即可,就這樣一步步推導(dǎo),自然想到使用 tanh 或 sigmoid 函數(shù),因?yàn)槠漭敵鍪顷P(guān)于 0 對(duì)稱或關(guān)于 0.5 對(duì)稱。該論文使用的 sigmoid 代替了預(yù)訓(xùn)練網(wǎng)絡(luò)的倒數(shù)第二層的 ReLU 函數(shù),且把輸出的維度壓縮至 12~48 之間,然后進(jìn)行微調(diào)。
在微調(diào)的過程中,有幾點(diǎn):一般我們的微調(diào)方法是指將前面卷積的權(quán)重凍結(jié),然后訓(xùn)練后面分類器的的權(quán)重。但在這里,一個(gè)是因?yàn)榫S度的減少,第二個(gè)是 sigmoid 做中間層的激活函數(shù)可能會(huì)造成梯度消失,神經(jīng)網(wǎng)絡(luò)的能力其實(shí)有了一定程度的衰減。因此做微調(diào)的時(shí)候,作者只是把 sigmoid 層的參數(shù)采用隨機(jī)化,其余參數(shù),包括分類器的大部分參數(shù)都保留下來,然后在訓(xùn)練期間,sigmoid 使用 1e-3 的學(xué)習(xí)率,其余層使用 1e-4 的學(xué)習(xí)率進(jìn)行學(xué)習(xí)。對(duì)于 cifar10 來說,使用數(shù)據(jù)強(qiáng)化后,能達(dá)到 89% 左右的 Accuracy,圖片檢索的 map 能夠達(dá)到 85%,可以說性能上十分可觀。
論文鏈接:http://www.iis.sinica.edu.tw/~kevinlin311.tw/cvprw15.pdf
參考實(shí)現(xiàn):https://github.com/flyingpot/pytorch_deephash
DEEP SUPERVISED HASHING FOR FAST IMAGE RETRIEVAL -- CVPR 2016
上文提及我們離散化時(shí)希望輸出的特征的關(guān)于某個(gè)值對(duì)稱,所以有文章用了 sigmoid 作為特征層的輸出的激活函數(shù),但直接引用 sigmoid 函數(shù)會(huì)導(dǎo)致一些問題,那有沒有辦法緩解這些問題?有,那就是使用正則的方法將輸出約束到某一個(gè)范圍內(nèi)。
這篇 CVPR 2016 的論文做法就是如此,并沒有像上述文章那樣使用分類網(wǎng)絡(luò)中間層來進(jìn)行哈希,而是使用神經(jīng)網(wǎng)絡(luò)直接學(xué)習(xí)哈希編碼,并用正則化方法將編碼進(jìn)行約束。
具體來說,就是讓神經(jīng)網(wǎng)絡(luò)的輸出通過正則的手法約束到 {-1,1} 之內(nèi)(后續(xù)使用 0 作為閾值進(jìn)行離散化),然后讓網(wǎng)絡(luò)的輸出達(dá)到以下的要求,相似的時(shí)候向量距離應(yīng)該較近,反之則遠(yuǎn),下面通過其目標(biāo)函數(shù)的表現(xiàn)形式來介紹具體過程
目標(biāo)函數(shù):
其中 b1,b2 是神經(jīng)網(wǎng)絡(luò)輸出的向量,y 是一個(gè)標(biāo)志,相似時(shí)記為 0,不相似時(shí)記作 1,其中超參數(shù)有兩個(gè),m 時(shí)用于控制 b1 和 b2 的最優(yōu)間隔,和 α 是正則項(xiàng)的權(quán)重,可見當(dāng)輸入的是相似圖片時(shí),y=0,要使 L 最小,需要最小化兩個(gè)向量的距離和正則項(xiàng)。而當(dāng)圖片不相似時(shí),y=1,最少化 L 需要使得兩個(gè)向量的距離分布在 m 的附近,以及最小化正則項(xiàng)。
最后的正則項(xiàng)使得輸出的特征向量分布在 {-1,1}。
而下圖是展示的是 m 和 α 對(duì)輸出分布的影響。
對(duì)于 CIFAR-10 來說,最終 map 只能 0.54~0.61,比上文提到的第一個(gè)方法要低,但實(shí)質(zhì)這個(gè)方法要更靈活。
參考實(shí)現(xiàn):https://github.com/yg33717/DSH_tensorflow
Feature Learning based Deep Supervised Hashing with Pairwise Labels——IJCAI 2016
如圖所示,這篇文章和上文提及的第二種方法大致相似。不采用分類網(wǎng)絡(luò)的中間層作為特征,而是直接采取一個(gè)神經(jīng)網(wǎng)絡(luò)進(jìn)行哈希函數(shù)的學(xué)習(xí),并用正則方法將輸出的特征的序列約束到一定范圍內(nèi)。
下面通過目標(biāo)函數(shù)的形式來說明具體過程:
其中 b 為輸出向量,Sij 是 label,相似為 1,否則為 0,ξij=bi*bjT,而 W,v 分別是最后一層的權(quán)重和偏置,而?(x;ξ) 即是倒數(shù)第二層輸出。
算法的更新步驟如下:
該方法在 CIFAR-10 數(shù)據(jù)集上取得 0.71~0.80 的 map 值。
論文鏈接:https://cs.nju.edu.cn/lwj/paper/IJCAI16_DPSH.pdf
參考實(shí)現(xiàn):https://github.com/jiangqy/DPSH-pytorch
本文分享了之前使用手工設(shè)計(jì)規(guī)則的方法來提取圖片特征用于衡量相似度,隨后介紹了深度學(xué)習(xí)在圖片搜索的過程,并給出三篇文章介紹了圖片檢索任務(wù)的大體框架和思路流程。
雷峰網(wǎng)原創(chuàng)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。