讓剁手更便捷,蘑菇街視覺搜索技術架構實踐
原創【51CTO.com原創稿件】眾所周知,圖像檢索屬于計算機視覺領域被研究得較早、且較為廣泛的方向。按照描述圖像內容方式的不同,一般可以分為兩大類:基于文本的圖像檢索(TBIR)和基于內容的圖像檢索(CBIR)。
2018 年 11 月 30 日-12 月 1 日,由 51CTO 主辦的 WOT 全球人工智能技術峰會在北京粵財 JW 萬豪酒店隆重舉行。
本次峰會以人工智能為主題,來自于美麗聯合集團的宋宏亮給大家介紹《視覺搜索技術系統與業務應用》。
本次分享將從如下三個部分展開:
- 視覺分享的背景與現狀
- 蘑菇街視覺搜索技術架構與研發
- 系統及業務應用
視覺分享的背景與現狀
基于文本的圖像檢索方法始于上世紀70年代,它利用文本標注的方式對圖像中的內容進行描述,從而為每張圖像產生內容描述的關鍵詞,包括圖像中的物體和場景等。
這種方式既可以采用人工標注,也可以通過圖像識別技術,來實現半自動化的標注。在檢索時,系統可以根據用戶所提供的查詢關鍵字,找出那些與關鍵字相對應的圖片,并返回給用戶。
由于具有易于實現的優點,因此在一些中小型規模的圖像搜索應用中,該方法仍在被繼續使用著。
當然,該方式也存在著如下缺陷:
- 對于大規模的圖像數據而言,由于在標注過程中需要有人工的介入,因此不但耗時耗力,而且持續涌入的新圖像也會干擾到人工標注。
- 在需要精確查詢時,用戶可能很難用簡短的關鍵字,來描述出自己真正想要獲取的圖像。
- 人工標注的過程,不可避免地會受到標注者的認知水平、言語使用、以及主觀判斷等方面的影響,因此會產生文字描述的差異性。
隨著圖像數據的快速增長,上述針對基于文本檢索方法的問題日益凸現。因此,業界普遍認為:索引圖像信息的最有效方式應該基于圖像內容自身。
此類方式是將對于圖像內容的表達和相似性,交給計算機自行處理,充分發揮其計算優勢,并大幅提升檢索的效率。
不過,基于內容檢索方法也存在著一項主要缺點:特征描述與高層語義之間存在著難以填補的鴻溝。
由于受到環境的干擾較大,因此我們需要選擇那些抗干擾性較強的、具有不變性局部特征的方法,如SIFT。同時,我們也要求此類方法應具有較高的特征維度。
近年來,以深度學習(尤其是卷積神經網絡CNN)為主的自動化圖像特征檢索方法,得以廣泛應用。
它能夠極大地提高檢索的精度。而且,我們可以使用PCA等降維手段,來構建出高效合理的快速檢索機制,以適應大規模或海量圖像的檢索任務。
上圖是基于內容圖像檢索的基本框架。我們可以事先建立好圖像特征矢量的描述,并存入圖像特征庫中。
當用戶輸入一張待查詢的圖像時,它會使用相同的方法,提取待查詢圖像的特征,并得到查詢的向量。
然后在某種相似性的度量準則下,計算查詢向量與特征庫中各個特征的相似性大小。最后按照相似性的大小進行排序,并順次輸出對應的圖片。
對于我們的電商場景而言,各種數據的來源一般分成兩塊:
- 賣家端:普通賣家,上傳商品主圖、附圖、SKU圖、以及各種詳情圖。主播,生產直播內容,包含商品截圖和視頻等。
- 用戶端:普通用戶,上傳對應的UGC內容、以及買家秀圖片等。達人,產生PGC之類的內容。
這些圖像數據不但體量龐大,而且具有“天然”的結構化信息。商家在上傳時,便能通過填寫圖片所對應的類目和屬性,完成明晰的標注。
而有了基礎的數據來源,我們就能通過構建后臺圖像數據庫,來進行款式屬性的識別,OCR文字的識別、以及圖像特征的檢索等操作。
在此基礎上,結合各種運營活動與策略,我們就能夠在前端將商品展現出去,對便用戶進行瀏覽和購買。
眾所周知,物體容易受拍攝環境的影響。比如:光照變化、尺度變化、視角變化、遮擋以及背景雜亂等因素,都會對檢索結果造成較大的影響。
此外,電商還面臨著來自如下方面的挑戰:
- 電商平臺每天都有頻繁的上、下架商品,它們給索引的整體構建帶來了巨大挑戰。
- 規模是把雙刃劍,雖然我們擁有了足夠多的數據進行模型訓練,但是龐大的數據也對整體搜索構成了巨大的壓力。
- 數據質量無法保障,尤其是那些用戶上傳的各種買家show圖片,以及商家打錯類目標簽的問題。
- 用戶的查詢也會存在著多樣性,包括對于各種上傳商品圖、視頻截圖、以及實拍圖的需求。
蘑菇街視覺搜索技術架構與研發
基于上面提到的數據特點與挑戰,我們研發了自己的視覺搜索技術架構。如上圖所示,其流程為:
- 在接到用戶的查詢請求之后,我們會對類目進行預測。
- 通過目標檢測,我們得到所需的內容。
- 通過特征提取器,提取圖像的特征表達。
- 基于ANN檢索,得到充分的檢索結果。
- 通過Rerank方式,得到檢索的最終結果。
基于上述流程,我們來依次介紹其不同的環節。對于類目預測而言,我們分為三個方向:
- 由于輸入數據較為雜亂,因此我們需要對圖像進行質量評估,處理掉質量較差、或不宜于展示的圖片,以提升用戶的體驗。
- 基于同圖的過濾方式,處理掉數據庫中的同圖。
- 進行各種類目的分類工作。
圖像質量評估
圖像質量評估實際上是對圖像美觀度的識別。目前市面上的大部分圖像質量分析,主要是在粗粒度層面上給出質量的分級,如:好的、中等的、差的。
因此,它們只是將問題歸成了分類問題,并沒有從細節上去模擬人類的審美,給出圖像的優劣判定。
在此,我們借鑒了“Photo Aesthetics Ranking Network with Attributes and Content Adaptation”一文的思想,采用了文中提到的前兩種網絡結構。
首先,我們通過人工標注,從上圖右側所展示的多緯度屬性方向去對數據進行打標,進而得出美觀度的總體分值。接著,我們采用了單支和多分支兩種回歸網絡。
單支回歸網絡訓練的是一個回歸模型的Reg,其lable為圖片的總評分(score)。通過對某個圖片上11個評分點的相加,構造出一個多分支,進而融合成一個得分制的回歸網絡Reg+Att。
在訓練時,label的11個屬性評分與最終的score,會將Reg所訓練好的權重遷移到Reg+Att之中,并最終使用Reg+Att網絡來進行預測。
有了該網絡之后,我們便可以對于數據庫中的圖片數據進行美觀度評分,進而過濾掉美觀度分值較差的圖片。
同圖過濾
如果我們搜索出來的結果存在大量同圖的話,勢必會降低用戶的體驗度。因此,我們采用輕量化的pHash方式進行快速地同圖過濾。
該方式的基本思想是:為每一張圖片形成一個哈希值。整個計算過程為:
- 對一張圖片進行resize,將其縮放成8×8的尺度,共有64個像素。
- 轉成灰度圖片,計算灰度平均值。
- 將每個像素的灰度值和平均值進行比較。如果是大于或者是等于該平均值,則記為1;若小于平均值,則記做0。
- 將這些0、1的結果進行串聯,得到二進制的表達。
- 通過漢明距離進行距離計算,籍此判斷是否為同一張圖片。
- 結合包括銷量、價格、上店時間、以及店鋪星級在內的業務邏輯,進行同圖的合并或過濾。
類目分類
類目分類的主要目的是縮小待檢索的數據量,提升檢索的精度。在電商的場景中,有著“類目數”的概念。例如:服飾鞋包、女裝、上裝、以及T恤,就構成了類目數的不同分支。
其中,服飾鞋包是一級類目,女裝是二級類目,上裝是三級類目,T恤則對應的是四級類目。如上圖所示,我們針對于不同類目數的數據分布情況,以及用戶對于類目的認知,整理出了上述十個大類,它們基本覆蓋了我們系統中的所有葉子類目。
除了上述橫向的十個大類,我們也結合了縱向的四級類目(共504個),以便在后續的結果召回上實現彌補。
同時,由于各個任務之間存在著相關性,因此我們采用的是基于多任務的學習方式,通過彼此之間的促進,讓模型具有更好的泛化能力。
如上圖所示,此處的底層網絡是ResNet18,后面的兩個FC分支分別對應著兩個不同的具體任務。通過迭代,該模型的top1,在十大類層面上可達92%,而在四級類目上則為84%。
主體檢測
對于一張圖片,我們可以采用兩種主流的目標檢測方式:
- Faster R-CNN之類的two-stages的方式
- SSD之類的one-stage的方式
由于是基于RNN,因此two-stages方式的精度更高些;同時,由于是串聯方式,所以其計算性能略差。而one-stage方式則恰恰與此相反。
鑒于兩類方法的優缺點,最終我們采用了基于Refinement網絡的模型訓練。其中,Anchor refine module類似于Faster R-CNN中的RPN,而Object detect module則類似于SSD。中間通過TCB模塊進行特征轉換,將上層的ARM特征上傳到某個檢測模塊中。
同時,TCB具有一個類似于FPN金字塔形式的向前傳遞過程。因此,該網絡相當于將RPN與后面的檢測模塊并行處理,進而保證了檢索的性能。
而且,由于接入了FPN的特定制,因此它對于一些小目標的檢測來說,會有比較好的效果。
我們基于該網絡也制定了一些檢測目標,例如:我們會檢測某張圖片中出現的上服、褲子、裙裝、鞋子、包包和人臉等區域部分。
通過迭代訓練,我們最終可以達到0.95的MAP,而在K40上的檢索性能則為25FPS,同時在P100上,會達到50多的FPS效果。
上面四張圖展示的是我們在不同場景下目標檢測的結果:第一張圖來自商品搜索的結果;第二張圖來自用戶的實拍;第三張截圖來自直播場景;最后一張圖來自線下數據的實測情況。
圖像特征學習
針對在真實的電商場景中存在著圖像特征提取的需求,我們整理出了一套多位的標簽體系。其中包括:類目的CID、SKU的顏色、圖像本身的圖案信息、Shape信息、以及其他擴展信息。
雖然在制定標簽時,我們難免要進行大量的數據清洗和整理工作,但是,由于商家在上傳圖片時,已經給商品打上了Title等屬性信息,因此我們可以直接通過這些文本描述,來拿到一些“天然”的標簽。
另外,我們也可以通過諸如:款式屬性模型、元素圖案模型、以及一些細粒度的顏色模型,來對這些數據進行重新打標或予以校驗。
有了上述兩方面的基礎,我們再結合一些人工的審核方式,最后就能得出相對完善的標簽。如上圖的右側兩行文字所示,它們分別代表了標簽的具體含義。
在標簽體系建成之后,我們就可以開始整理數據了。一般而言,類別應當越細越好,每類的數據也是越多越好。
但是在實踐中,我們需要將每一類數據的體量設置為:上限2萬、下限1千,以避免出現樣本不均衡的問題。因此,在整理完成后,我們最終得到了2319個標簽、約1000萬個訓練樣本。
有了數據標簽和可供訓練的數據,下面我們便可以通過基于CNN網絡的分類模型,來訓練特征了。
為了得到更好的分類效果,我們引入了Triplet的網絡結構。如上圖所示,右側圖共有三個分支:中間為query、上面是positive、下面為negative。
而在最后,我們采用了兩種loss:一種是分類的loss、另一種是基于Triplet的loss。通過此方式,我們既可以縮減類內距離,又能夠拉大類間距離,進而增強特征學習的效果。可見,在基于Triplet loss的學習中,關鍵問題是對于上述三個分支的選擇。
對于positive樣本,我們會選擇同一個標簽的樣本;而對于negative樣本,則盡量選擇那些移位不同所對應的標簽圖片。因此,通過迭代式訓練,我們最終的分類效果(即top1)為68%。
有了上述基本特征的提取網絡,我們接著需要考慮具體應選用哪些特征。如上圖所示,我們分別對于res所對應的5a、5b、5c、以及res4的一些層(如fc層)進行了特征提取。通過驗證,我們最終認為:基于res 5a層所得到的結果最好。
在res 5a層上,我們會結合GAP(全局平均池化,Global Average Pooling)的方式,進行特征的聚合。GAP主要被用來解決全連接的問題。
如上圖,通過基于res 5a的512×7×7 feature map的處理,我們能得到一個1×512的512個特征。接著,我們進行各種平方與歸一化的操作,進而得到最終的檢索特征。
近似最近鄰檢索
接著,我們需要通過乘積量化的方式來進行近鄰檢索。乘積量化是在內存和效率之間實現平衡的一種方式。它既能為圖像的檢索結構提供足夠的內存,又能保證檢索的質量與速度。
其核心思想是對特征進行分組量化,即:將某個特征分成M組,對每一組進行細致的量化,進而通過每一組量化中心的卡爾積,得到最終的碼本。
在檢索過程中,我們需要構建索引的結構。上面左側圖是我們對于數據庫采用的檢索結構。輸入Y對應的是數據庫中某一張圖片。
通過粗量化的中心計算,我們能夠得到一個粗量化的QC,該QC即為對應的倒排文件入口。通過計算Y和QC之間的殘差向量,我們便可得出一個RY。
RY再通過M分組,讓每個分組對應一個細量化的中心。籍此,我們便可將該圖片加入其對應的粗量化倒排鏈了。
如上面右側圖所示,在查詢圖像時,我們會先通過粗的量化,給X找到對應的檢索入口,接著計算其殘差,并根據既有的侯選查詢集合,計算出該殘差和集合的具體距離,最后再通過排序,以得到檢索結果。
Reranking
為了得到更為全局的特征,我們需要采用Reranking,來挖掘圖像的局部特征。此處,我們是通過結合RMAC特征,以及Attention方式來實現的。
RMAC方式是通過變窗口的方式來進行滑窗的。該滑窗過程不是在圖像本身上進行的,而是在某個feature map上實現的。因此,它保障了特征提取的速度。
不過,雖然RMAC可以提取許多局部區域特征,但是它并未考慮到不同region之間的重要性。而且在某些情況下,由于某些圖片包含了較多的背景區域,從而干擾了檢索效果。因此,我們需要結合Regional attention來進行學習,以得出特征的重要性。
具體做法如上圖所示:通過前面訓練出來的網絡結構,我們可以得出圖像的Res維特征。接著,我們基于不同的scale,進行局部特征的提取。
通過該四個scale的特征選取,我們能夠保證相鄰窗口具有40%的overlap。之后,會配有兩個分支:
- R-MAC模塊。其中包含了Max spooling和后處理過程(Post-processing)。該后處理過程包括:L2-normalization和PCA-whitening。此后通過sum-pooling和L2-normalization得到Global feature vector的表達。
- Regional attention模塊。鑒于這些局部特征的重要性,我們需要結合Regional attention模塊,來學習不同的權重。具體過程是:我們將區域特征(Regional feature)和全局特征(Global feature)進行融合(Mean pooled),以實現對上下文的感知(Context-aware)。在Attention模塊中,我們在Channel space中進行了Concat,之后進入Attention network(其中包括兩個線性層和兩個非線性層),以得到Attention的權重。
結合上述RMAC的特征,我們通過加權,以得到基于局部特征的表達。接著,我們會基于topN的結果執行Reranking。當然,我們也會結合擴展查詢(Query expansion)的方式,以進一步提升檢索的效果。
如上圖所示,左側是RNN網絡提取的全局的特征,右側是RMAC+Attention網絡提取的局部特征。
評測集及指標
為了評測效果,我們準備了如下評測數據:
- Query圖片,包括:商品主圖、買家秀、以及直播截圖。
- Similar圖片,包括:商品附圖和詳情圖。
- 共2000組、1對1形式(商品的主圖對應著商品的詳情圖)和1對N形式(一張主圖片對應N張詳細圖片)。
- 搜索測試DB:200萬。
在結果上,我們分別設置了兩個算法測試指標:TopN的召回結果和TopN的mAP結果。
上圖展示了可視化搜索的效果。
系統及業務應用
上面是蘑菇街視覺搜索的系統架構圖。它分為四個層級:
- 基礎網絡模型,包括:類目的識別、目標的檢測和特征提取的深度學習。同時它也包括基于PQ量化的模型。
- 算法模塊,分為離線和線上兩個部分:
- 離線數據的處理,包括:目標檢測、特征提取、生成索引庫、以及通過Dump過程生成一些echo文件和數據。
- 線上的搜索過程,對應了前面提到的那張表。
- 中間接口層,灰色為Dump數據的生成,右邊白色在線部分是針對不同算法模塊所給出接口。
- 業務應用層,此處羅列了各種業務。目前,除了http接口,我們還接入了ZSerach和推薦引擎,以豐富推送結果。
下面具體介紹幾個業務應用:
運營選品業務:導購運營基于流行服飾等圖片,利用視覺搜索技術,查找到蘑菇街相應的商品。通過接入選品的后臺,我們根據運營輸入的圖片,搜索出來各種相似的商品圖片。
這些圖片附帶有價格、銷量、折扣、上架時間等商品信息。運營篩選需要的商品,通過APP前端推給用戶,從而避免了人工找圖的工作量,同時提升了運營效率。
同款審核:電商的基礎業務需要對商家上傳的商品圖片進行同款審核,并提供商家對于審核結果的在線查詢。
因此,在接入了視覺搜索技術之后,我們通過識別系統來判斷同款商品,并返回結果數據。在該算法上線之后,我們通過結合業務數據的實測,整體系統的準確率達到了99.06%,而漏檢率僅有3%。
搜圖購類產品:我們在2017年底上線了該產品的App端,而在2018年初上線了微信女裝小程序。該產品的整體情況為:日均UV可達50萬左右。
搭配TAB:為了給用戶推薦各種搭配商品,我們基于現有圖像數據庫,結合目標檢測算法,對全身圖商品進行了檢測。系統通過區分不同區塊,以獲取相似商品的搜索結果。
如上圖所示,用戶在點擊了首頁里的搭配圖之后,便可獲取詳細的展示信息,進而在第三層的頁面上,看到不同區塊的相似性推薦結果。
Buy The Look:在內容分享場景中,達人們會曬出自己的服飾自拍圖,我們根據這些圖片進行目標檢測,并通過每個區塊實施相似搜索,最終給用戶推送對應的相似商品。
【51CTO原創稿件,合作站點轉載請注明原文作者和出處為51CTO.com】