天天看點

以圖搜圖技術演進和架構優化【優質文章】

進階研究員:李習華

當你看到一株未曾見過的植物,你可以打開百度APP,拍照搜尋,找到相關資訊;當你看到朋友穿了一件你特别喜歡的衣服,你也想買一件,你可以通過淘寶APP的拍立淘功能,找到商品;當你到達一個陌生的地方,你可以通過微信APP對着當地的街區或者建築物拍一張照片,來定位你的詳細位置。這背後都是強大的以圖搜圖技術。

以圖搜圖技術發展了許多年,從早期以圖搜圖的精度不盡如人意,到後來基于以圖搜圖技術開發出非常多的改變使用者行為和提升效率的應用,經曆了不小于10年的發展,整體的技術方案,資料量級,工程架構都進行了多輪的疊代。目前,各個大廠都在基于以圖搜圖技術來提供更好的産品,服務;我們希望在這篇文章中對以圖搜圖技術做一個全面的總結,主要包含以下幾個方面:

1. 以圖搜圖技術的通用架構;

2. 以圖搜圖技術疊代;

3. 以圖搜圖是工程+算法的結合,架構演進;

Part 1. 以圖搜圖技術的通用架構

在這一章,我們來介紹以圖搜圖技術的通用架構。在介紹以圖搜圖技術之前,我們來看任何一個搜尋技術所擁有的基本元件。舉個例子,我們需要到圖書館查找一本書,需要幾個基本的要素:1. 圖書館(海量圖書);2. 圖書的分類、書名或者作者(在圖書館的編碼體系下,這些資訊的組合能夠唯一表示這一本書);3. 圖書館的書需要按照一定的規律來布置(科目、難易程度、首字母、作者、年份等);在有了這些基本的要素之外,隻要圖書館有這本書,我們就能夠快速找到它;或者即便沒有某一本具體的書,我們也能夠查詢到這本書相近内容的書。

結合上面的例子,我們來看一個典型的以圖搜圖系統所擁有的基礎架構:

以圖搜圖技術演進和架構優化【優質文章】

先來看offline部分,包括3個基本的要素:

01. 檢索圖檔庫:這就相當于上一個例子中的圖書,我們需要有一個足夠規模的圖檔庫,比如淘寶的所有商品的圖檔集合,比如百度圖檔搜尋中收集到的網際網路圖檔資料集合。當然,這裡我們介紹的是一個靜态的圖檔庫,在實際項目中,我們需要有能力來處理動态變化的圖檔資料庫;

02. 特征提取:這就相當于上一個例子中圖書的作者、年份、科目等等,我們稱為圖檔的特征。實際上,圖檔的任何統計量都可以作為圖檔的特征,甚至圖像的像素值本身通過歸一化之後也可以作為圖檔的特征。在實際中,我們使用圖檔的顔色分布、梯度變化統計量、紋理、BOW統計、底層/中層/高層語義特征等作為圖檔的特征,非常豐富。

03. 檢索結構:檢索結構的唯一目的就是讓查找更快更準。簡單的,一一對比是最簡單的查詢結構,最準,但是最慢;是以所有檢索結構本質上都是效率和精度的平衡。常見的,我們可以對資料集進行聚類,把資料分成一堆一堆的,比對時先選擇相似的堆,然後在堆内部再進行細緻的比對。而分堆的理念又可以通過樹結構、Hash結構、反向索引、圖結構等等來刻畫。

再來看online部分,其中特征提取和offline的特征提取需要保持高度的一緻性,是以實際中我們通常使用一個單獨的特征伺服器來提供特征提取服務。這裡為什麼将檢索結構和檢索引擎分開,主要是基于如下的考慮:檢索引擎需要應對高并發等一些的工程方面的問題,是以本質上檢索引擎更傾向于工程架構的優化,而檢索結構更傾向于檢索結構算法方面的優化;但實際上,二者是沒辦法完全拆分開的。

以圖搜圖技術本質上是尋找相似圖檔,但兩張圖檔是否相似有非常多的次元:

以圖搜圖技術演進和架構優化【優質文章】

是以在很多時候,以圖搜圖技術需要根據不同的使用場景來選擇合适的技術方案,尤其是特征的選擇。産品層面,也層出不窮,可以參考下面的幾個連結:

The Best Image Search Engines on the Webwww.lifewire.com

以圖搜圖技術演進和架構優化【優質文章】

The 7 Best Search Engines for Finding Free Images — SitePointwww.sitepoint.com

以圖搜圖技術演進和架構優化【優質文章】

Part 2. 以圖搜圖的技術疊代

這個部分我先打算介紹一下特征、檢索引擎各自都經曆了哪些疊代,然後在以不同時段典型的工業界的使用的方案來介紹以圖搜圖技術代際的疊代。

特征層面:

簡單的,圖像的單通道、多通道的顔色直方圖可以作為一個簡單的特征;進一步顔色矩特征,圖像中任何的顔色分布都可以通過它的矩來表示。另外需要強調的局部特征是SIFT特征,參考:

​​https://blog.csdn.net/abcjennifer/article/details/7639681blog.csdn.net​​

SURF特征,HOG特征等;當有了局部特征之後,我們需要對局部特征進行聚合,作為圖像的全局表示;将多個局部特征矢量聚合成一個統一次元的矢量表示的方法有:BOW、VLAD、Fisher Vector等等。深度學習技術興起之後,基于深度學習的圖像特征開始成為圖像檢索的主流。我們知道CNN網絡具有很多不同程度對圖像進行抽象的layer,較低的層得到的是圖像的簡單特征,而較高層得到的是圖像的語義相關的特征,不同層的特征在檢索層面精度有很大的差別,在Oxford Building資料集上,使用VGGNet進行簡單的測試,得到了如下的統計結果,參考:

圖像檢索:layer選擇與fine-tuning性能提升驗證yongyuan.name

以圖搜圖技術演進和架構優化【優質文章】
以圖搜圖技術演進和架構優化【優質文章】

實際上,深度網絡最後的FC層同樣可以作為圖像的特征表示,當使用FC作為特征的時,網絡訓練時使用的label對檢索的效果有較大的影響。理論上,label如果能夠提供更多的細粒度的資訊,則學習到的FC特征則更能夠表達圖像的細粒度特征。

特征類型對檢索效果影響很大;但特征的學習方式,尤其是引入度量學習的思路之後,即便是同一個網絡的同一層特征,不同的訓練方式對最後的精度也會有很大的影響。

比如Class weighted conv features,參考:

​​https://github.com/bikong2/retrieval-2017-camgithub.com​​

以圖搜圖技術演進和架構優化【優質文章】

分類loss和triplet loss結合:

以圖搜圖技術演進和架構優化【優質文章】

引入更多監督資訊的學習:

以圖搜圖技術演進和架構優化【優質文章】

以及通過KL散度來優化:

以圖搜圖技術演進和架構優化【優質文章】

其實通過不同的方式進行網絡學習的優化方式還有很多,這裡大緻總結幾個優化的大緻方向:

1. 引入更多的監督資訊;

2. 不同程度、次元的attention(包括層、channel、類等等);

3. Triplet loss及其各種變種;

4. 不同的特征聚合方式;

特征部分我們先介紹到這裡,下面來介紹檢索引擎。

檢索引擎:

檢索引擎方面,早期我們通過階層化的聚類來對資料分組,通過K-D Tree對資料進行劃分,通過Hash對空間進行劃分,通過反向索引加速檢索的效率,通過PQ量化對更大規模的資料進行二次方的劃分。參考:

​​https://blog.csdn.net/qq_27245709/article/details/72393613blog.csdn.net​​

圖像檢索:基于内容的圖像檢索技術yongyuan.name

以圖搜圖技術演進和架構優化【優質文章】

​​https://blog.csdn.net/CHIERYU/article/details/50347735blog.csdn.net​​

階層化的聚類算法可以通過如下的圖檔來表示:

以圖搜圖技術演進和架構優化【優質文章】

通過聚類來減少檢索時比對的檢索時間。K-D Tree和Hash請參考下面的圖檔。K-D Tree相對階層化聚類基本原理是一緻的,不過聚類算法更多的是資料的劃分,但樹結構的階層化劃分包含特征和資料的劃分兩方面。Hash方法,尤其是LSH(局部敏感哈希),則是同時在尋找特征的mapping和空間的劃分。

以圖搜圖技術演進和架構優化【優質文章】

PQ量化本質上是在特征和資料的兩個層面對資料集進行量化,如下圖所示,特征向量本身是16*8=128維,通過特征層面的劃分,分成y1…y8總共8組特征;劃分之後,對每一組特征在全資料集上進行聚類等量化手段,比如量化的長度是8bits的01向量。最終得到的是8*8bits的01向量,壓縮比超高。

以圖搜圖技術演進和架構優化【優質文章】

接下來,我們介紹兩代不同的以圖搜圖技術。

局部特征(如SIFT特征)+BOW+LSH的方案:

這種方案大緻在2015年之前算是比較流行的架構,通常針對特殊的使用場景,在檢索基礎上可能還需要進行細粒度的精排序。這個方案在10億以内的資料量級上非常适用,當然如果數量級更大,也是可以的,隻是需要引入其他的檢索結構。關于LSH,推薦使用一個開源的工具包FALCONN:

​​https://github.com/FALCONN-LIB/FALCONNgithub.com​​

CNN卷積特征+VLAD+PQ量化的方案:

這是目前比較主流的方案,卷積特征建議做多層特征的組合,PQ量化建議根據資料規模做密集的參數選擇,推薦使用Facebook開源的一個工具包FAISS:

facebookresearch/faissgithub.com

以圖搜圖技術演進和架構優化【優質文章】

當然,卷積特征的學習方式的選擇層面,需要根據實際擁有的資料的标簽資訊來決策。也有一些基于弱監督學習的方案,也可以嘗試。

Part 3. 以圖搜圖是工程+算法的結合,架構演進

在這裡,我們介紹一個理想狀态下的以圖搜圖架構,需要嘗試去解決的幾個問題:

1. 如何解決檢索庫動态增加的問題;

2. 如何解決全量的特征疊代的問題,也就是說query和database的特征需要同步;

3. 特征增強,在檢索結構确定的情況下獲得更好的檢索效果;

4. 高并發低延遲;

以圖搜圖技術演進和架構優化【優質文章】

以上隻是一個簡單的架構示意圖,如果涉及到特征評價,檢索結構評價,甚至其他的政策疊代等一些列的關于AB Test需要,架構層面需要進行深度的優化。

到這裡基本上對以圖搜圖技術從特征、檢索結構、架構等層面進行了一個基本的介紹。其實工業界的以圖搜圖産品或者說引擎遠比我寫到的要複雜,如果有大家有興趣,建議研究一下以下幾個檢索系統的演進:

阿裡的拍立淘

百度的圖檔搜尋