圖像目標檢測算法——總結

2021-01-08 程式設計師觀察

傳統目標檢測方法

Selective Search

Deformable Part Model

基於CNN 的目標檢測

1. Two-stage 方法

所謂Two-stage 的方法,指的是先通過某種方式生成一些備選框,然後對備選框裡的內容進行分類,並修正備選框的位置的方法。由於包含了region proposal 和detection 兩個步驟,因此稱為two-stage(兩階段)方法。最開始的CNN 目標檢測就是兩階段的。

R-CNNR-CNN 是最早利用CNN 實現目標檢測任務的方法,由rbg(Ross Girshick)等人提出。這裡的R 指的是Region,R-CNN 即「Regions with CNN features」,即對不同的區域進行CNN 特徵提取和分類。

R-CNN 方法pipeline

鑑於CNN 在整圖分類任務中的優異性能,很自然的想法是將其用於目標檢測領域,將CNN 強大的數據驅動的特徵提取能力遷移到比整圖分類更細緻和複雜的任務中。R-CNN 的思路相對容易理解,它主要有以下幾個步驟:

1. 通過Selective Search(SS)方法篩選出一些備選的區域框(Region proposal)。

2. 將這些備選的proposal 縮放到指定尺寸,用於輸入CNN 進行分類(根據某種規則將各個proposal 分成正負樣本)。其目的在於通過訓練CNN,得到每個region proposal 的定長特徵向量。

3. 用每個proposal 中提取的特徵向量訓練SVM,得到最終的分類結果。

4. 利用非極大值抑制(Non-Maximun Suppresion) 方法,對最終得到的bbox 進行篩選。

5. 分類完成後,對bbox 進行回歸,修正bbox 中的坐標的值,得到更精確的bbox。

詳細來說,第一步中,SS 可以得到大量的備選框,這些框中都有可能有某個類別的目標,因此都需要進行後續的處理。這個步驟是不區分類別的。第二步驟中,由於第一步SS 得到的proposal 沒有指定大小和比例(長寬比),因此用普通的CNN(R-CNN 中用的是AlexNet)無法得到一樣長度的特徵向量。R-CNN 採取的對策是直接用縮放的方式將所有proposal 強行整理成同樣的大小。這裡的縮放並不確切,實際上是某種形變(warp),因為這種操作可能會導致proposal 的長寬比例發生改變,導致目標物體也發生形變。縮放完成後,剩下的步驟就是普通的整圖分類時的結果,即輸入CNN,輸出每個類別的概率的向量。由於這個任務上(Image classification)已經有了很多在ImageNet 這種大數據集上預訓練好的模型,因此可以直接借用,進行微調(fine-tune)。這個過程並不是最終的分類結果,而是只用來得到最後一層的特徵向量。然後,將特徵向量用來訓練SVM,得到最終的分類。(這種先CNN 再SVM 的方法,僅僅將CNN 作為feature extractor,這種策略在有些場景下效果要比直接CNN 輸出結果要好。這個實際上就是用SVM 替換了CNN 的最後一個LR。)

這裡有一個注意點,即正負樣本如何確定(CNN 和SVM 都需要有監督的樣本)。這裡,也是採用了groundtruth(GT)和SS 的proposal 之間的IoU 來進行確定。如果一個proposal 和某個類別的GT 的IoU 大於某個閾值,那麼,這個proposal 的樣本就被視為該類別的正樣本。

最後要進行的是NMS 操作,這個是為了避免很多大小類似且只有微小位移的框(它們實際上框定的是同一個object)都被輸出,導致框的重疊和冗餘。NMS 的過程如下:

輸入:所有預測結果大於閾值的bbox,包含四個位置坐標(角點的x 和y,以及長w 寬h),以及一個置信度c。輸出:過濾了重複和冗餘後的bbox 列表。過程:首先,將所有預測出的bbox 按照c 進行降序排列。另外,維護一個輸出列表list,初始化為空。然後進行遍歷,每次取出一個bbox。如果該bbox 與list 中的某個bbox 具有超過閾值thr 的IoU,那麼不輸出該bbox。否則,將該bbox 加入list。當所有預測的bbox 都被遍歷完後,NMS 算法結束。

可以看出,如果bbox 和list 中的某個已有的決定輸出的bbox 重疊較大,那麼說明它們只需要留下一個即可。根據置信度,我們肯定選擇留下置信度高的那個。由於已經按照置信度排好序了,所以先進入list 的自然置信度更高,所以直接捨棄後面的即可。

最後一步,利用特徵預測邊框的位置,即bbox 回歸。該過程的輸入是CNN 的特徵,這裡用的是pool5 的特徵,需要回歸的目標值並不是實際的x,y,w,h。由於我們已經用SS 給出了一個位置,所以只需要預測兩者的差異即可。具體公式為:

tx = (Gx Px)/Pwtx = (Gy Py)/Phtw = log(Gw/Pw)th = log(Gh/Ph)

公式中G 表示ground-truth,P 表示predict。根據公式,這樣的目標變量相對比較穩定,便於回歸。R-CNN 在SS 過程中需要花費較多時間,且對每個proposal 都要過一遍CNN,因此效率較低。基於R-CNN的一些問題和缺陷,後面的方法做了不同程度不同方向的修正,從而形成了以R-CNN 為源頭的一條清晰的研究線路。

SPP-netSPP-net 是何愷明、孫健等人的作品。SPP-net 的主要創新點就是SPP,即Spatial pyramid pooling,空間金字塔池化。該方案解決了R-CNN 中每個region proposal 都要過一次CNN 的缺點,從而提升了效率,並且避免了為了適應CNN 的輸入尺寸而圖像縮放導致的目標形狀失真的問題。

在R-CNN 中,整個處理流程是這樣的:

圖像- 候選區域-CNN - 特徵- 輸出

而對於SSP-net 來說,上面的過程變成了:

圖像- CNN -SPP - 特徵- 輸出

可以看出,R-CNN 中,每個區域都要過一次CNN 提取特徵。而SPP-net 中,一張圖片只需要過一次CNN,特徵提取是針對整張圖進行的,候選區域的框定以及特徵向量化是在CNN 的feature map 層面進行的,而非直接在原始圖像上進行(R-CNN)。

R-CNN 之所以要對候選框進行縮放後再輸入CNN,是為了保證輸入圖片尺寸一致,從而得到定長特徵向量(全連接層的存在使得CNN 需要輸入同樣大小的圖像)。如果直接用不同的region proposal 的框來限定某個區域,就需要有某種辦法保證也能得到不受輸入尺寸影響的定長向量。這種辦法就是SPP。

SPP 實際上是一種自適應的池化方法,它分別對輸入的feature map(可以由不定尺寸的輸入圖像進CNN得到,也可由region proposal 框定後進CNN 得到)進行多個尺度(實際上就是改變pooling 的size 和stride)的池化,分別得到特徵,並進行向量化後拼接起來。如圖。

和普通的pooling 固定size 不同(一般池化的size 和stride 相等,即每一步不重疊),SPP 固定的是池化過後的結果的尺寸,而size 則是根據尺寸計算得到的自適應數值。這樣一來,可以保證不論輸入是什麼尺寸,輸出的尺寸都是一致的,從而最終得到定長的特徵向量。

SPP結構

SPP 的window size 和stride 的計算如下:

win = ceil(a/n), str = floor(a/n)

除了SPP 外,SPP-net 也沿用了hard negative sampling 和NMS 等技術。

Fast R-CNNFast R-CNN 是rbg 對之前提出的R-CNN 的改進版。主要結構如下:

Fast R-CNN 結構

從SPP-net 的分析中其實可以看出,制約R-CNN 速度的實際上就是對一張圖片的多個ROI 進行的很多重複的CNN 計算。因此,只需要對一張圖片計算一遍CNN 的feature map,然後對各個ROI 分別整理出特徵就可以了。SPP 中的所謂「金字塔」結構和解決R-CNN 的速度問題關係不太大,主要還是由於SPP 對各個ROI的feature map 直接提特徵導致了效率的提高。因此,Fast R-CNN 也沿用這個思路進行了改造升級,變成了Fast R-CNN。

Fast R-CNN 提出了ROI pooling 的結構,實際上就是一種特殊的SPP(相當於SPP 的金字塔層數設置為了1,即只計算一次池化)。

Fast R-CNN 的另一個改造是,將最終的SVM 分類去掉了,直接做成了端到端的一個網絡結構。對這個網絡進行多任務訓練,即分類和回歸,得到物體類別和bbox 的位置。這個多任務的損失函數如下:

L = losscls(p, u) + [u ≥ 1]lossloc(tu, v) (1.3)

其中,losscls 為分類損失,形式為log pu,pu 為真實類別上的預測概率。而lossloc 為位置損失,只在非背景(u=0 是背景,u ≥ 1 表示非背景的類別)才進行位置損失的優化。位置損失的函數形式為smooth-L1 損失,即在自變量小於1 的時候為平方項,而大於1 的時候為L1 損失。之所以採用L1 損失,是因為回歸的預測沒有範圍限制,L1 函數可以較好地抑制異常點的影響。

Faster R-CNNFaster R-CNN 在Fast R-CNN 的基礎上又進行了改進。主要的改進點是利用RPN 網絡(Region Proposal Network)代替了Selective Search 生成備選框。另外,引入了anchor 的概念,anchor 方法在後面的模型中也一直被沿用了下來。

首先介紹RPN 網絡。在前面的模型中,計算時間效率的時候都排除了預先SS 生成候選框的過程的時間消耗。但是實際上這一部分佔據了較多的時間。因此,在Faster R-CNN 中,不再預先利用SS 生成候選框,而是利用一個與檢測器共享部分權重的RPN 網絡來直接對圖片生成候選框,然後基於RPN 得到的候選框進行分類和位置回歸。

基於RPN 的Faster R-CNN 網絡的結構如下:

Faster R-CNN 結構

可以看出,RPN 的region proposal 也是基於前面的CNN backbone 提取的feature map 進行的,而檢測則是基於ROI pooling,和之前一樣。整個過程中,原始圖像過了一遍CNN,所有的操作都是基於整圖的featuremap 進行的。

RPN 網絡是基於anchor box 的方式進行的。過程示意圖:

RPN 的過程

首先,定義anchor box 的尺寸(scale)和比例(aspect ratio)。按上圖,預先定義了k 個anchor box。在實際的RPN 網絡實現中,共採用了3 個不同的scale(大中小)和3 種不同的比例(寬中窄)。然後通過組合,得到了9 個anchor box,即k=9。在訓練RPN 的過程中,對於每個feature map 上的像素點,都生成k 個anchorbox 的預測。由於預測需要有兩個輸出用來分類(前景/背景),以及4 個用來定位(x,y,w,h),所以RPN 的分類層生成的是2k 維度的向量,RPN 的回歸層生成的是4k 維度的向量。

既然要訓練RPN 的分類,就需要定義正負樣本。在RPN 中,正樣本被定義為滿足如下條件之一的那些anchor box:1. 在anchor box 中具有最高的GT IoU;2. GT IoU 大於0.7。而對於負樣本來說,只要滿足GTIoU 小於0.3,即被認定為負樣本。除了上面的正負樣本以外,其他的anchor box(即不滿足正樣本也不滿足負樣本條件的)不參與訓練,對損失函數優化沒有貢獻。

RPN 的損失函數和Fast R-CNN 的類似,分類損失根據預測和GT 的類別計算,回歸損失只用label=1,即有object 的那些預測結果的框計算。回歸仍然用的是smooth L1 損失。基於anchor box 回歸邊框的目標值和基於SS 的類似,也是用proposal 的值作為基準,只回歸一個位移和縮放。由於Faster R-CNN 中採用了網絡做region proposal 和檢測,所以訓練方式與之前有所不同。在實現中,首先用ImageNet 預訓練做初始化,然後訓練RPN,訓練好RPN 後就可以生成region proposal 了,然後用RPN 的proposal 單獨訓練Fast R-CNN,即檢測網絡。然後再用檢測網絡初始化RPN,並保持公共的層的權重固定,對檢測網絡的非共享層進行微調。

Faster R-CNN 由於可以端到端的進行,無需SS 提前準備備選框,因此可以做到近實時的速度(near real time),所有過程可以5fps 的速度實現。

2. One-stage 方法

與two-stage 方法不同,one-stage 的思路是直接對圖像進行各個位置上的候選框的預測和分類,不需要預先生成一些備選框。以YOLO 和SSD 等方法為代表的就是one-stage(單階段)方法。

YOLO (v1)

「YOLO」是一句美語俚語「you live only once」的縮寫,字面意思是「人生只有一次」,引申義即「及時行樂」,表達一種人生態度。本模型的名稱借鑑了YOLO 這個說法,全名是:You Only Look Once,表示只需要看一次即可完成識別,主要是為了與之前的兩階段(看兩次)進行區分。我們人類看到某個場景時,並不會先看一下有沒有物體,物體在哪,然後再確定這個物體是什麼,而是「只看一次」,就完成目標位置和內容的判斷。

YOLO 的模型結構和之前的以R-CNN 為基礎的模型差別較大,整個過程如下所示:

YOLO v1 網絡結構

YOLO 的過程如下:首先,將整個圖像分成S × S 的小格子(cell),對於每個格子,分別預測B 個bbox,以及C 個類別的條件概率(注意是條件概率,即已經確定有目標的情況下,該目標屬於哪個類別的概率,因此不需要對每個bbox 分別預測類別,每個格子只預測一個概率向量即可)。每個bbox 都有5 個變量,分別是四個描述位置坐標的值,以及一個objectness,即是否有目標(相當於RPN 網絡裡的那個前景/背景預測)。這樣一來,每個格子需要輸出5B+C 維度的向量,因此,CNN 最終的輸出的tensor 的形態為S × S × (5B + C)。

在YOLO v1 的實現中,採用了7*7 的cell 劃分,每個cell 預測2 個bbox,在Pascal VOC 數據集上,共有20 類,因此C=20。所以輸出的結果是一個7 × 7 × 30 的tensor。

YOLO 的訓練過程如下:首先,對於每個GT bbox,找到它的中心位置,該中心位置所在的cell 負責該物體的預測。因此,對於該cell 中的輸出,其objectness 應該儘可能的增加,同時其位置坐標儘可能擬合GTbbox(注意,由於每個cell 可以輸出多個備選的bbox,因此這裡需要選擇和GT 最相近的那個預測的bbox 進行調優)。另外,根據其實際的類別,對類別概率向量進行優化,使其輸出真實的類別。對於不負責任何類別的那些cell 的預測值,不必進行優化。

YOLO 的損失函數如下:

YOLO 損失函數

YOLO 模型雖然速度快,但是對於小物體檢測不敏感,以及具有一些固有的缺陷,如定位準確性差等等。在YOLO v1 的訓練過程中,還用到了dropout 和一些數據增廣的策略方法。這個是YOLO 的初版,後續還有很多改進版本。

SSD

SSD 的全稱是Single Shot MultiBox Detector。SSD 也是一種one-stage 的直接檢測的模型。它相比起YOLO v1 主要的改進點在於兩個方面:1. 利用了先驗框(Prior Box)的方法,預先給定scale 和aspect ratio,實際上就是之前Faster R-CNN 中的anchor box 的概念。2. 多尺度(multi-scale)預測,即對CNN 輸出的後面的多個不同尺度的feature map 都進行預測。下圖是SSD 論文作者給出的SSD 與YOLO 的結構的比較:

SSD 的結構及其與YOLO 的區別

可以看出,相比於YOLO,SSD 在不同尺度上進行預測,這個過程的具體操作如下:首先,根據不同feature map 的尺寸,或者說縮放比例,找到每個feature map 和原圖的尺寸的對應關係。然後,設計不同比例的先驗框。對於每個GT bbox,分別在不同尺度下考察各個點上的各個比例的先驗框,找到最相似的,用來負責預測。

如下圖中,狗的尺寸較大,因此用到了更靠後的feature map(越靠後所代表的原圖中的比例越大),而貓的尺寸較小,用的是前面的feature map。同時,還要適配各自的長寬比。

SSD 的多尺度先驗框預測

通過上面的改進,SSD 提高了速度,同時也提升了準確率,另外還對於低解析度圖像也能有較好的預測結果。

YOLO v2YOLO v2 是對YOLO v1 的改進版本。論文中叫做YOLO9000,因為它可以識別9000+ 的類別的物體。

YOLO v2 的主要改進為以下幾個方面:

對所有卷積層增加了BN(BatchNorm)層。用高解析度的圖片fine-tune 網絡10 個epoch。通過k-means 進行聚類,得到k 個手工選擇的先驗框(Prior anchor box)。這裡的聚類用到的距離函數為1 - IoU,這個距離函數可以很直接地反映出IoU 的情況。直接預測位置坐標。之前的坐標回歸實際上回歸的不是坐標點,而是需要對預測結果做一個變換才能得到坐標點,即x = tx × wa xa (縱坐標同理),其中tx 為預測的直接結果。從該變換的形式可以看出,對於坐標點的預測不僅和直接預測位置結果相關,還和預測的寬和高也相關。因此,這樣的預測方式可以使得任何anchor box 可以出現在圖像中的任意位置,導致模型可能不穩定。在YOLO v2 中,中心點預測結果為相對於該cell 的角點的坐標(0-1 之間),如下:多尺度訓練(隨機選擇一個縮放尺度)、跳連層(paththrough layer)將前面的fine-grained 特徵直接拼接到後面的feature map 中。

YOLO v2 預測bbox 的坐標

YOLO v2 的backbone 被稱為Darknet-19,共有19 個卷積層,間以Maxpool。其中,3*3 conv filter 和1*1 conv filter 交替的方式被採用。最後利用一個Avgpool(GAP,Global Average Pooling)輸出預測結果。

除了上述對於模型結構以及訓練過程的改進,YOLO9000 的另一個亮點在於它利用了標籤的層級結構(Hierarchy)。由於ImageNet 的label 來自於WordNet,作者將WordNet 轉化為了WordTree,預測的時候實際上預測的是條件概率,即如果屬於父節點的概念(標籤),那麼他屬於子節點的概率為多大。所以,對於某個葉子節點的類別,他的實際的預測概率是整個路徑的預測值的乘積。

由於每個條件概率在對應的節點上應該歸一(sum to one),所以,softmax 應該對該節點的所有類別進行,而非全部類別做softmax。這是利用WordTree 做標籤訓練的一個注意點。

FPNFPN 全稱Feature Pyramid Network,其主要思路是通過特徵層面(即feature map)的轉換,生成語義和低層信息都很豐富的特徵金字塔,用於預測。

如圖所示,(a) 表示的是圖像金字塔(image pyramid),即對圖像進行放縮,不同的尺度分別進行預測。這種方法在目標檢測裡較為常用,但是速度較慢,因為每次需要對不同尺度的圖像分別過一次CNN 進行訓練。(b)表示的是單一feature map 的預測。由於圖像金字塔速度太慢,索性直接只採用最後一層輸出進行預測,但這樣做同時也丟失了很多信息。(c) 表示的是各個scale 的feature map 分別進行預測,但是各個層次之間(不同scale)沒有交互。SSD 模型中就是採用了這種策略,將不同尺度的bbox 分配到代表不同scale 的feature map上。(d) 即為這裡要將的FPN 網絡,即特徵金字塔。這種方式通過將所有scale 的feature map 進行打通和結合,兼顧了速度和準確率。

圖像、特徵金字塔的處理方式對比

FPN 在每兩層之間為一個buiding block,結構如下:

FPN 特徵金字塔結構

FPN 的block 結構分為兩個部分,一個自頂向下通路(top-down pathway),另一個是側邊通路(lateral pathway)。所謂自頂向下通路,具體指的是上一個小尺寸的feature map(語義更高層)做2 倍上採樣,並連接到下一層。而側邊通路則指的是下面的feature map(高解析度低語義)先利用一個1x1 的卷積核進行通道壓縮,然後和上面下來的採樣後結果進行合併。合併方式為逐元素相加(element-wise addition)。合併之後的結果在通過一個3x3 的卷積核進行處理,得到該scale 下的feature map。

RetinaNet

RetinaNet 的最大的貢獻不在於網絡結構,而是在於提出了一個one-stage 檢測的重要的問題,及其對應的解決方案。這個問題就是one-stage 為何比two-stage 的準確率低,兩者的區別在哪裡?解決方案就是平衡正負樣本+ 平衡難易樣本的focal loss。下面詳細介紹。

首先,RetinaNet 的作者發現,two-stage 和one-stage 的目標檢測方法的一個很大的區別在於:two-stage的方法通過SS 或者RPN 給出了一些預先選好的先驗框,這個數量一般是1 2k 左右,從而保證正負樣本的比例大概在1:3 左右。而在one-stage 方法中,這個過程被省略了,導致負樣本比例大約為100k 的量級。這樣懸殊的正負樣本比例,使得在訓練one-stage 模型的過程中,那些容易區分的負樣本佔據了主導地位,而難分的正樣本(我們更關注的)則不太容易得到較好地訓練。

基於這個發現,作者設計了一種新的損失函數的形式,以取代普通的分類問題中的交叉熵損失。Focal loss 的數學形式如下:

FocalLoss(pt) = αt(1 pt) ^γ log(pt)

其中,αt 表示正負樣本的權重係數,這個在處理正負樣本不均衡的情況下是常用的方法。

pt 當實際label 為1 時,取值為p(即輸出的正樣本預測概率),當實際label 為0 時,取值為1-p(實際上表示負樣本的概率)。可以看出,pt 表示的是預測出的真實值的概率。因此,(1 pt) 表示的就是預測結果距離真實結果的差距。比如,本來應該是正樣本,預測應該為1,此時如果p=0.8,那麼說明還有0.2 的差距。類似地,對於負樣本,應該預測為0,如果此時p=0.3,則差距為0.3。

這個差距實際上度量的就是該樣本可分性的難易程度。差距越大,說明該樣本越難分。於是,我們將該差距作為係數(進行了冪次處理後),和前面的正負樣本權重係數一起,組成新的權重。這樣一來,這個損失函數一方面調整了正/負樣本之間的不均衡,還兼顧了難/易樣本之間的不均衡。

指數參數γ 叫做聚焦參數(focusing parameter),它控制著難易樣本權重的差別程度。比如,當γ = 2 時,預測結果為0.9 的正樣本的係數僅為0.01,而預測結果為0.6 的正樣本的係數為0.16。相差16 倍。如果指數為1,那麼差距僅為4 倍。

RetinaNet 的網絡結構沿用了FPN 的基本構件,並且設計了分類子網絡和回歸自網絡,分別進行類別預測和bbox 回歸。如圖:

RetinaNet 網絡結構

Mask R-CNNMask R-CNN 顧名思義,是為每個目標物體生成一個mask。本模型將實例分割(instance segmentation)與目標檢測(object detection)兩個任務相結合,並在兩個任務上都達到了SOTA。

Mask R-CNN 的基本結構如下:

整個過程的pipeline 如下:首先,輸入圖片,根據RoI 進行RoIAlign 操作,得到該區域內的特徵,然後將該特徵feature map 進行逐點sigmoid(pixel-wise sigmoid),用於產生mask。另外,還有一個支路用於分類和回歸。

Mask R-CNN 網絡結構

Mask R-CNN 中的分類和mask 生成之間是解耦的。這種方式和常見的直接對所有類別做逐像素的softmax不同。

下面介紹ROIAlign。ROIAlign 的基本出發點是在ROI pooling 中的兩次量化(quantization)。第一次是從原圖的bbox 映射到feature map 的時候,由於尺寸不一致,需要縮放,並對準像素點(取整),此為第一次量化。第二次是根據fixed length 特徵向量,計算pooling 的步長的過程中,由於可能會除不盡,從而需要再一次地取整。這兩次量化使得最終的結果與原圖差異較大,位置不準。因此,提出RoIAlign 進行改進。

ROIAlign 的基本過程如下:如圖,首先對一個不定尺寸的ROI 進行切分,完全平均分為四塊,此時可能分割點不是整數(沒有落在某個像素上),然後,在每個小塊內平均地取四個點,這四個點也不需要是整數。取出這四個點的值,對於不落在實際像素點上的點的情況,通過插值方法根據四周像素點的值進行計算。計算完畢後,每個塊內取其四個值的max,類似max pool,得到每個塊的輸出值。這樣即可得到一個2x2 的輸出結果。

Mask R-CNN 的損失函數由三個部分構成,分別是cls、reg 和mask。

ROIAlign 原理

https://tjmachinelearning.com/lectures/1718/instance/instance.pdf)

YOLO v3YOLO v3 是針對YOLO 模型的又一次改進版本,如作者自稱,是一個incremental improvement,並無太大創新,基本都是一些調優和trick。主要包括以下幾個方面。

1. 用單類別的binary logistic 作為分類方式,代替全類別的softmax(和mask R-CNN 的mask 生成方式類似)。這樣的好處在於可以處理有些數據集中有目標重疊的情況。

2. YOLO v3 採用了FPN 網絡做預測,並且沿用了k-means 聚類選擇先驗框,v3 中選擇了9 個prior box,並選擇了三個尺度。

3. backbone 做了改進,從darknet-19 變成了darknet-53,darknet-53 除了3x3 和1x1 的交替以外,還加入了residual 方法,因此層數得到擴展。

目標檢測模型改進思路總結

最早的目標檢測方法實際上就是圖像分類方法,只是以ROI 中的區域代替整圖進行,如R-CNN,過程為:選區域-CNN 提取特徵-SVM 分類。然後,考慮到重複計算的冗餘,SPP-net 提出,用空間金字塔池化,即自適應stride 的池化,保證任意大小都能得到定長特徵向量。然後是Fast R-CNN,沿用了ROI pooling 的思路,並且加入了新的改進,即多任務學習,直接網絡端到端回歸bbox,並進行分類,去掉了SVM。到此為止,模型已經確定了,只是ROI 的方法還是利用Selective Search,導致預處理速度較慢,拖慢了整體的速度。因此,Faster R-CNN 引入了一個和檢測網絡共享部分權重的RPN 網絡,用網絡進行region proposal,從而提高了整體的效率,去掉了Selective Search。

上述的方法都是two-stage,即先給出候選框,然後在進行分類和微調位置。於是,另一種新的思路,即直接進行預測bbox 和類別,這就是one-stage 的方法。代表就是YOLO 模型,通過對圖像劃分成多個區塊,直接輸出一個和區塊數相同的tensor,每個區塊的預測向量裡包含了其是否有目標,是什麼類別,以及具體位置的修正。SSD 基於YOLO 的基本思路,考慮了多尺度的情況,將不同尺度的GT bbox 分配到不同尺度去預測,不同尺度的預測即通過不同層的feature map 進行。後續的YOLO v2 提出了對位置的直接預測方法,以及用k-means 聚類來手工得到先驗框的方法,並利用darknet-19 作為backbone 網絡。FPN 網絡的基本思路是將不同尺度的feature map 通過網絡連接的方式進行融合,並在每一層進行預測,從而可以利用不同尺度的信息。

RetinaNet 基本沿用了FPN 的思路,但是提出了focal loss 來處理樣本比例不均衡的問題,對數量較少的正樣本,以及難分樣本給予較多的關注。Mask R-CNN 將實例分割與目標檢測進行結合,融合了分類、回歸、mask三個損失進行優化。YOLO v3 採用了具有residual 模塊的darknet-53 作為backbone,並且用了binary logistic代替全局softmax,以及FPN 網絡等trick,提升了性能。

相關焦點

  • ...遙感圖像目標跟蹤算法、語義分割算法、人體目標檢測等技術全球...
    目前,公司的自研算法已在眾多領域實現商用化,人工智慧應用主要聚焦在智能交通、人臉、行為分析、物品識別、機器人、多維傳感融合等多個應用領域,根據不同行業的應用場景推出端到端的人工智慧解決方案與產品。在AI的各細分領域,公司近期在場景分析評測、遙感圖像目標跟蹤算法、語義分割算法、人體目標檢測等技術全球排行中取得第一,彰顯了大華在AI領域深厚的技術積澱。感謝您的關注!
  • 基於深度學習的目標檢測算法總結(Faster R-CNN,YOLO,SSD等)
    基於深度學習的目標檢測算法分類由於無需進行人工的特徵設計、良好的特徵表達能力及優良的檢測精度,目前,基於深度學習的目標檢測算法已經超越傳統檢測方法,成為當前目標檢測算法的主流。依據其設計思想,主要可分為兩種,即基於區域提名的目標檢測算法和基於端到端學習的目標檢測算法。
  • 目標檢測(一)——RCNN算法
    原創課程,第一時間送達 前言 傳統目標檢測算法: 傳統的目標檢測算法大部分是通過不同大小的滑動窗口掃描圖片,然後進行特徵提取,最後使用分類器分類,這樣做的缺點是: 1)基於滑動窗口的區域選擇策略沒有針對性,時間複雜度高,
  • 圖像局部特徵點檢測算法綜述
    ,圖像特徵檢測的方法很多,又加上各種算法的變形,所以難以在短時間內全面的了解,只是對主流的特徵檢測算法的原理進行了學習。在應用方面,後面會增一些具有實際代碼的例子,尤其是基於特徵點的搜索與運動目標跟蹤方面。1.
  • 目標檢測之公開圖像數據集
    建立一個具有較小偏差的大數據集,對於開發先進計算機視覺算法是很重要的。在PASCALVOC中是多任務的,包括圖像分類,目標檢測,語義分割和行為檢測。在目標檢測中有兩個Pascal-VOC版本:VOC07和VOC12,其中前者有5k張圖像和27k個被標註目標,後者則有11k張圖像和27k個被標註的目標。
  • 不需要錨框:一種全卷積 One-Stage 目標檢測算法(FCOS)
    本文來源於 ICCV'19 上發表的一種新的目標檢測技術 FCOS :全卷積 One-Stage 目標檢測算法。該算法提出了一種非常直觀和簡單的方法來解決目標檢測問題,本篇文章是對該算法的總結。本文內容框架基於錨框的檢測器(Anchor-Based Detectors)全卷積 One-Stage 目標檢測算法(FCOS)的提出多級檢測(Multi-level detection)Centre-Ness 策略實驗對比總結基於錨框的檢測器(Anchor-Based Detectors)現有的目標檢測方法大多使用預先定義的錨框,如:Fast-RCNN,YOLOv3
  • 針對不同場景設計目標檢測算法
    在項目中經常會遇到各種各樣的需求,我曾經遇到過的一些比較少見的需求,火焰檢測,閃電檢測。我記得18年的時候,拿到一個需求是雷電檢測,就是下雨天,檢測視頻中的閃電,當時拿SSD直接幹,啥也幹不出來,一條閃電又細又長。後來才意識到針對不同的任務,要去根據應用場景去設計算法。anchor-based的目標檢測當然就是針對場景設計anchor了。
  • 一文帶你學會使用YOLO及Opencv完成圖像及視頻流目標檢測(下)
    在上一節內容中,介紹了如何將YOLO應用於圖像目標檢測中,那麼在學會檢測單張圖像後,我們也可以利用YOLO算法實現視頻流中的目標檢測。將YOLO應用於視頻流對象檢測首先打開 yolo_video.py文件並插入以下代碼:同樣,首先從導入相關數據包和命令行參數開始。
  • 2020「水下目標檢測算法賽」賽題解析——聲學圖像
    為了解決該類問題,將光學技術、聲學技術和 AI 算法更好的融入到海洋產業中,近期,一場由國家自然基金委、鵬城實驗室和湛江市人民政府聯合主辦的線上比賽「水下目標檢測算法賽」拉開了帷幕。聲學圖像在水下目標檢測中探程遠、實用性強,針對「聲學圖像目標檢測」賽項,鵬城實驗室專門開設了 2 期在線直播課程,先後請到上海達華測繪有限公司專家李太春老師和河海大學、水下信息感知技術研究中心副主任霍冠英老師,為參賽者和算法愛好人士提供深入淺出的專業講座。
  • 「少即是多」的目標檢測算法Sparse R-CNN
    近幾年來,目標檢測算法發展迅速,許多新出現的目標檢測範式有著很強的相同之處,如Anchor-Free的方法中不依賴於Anchor的目標檢測範式:CenterNet兼有結構簡單和高的準確率;FCOS創新性目標檢測思路。
  • 基礎目標檢測算法介紹:CNN、RCNN、Fast RCNN和Faster RCNN
    現在,目標檢測算法或許能做到。目標檢測的用途遍布多個行業,從安防監控,到智慧城市中的實時交通監測。簡單來說,這些技術背後都是強大的深度學習算法。在這篇文章中,我們會進一步地了解這些用在目標檢測中的算法,首先要從RCNN家族開始,例如RCNN、Fast RCNN和Faster RCNN。1.
  • 最強目標檢測算法YOLOv4論文解讀
    YOLO v4中使用的方法加權殘差連接(WRC)跨階段部分連接(CSP)交叉小批量歸一化(CMBN)自動對抗訓練(SAT)MISH激活鑲嵌數據增強CmBNDROPBOLD正則化CIOU損失目標檢測算法比較通過上圖可以看出,在MSCOCO數據集上,YOLO v4和其它比較先進的目標檢測算法比較,從速度和精度綜合來看,明顯優於其它算法。
  • 乾貨|一文讀懂圖像局部特徵點檢測算法
    研究圖像特徵檢測已經有一段時間了,圖像特徵檢測的方法很多,又加上各種算法的變形,所以難以在短時間內全面的了解,只是對主流的特徵檢測算法的原理進行了學習研究。總體來說,圖像特徵可以包括顏色特徵、紋理特徵、形狀特徵以及局部特徵點等。其中局部特點具有很好的穩定性,不容易受外界環境的幹擾,本篇文章也是對這方面知識的一個總結。
  • 目標檢測算法Fast R-CNN詳解
    前面我們一起學了SPP-Net和R-CNN的相關知識,如下:目標檢測算法SPP-Net詳解目標檢測R-CNN通俗詳解由於每期都是逐步改進
  • 深入了解目標檢測深度學習算法的技術細節
    一種費機器(奢侈計算)的方法:窮舉搜索最簡單的目標檢測方法是對圖像的各個子部分使用圖像分類器,讓我們來逐個考慮:· 首先,選擇想要執行目標檢測的圖像。· 使用經典的圖像分類器對每幅圖像進行分類。· 最後,將檢測到目標的區域的所有圖像與預測標籤結合。
  • 計算機視覺:圖像檢測和圖像分割有什麼區別?
    翻譯:雷鋒字幕組(明明知道)人工智慧中的圖像處理人工智慧對於圖像處理有不同的任務。在本文中,我將介紹目標檢測和圖像分割之間的區別。在這兩個任務中,我們都希望找到圖像中某些感興趣的項目的位置。通常有兩種方法可以用於此:目標檢測(Object Detection)和圖像分割(Image Segmentation)。目標檢測-預測包圍盒當我們說到物體檢測時,我們通常會說到邊界盒。這意味著我們的圖像處理將在我們的圖片中識別每個人周圍的矩形。邊框通常由左上角的位置(2 個坐標)和寬度和高度(以像素為單位)定義。
  • YOLO 系目標檢測算法家族全景圖!
    YOLO目標檢測算法誕生於2015年6月,從出生的那一天起就是「高精度、高效率、高實用性」目標檢測算法的代名詞。 本文帶領大家細數在此名門之中自帶「YOLO」的算法,總計23項工作,它們有的使YOLO更快,有的使YOLO更精準,有的擴展到了3D點雲、水下目標檢測、有的則在FPGA、CPU、樹莓派上大顯身手,甚至還有的進入了語音處理識別領域。
  • DAC快速目標檢測算法優化和架構設計優化方案
    DAC快速目標檢測算法優化和架構設計優化方案 Pynq 發表於 2020-12-03 15:26:17 1.
  • 實現人臉識別無感通行密鑰:圖像質量檢測算法
    如果可以將人臉圖像進行標準化評估,去除低質量圖片,將篩選後質量符合標準的圖像才送往下一個流程中,那麼識別效率將大大提升。這就是實現人臉識別無感通行的一項重要技術——圖像質量檢測算法(FQ),《從零學習人臉識別》系列公開課第六期就對該算法進行了詳細介紹。
  • 實現人臉識別無感通行的密鑰:圖像質量檢測算法
    這就是實現人臉識別無感通行的一項重要技術——圖像質量檢測算法(FQ),《從零學習人臉識別》系列公開課第六期就對該算法進行了詳細介紹。人臉圖像質量檢測算法的原理與人臉識別一樣,圖像質量檢測算法(FQ)也是基於特徵提取原理,通過神經網絡從海量數據中學習獲取人臉質量檢測關注的特徵(主要包括光線、模糊、角度、遮擋、表情、噪聲等)並進行質量判斷。