物體檢測、影像分割技術概述

tgltt發表於2024-10-30

物體檢測、影像分割是CV領域的兩大任務,尤其是物體檢測,其在各個領域和AI比賽中,更是佔有舉足輕重的位置。

1、概述

  圖1描述了起源於影像分類的主要計算機視覺類任務。

圖1 發源於影像分類的計算機視覺任務

為什麼如此劃分?因為在更早的時候,AI圈還停留在機器學習的時代,那時候的演算法只有KNN、決策樹、樸素貝葉斯和SVM等,外加AI界的設計模式:整合學習,搞出了一些組合式演算法,比如隨機森林、XGBoost等,這些演算法大多隻能對結構化(一張二維表)的資料進行處理,而對影像、音訊、影片類的資料,往往不太勝任,要麼是計算精度不夠,要麼就是計算速度太慢,對於那個時代的王者SVM演算法,其計算速度是其致命的硬傷,無法規避,導致今天其已經很少使用,只留下了演算法思想的價值。

加上算力和算據的極大限制,因此早期機器學習類的演算法,大多隻能對影像類任務進行較為簡單的處理,比如輸入一張較小的影像,將其用決策樹或SVM等進行分類,然後用模式匹配等演算法,找找影像裡有沒物體。

進入到網際網路時代後,尤其是移動網際網路時代,算據規模接近天文數字,英偉達顯示卡提供了充足的算力,深度學習的出現,正所謂天時、地利、人和三者合一,將時代推進到了AI變革的時代,影像分類任務就成了最基本的視覺類任務,在一張影像被成功分類後,自然而然就想進一步知道影像中某個物體的具體位置在哪,這個物體的類別是什麼,這時候物體檢測任務就呼之欲出了,而有了物體檢測任務,又想更進一步將物體內容同背景區隔開,這個就是分割任務。

分割任務又分為語義分割和例項分割,語義分割是不同類別的物體,用不同的顏色區分,相同類別的物體,用同一顏色,即語義分割,只區分不同物體的類別。而例項分割,無論物體間的類別是否相同,都將它們視為不同的,用不同顏色標識。Meta更是打著分割萬物的旗號,推出了SAM模型,這種模型不再是簡單的語義分割、例項分割和全景分割,而是這幾種任務的結合體。

在所有的計算機視覺任務中,物體檢測是很核心的,也是很基礎的任務,從物體檢測派生出了影像分割、人臉檢測、OCR和物體跟蹤這些任務。

2、物體檢測

物體檢測演算法有基於錨框和不基於錨框兩種,Faster RCNN、SSD、YOLO這些都是基於錨框的物體檢測演算法,而DLTR、FCOS這些演算法是不基於錨框的。

2.1 物體檢測套路

不論哪種物體檢測演算法,其套路不外乎切、提、分三部曲,區別在於這三個步驟的執行順序,以及如何切、如何提、如何分,不同的檢測框架,其具體的切/提/分策略是不同的。

  即切圖,將原圖中的某一部分切出來,進行該區域內的物體檢測,至於具體切哪個位置,以及切圖寬高大小,不同的物體檢測演算法不一樣。切這個動作,其最終目的是構建影像金字塔,是提取多尺度特徵的一個必要手段。

  即提取特徵,對原圖或切下來的子圖,採用CNN、Attention等進行特徵提取。

  即分類或迴歸,對原圖或切下來的子圖,分類其內所預測物體的類別,或迴歸其內所預測物體的偏移量。

2.2 基於anchor的物體檢測演算法

  基於anchor的物體檢測演算法眾多,本文以MTCNN和SSD為例,簡要介紹一下。

2.2.1 MTCNN

  MTCNN是一種人臉檢測框架,本質上也是一種物體檢測框架,稍加修改,也可用於其他物體檢測任務,而MTCNN也是一種基於anchor的檢測框架,相較於SSD、YOLO,其anchor種類比較單一,只有一種正方形的anchor,因為人臉都是類方形的,所以其邏輯和功耗相較SSD、YOLO就簡潔許多。

  MTCNN的核心思想是三個臭皮匠,頂得一個講諸葛亮,即用三個簡單模型(P-Net、 R-net、O-net)的序列聯接,代替一個複雜的模型,透過實踐驗證,其效果還不錯,即使效能上比複雜的單一模型稍差點,但效果也還不錯,而且MTCNN模型非常簡單,對儲存、算力、功耗的要求極低,這是其他模型所不能比擬的。

  其工作流程簡要概括為切、提、分,即先從原圖切下子圖,然後對子圖提取特徵,最後基於提取的子圖特徵,預測子圖中的物體分類及位置,如圖2所示,MTCNN將原圖按幾種不同的比例進行壓縮,再將壓縮後的圖片傳給MTCNN的P-Net進行滑窗(CNN卷積核)處理,這就實現了多尺度特徵的提取。

圖2 MTCNN工作原理

2.2.2 SSD

SSD英文全稱Single Shot MultiBox Detect,是一種單階段多工的通用物體檢測框架。

SSD的工作流程是提、切、分,即上來先一頓猛如虎的提特徵的操作,提取出不同層次的影像特徵,然後基於這些不同深度的影像特徵,將原圖劃分為大小不同的8732多個子圖,影像特徵深度越淺的,其感受野越小,對應原圖的子區域範圍越小,越能檢測小的物體,反之則越大。每個特徵圖會相應地將原影像均分(切圖)為特徵圖寬高乘積(寬*高)個子圖,再然後會對這些子圖預測其內包含的物體及其位置偏移。

SSD原理如圖3所示,圖中紅框表示SSD透過特徵圖金字塔的方式,構建了對影像多尺度特徵的提取,即每個特徵圖對應原圖的一個切分粒度,比如8*8的feature map,將原圖近似平均地劃分為8*8=64個子圖,然後SSD對這64個子圖進行物體檢測,其他層級的特徵圖工作方式以此類推。

圖3 SSD原理圖

2.2.2.1 SSD多尺度特徵

SSD的多尺度特徵提取,基於不同層次的特徵圖實現,圖3中一張300*300的影像,先經SSD backbone各CNN層次的卷積計算,再依次透過6層自定義卷積層,依次得到38*38、19*19、10*10、5*5、3*3、1*1共計6張特徵圖,這6張圖用來對原圖進行不同scale尺寸的子圖切割,以38*38特徵圖為例,其將原圖300*300大小的影像,近似均勻地切分為38*38=1444個子圖,每個子圖大小約為(300/38, 300/38)的大小而這1444個子圖從上到下、從左到右地排布在原圖上,在此基礎上,SSD對每個子圖設計了高矮胖瘦各不相同的4個anchor,然後SSD就對每一個anchor預測其內是否有物體,以及物體是哪個分類,以及物體位置相對於子圖的偏移。

所以,特徵圖越大,其能分辨的特徵越區域性,而特徵圖越小,其能分辨的特徵就越全域性,對於小物體檢測,需要增加尺寸大的特徵圖數量,減少尺寸小的特徵圖數量。

2.2.2.2 SSD anchor

SSD提出了8732個大小不一的anchor,兼顧大小不同、高矮胖瘦不同的物體檢測,如圖4所示。

圖4 SSD錨框分佈

2.2.2.3 SSD損失函式

SSD損失函式包含2個部分,一部分是物體類別預測損失的交叉熵Loss1,一部分是預測物體位置偏移的損失Loss2。

  • 物體類別預測的Loss1損失

  這類損失,採用的是交叉熵計算,採用了一個trick,用於平衡正負樣本不均衡的問題,即對每張影像,正樣本為n,則對應選取3n的負樣本,也即正樣本的權重為1。

對於正負樣本不均衡的問題,也可借鑑Focus Loss的思路,給正負樣本的loss,分別設定一個權重,以減輕樣本不均衡帶來的問題。

  • 物體位置偏移預測的Loss2損失

  SSD採用的是L1SmoothLoss,L1SmoothLoss是對L1損失函式的改進,將0附近的點變得可導且光滑,更容易使模型訓練收斂,如圖5所示。

圖5 L1損失、L1SmoothLoss效果對比

2.2 無anchor的物體檢測演算法

  此類物體檢測演算法,規避了因引入anchor而帶來的額外的龐大計算開銷,實際執行效果也還不錯,代表演算法有DETR、FCOS、Yolov8等。

2.3.1 DETR演算法

  DETR演算法全稱為Detection Transformer,是一種基於Transformer的物體檢測框架,先透過傳統CNN提取影像特徵為一個Contextual Vector,經位置編碼後,利用Transformer encoder對Contextual Vector進行特徵提取,然後使用Transformer decoder結合object queries生成式地輸出目標物體的位置和物體類別,演算法原理如圖6所示。

圖6 DETR演算法原理

DETR演算法的缺點是訓練慢、所需的資料規模也比較大,在小物體檢測上表現還有所欠缺,但其優點是演算法架構靈活,很容易地應用於全景分割,在較大物體的檢測上效果不錯。

2.3.2 FCOS演算法

  FCOS演算法是基於anchor-based演算法衍生出的一種anchor-free演算法,圖7描述了FCOS演算法原理。

圖7 FCOS演算法原理

從演算法原理圖上看,FCOS同SSD、YOLO差異似乎不是太大,至少在特徵提取、多尺度這塊,三者差異不大,都是透過特徵圖實現多尺度,以及透過提取區域性區域感受野的特徵,作為後續物體類別、位置偏移的預測提供依據。

FCOS與SSD、YOLO的不同,在於對特徵圖上點的處理,SSD會基於特徵圖的每個點,設定一些anchor,然後做後續GT框的分配和預測後的NMS處理等等,而FCOS對於特徵圖點的處理,是將其對映回原圖中的一個點,如果這個點恰好在某個GT框的內部,則該特徵圖點對應子塊在原圖中的位置,則為一個正樣本。之後FCOS基於每個特徵圖的每個特徵點,透過Head分支預測其對應塊的物體類別、center_ness、l、t、r、b,center_ness是一個權重項,用來抑制預測目標同GT框中心點相距很遠,從而使預測質量低下的情況。

3、影像分割

  影像分割是基於物體檢測任務,自然而然派生出來的任務,物體檢測本質上還是一種粒度較為粗糙的檢測任務,只是對物體所在位置畫了一個檢測方框,而物體本身面積可能在該檢測框內所佔面積還不到1/10。

影像分割是一種精度要求較高的任務,本質是畫素級的分類任務,即對影像中的每個畫素進行分類,經典框架有UNet,以及後續的Deeplab、Yolact等。

UNet框架採用的是一種Encoder-Decoder,如圖8所示,UNet的左半邊是不斷CNN及降取樣的過程,這個過程是Encoder的編碼過程,而UNet的右半邊,是不斷轉置CNN和上取樣的過程,這個過程是Decoder的解碼過程,編碼過程和解碼過程會有shortcut短接的資料連線,以使用上取樣時可以訪問原始的低層特徵。

圖8 UNet架構

UNet框架雖然簡單,但其應用價值非常重要,後面擴散模型Stable Diffusion Model(LDM)等很多地方都會用到。

4、總結

  計算機視覺類的常見任務有影像分類、物體檢測和影像分割,這些任務已經派生出了非常多的經典框架,可根據任務的實際情況,酌情使用。

關注更多安卓開發、AI技術、股票分析技術及個股診斷等理財、生活分享等資訊資訊,請關注本人公眾號(木圭龍的知識小屋)

相關文章