從零開始深度學習0519——圖像檢索基本知識

視頻摘要與視頻濃縮(video summarization and video synopsis) 視頻摘要是從原始視頻中提取有代表性的關鍵幀,而視頻濃縮將多幀視頻合併成一幀。

 

 

如果是在低維度的小數據集中,可以使用線性查找(Linear Search)的方法,但是在高緯度大數據集中,線性查找的效率很低,顯然是不可行的。如何的從大的高維數據集中找到與某個向量最相似的一個或多個向量,是圖像檢索中一個難點。

在這種高緯度大數據集中的檢索,通常需要使用最近鄰最相似查找(Approximate Nearest Neighbor,ANN)的方法。ANN的相似性檢索算法,大體可以分爲三大類:

  • 基於樹的方法,KD-樹爲代表。對於低維度的數據,KD樹的查找性能還是比較高效的;但當空間維度較高時,該方法會退化爲暴力枚舉,性能較差,這時一般會採用下面的哈希方法或者矢量量化方法。
  • 哈希方法
    • LSH Locality Sensitive Hashing 爲代表,對於小數據集和中等數據集效果不錯
  • 矢量量化
    • vector quantization,在矢量量化編碼中,關鍵是碼本的建立和碼字搜索算法。比如常見的聚類算法,就是一種矢量量化方法。而在相似搜索中,向量量化方法又以PQ方法爲代表
    • 對於大規模數據集,矢量量化是個很好的選

 

 

 

KNN    就是K近鄰

進行線性掃描   找最近的點 認爲相似  進行暴力搜索

 

在KNN 的基礎上,進行改進  出現了KD-Tree

從訓練樣本中 找一個節點  進行分叉 如圖

 

 

 

 

如果數據維度更高的話,還可以進一步提升,出現了LSH

提高了效率,但是付出的代價是會損失一些精度

LSH的思想:在原空間中很近(相似)的兩個點,經過LSH哈希函數的映射後,有很大概率它們的哈希是一樣的;而兩個離的很遠(不相似)的兩個點,映射後,它們的哈希值相等的概率很小。

LSH(Locality Sensitive Hashing)位置敏感哈希,局部敏感哈希

最近鄰最相似搜索算法的一種,有比較可靠的理論根據且在高維數據中表現比較好,很適合應用在圖像檢索中。

與一般的哈希算法不同的是其位置敏感性,也就是散列前類似的點(距離近的點),在散列後仍然能夠保證在一定程度的相似,且有一定的概率保證。

原理大概就是,將相似的點,也就是相似的圖像 放在一個Bucket中,做好LSH索引。然後來了圖像檢索,就去找Bucket

 

 

一種簡單的LSH實現  假設要將LSH投影到128的bianry-code中

隨機生成128條直線,其中每一條直線把平面space切分成了兩半部分,不是0就是1

可以認爲左邊是0.右邊是1   這只是一條直線  我們有128個直線  所以對於每個特徵點有128個0或1  所以就表示成了128個bianry-code 這就是隨機投影random projection

既然是有128個直線,所以相當於就是確定了128個截距和斜率

所以如果來了一個圖片,對這個圖片也做這128個直線的投影,做對比

 

 

整體framework

LSH應用在圖像搜索中

 

機器學習  深度學習 都分爲 監督學習 和  無監督學習

 

無監督學習

Encoder – Decoder Framework  編碼解碼

 

 

卷積是把大的Feature map 下采樣 變成小的

轉置卷積是把 小的 的進行上採樣

 

 

IR –》 image retrieval

 

 

特徵層的選取

假設最後取到的特徵是7*7*256

我們取到VGG或者AlexNet等在imagenet上訓練的網絡的最後一個卷積層後,肯定是需要pooling層 和 歸一化操作,這裏對比了2種pooling方式和2種歸一化操作

Sum-L1 效果比較好  但是 平常我們一般選擇max-L2

輸出層的選取

我們以VGG-19層爲例

可以隨着選取卷積層越靠後 得到的查詢效果越好,但是到了一定程度後就會過猶不及

 

 

 

 

Image Resizing

 

直接resize 話 圖像會被拉伸變形   叫做two-fixed

還可以固定一邊,然後一定的比例,縮放另一邊 叫做 one-fixed

 

 

 

如果網絡結構的設計接受299*299*3 的圖像,但是實際上輸入圖像肯定是大小不一的,假如我們圖像是1024*1024*3,那我們如何進行圖像原始的輸入,輸出。基本上99%case都是比網絡結構設計的輸入尺寸要大 。 那我們如何解決這個問題

 

我們可以把fc層全部去掉,換上Global average pooling (GAP)  全局池化層

Global average pooling (GAP)      https://www.jianshu.com/p/04f7771f4da2   說的特別好

卷積層是CNN網絡的核心,激活函數幫助網絡獲得非線性特徵,而池化的作用則體現在降採樣:保留顯著特徵、降低特徵維度,增大kernel的感受野

一般在全連接後會有激活函數來做分類,假設這個激活函數是一個多分類softmax,那麼全連接網絡的作用就是將最後一層卷積得到的feature map stretch成向量,對這個向量做乘法,最終降低其維度,然後輸入到softmax層中得到對應的每個類別的得分。全連接層如此的重要,以至於全連接層過多的參數重要到會造成過擬合

在最後一個卷積層後,加上GAP 不管前面輸出是多少  通過GAP後都變成了1*1*chinnal

所以就可以不在乎原始圖像輸入是多少,然後繼續接下往下做

 

去掉fc層 換成GAP 我們叫全卷積神經網絡  fully convlation network

 

 

 

一些訓練網絡的建議

 

 

 

推薦一個特別強大的  數據擴增的庫  

https://github.com/aleju/imgaug

 

 

 

 

 

Re-Identification   ReId  車輛重識別  人體重識別

 

核心Triplet Loss 三元組損失  三重態損失

Anchor,positive,Negative 

Margin 其實就是閾值  就是允許多大的誤差

在垂直領域 迫使系統去尋找和給定樣本 距離相近的

Triplet loss  函數 和 求導

 

 

網絡流程

每次把3個圖像作爲一組樣本,形成三元組,(batch都是3的倍數,一個batch就是3,如果24 就是有8組,),作爲輸入到cnn,然後輸出特徵向量,到triplet loss 中 計算distance。 期望anchors 和 positive 距離更近  迫使網絡學到更細粒度的信息

 

 

 

很重要  工業界中用的  面試題

輸入是1022*767    輸出是320*320

短邊767先縮放到320,長邊按比例縮放(1022767*320),然後在中間再去裁剪出320*320

Center crop  +   resize

會損失一點邊界   但是沒關係可以接受

 

 

 

Checkpoint 設置一個保存路徑

 

設置學習率

 

Patience 就是耐心是15  連續15輪epoches 沒有變化時  停止

 

 

 

使用triplet loss 時  千萬一開始不能用來訓練中

通常是先訓練一個基本的cnn  然後再加進來進行二次訓練  這樣會使得訓練的精度可以拔高一點。如果一開始嵌入trieplet loss  可能會不收斂

 

 

 

 

正負樣本的採樣  positive and negative

A best approach is  “hard negative”

比如相同車輛,相同型號,相同顏色  但是不能車牌

 

 

訓練一個faster r-cnn  檢測器  去檢測

然後扔給孿生神經網絡 去match

 

 

孿生神經網絡   來做match 匹配

輸入x1 x2 到cnn  相同輸出1  不同輸出0

 

 

 

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