DeepHash 論文簡要
由於項目的需要,需要用到從圖片生成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值豈不是更準,然後就退化成簡單的分類問題了。這點一直不太明白。(評論中有回答)
推薦閱讀: