由於項目的需要,需要用到從圖片生成hash值的方法,以期能夠在圖像去重和視頻去重中發揮作用。

Liu_Deep Supervised Hashing for Fast Image Retrieval_CVPR_2016_paper

首先DeepHash的目的是對一張圖片生成一個hash值,相似的圖片的hash值儘可能完全一樣,不相似的圖片最好沒有一位相同。

兩個問題:hamming距離不可導,只是比對相不相同;生成的hash值為0或者1。

訓練模型分辨圖片是不是相似,自然得用上經典的孿生網路的結構。

在每個batch內部生成pair 對。

Loss方面得做一些改變。

很顯然不能用hammming距離,只能用歐式距離,整體的loss和Contrastive Loss 一樣,再加上一個正則項,使得每一位儘可能接近於1或者-1,方便生成hash值。

訓練是一套relaxed loss,實際使用的時候直接使用符號函數,這裡存在的GAP已經決定了效果不會太好,至少很難做到兩張相似的圖片產生完全相同的hash值。

如圖中所示,alpha越大,輸出值越接近1或者-1.

Deep Learning of Binary Hash Codes for Fast Image Retrieval_cvprw2015

文章的idea極為簡單,就像文中所說,一張圖片屬於某一個類,一定是圖像中某些concept起作用,於是加入H層,節點數目為hash值的維度,利用sigmoid 激活函數,使得輸出為0或1,從而得到一個近似的hash值。

文中最大的問題,也是所有DeepHash最大的問題,就是用的數據集是帶label的,也就是圖片如果屬於同一類就會認為是相似圖片,這樣的結果是太粗粒度,實際上hash 值需要定義為輸出來的類別即可,何必弄的那麼複雜。

Deep Supervised Discrete Hashing NIPS2017

主要的不同點在於優化方式上,我覺得文章聲稱的主要的創新點--利用分類的信息,這一點實在不是創新,而是一個短板,利用圖像原有的label,和上一篇論文的思想一樣。

幾個不同點:

如果是相似圖片,最後一層的輸出做內積,而不是歐式距離。

最後一層輸出直接拿來做分類,這裡只是簡單L2範數。

訓練方式,迭代更新:

確實也只有迭代更新上有點不同的感覺。

Learning Compact Binary Descriptors with Unsupervised Deep Neural Networks cvpr2016

重點是無監督,圖像可以是無label的。

實際上是大量的樣本自己去產生類似的hash值,隱含的聚類。

同一張圖片,3個loss

第一個loss和其他方法一樣,盡量讓輸出趨於符號函數。

第二個loss,主要是讓hash值每一位為1或0的概率為0.5,沒有什麼偏向性,。。這點存疑,由數據的分佈決定了。

第三個loss,主要是圖像旋轉帶來的誤差消去。

實際上一個隱含的事實是,一個網路對相似的圖片更可能產生相似的輸出,取符號函數則更容易。可能最大的問題,沒有顯式的規定相似的圖片產生相似的hash 值。

HashNet Deep Learning to Hash by Continuation_arxiv_2017

最大的改進是用tanh激活函數不斷的去逼近符號函數,其他地方和普通的方法差不多。

距離取的是內積。

訓練起來有些麻煩,不太好調的樣子。

Feature Learning based Deep Supervised Hashing with Pairwise Labels IJCAI2016

沒啥特別的,內積+正則

總結一下:

看似每年的頂會中都有一些DeepHash的文章,但是方法上幾乎沒有大改變,所有看少量有代表性的 文章就足夠了。

基本都是siamese network+contrastive loss。但是為了產生hash 值,需要加入正則項,使得輸出儘可能符合符號函數。衡量兩個hash值的距離不能用hamming 距離,因為不可能,所以採用歐式距離或是餘弦距離。

然後DeepHash的工作最大的問題是用了帶label的數據集,本身圖片就可以通過網路分類的類別來搜索,所以用hash值進行搜索的意義何在??以類別作為hash值豈不是更準,然後就退化成簡單的分類問題了。這點一直不太明白。(評論中有回答)


推薦閱讀:
相關文章