使用Keras構建深度影像搜索引擎
- 2019 年 12 月 12 日
- 筆記
作者 | Youness Mansar
編譯 | VK
來源 | Towards DataScience
動機
想像一下,如果有數十萬到數百萬張影像的數據集,卻沒有描述每張影像內容的元數據。我們如何建立一個系統,能夠找到這些影像的子集來更好地回答用戶的搜索查詢?
我們基本上需要的是一個搜索引擎,它能夠根據影像與搜索查詢的對應程度對影像結果進行排序,可以用一種自然語言表示,,也可以用其他查詢影像表示。
我們將在本文中解決問題的方法是訓練一個深度神經模型,該模型學習任何輸入影像和文本的固定長度表示形式(或嵌入形式),使得如果文本-影像或影像-影像是「相似的」,則他們在歐氏空間中接近。
數據集:
我找不到足夠大的搜索結果排名數據集,但我能夠得到這個數據集: http://jmcauley.ucsd.edu/data/amazon/ 它將電子商務項目的影像鏈接到它們的標題和描述。我們將使用這些元數據作為監督源來學習有意義的聯合文本-影像表示。為了管理計算和存儲成本,這些實驗僅限於時尚(服裝、鞋子和珠寶)物品和50萬張影像。
問題設置:
我們的數據集將每個影像與用自然語言編寫的描述鏈接起來。因此,我們定義了一個任務,在該任務中,我們要學習影像和文本的固定長度的聯合表示,以便每個影像表示都接近其描述的表示。

模型:
該模型有3個輸入:影像(即錨點)、影像標題與描述(即正例)和第三個輸入是一些隨機取樣的文本(即負例)。
然後定義兩個子模型:
- 影像編碼器:Resnet50預訓練的ImageNet+GlobalMaxpooling2D
- 文本編碼器:GRU+GlobalMaxpooling1D
影像子模型產生錨點E_a的嵌入,文本子模型輸出正標題和描述E_p的嵌入和負例文本E_n的嵌入。
然後,我們通過優化以下損失函數進行訓練:
L = max( d(E_a, E_p)-d(E_a, E_n)+alpha, 0)
其中d為歐氏距離,alpha為超參數,在本實驗中為0.4。
基本上,這種損失允許做的是使d(E_a, E_p)變小,使d(E_a, E_n)變大,這樣每個影像的嵌入就接近於它的描述的嵌入,而遠離隨機文本的嵌入。
可視化結果:
一旦我們學習了影像嵌入模型和文本嵌入模型,我們就可以通過使用tsne (https://scikit-learn.org/stable/modules/generated/sklearn.manifold.TSNE.html)將它們投影到二維空間中來實現可視化。 測試影像及其對應的文本描述用綠線連接:

從圖中可以看出,通常在嵌入空間中,影像及其對應的描述是接近的。考慮到使用的訓練損失,這是我們期望的。
文字圖片搜索:
在這裡,我們使用幾個文本查詢示例來在一組70,000張影像中搜索最佳匹配。我們計算查詢的文本嵌入,然後計算集合中每個影像的嵌入。我們最終在嵌入空間中選擇最接近查詢的前9張影像。


這些例子表明,嵌入模型能夠學習影像的有用表示形式和簡單單片語成的嵌入。
影像搜索:
在這裡,我們將使用影像作為查詢,然後在包含70,000張影像的資料庫中搜索與之最相似的示例。排序是由每對影像在嵌入空間內的歐氏距離決定的。


結果表明,生成的嵌入是影像的高級表示,它捕獲了所表示對象的最重要特徵,而不受方向、光照或局部細節的過度影響,也沒有經過明確的訓練。
結論: 在這個項目中,我們研究了機器學習模組,它允許我們構建一個基於關鍵字和影像的搜索引擎,應用於影像集合。其基本思想是學習一個有意義的文本和影像的聯合嵌入函數,然後利用嵌入空間中項之間的距離對搜索結果進行排序。
參考文獻:
- Large Scale Online Learning of Image Similarity Through Ranking
- Ups and downs: Modeling the visual evolution of fashion trends with one-class collaborative filtering
- https://github.com/KinWaiCheuk/Triplet-net-keras/blob/master/Triplet%20NN%20Test%20on%20MNIST.ipynb
程式碼: 重現結果 => https://github.com/CVxTz/image_search_engine