微信AI从识物到通用图像搜索的探索揭秘
作者:lincolnlin,騰訊 WXG 專家研究員
微信識物是一款主打物品識別的 AI 產品,通過相機拍攝物品,更高效、更智能地獲取信息。2020 年,微信識物拓展了更多識別場景,上線了微信版的圖片搜索。本篇文章將與大家分享微信識物從識物拓展到通用圖像搜索領域的發展過程。
微信識物
以上小視頻簡單介紹了識物的產品形態,它對微信掃一掃的掃封面能力進行了升級。打開微信掃一掃,左滑切換到“識物”功能,對準想要了解的物品正面,可以獲取對應的物品信息,包括物品百科、相關資訊、相關商品。在微信識物發布不久,也快速地支持了像識花、識車這些實用的識別能力。
從一個 query 到結果,識物引擎是如何完成一次圖像識別全過程呢?
首先我們會對 query 的圖片做目標檢測,去除背景干擾。
然后以圖像主體進行檢索,拿到圖像召回的列表。
最后一步是進行信息提煉,得到商品的標題,品牌,主體,主圖等。
從一個識別天地一號的例子來講,可以看到從檢測、圖像召回、信息提煉后,我們得到了這是一個天地一號的蘋果醋,再關聯更多的搜索結果。
我們的識別效果究竟如何,我們也跟公司內外的識別引擎作了一些對比發現,基于微信自研的識物引擎和微信小程序商城海量的商品數據,我們取得了一流的識別效果。
跟業界同類產品相比,微信識圖無論是在體驗、識別效果、內容和商品上,都更具有微信的特色。
微信圖像搜索
微信圖片搜索是我們最近剛剛上線的,大家應該能看到,在微信會話和朋友圈中,圖片多了一個搜一搜的入口。
識物搜索的現狀
那么講起圖像搜索,大家肯定馬上想到 google、baidu。這些搜索引擎在 10 年前就上線了圖像搜索,并且經過多年經營,已經成了一個很大的入口。
微信識圖又是怎么樣的,如何基于微信的場景做出差異化?這是我們首先思考的問題。
微信識圖
接下來這個圖,是我對微信識圖的一個設計藍圖。我們期望微信識圖是這樣的一個產品形態:
微信圖像識別的入口,拓展各類識別能力,包含圖像識別、圖像搜索、二維碼識別、文字提取,以及各種圖像的應用及玩法。
接下來,我會介紹一下識圖的一些具體應用場景。
商品識別
社群中經常會看到商家在推薦商品,我們直接通過搜一搜,可以快速了解商品信息,看看是否真是物有所值,價廉物美。
細分類識別
群聊中有時候看到一些豪車不認識時,長按搜一搜,避免被忽悠。
有些同事經常會在朋友發一些花草,尤其春夏季節。但可能發表者自己都不認識花的名字,搜一搜可以幫你快速知道植物的所有細節。
前幾天我看到一個北大同學發湖的圖片,我猜測是未名湖,但不太確實。這時候果斷搜一搜,感覺評論的時候就自信多了。
我們還支持動物識別、菜品識別、紅酒識別、名畫識別等細分類識別能力。
菜品識別對一些正在減肥健身的人群,了解食品的熱量是個強需求。長按識別菜品我們很快會支持查熱量,我們支持常見的菜肴、水果蔬菜、包裝食品等。
以圖搜圖的拓展
接下來介紹以圖搜圖的一些拓展能力:
包含圖片內容:溯源。當圖片是某個電影里的截圖,你想要知道它的出處。或者你想知道你的原創圖片是否被他人轉載或者盜用。又或者有一個長得很漂亮的美女主動加你微信,說頭像是本人。這時候通過圖片搜索,我們很容易一探究竟。
相似圖片:找一些相同風格的圖片。
搜索物料:通過識別 logo+ocr 的方法,可以實現內容提取并跳轉的能力。
以圖搜圖的系統實現
前面是一些產品介紹,接下來我詳細聊一下以圖搜圖的系統實現,核心講三個東西:分類、檢測、檢索。
分類篇 | ? 圖片內容標簽體系
圖像分類是 CV 的基礎,為了更好地理解微信內圖片的類型分布,我們構建了一套圖片內容標簽體系。從圖上來源上,我們主要分為廣告、拍照、手機截屏這三種。從圖片的內容標簽上,我們劃分成 9 個一級類目,42 個二級類目。這是一個多標簽、多任務的分類任務。
分類篇 | 多標簽分類
之所以是多標簽,是因為多標簽分類更加適合復雜的圖像場景,比如上面圖 1,同時有美女、服裝、植物、戶外場景等標簽。所以我們的做法是來源和標簽兩種任務共享 backbone 網絡,通過一個 slice 層、一個 Batch 訓來源和標簽兩種分類任務。
上圖像來源這塊的分類結果示例,不同來源的圖片,特征差異明顯。
分類篇 | 細分類的應用
前面提到的圖像標簽,是一個粗分類的方法。我們只需要知道是一只狗,但不需要知道是蛤蟆狗,還是哈士奇。要真的能見微知著,通過一些細節來分辨物體具體的款式,這也是計算機視覺擅長的領域。實現細分類,總的來說,我們有兩種做法。
電商場景:我們要識別的集合是無限大的,而且還是動態的。所以我們是通過動態圖像召回。從召回的結果上推斷出商品的具體款式。
動植物汽車這種場景:集合是相對固定的。而且需要一些專業的數據庫。我們采用分類+檢索的方法,在具體的處理邏輯上,也依據具體的場景不同而不同。目前我們支持了動物/植物/菜品/地標/汽車/名畫/紅酒識別。
檢測篇 | 移動端主體檢測
在微信識物中,我們需要在移動端構建一套圖像采集的 SDK。首先我們基于運動估計中的光流追蹤方法,先判斷用戶手機是否處于靜止狀態,如果已經靜止則會從 camera 的圖片序列中,根據圖像梯度的方法,選出較為清晰的幀,再用深度模型進行主體檢測,如果檢測到有物品,進行裁剪后再發送到后臺,后臺返回后還會做一些糾正后處理。整個過程中難點在于實現一個輕量級的移動端物體檢測模型。
我們基于 centernet 的方法,并基于移動端的場景進行專項優化,如大感受野、輕檢測頭、改進可形變卷積在移動端的實現等。最終我們的方法與主流方法在 ms-coco 上對比,在 MAP 相當的情況下,參數量只有 1M,大大降低。在 iphone 下測試,每幀只需 25ms.。從上圖可以看出,掃描模型改進版,有效提高了掃描速度,節省 3 倍流量。
檢測篇 | 服務端物品檢測
移動端是 objness 的無類別主體檢測,服務端則更傾向于 class-wise 的目標檢測。我們既要支持商品類目,又需同時識別出各種自然場景。故我們基于 maskrcnn 的訓練框架,改進 RetinaNet 成為雙流的 RetinaNet, 一條流用于商品的精確位置和類別輸出,一條流只用于分類自然場景圖片,以便快速拓展更新模型。
檢測篇 | 目標檢測的應用
在微信界面中,我們看到識別的主體上,有個小綠點。這個就是目標框的中心點。在識圖中,我們看到 query 頭部,有多個主體,這是更直接的目標檢測出來的 bbox。
目標檢測算法對于 Query 理解,去除背景干擾,理解多主體,還有壓縮源數據的基礎算法能力。
在我們離線構建檢索庫的過程中,檢測器會檢出非常多的目標,這里會包含很多的噪聲目標,如圖中還會檢出鞋子、上衣等。我們最后會根據標題 NER 后的主體,還有所有 bbox 之的聚類結果,來決定商品最后的 bbox 是哪些。
以圖搜圖本質上是尋找度量圖像之間距離的方法,這個距離的表示有很多維度。
所以這里的核心工作之一,就是尋找一個強大的特征表達,可以跨越不同視角,不同裝扮下的 gap,讓我們探尋事物的本質,更靠近任務的目標。一開始在重復圖任務上,我們還會使用 ORB,SIFT,SURF 這些局部特征,再使用像 BOW、VLAD、Fisher Vector 這些方法,把多個局部特征聚合成一個統一維度的向量表示,以利于檢索的工程化。但當我們積累了足夠多的同款數據后,CNN 的方法在平面圖上的表達能力,也已遠超傳統的圖像方法。
關于 CNN 特征學習的探索,在《微信掃一掃識物技術的從 0 到 1》一文中已有全面的論述。我們的另一塊核心工作,是解決大規模數據下帶來的挑戰。
檢索篇 | 大規模檢索系統之分庫實現
以微信圖片搜索為例,每天新入庫圖片達 500w 張,我們收錄半年的數據,就有近 9 億張圖片。我們的思路是多機多庫的拆解方法,先把數據在離線階段分成多個庫,在線召回為了減少檢索耗時,我們只檢索其中幾個庫,這時候需要做智能的路由。最后根據召回的結果,進行類目預測。
檢索篇 | 識物引擎系統框架
1.分庫:以微信識物為例,這里的分庫比較簡單,直接按商品大類劃分,比如箱包、美妝、食品這些,一共有 12 大類。
檢索篇 | ? 識物引擎之分庫路由
2.路由:那么當一個 query 到來時候,我們去檢測哪個庫呢?這就涉及到路由的邏輯。
前面提到服務端的檢測是帶有類別的,比如圖中輸出鞋子,那么我們就走鞋子的專用檢索模型提取特征,再到鞋子庫中檢索。這是最樸素的版本。然而現實場景中的真實的數據分布往往是離散,且存在較大交叉邊界的,這會導致以下問題。
檢索的開集問題,比如未出現過的子類容易分錯;
類間混淆性,從視覺上存在歧義。
檢索篇 | ? 識物引擎之類目預測
基于我們前面提到的數據分布,我們首先從分類好的商品庫中,采樣出圖片進行聚類,通過聚類堆中包含商品類目的多少,把所有的堆分成 clean cluster 和 dirty clean。如上圖所示,clean cluster 代表商品圖是容易從視覺上分類的,都是鼠標。而 dirty clean 則代表不容易視覺區分,都是一些相似的瓶瓶罐罐。相應的,clean 的圖一般只需檢索 1-2 個類目庫,而 dirty 的圖需要檢索 4-5 個類目庫。簡單講,我們實現了一個動態 topk 檢索的優化。從最終優化效果看,在平均檢索次數更低的情況下,實現了更高的類別準確率。
3.類目預測:由于每個庫都是專有模型,特征之間是可以度量的。于是我們引入了一個精排模型,可以度量所有商品圖片的距離,統一對多庫召回的結果作歸一化。最后我們會結合 query 圖的分類檢測結果,召回結果的圖像精排特征,以及相關的結果圖像及結果一致性,通過一個 MLP 網絡進行類目預測,同款歸納等后處理。
檢索篇 | 通用以圖搜圖之無監督的分庫
上面提到的是識物的檢索方案實現,回到通用的以圖搜圖場景,我們無法簡單的把圖片定義成 N 個庫出來,所以我們用了無監督的分庫方法。
1.分庫:基于 moco 這種無監督的對比學習方法,得到圖片一個向量表示。再通過聚類的方法產生偽標簽,如下面的 16 個標簽。可以看出,相同 topic 的圖片,會被盡量分到同一個庫中。
檢索篇 | 圖搜流程框架
2.路由:在離線流程中,我們把所有的圖片通過上述的分庫方法,分成了 16 個庫。在線檢索的時候,路由層會預測 query 圖的標簽,只走 top3 的分庫。最后通過一個統一多庫精排模型,把召回結果融合到一起。
結語
從識物到識圖,我們不斷擴大計算機視覺所能感知的范圍。從技術上我們日趨完善,逐漸搭建起從數據采集->半自動化清洗->訓練->上線->反饋優化的 pipeline,從基礎的分類檢測到各類應用層的算法,從移動端部署到大規模 GPU 集群。另一方面,基于微信的圖片應用場景,我們開拓出了微信識物、長按識圖等新的嘗試入口。相信緊貼用戶場景,通過技術的不斷沉淀積累,一定可以孕育出更多的智能產品。
總結
以上是生活随笔為你收集整理的微信AI从识物到通用图像搜索的探索揭秘的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Go netpoller 网络模型之源码
- 下一篇: 腾讯关系型数据库达成“双百”里程碑——6