大廠技術實現 | 影像檢索及其在淘寶的應用 @計算機視覺系列

ShowMeAI發表於2022-01-22

大廠技術實現方案

影像檢索任務指的是,給定查詢影像,從影像資料庫中找到包含相同或相似例項的影像。典型應用之一就是電商商品檢索,如淘寶拍立淘,只需要使用者隨手拍照即可精準檢索,提高了電商購物的體驗。本篇我們來看看淘寶拍立淘背後的實現方案和依託的計算機視覺技術。

一圖讀懂全文

淘寶·拍立淘 | 影像檢索及其在淘寶的應用

獲取『計算機視覺』行業解決方案

『推薦與計算廣告』系列的專案實現程式碼、專案資料集、論文合輯、文章合輯等,已整理為大廠行業解決方案。前往公眾號(AI演算法研究所) 後臺回覆關鍵字『計算機視覺』獲取。

相關程式碼實現參考

ShowMeAI社群的技術專家小夥伴們也對影像檢索的典型演算法做了實現,構建了相關應用。對『基於CNN與三元組的影像檢索實現』細節感興趣的話,請前往我們的GitHub專案https://github.com/ShowMeAI-Hub/image_retrieval)檢視實現程式碼。感謝ShowMeAI社群參與此專案的所有技術專家小夥伴,也歡迎大家 PR 和 Star!

推薦閱讀 | 點選檢視『計算機視覺』系列教程

大廠技術實現 | 影像檢索及其在高德的應用 @計算機視覺系列


​影像檢索是一個在網際網路行業有著非常多應用場景的AI技術,典型應用例如電商商品檢索(淘寶『拍立淘』,京東『拍照購』),使用者隨手拍照即可精準檢索商品,整套實現的背後包含了非常多計算機視覺技術。本篇我們結合阿里CV方向資深演算法工程師Frank的分享,一起來看看淘寶拍立淘背後的實現方案和依託的計算機視覺技術。

一、影像檢索提升購物體驗

影像檢索任務指的是,給定一個包含特定例項(例如特定目標、建築、場景等)的查詢影像,從影像資料庫中找到包含相同/相似例項的影像。

因為不同影像的拍攝視角、光照、遮擋情況等不同,完成精準檢索需要很多演算法技術支撐,同時對於影像資料庫龐大的各大網際網路公司而言,查詢效率也是需要考慮的核心問題之一。

淘寶·拍立淘 | 影像檢索提升了電商購物體驗
以電商為例,淘寶拍立淘於2014年首次在APP中上線,現已經成為擁有數千萬日活使用者的應用。與傳統的基於文字搜尋的電商搜尋相比,拍立淘只需要使用者隨手拍一張照片,即可精準檢索,省去了繁瑣的文字描述,簡化了使用者的購物流程,大大提高了電商購物的體驗。

二、淘寶·拍立淘的影像搜尋流程架構

拍立淘的影像搜尋架構如下圖所示,架構整體分為離線和線上處理流程兩個部分。
影像檢索離線流程(Visual Search Offline Process)
影像檢索線上流程(Visual Search Online Process)

2.1 離線流程

離線處理的過程主要是定期對影像抽取特徵構建索引。完整的離線流程包括:

1. 檢測與特徵學習:構建離線影像選品,通過目標檢測在選品影像上提取感興趣的商品;

2. 特徵抽取:對商品進行特徵提取,構建大規模索引庫,放入影像搜尋引擎等待查詢;

3. 構建索引:以一定頻率保持索引庫更新。

影像檢索離線流程 | 關鍵步驟

2.2 線上流程

線上處理的過程主要是對使用者上傳的查詢圖片進行檢索返回庫內檢索結果。具體的步驟包括:

1. 品類識別:對查詢影像進行分類處理,識別商品類目;

2. 目標定位 & CNN特徵抽取:提取影像目標區域的特徵,基於相似性度量在索引引擎中搜尋產生候選;

3. 影像索引與重排:可以通過重排序進行結果商品重排並返回搜尋結果。

影像檢索線上流程 | 關鍵步驟

三、品類識別模組

3.1 影像選品處理

之所以做淘寶選品,是因為淘寶平臺存在非常多相同或高度相似的商品影像,直接使用會導致最終的搜尋結果出現大量相同的商品寶貝,影響使用者體驗。

淘寶包含大量不同來源的商品影像,例如和商品對應的『主圖』、『SKU圖』、『拆箱圖』等。首先,需要對這些海量影像做一個篩選,選出使用者相對感興趣的影像作為商品影像構建索引。

品類識別模組 | 影像選品過濾的原理
這個過程相當於『根據影像附帶的屬性和影像質量等對整個影像庫進行過濾』。新增影像選品過濾模組後,會每天定時選擇和刪除重複或高度相似的商品影像,進而優化索引檔案。

3.2 基於模型&搜尋結合的類目預測

淘寶的類目體系是基於葉子類目的層次化結構,這樣可以兼顧視覺和語義相似性。 淘寶在拍立淘中先影像進行預測,得到14個大類目之一的結果,如服飾、鞋、包等,這個處理可以縮小影像庫的搜尋空間。具體實現採用基於模型與搜尋結合的方式,如下:

品類識別模組 | 基於模型&搜尋的類目預測

3.2.1 基於模型的預測模組

  1. 採用 GoogLeNet V1 網路結構來權衡高精度和低延遲,使用包含不同商品類目標籤的影像集進行訓練;
  2. 將輸入影像的大小 resize 為 256×256,隨機裁剪到 227×227 ,使用 Softmax(交叉熵)損失函式作為分類任務的損失函式。

3.2.2 基於搜尋的預測模組

該模組不直接訓練分類模型,而是基於相似度與匹配思想,使用特徵模型和待檢索資料庫完成基於搜尋的加權KNN分類。具體的預測流程為

  1. 獲取使用者輸入的待分類圖片;
  2. 應用基於搜尋的分類方法:對圖片特徵提取,並在待檢索的資料庫中找出 Top-K 個和它相似的圖片,根據這些圖片的類目標籤對輸入圖片進行預測。

3.2.3 淘寶·拍立淘應用實踐

  • 離線部分。淘寶收集了2億張附帶『真實類別標籤』的影像作為參考影像庫,訓練一個通用類目的特徵模型對參考影像庫離線提取通用特徵並構建索引。
  • 線上部分。實際預測時,對查詢影像提取通用特徵,並在影像參考集中檢索Top 30的結果。通過查詢影像的Top 30個鄰居,再根據每個的類目標籤加權投票,以預測待查詢影像的標籤 。其中,加權函式為查詢影像與鄰居圖片的距離函式。

淘寶·拍立淘實踐 | 基於模型&搜尋的類目預測

品類識別的效果提升。 淘寶將『基於模型的預測結果』和『基於搜尋的結果』再一次加權融合,以進一步提高類目預測的準確性。 相比於單方法,兩者融合的方式,使得淘寶最終類目預測的精度提高了 2% 以上。 ​

四、目標檢測&特徵聯合學習&度量學習模組

淘寶場景下,應用拍立淘進行影像搜尋,有一個大挑戰:使用者和商家影像之間存在巨大差異。商家的商品圖片通常質量都非常高,拍攝環境和裝置也非常好。而使用者查詢的影像,通常是用手機攝像頭拍攝的,伴隨著光照、模糊和複雜的背景等一系列問題。

為了減少複雜的背景影響,系統需要具備在影像中『定位主體目標』並『提取主體特徵』的能力。淘寶提出了基於度量學習的分支網路CNN框架,來聯合學習主體檢測框和特徵表示,以實現在沒有背景干擾的情況下使使用者實拍影像和商家的索引影像特徵保持一致。

目標檢測 & 特徵聯合學習 & 度量學習模組

圖例顯示了,是否進行目標主體檢測與針對性檢索的效果差別:

  • 第1行沒有進行主體檢測,檢索結果明顯受到了背景干擾;
  • 第2行採用主體檢測,檢索結果有非常顯著的效果提升。

基於度量學習的分支網路CNN框架 | 主體檢測

4.1 三元組挖掘

4.1.1 原理簡介

在度量學習中,利用三元組樣本,構建『三元組損失函式(Triplet Loss Function)』是當前比較常見和有效的一種處理方式。

這個方法最早由Google研究團隊在論文《 FaceNet:A Unified Embedding for Face Recognition》中提出,常用於人臉識別任務,目的是做到非同類極相似樣本的區分(如對兄弟二人的區分)。

它的基本思想是:對於設定的三元組(Anchor , Positive , Negative),Triplet Loss 試圖學習到一個特徵空間,使得在該空間中相同類別的基準樣本(Anchor)與 正樣本(Positive)距離更近,不同類別的 Anchor 與負樣本(Negative)距離更遠。

三元組學習建模原理

說明:Anchor 和 Positive 為同類的不同樣本;Anchor 與 Negative 為異類樣本。舉例:在影像檢索場景下,與檢索圖片同樣的主體內容是Positive,不一樣的是Negative。

4.1.2 方法優缺點

  • 優點1:基於 Triplet Loss 的神經網路模型,可以對細節進行很好地區分。 尤其是在影像分類任務中,當兩個輸入很相似的時候,Triplet Loss 對這兩個差異性較小的輸入向量,可以學習到更好的、細微的特徵 Feature,從而在分類任務中表現出色。
  • 優點2:相比其他分類損失函式,Triplet Loss 能夠根據模型訓練的需要設定一定的閾值。 帶 Triplet Loss 的網路結構,在進行訓練的時候一般都會設定一個閾值 margin,設計者可以通過改變 margin 的值來控制正負樣本的距離。

雖然 Triplet Loss 很有效,但也有缺點:

  • 缺點1:三元組的選取,導致資料的分佈並不一定均勻,所以在模型訓練過程表現很不穩定且收斂慢,需要根據結果不斷調節引數。
  • 缺點2:Triplet Loss 比分類損失更容易過擬合。

三元組樣本挖掘優缺點總結

4.1.3 淘寶拍立淘應用實踐

在淘寶拍立淘的場景中,給定一張輸入影像,核心問題是利用影像特徵可靠地匹配來自使用者和賣家的不同源影像。 對應到三元組場景,我們需要拉近『查詢影像』與其『同款商品影像』之間的距離,並拉遠『查詢影像』與『不同款商品影像』之間的距離。

這裡採用的 Triplet Loss 三元組損失函式如下:

\(\operatorname{loss}\left(q, q^{+}, q^{-}\right)=\left[L 2\left(f(q), f\left(q^{+}\right)\right)-L 2\left(f(q), f\left(q^{-}\right)\right)+\delta\right]_{+}\)

  • \(L2\) 表示兩個向量之間的 \(L2\) 距離
  • \(\delta\) 是控制間隔的引數
  • \(f\) 是需要學習的 CNN 特徵提取方式,可以通過端到端的訓練學習到

4.1.4 三元組樣本挖掘

方法思路如上,但模型訓練需要依靠大量樣本,這裡的核心是『挖掘較難的三元組樣本』。 簡單的處理方式是,從與查詢影像相同的類目中選擇正樣本影像,從其他類目中選擇負樣本影像。這種方式存在的問題是:負樣本影像與查詢影像存在較大的視覺差異,導致訓練過程中三元組排序損失函式很容易為零,沒有貢獻任何損失。

實際上,淘寶應用『使用者點選資料』來『挖掘較難的三元組樣本』,具體流程如下圖:

淘寶·拍立淘實踐 | 以使用者點選資料來挖掘三元組樣本

  • 基本思路

在影像檢索場景下,很大一部分使用者會在返回列表中點選同款的商品影像,這意味著『點選的影像』可以被視為『查詢影像的正樣本影像』,『未點選影像』可以作為『難負樣本影像』,它們類似於查詢影像但屬於非同款商品影像。

  • 問題點&解決方式

上述的思路中,『未點選的影像』仍然可能是『與查詢影像具有同款商品的影像』,因為當許多同款的寶貝影像被返回時,使用者只會點選結果中的一個或兩個,我們需要過濾『未點選且與查詢影像具有同款商品的影像』。

三元組樣本挖掘 | 負樣本構建 & 正樣本構建

  • 負樣本構建

最終『查詢影像的負樣本影像』計算如下:

\(q^{-} \in\left\{d^{\text {nonclick }} \mid \min \left[\operatorname{dist}\left(d^{\text {nonclick }}, q\right), \operatorname{dist}\left(d^{\text {nonclick }}, d^{\text {click }}\right)\right] \geqslant \gamma\right\}\)

  • \(dist\) 為特徵的距離函式
  • \(\gamma\) 為距離閾值

淘寶拍立淘對距離計算做了一些設計,採用了多特徵融合的方法,結合了『區域性特徵』、『不同版本特徵』和『ImageNet預訓練的通用特徵』等,從而更準確地發現噪聲負樣本。

  • 正樣本構建

類似的思路,更精確的『查詢圖片正樣本』選取方式如下公式所示:

\(q^{+} \in\left\{d^{\text {click }} \mid \operatorname{dist}\left(d^{\text {click }}, q\right) \leqslant \varepsilon\right\}\)

  • 資料擴增

拍立淘的樣本構建時,在小批量中獲取的三元組之間,共享所有負樣本影像。這樣可以擴充套件小批量中的所有可用三元組資料,增加更多訓練資料。不採用共享機制,生成 \(m\) 個三元組,通過共享負樣本,可以在進入損失層之前生成m平方個三元組。

  • 損失函式優化

為進一步減少訓練影像中的噪聲,對原始三元組排序損失函式進行改進:

在這裡插入圖片描述

改進的思路,是針對同一查詢影像的所有三元組樣本計算平均損失,這樣可以最大程度地減少噪聲三元組的影響。 通過查詢影像層面的三元組損失函式,學習CNN 特徵,從而將使用者的實拍影像和商家的高質量影像對映到同一特徵空間,使得不同來源的影像能夠更可靠地匹配。

Triplet Loss 的簡單程式碼實現示例

class TripletLoss(nn.Module):
"""
pytorch上的Triplet Loss實現
"""
def __init__(self, margin):
    super(TripletLoss, self).__init__()
    self.margin = margin
def forward(self, anchor, positive, negative, size_average=True):
    distance_positive = (anchor - positive).pow(2).sum(1)  # .pow(.5)
    distance_negative = (anchor - negative).pow(2).sum(1)  # .pow(.5)
    losses = F.relu(distance_positive - distance_negative + self.margin)
    return losses.mean() if size_average else losses.sum()

4.2 Deep Ranking 網路

4.2.1 網路結構

整個流程中重要的一個環節是『剔除背景噪聲,檢測出主體物件』。計算機視覺中,目標檢測的方法是部署現成的主體檢測演算法(如 Faster R-CNN 或 SSD),但這類方法時延較長而且需要大量邊界框的標註。

淘寶拍立淘提出『兩個分支的聯合網路模型』,來同時學習檢測和特徵表示。分支網路模型結構如下圖所示:

Deep Ranking | 兩個分支的深度聯合網路模型

4.2.2 引數學習與訓練

以上個步驟中挖掘的三元組為監督資訊,在Deep Ranking 框架下學習該聯合模型。這種方式下,可以通過三元組正負樣本度量關係來學習出判別特徵,同時,根據分支結構迴歸出對特徵判別起到重要作用的物件主體掩膜。在不需要邊界框標註的情況下,主體掩膜通過分支結構以類似注意力的機制被學習出來。 總體來說,Deep Ranking 框架如下圖所示。

Deep Ranking | 以三元組為輸入的三個深度聯合網路模型

Deep Ranking 框架下的每個深度聯合模型都共享引數,檢測的掩膜函式 \(M(x , y)\) 如下公式所示,先利用檢測分支迴歸出矩形座標 \((x_{1} , x_{r}, y_{t} , y_{b})\),再使用階躍函式 \(h\) 表示:

在這裡插入圖片描述

主體邊界框區域是輸入影像 \(I(x,y)\)\(M(x,y)\) 按位點乘得到的。然而,階躍函式 \(h\) 是不可微的。為了端到端地訓練,我們可以用 \(Sigmoid\) 函式來逼近階躍函式。

\(f(x)=\frac{1}{1+\mathrm{e}^{-k x}}\)

\(K\) 足夠大時使其可微化。 整個過程只需要弱監督的使用者點選資料,不需要依賴邊界框的標註進行訓練,這大大降低了人力資源成本,提高了訓練效率。

五、影像索引與重排模組(Image Indexing & Re-ranking)

5.1 十億級大規模影像檢索引擎

實際引擎端為了最大程度加快響應速度,淘寶拍立淘使用大規模二值引擎進行查詢和排序,整體採用 Multi-shards 和 Multi-replications 引擎架構。

影像索引與重排模組 | 能快速響應的引擎架構

5.1.1 結構框架

結構如下圖所示,它保證了大量使用者查詢下的快速響應,同時又具有非常好的可擴充套件性。
Multi-shards和Multi-replications 引擎架構 | 原理

  • Multi-shards

單機記憶體無法儲存龐大的特徵資料,因此特徵被儲存到多個節點上。每次查詢,將從每個節點檢索出 Top-K 結果,將其合併得到最終的結果。

  • Multi-replications

單個特徵資料庫無法應對大量的查詢流量,特徵資料庫被複制多份,從而將查詢流量分流至不同的伺服器叢集上,以降低使用者的平均查詢時間。

5.1.2 粗篩選和精排序

在每個節點,使用兩種型別的索引:粗篩選和精排序,解釋如下:
Multi-shards和Multi-replications 引擎架構 | 節點

粗篩選:採用改進的基於二值特徵(CNN 特徵二值化)的二值倒排索引檢索。

  1. 以影像ID為關鍵字、二值特徵為值,通過漢明距離計算,快速濾除大量不匹配資料。
  2. 根據返回的影像資料的二進位制編碼,對最近鄰進行精排序。

精排序:根據附加後設資料(如視覺屬性和特徵)對粗篩選出的候選項進行更精確的排序。精排過程較慢:

  1. 後設資料以非二進位制形式儲存
  2. 後設資料的儲存開銷太大,無法將其全部載入記憶體中。這裡快取命中率是影響效能的關鍵因素。

通過粗篩選精排序(這個過程和推薦系統中的召回+排序非常類似),基本可以滿足達到無損精度的召回結果,且檢索效率大幅提升。

5.2 結合多資訊維度的結果重排

5.2.1 存在的問題

上面的影像檢索結果,基於計算機視覺與深度學習排序,儘量精準地檢索回圖片商品。但迴歸到電商的本質,同款商品可能有很多不同的配圖。匹配最接近檢索圖片形態的同款商品結果,並不能保證它們是最能激發使用者點選和購買的商品。

淘寶·拍立淘實踐 | 結合多資訊維度的結果重排

5.2.2 淘寶·拍立淘的解決方案

業務目標調整變更之後,變成了1個綜合排序問題,最後要根據結果列表裡的商品的價格、好評度、銷量、使用者畫像等綜合資訊重排序。 經過上述影像檢索的過程,淘寶拍立淘得到的初步結果列表包含 Top 60 影像相似度的同款結果,進一步利用語義資訊對 Top 60 的結果進行重新排序,包括使用銷量、轉化率、點選率、使用者畫像等。

  • 簡單的處理方式可以是利用 GBDT+LR 這種傳統模型,對不同維度的相關描述特徵進行整合,將最終得分歸一化到0,1,以保證外觀相似度的同時,綜合考慮其他屬性維度的重要性。
  • 更精準的排序方式,可以考慮 CTR 預估模型與多目標優化的複雜網路方法,參考『多目標排序』 『愛奇藝多目標』等過往文章。結合多資訊維度的結果重排序階段,使得最終結果在保持整體外觀相似性的同時,對質量差的影像進行降權與過濾,獲得更符合使用者意圖的商品影像。

六、相關程式碼實現參考

在這裡插入圖片描述

獲取『計算機視覺』行業解決方案

『推薦與計算廣告』系列的專案實現程式碼、專案資料集、論文合輯、文章合輯等,已整理為大廠行業解決方案。前往公眾號(AI演算法研究所) 後臺回覆關鍵字『計算機視覺』獲取。

相關程式碼實現參考

ShowMeAI社群的技術專家小夥伴們也對影像檢索的典型演算法做了實現,構建了相關應用。對『基於CNN與三元組的影像檢索實現』細節感興趣的話,請前往我們的GitHub專案https://github.com/ShowMeAI-Hub/image_retrieval )檢視實現程式碼。感謝ShowMeAI社群參與此專案的所有技術專家小夥伴,也歡迎大家 PR 和 Star!

推薦閱讀 | 點選檢視『計算機視覺』系列教程

大廠技術實現 | 影像檢索及其在高德的應用 @計算機視覺系列

七、參考文獻

[1] Shaoqing Ren, Kaiming He, Ross B Girshick,et al. Faster R-CNN: Towards Real-Time Object Detection with Region ProposalNetworks. IEEE Transactions on Pattern Analysis and MachineIntelligence(T-PAMI), 2017:1137–1149.
[2] Wei Liu, Dragomir Anguelov, Dumitru Erhan,et al. SSD: Single Shot MultiBox Detector. In European Conference on ComputerVision (ECCV), 2016:21–37.
[3] YanhaoZhang, Pan Pan, Yun Zheng,et al. Visual Search at Alibaba. In Proceedings of the 24th InternationalConference on Knowledge Discovery and Data Mining (SIGKDD), 2018:993-1001
[4] Yushi Jing, David C Liu, Dmitry Kislyuk,et al. Visual Search at Pinterest. In Proceedings of the 21th InternationalConference on Knowledge Discovery and Data Mining (SIGKDD), 2015:1889–1898
[5] Christian Szegedy, Wei Liu, Yangqing Jia,et al. Going deeper with convolutions. In IEEE Conference on Computer Visionand Pattern Recognition(CVPR), 2015:1–9.
[6] Jiang Wang, Yang Song, Thomas Leung, etal. Learning Fine-Grained Image Similarity with Deep Ranking. In IEEEConference on Computer Vision and Pattern Recognition(CVPR), 2014:1386–1393.
[7] OlgaRussakovsky, Jia Deng, Hao Su, et al. ImageNet Large Scale VisualRecognition Challenge. (2014). arXiv:arXiv:1409.0575, 2014.


作者:韓信子@ShowMeAI,Frank@淘寶
地址:http://showmeai.tech/article-detail/taobao-image-retrieval
宣告:版權所有,轉載請聯絡平臺與作者並註明出處

showmeai

相關文章