本系統是基於CVPR2015的論文《Deep Learning of Binary Hash Codes for Fast Image Retrieval》實現的海量數據下的基於內容圖片檢索系統,250w圖片下,對於給定圖片,檢索top 1000類似時間約爲1s,其基本背景和原理會在下文提到。算法
你們都知道,基於內容的圖像檢索系統是根據圖像的內容,在已有圖像集中找到最『相近』的圖片。而這類系統的效果(精準度和速度)和兩個東西直接相關:數據庫
根據咱們這個簡單系統裏的狀況粗淺地談談這兩個點。網絡
首先說圖像特徵的表達能力,這一直是基於內容的圖像檢索最核心卻又困難的點之一,計算機所『看到』的圖片像素層面表達的低層次信息與人所理解的圖像多維度高層次信息內容之間有很大的差距,所以咱們須要一個儘量豐富地表達圖像層次信息的特徵。咱們前面的博客也提到了,deep learning是一個對於圖像這種層次信息很是豐富的數據,有更好表達能力的框架,其中每一層的中間數據都能表達圖像某些維度的信息,相對於傳統的Hist,Sift和Gist,表達的信息可能會豐富一下,所以這裏咱們用deep learning產出的特徵來替代傳統圖像特徵,但願能對圖像有更精準的描繪程度。架構
再說『近似最近鄰』,ANN(Approximate Nearest Neighbor)/近似最近鄰一直是一個很熱的研究領域。由於在海量樣本的狀況下,遍歷全部樣本,計算距離,精確地找出最接近的Top K個樣本是一個很是耗時的過程,尤爲有時候樣本向量的維度也至關高,所以有時候咱們會犧牲掉一小部分精度,來完成在很短的時間內找到近似的top K個最近鄰,也就是ANN,最多見的ANN算法包括局部敏感度哈希/locality-sensitive hashing,最優節點優先/best bin first和Balanced box-decomposition tree等,咱們系統中將採用LSH/局部敏感度哈希來完成這個過程。有一些很是專業的ANN庫,好比FLANN,有興趣的同窗能夠了解一下。框架
圖像檢索系統和關鍵環節以下圖所示: 函數
圖像檢索過程簡單說來就是對圖片數據庫的每張圖片抽取特徵(通常形式爲特徵向量),存儲於數據庫中,對於待檢索圖片,抽取一樣的特徵向量,而後並對該向量和數據庫中向量的距離,找出最接近的一些特徵向量,其對應的圖片即爲檢索結果。學習
基於內容的圖像檢索系統最大的難點在上節已經說過了,其一爲大部分神經網絡產出的中間層特徵維度很是高,好比Krizhevsky等的在2012的ImageNet比賽中用到的AlexNet神經網,第7層的輸出包含豐富的圖像信息,可是維度高達4096維。4096維的浮點數向量與4096維的浮點數向量之間求類似度,運算量較大,所以Babenko等人在論文Neural codes for image retrieval中提出用PCA對4096維的特徵進行PCA降維壓縮,而後用於基於內容的圖像檢索,此場景中效果優於大部分傳統圖像特徵。同時由於高維度的特徵之間類似度運算會消耗必定的時間,所以線性地逐個比對數據庫中特徵向量是顯然不可取的。大部分的ANN技術都是將高維特徵向量壓縮到低維度空間,而且以01二值的方式表達,由於在低維空間中計算兩個二值向量的漢明距離速度很是快,所以能夠在必定程度上緩解時效問題。ANN的這部分hash映射是在拿到特徵以外作的,本系統框架試圖讓卷積神經網在訓練過程當中學習出對應的『二值檢索向量』,或者咱們能夠理解成對所有圖先作了一個分桶操做,每次檢索的時候只取本桶和臨近桶的圖片做比對,而不是在全域作比對,以提升檢索速度。spa
論文是這樣實現『二值檢索向量』的:在Krizhevsky等2012年用於ImageNet中的卷積神經網絡結構基礎上,在第7層(4096個神經元)和output層之間多加了一個隱層(全鏈接層)。隱層的神經元激勵函數,能夠選用sigmoid,這樣輸出值在0-1之間值,能夠設定閾值(好比說0.5)以後,將這一層輸出變換爲01二值向量做爲『二值檢索向量』,這樣在使用卷積神經網作圖像分類訓練的過程當中,會『學到』和結果類別最接近的01二值串,也能夠理解成,咱們把第7層4096維的輸出特徵向量,經過神經元關聯壓縮成一個低維度的01向量,但不一樣於其餘的降維和二值操做,這是在一個神經網絡裏完成的,每對圖片作一次完整的前向運算拿到類別,就產出了表徵圖像豐富信息的第7層output(4096維)和表明圖片分桶的第8層output(神經元個數本身指定,通常都不會不少,所以維度不會很高)。引用論文中的圖例解釋就是以下的結構:.net
上方圖爲ImageNet比賽中使用的卷積神經網絡;中間圖爲調整後,在第7層和output層之間添加隱層(假設爲128個神經元)後的卷積神經網絡,咱們將複用ImageNet中獲得最終模型的前7層權重作fine-tuning,獲得第7層、8層和output層之間的權重。下方圖爲實際檢索過程,對於全部的圖片作卷積神經網絡前向運算獲得第7層4096維特徵向量和第8層128維輸出(設定閾值0.5以後能夠轉成01二值檢索向量),對於待檢索的圖片,一樣獲得4096維特徵向量和128維01二值檢索向量,在數據庫中查找二值檢索向量對應『桶』內圖片,比對4096維特徵向量之間距離,作重拍即獲得最終結果。圖上的檢索例子比較直觀,對於待檢索的」鷹」圖像,算得二值檢索向量爲101010,取出桶內圖片(能夠看到基本也都爲鷹),比對4096維特徵向量之間距離,從新排序拿獲得最後的檢索結果。rest
通常說來,在本身的圖片訓練集上,針對特定的場景進行圖像類別訓練,獲得的神經網絡,中間層特徵的表達能力會更有針對性一些。具體訓練的過程能夠第3節中的說明。對於不想本身從新費時訓練,或者想快速搭建一個基於內容的圖片檢索系統的同窗,這裏也提供了100w圖片上訓練獲得的卷積神經網絡模型供你們使用。
這裏提供了2個預先訓練好的模型,供你們提取『圖像特徵』和『二值檢索串』用。2個模型訓練的數據集一致,卷積神經網絡搭建略有不一樣。對於幾萬到十幾萬級別的小量級圖片創建檢索系統,請使用模型Image_Retrieval_20_hash_code.caffemodel,對於百萬以上的圖片創建檢索系統,請使用模型Image_Retrieval_128_hash_code.caffemodel。
對於同一張圖片,二者產出的特徵均爲4096維度,但用做分桶的『二值檢索向量』長度,前者爲20,後者爲128。
引用:http://blog.csdn.net/han_xiaoyang/article/details/50856583