得物技術基於自注意機制的影像識別演算法

得物技術發表於2021-11-20

背景

對於做 CV 同學的人來說,影像識別是入門中最簡單的模型,也是最最基礎的模型。在不同的 CV 任務重,即使發展多年,都一直保留著利用訓練好的影像識別任務重的模型權重,作為 backbone 用於加速訓練收斂的作用。但是面對一些影像識別的任務,我們如何根據業務需求去改造一個已經比較完備的識別任務,還是蠻有意思的一個話題。

業務需求

能夠篩選出使用者上傳的球鞋圖片中帶有乾淨統一背景的圖片,我們暫且就叫這個專案為 背景複雜度檢測 任務。幫助後續估價以及出售環節演算法降低難度,以及維持整個 app 影像質量在一個水平線上。

專案要求

  1. 能夠在測試集的準確率達到 80% 以上,可以用於給予使用者提示,但是並不強制;而達到 90% 以上,可以強制使用者按照要求達到上傳圖片質量的要求。
  2. 能夠實現端側應用。

模型設計

mobilenet backbone + FPN + modified SAM

最終做出來的模型各個模組分解來看其實很簡單,沒有什麼特別難懂的地方。

整體需要努力的方向無外乎以下幾點:

  1. 分析業務特點,這是一個典型的空間型識別任務,即是通過影像的某部分或者某幾部分割槽域的內容完成目的。對於 背景複雜度 我們要刨去主體之外的部分,判斷剩餘部分是否是“複雜的”,即可,所以想到可以用空間系列的注意力機制。
  2. 我們不可能對於使用者嚴格控制拍照中的主體佔據圖片中比例的大小。有些使用者習慣將主體佔滿屏,有些使用者喜歡留白多一些。對於不同的尺度,如果想做到精細分類,是需要在較高解析度下的 feature map 做文章,所以這裡用 FPN。
  3. 為了能夠在端側實現應用,選用 mobilenet 系列是很天然的想法。

以上幾點的設計思路其實就是完全圍繞當前 業務場景 而去做出的設計。

最終在測試集上,利用設計好的 CNN 模型達到了 96% 的正確率。可以作為強制使用者上傳高品質圖片質量的依據。

如果想了解(白嫖)這個專案所用模型,其實分享到這就可以達到目標了。每一個模組的設計,其實都不難,沒有新的概念。程式碼也很簡明,實現也很方便。

但專案本身最有趣的實際上是實現整個專案的思想,為什麼最後選用這樣的模型,中間其他的思路是如何被排除,如何試錯的!!!

專案過程

傳統 CV

專案需要在端側實現,雖然沒有明確手機實時性的要求,但是需要整個演算法檔案,所引用的 庫 佔據記憶體足夠的小。第一能夠想到的就是如果不用深度網路,這個問題是否能夠解決。

錯誤的思路

分析 背景複雜度,我曾想到用

  1. 對於和整個業務無關但是又嚴重影響結果的主體內容,用一個固定大小的高斯核進行過濾,然後進行其他處理。
  2. 利用邊緣檢測、梯度資訊分析一張圖片的背景複雜度
  3. 傅立葉頻率資訊分析圖片的高低頻資訊來判斷:高頻代表背景資訊多,較為複雜;低頻代表乾淨。
  4. 通過多張背景乾淨的圖片做簡單畫素加權平均當做模板,然後利用異常檢測的方法,篩選出背景複雜的圖片。

以上都是在專案初期,我能想到的一些簡單的 idea。但是觀察圖片樣本後,這些想法,除去第一條的思路是對的(空間維度的資訊),其他三條的思路都是錯的。舉個例子,一雙鞋放在地毯上,地毯本身是乾淨的,圖片也除去主體和地毯沒有其他任何物體。但是地毯有自己的紋路,高頻資訊很多,梯度資訊很多。按照上述 idea 2、3、4 條的原則,這樣的背景屬於複雜度很高的背景。但是實際上,在樣本中,這樣的背景算是乾淨的。

通過分析資料的樣本以及反思業務邏輯得出以下結論:

  1. 背景複雜度概念不是針對不同圖片之間背景的差異。
  2. 背景複雜度的概念是針對每張圖片自身是否出現了不同的背景和不是主體的一些前景物體。

那麼,整體的思路就要做出一些改變,就是要通過 自相似度 的方式來判斷背景複雜度。這也是對於業務越來越熟悉之後做出策略上的調整。

模板匹配

那麼需要用到哪些部分可以用於自相似度的判斷呢?

  1. 四個角

上面說過,錯誤的 idea 中,有一個思路是對的,就是要利用空間維度去思考業務,去掉主體資訊思路是對的。即我們在判斷背景自相似度的情況,是需要避免劃到主體資訊的。根據這個思路,我們可根據經驗,4 個角可以在一定程度上可以代表一張圖的背景資訊。如果 4 個角上的內容相似,可以解決大部分業務的目標。利用 4 個角的資訊計算兩兩自相似度,有 6 個值。6 個值越高,說明 4 個角的相似度越高,是乾淨背景的概率也就越大。

  1. 兩個角

通過觀察實際的 業務 樣本後發現,使用者拍照的習慣往往是上面的留白會比下面的多。也就是說,下方的 2 個角經常會含有主體資訊。所以最終確認的方案就是隻利用 上方的 2 個角進行相似度匹配。

  1. 還沒完

但是,只利用 2 個角的相似度匹配只有 1 個值的輸出,那這樣的值對於整個業務來說,太不穩定了,存在很大的風險。於是我分別利用上方兩個角自己作為模板,然後分別去做滑窗做匹配,記錄大於一定閾值的個數,作為一個相似度評價的一個指標。所以,最終有 3 個指標來衡量一張圖背景的相似度情況。一個是上方兩個角彼此的相似度值。另外兩個是每一個角,獨自作為模板,與整幅圖上其他空間上內容能夠匹配的個數。根據預設定好的權重,進行加權,最終得到一個分數。這個分數用來判斷最後這幅圖是否是背景複雜。

最終,通過這種方法,輸入圖片進行統一的 resize,保持影像在一定大小,讓模板匹配速度控制在合理的範圍內,根據以上的做法,在測試機就可以達到 80% 的正確率。這個演算法可以在產品端作為引導暈乎拍照的工具。當演算法判斷為複雜背景時,給予提示希望使用者重新拍照。

CNN

以上傳統 CV 沒有聽懂,沒有關係。它只是敘述下整個專案利用業務分析,得到一些寶貴思路的過程。下面的方式才是此文章的重點。

baseline

為了專案快速迭代優化,選用識別的思路做這個專案。也就是很普通的影像識別任務。由於希望能夠放在手機裡的模型,自己能夠想到也比較熟悉的是 mobilenet v1。

優化模型

目標檢測

在文章開始的時候,我提到過,這是一個標準的空間行識別問題。對於這樣的識別問題,我通常的做法就是利用 檢測模型 解決識別任務。

這種思路很常見。比如在社群中,我們想識別一個圖文帖子中,圖中達人他的穿搭是什麼樣的,有沒有背什麼牌子的包包,穿了什麼品牌的鞋。不考慮實際演算法難度,端對端的思路就是一個識別問題。輸入一張圖,輸出幾個標籤。但是實際上,直接利用識別模型是很難的,因為有很多冗餘背景的資訊。我們面對這樣的問題還是需要利用檢測模型去做。最後只是不需要輸出 bounding box 就好,可能還需要做一些去重的策略上的工作。

回到本業務,有一點不同的是,我們最終關心的區域恰恰是去除主體的區域。在 傳統 CV 中有一個思路就是用一個固定大小的高斯核去做這樣類似的事情。但是恰恰是因為這一點,我們不能像上文社群那樣的例子利用一個目標檢測模型加上一些策略就直接拿到輸出。

首先需要一個目標檢測模型拿到主體。然後用 mask 過濾的方案,接上傳統 CV 演算法也好,CNN 的 baseline 也罷,就可以得到最終的答案。

利用目標檢測的方法,是可以很明晰地解決這樣的一個業務問題,也是最直觀的選擇。

隱性目標檢測

目標檢測的方法雖然直觀,但是存在兩個巨大的缺陷:

  1. 不能夠端對端,至少需要兩個步驟,或者兩個模型,對於速度,和記憶體空間來說都是一個負擔。
  2. 目標檢測需要標籤的成本也比識別的成本大的多。

那麼,是否我們可以優化掉上述的這兩個缺陷呢?答案是肯定的。

我們可以像目標檢測的步驟那樣,在中間的模型的過程中,預測一個區域,就是一個 bounding box。輸出也就是 4 個維度。通常是可以輸出 左上角、右下角;左上角、寬高;或者中心座標、寬高。然後利用原影像和這 4 個維度的結果做一個 mask 過濾,過濾掉主體,再進行下一步的識別作用。

這樣做的好處就可以避免直接用 目標檢測 任務所有的缺陷。他把上一種方案分步做合併成一個模型。中間標籤也是自己學出來的而不是人工標出來的,省去很多訓練之前的準備工作時間。

其實著名的 拍立淘 的圖搜演算法就是利用了這樣的思路進行圖搜識別的。一般的圖搜也是分為 目標檢測 + 識別的方法,但是 拍立淘的方案利用上述這種方法去除了目標檢測的前置任務。

隱性分割

既然目標檢測可以,那麼其實語義分割,或者例項分割也可以做這樣的內容。我們看看隱性目標檢測也有這個他的侷限性:

  1. 由於 bounding box 本身的問題,他依然囊括了一些或者去除了一些必要資訊。
  2. 對於多個物體的話,這種方式就很不靈活。(當然這個問題不是不可以解決。也可以用到目標檢測設計一些卷積得到 feature map 的方式解決多目標檢測的問題,但是那樣引數量也會上升。)

同樣,我們利用典型的分割思路,在 mask 生成的階段,拋棄 bounding box 這種規整的形狀,去省城一個物體的外輪廓邊界。這個邊界同樣也是隱性的,是不需要人工標註的,然後用輸入影像去過濾這個mask。

空間注意力機制

隱性分割固然很有道理,但是實際上引數量會上升,計算量會加大。其實無論是目標檢測還是分割的方法,其實從廣義上講就是一個空間注意力強監督。也就是我們人為劃定好的空間注意力機制。但是還是那個問題,我們最終的目標不是學習 bounding box 的座標,不是學習到背景的外輪廓資訊 mask 有多麼精確。這些中間結果對於最終目標不是很關鍵。或者說,模型可以學習到自己的一套關注的區域就可以了,不需要可解釋性很強的區域也是可以的。那麼對於這樣的場景,我們沒有必要在分割模型上做到最上層,也就是解析度最高那層的 mask。只要做到中間層效果就已經出來了,無需浪費更多的引數量。

對於“U”型的影像分割模型,我們只需做到“J”型就夠了。“J”型結構就是標準的 backbone + FPN。FPN 即保留了一定高解析度的資訊,又結合了底層上來的語義資訊,是一個完美的“融合體”。在這一層再做一個 mask 就相當於是在這一層做了語義分割。其實這就是屬於空間注意力機制。

空間 + channel 注意力機制

既然有了空間注意力,來都來了,我們也可以加上 channel 維度的注意力機制。我們耳熟能詳的 attention 模組像 SE 屬於 channel 維度的。BAM/CBAM 是空間維度 + channel 維度都有的注意力機制。但是他是分開做的。無論是序列還是並行,都是分為兩個模組做。這個專案中利用 YOLOV4 中改寫的 Modified SAM 模組,一步合成了 空間 + channel 的權重。簡單而又便於理解。但是 channel 維度,確實就是個“順便”,在此業務中,我覺得加不加都可以。

我們看一下中間的 grad CAM 結果

結果對比

通過與沒有加入上述 attention 模組以及 FPN 的模型對比改進之後的模型。原有模型在驗證集上的正確率為 93%,改進後的模型在 96%。但更重要的是,改進後的模型在可解釋性上有明顯的增強。當可解釋性增強之後,才會有明確的優化方向的可能性。

總結

以上就是對於如何在影像識別中做出創新的一種思路。但是創新的目的不是為了創新,整個專案下來最重要的核心就是為了 解決業務問題

文/詩詩

關注得物技術,做最潮技術人!

相關文章