基于CNN目标检测方法(RCNN,Fast-RCNN,Faster-RCNN,Mask-RCNN,YOLO,SSD)行人检测,目标追踪,卷积神经网络
一、研究意義
????????卷積神經網絡(CNN)由于其強大的特征提取能力,近年來被廣泛用于計算機視覺領域。1998年Yann LeCun等提出的LeNet-5網絡結構,該結構使得卷積神經網絡可以端到端的訓練,并應用于文檔識別。LeNet-5結構是CNN最經典的網絡結構,而后發展的卷積神經網絡結構都是由此版本衍生而來。
????????在過去六年中,由于深度學習和卷積網絡的發展和進步,基于圖像的目標檢測和分類能力已經大大提高。而目標檢測是計算機視覺領域一個重要的研究方向,是眾多高級任務的必備前提,包括場景理解,事件識別等。目前,目標檢測也廣泛用于安全監控,自動駕駛,人機交互,增強現實等眾多領域。目標檢測對計算機視覺和產業界實際應用都有十分重要的意義。
????????然而, 由于視角、遮擋、姿態等因素引起目標發生形變, 導致目標檢測成為一個具有挑戰性的任務。設計高準確率高效率的目標檢測算法仍具有重大意義。
二、研究現狀
????????如今, 基于卷積神經網絡的目標檢測已經超越傳統目標檢測方法, 成為當前目標檢測的主流方法。本文根據卷積神經網絡的使用方式,將基于卷積神經網絡的目標檢測分為兩大類: 基于分類的卷積神經網絡目標檢測和基于回歸的卷積神經網絡目標檢測。
1. 基于分類的卷積神經網絡目標檢測
????????基于分類的CNN也可以成為two-stage檢測算法,傳統目標檢測方法包含預處理、窗口滑動、特 征提取、特征選擇、特征分類、后處理等步驟,而卷積神經網絡本身具有特征提取、特征選擇和特征分類的功能。那么,可以 直接利用卷積神經網絡對每個滑動窗口產生的候選區進行二分類,判斷其是否為待檢測目標。本文將這類方法稱為基于分 類的卷積神經網絡目標檢測。相比于傳統目標檢測的六個步驟,基于分類的卷積神經網絡目標檢測只有: 窗口滑動,產生候選區域(region proposals),對候選區域圖像分 類,后處理三個步驟,而且窗口滑動和后處理都是固定的方法。因此,該類方法的研究重點在于如何提升卷積神經網絡的特征 提取能力、特征選擇能力以及特征分類能力,以提高圖像識別的準確度。這類算法的典型代表是基于region proposal的R-CNN系算法,如R-CNN,Fast R-CNN,Faster R-CNN等;
?
1.1 R-CNN
????????R-CNN是基于region proposal方法的目標檢測算法系列奠基之作,其先進行區域搜索,然后再對候選區域進行分類。在R-CNN中,選用Selective search方法來生成候選區域,這是一種啟發式搜索算法。它先通過簡單的區域劃分算法將圖片劃分成很多小區域,然后通過層級分組方法按照一定相似度合并它們,最后的剩下的就是候選區域(region proposals),它們可能包含一個物體。示意圖如下:
????????對于一張圖片,R-CNN基于selective search方法大約生成2000個候選區域,然后每個候選區域被resize成固定大小(227×227)并送入一個CNN模型中,使用AlexNet來提取圖像特征,最后得到一個4096維的特征向量。然后這個特征向量被送入一個多類別SVM分類器中,預測出候選區域中所含物體的屬于每個類的概率值。每個類別訓練一個SVM分類器,從特征向量中推斷其屬于該類別的概率大小。為了提升定位準確性,R-CNN最后又訓練了一個邊界框回歸模型。訓練樣本為(P,G),其中P=(Px,Py,Pw,Ph)為候選區域,而G=(Gx,Gy,Gw,Gh)為真實框的位置和大小。G的選擇是與P的IoU最大的真實框,回歸器的目標值定義為:
????????在做預測時,利用上述公式可以反求出預測框的修正位置。R-CNN對每個類別都訓練了單獨的回歸器,采用最小均方差損失函數進行訓練。
????????R-CNN是非常直觀的,就是把檢測問題轉化為了分類問題,但是,由于R-CNN使用計算復雜度極高的selective search提取候區域,并使用SVM來進行分類,并不是一個端到端的訓練模型。R-CNN模型在統一候選區的大小后才能進行特征提取和特征分類。并且提取的候選框會在特征提取的時候會進行重復計算。
1.2 Fast-RCNN
????????Fast-RCNN為了解決特征提取重復計算問題而誕生,并且Fast-RCNN巧妙的將目標識別與定位放在同一個CNN中構成Multi-task模型。
????????Fast-RCNN先用Selective Search找出候選框,’而后整張圖過一次CNN,然后用RoI Pooling,將對應候選框的部分做采樣,得到相同長度的特征,又經過兩層全連接層之后得到最終的特征。接著產生兩個分支,一個分支給此特征分類,另一個分支回歸此特征的候選框偏移。Fast-RCNN將分類和回歸任務融合在一個模型中。
????????首先介紹Fast-RCNN核心算法模塊,即RoI Pooling。基于圖像分類任務的卷積神經網絡首先將圖片重新縮放并才裁剪到固定大小,如AlexNet和ResNet將圖片縮放到256尺度并裁剪至224×224大小,然后將裁剪后的圖像輸入至網絡訓練。但對于檢測任務,圖像大小對檢測性能有重要的影響。假設輸入224×224大小的圖像,則很有可能目標對象會因為分辨率過低而無法檢測。Fast-RCNN的圖像輸入并不對圖像大小限制,而實現這一點的關鍵所在,就是RoI Pooling網絡層。RoIPooling層在任意尺度的卷及網絡特征層,針對每一個候選框在特征層的映射區域提取固定尺度的特征,通過設置不同尺度的RoI Pooling可以提取多尺度特征。RoIPooling實現原理簡單而言就是通過設定固定尺度計算出每一次采樣的網格大小,然后最大值采樣即可。RoI Pooling使用最大池化將任何有效的感興趣區域內的特征轉換為具有H×W(例如,7×7)的固定空間范圍的小特征圖,其中H和W是RoI Pooling層超參數,獨立于任何特定的ROI。Fast-RCNN定義RoI是一個矩形窗口。每個ROI由定義其左上角(r,c)及其高度和寬度(h,w)的四元組(r,c,h,w)定義。RoI Max Pooling通過將h×w的ROI窗口轉換成大小為h/H×w/W的子窗口的HxW網格,然后將每個子窗口中的值最大存儲到相應的輸出網格單元中。RoI Pooling是SPP-Net中使用的空間金字塔層的特殊情況,其中只有一個金字塔層。然后RoI pooling層得到的特征圖送入幾個全連接層中,并產生新的特征向量,這些特征向量分別用于一個softmax分類器(預測類別)和一個線性回歸器上(用于調整邊界框位置)來進行檢測。在實現上是使用兩個不同的全連接層,第一個全連接層有N+1個輸出(N是類別總數,1是背景),表示各個類別的概率值;第二個全連接層有4N個輸出,表示坐標回歸值(tx,ty,tw,th),這個與R-CNN是一樣的,每個類別都預測4個位置坐標值。
????????Fast R-CNN與R-CNN的另外的一個主要區別點是采用了softmax分類器而不是SVM分類器,而且訓練過程是單管道的,因為Fast R-CNN將分類誤差和定位誤差合并在一起訓練,定位誤差采用smooth L1 而不是R-CNN中的L2。因此,整個網絡可以端到端的訓練。
????????Fast-RCNN提出之后,基于深度學習的目標檢測框架問題已經非常清晰,就是能不能把潛在候選區域的提取納入CNN框架內。Faster-RCNN就是基于此點并提出Region Proposal Net將潛在候選區域提取納入CNN框架內。
1.3 Faster-RCNN
????????Faster-RCNN模型引入了RPN(Region Proposal Network)直接產生候選區域。Faster-RCNN可以看成是RPN和Fast RCNN模型的組合體,即Faster-RCNN = RPN + Fast-RCNN。
????????對于RPN網絡,先采用一個CNN模型(一般稱為特征提取器)接收整張圖片并提取特征圖。然后在這個特征圖上采用一個N×N(文中是3×3)的滑動窗口,對于每個滑窗位置都映射一個低維度的特征(如256-d)。然后這個特征分別送入兩個全連接層,一個用于分類預測,另外一個用于回歸。對于每個窗口位置一般設置k個不同大小或比例的先驗框(anchors,default bounding boxes),這意味著每個位置預測k個候選區域(region proposals)。對于分類層,其輸出大小是2k,表示各個候選區域包含物體或者是背景的概率值,而回歸層輸出4k個坐標值,表示各個候選區域的位置(相對各個先驗框)。對于每個滑窗位置,這兩個全連接層是共享的。因此,RPN可以采用卷積層來實現:首先是一個n×n卷積得到低維特征,然后是兩個1×1的卷積,分別用于分類與回歸。
????????RPN采用的是二分類,僅區分背景與物體,但是不預測物體的類別,即class-agnostic。由于要同時預測坐標值,在訓練時,要先將先驗框與ground-truth box進行匹配,原則為:(1)與某個ground-truth box的IoU最高的先驗框;(2)與某個ground-truth box的IoU值大于0.7的先驗框,只要滿足一個,先驗框就可以匹配一個ground-truth,這樣該先驗框就是正樣本(屬于物體),并以這個ground-truth為回歸目標。對于那些與任何一個ground-truth box的IoU值都低于0.3的先驗框,其認為是負樣本。RPN網絡是可以單獨訓練的,并且單獨訓練出來的RPN模型給出很多region proposals。由于先驗框數量龐大,RPN預測的候選區域很多是重疊的,要先進行NMS(non-maximum suppression,IoU閾值設為0.7)操作來減少候選區域的數量,然后按照置信度降序排列,選擇top-N個region proposals來用于訓練Fast R-CNN模型。RPN的作用就是代替了Selective search的作用,但是速度更快,因此Faster R-CNN無論是訓練還是預測都可以加速。
????????Faster-RCNN遵循如下訓練過程:
????????第一步:使用ImageNe上預訓練的模型初始化特征提取網絡并訓練RPN網絡;
????????第二步:使用在ImageNet上預訓練的模型初始化Fast-RCNN特征特征提取網絡,使用步驟一中訓練好的RPN網絡產生的候選框作為輸入,訓練一個Fast-RCNN網絡,至此,兩個網絡每一層的參數完全不共享;
????????第三步:使用步驟二的Fast-RCNN網絡參數初始化一個新的RPN網絡,但是把RPN,Fast-RCNN共享的特征提取網絡參數的學習率設為0,即使學習RPN網絡所特有的參數,固定特征提取網絡。到此步,兩個網絡已經共享了所有的公共的卷積層;
????????第四步:仍然固定共享的那些網絡層,把Fast-RCNN特有的網絡層也加入進來,繼續訓練,微調Fast-RCNN特有的網絡層,到此為止,RPN與Fast-RCNN網絡完全共享參數,使用Fast-RCNN即可同時完成候選框提取和目標檢測功能。
????????其問題主要在于對小尺度目標檢測性能較差,不能有效的將候選區域的特征在深度CNN提取之后,有效保留小尺度的特征。分辨率有一定限制,同樣檢測速度還是較慢。
1.4 Mask RCNN
????????把原有的Faster-RCNN進行擴展,添加一個分支使用現有的檢測對目標進行并行預測。同時,這個網絡結構比較容易實現和訓練,速度為5fps,可以很方便的應用到其他的領域,像目標檢測,分割,和人物關鍵點檢測等,并且比現有的算法效果都要好。
????????實例分割的難度在于要先對一張圖片所有的目標進行正確的檢測同時還要對每個示例進行分割。檢測的目的是把每一個單個目標分類然后用bounding box標定出來,而實例分割的目的是區分每一個像素為不同的分類而不用區別不同的目標。Mask R-CNN使用了全連接卷積網絡(FCN)來完成這個預測。這需要訓練數據必須有像素級別的標注,而不是簡單的邊框。
????????Faster R-CNN:包含兩個部分,提出RPN區域,找到目標框,對ROI進行分類。核心思想就是把圖片區域內容送給深度網絡,然后提取出深度網絡某層的特征,并用這個特征來判斷是什么物體,把背景也當成一種類別,故如果是判斷是不是20個物體時,實際上在實現是判斷21個類。最后再對是物體的區域進行微微調整。
????????Mask Representation:mask 對輸入目標的空間布局進行編碼。使用m*m的矩陣對每一個ROI進行預測而不是使用向量去進行預測,這樣可以保證ROI當中的空間信息不會損失。
????????ROI Align:RoI Pooling就是實現從原圖區域映射到卷積區域最后pooling到固定大小的功能,把該區域的尺寸歸一化成卷積網絡輸入的尺寸。在歸一化的過程當中,會存在ROI和提取的特征不重合現象出現,作者提出了ROI Align,使用ROI Align層對提取的特征和輸入之間進行校準。?避免對每一個ROI邊界或者塊進行數字化。使用雙線性內插法計算在ROI 塊當中固定的四個采樣位置得到的輸入特征值并對結果進行融合。
????????因為FCN會精確預測每個像素的類別,就是輸入圖片中的每個像素都會在標注中對應一個類別。對于輸入圖片中的一個錨框,我們可以精確的匹配到像素標注中對應的區域。但是RoI池化是作用在卷積之后的特征上,其默認是將錨框做了定點化。例如假設選擇的錨框是(x,y,w,h),且特征抽取將圖片變小了16倍,就是如果原始圖片是256×256,那么特征大小就是16×16。這時候在特征上對應的錨框就是變成了(x/16,y/16,h/16,w/16)。如果x,y,w,h中有任何一個不被16整除,那么就可能發生錯位。同樣,如果錨框的長寬不被池化大小整除,那么同樣會定點化,從而帶來錯位。
????????通常這樣的錯位只是在幾個像素之間,對于分類和邊框預測影響不大。但對于像素級別的預測,這樣的錯位可能會帶來大問題。RoI Align層類似于RoI池化層,但是去除掉了定點化步驟,就是移除了所有?。如果計算得到的錨框不是剛好在像素之間,那么我們就用四周的像素來線性插值得到這個點上的值。
????????對于一維情況,假設我們要計算x點的值f(x),那么我們可以用x左右的整點的值來插值:
????????我們實際要使用的是二維差值來估計f(x,y),我們首先x軸上差值得到f(x,y)和f(x,y+1),然后根據這兩個值來差值得到f(x,y)。
????????Network Architecture :
????????分成三個部分,第一個是主干網絡用來進行特征提取,第二個是頭結構用來做邊界框識別(分類和回歸),第三個就是mask預測用來對每一個ROI進行區分。主干網絡使用的是50層的深度殘差網絡ResNet50。
????????以上方法由于使用了特定的方法提取候選區,替代以滑動窗口方法遍歷搜索的方式,需要候選區的數量較少,使基于卷積神經網絡的目標檢測在準確度和速度上都得到了較大提升。然而這些方法非常依賴候選區提取方法的準確度,如果檢測場景復雜且目標不明顯,候選區提取方法很難捕獲到目標附近的區域,導致檢測不到目標。
2 基于回歸的卷積神經網絡目標檢測
針對目標檢測重新設計卷積神經網絡的結構,提出了將卷積神經網絡作為回歸器,把整幅待檢測圖像看成一個候選區,直接輸入卷積神經網絡,回歸目標在待檢測圖像中的位置信息。其中最具有代表性的是YOLO算法和SSD算法。
2.1 YOLO算法
????????Yolo算法,其全稱是You Only Look Once: Unified, Real-TimeObject Detection。Yolo算法采用一個單獨的CNN模型實現end-to-end的目標檢測,整個系統如圖所示:首先將輸入圖片resize到448x448,然后送入CNN網絡,最后處理網絡預測結果得到檢測的目標。相比R-CNN算法,其是一個統一的框架,其速度更快,而且Yolo的訓練過程也是end-to-end的。
????????YOLO的CNN網絡將輸入的圖片分割成S×S網格,然后每個單元格負責去檢測那些中心點落在該格子內的目標。每個單元格會預測B個邊界框(bounding box)以及邊界框的置信度(confidence score)。所謂置信度其實包含兩個方面,一是這個邊界框含有目標的可能性大小,二是這個邊界框的準確度。前者記為Pr(object),當該邊界框是背景時(即不包含目標),此時Pr(object)=0。而當該邊界框包含目標時,Pr(object)=1。邊界框的準確度可以用預測框與實際框(ground truth)的IOU(intersection over union,交并比)來表征,記為IOU(truth/pred)?。因此置信度可以定義為Pr(object)*IOU(truth/pred)??。YOLO的置信度是兩個因子的乘積,預測框的準確度也反映在里面。邊界框的大小與位置可以用4個值來表征:(x,y,w,h),其中(x,y)是邊界框的中心坐標,而w和h是邊界框的寬與高。中心坐標的預測值(x,y)是相對于每個單元格左上角坐標點的偏移值,并且單位是相對于單元格大小的。而邊界框的w和h預測值是相對于整個圖片的寬與高的比例,這樣理論上4個元素的大小應該在[0,1]范圍。這樣,每個邊界框的預測值實際上包含5個元素:(x,y,w,h,c),其中前4個表征邊界框的大小與位置,而最后一個值是置信度。
????????對于分類問題,對每一個單元格其還要給出預測出C個類別概率值,其表征的是由該單元格負責預測的邊界框其目標屬于各個類別的概率。但是這些概率值其實是在各個邊界框置信度下的條件概率,即 Pr(class|object)。不管一個單元格預測多少個邊界框,其只預測一組類別概率值,這是YOLO算法的一個缺點,在后來的改進版本中,YOLO9000是把類別概率預測值與邊界框是綁定在一起的。同時,我們可以計算出各個邊界框類別置信度(class-specific confidence scores):?
????????邊界框類別置信度表征的是該邊界框中目標屬于各個類別的可能性大小以及邊界框匹配目標的好壞,一般會根據類別置信度來過濾網絡的預測框。
????????YOLO的優點,Yolo采用一個CNN網絡來實現檢測,是單管道策略,其訓練與預測都是end-to-end,所以Yolo算法比較簡潔且速度快。第二點由于Yolo是對整張圖片做卷積,所以其在檢測目標有更大的視野,它不容易對背景誤判。另外,Yolo的泛化能力強,在做遷移時,模型魯棒性高。
????????YOLO的缺點,首先Yolo各個單元格僅僅預測兩個邊界框,而且屬于一個類別。對于小物體,Yolo的表現會不如人意。Yolo對于在物體的寬高比方面泛化率低,就是無法定位不尋常比例的物體。Yolo的定位不準確也是很大的問題。
2.2 SSD算法
????????SSD全稱 :Single Shot MultiBox Detector。在R-CNN系列模型里。Region Proposal和分類是分作兩塊來進行的。SSD則將其統一成一個步驟來使得模型更加簡單并且速度更快。YOLO與SSD可以一步到位完成檢測。相比YOLO,SSD采用CNN來直接進行檢測,而不是像Yolo那樣在全連接層之后做檢測。它跟Faster R-CNN主要有兩點不一樣,1,對于錨框,不再首先判斷它是不是含有感興趣物體,再將正類錨框放入真正物體分類。SSD里我們直接使用一個C+1類分類器來判斷它對應的是哪類物體,還是只是背景。我們不再有額外的回歸器對邊框再進一步預測,而是直接使用單個回歸器來預測真實邊框。2,SSD不只是對卷積神經網絡輸出的特征做預測,它會進一步將特征通過卷積和池化層變小來做預測。這樣達到多尺度預測的效果。
????????(1)采用多尺度特征圖用于檢測?
????????多尺度采用大小不同的特征圖,CNN網絡一般前面的特征圖比較大,后面會逐漸采用stride=2的卷積或者pool來降低特征圖大小,一個比較大的特征圖和一個比較小的特征圖,它們都用來做檢測。這樣做的好處是比較大的特征圖來用來檢測相對較小的目標,而小的特征圖負責檢測大目標,如圖下圖所示,8x8的特征圖可以劃分更多的單元,但是其每個單元的先驗框尺度比較小。
????????(2)采用卷積進行檢測?
????????與Yolo最后采用全連接層不同,SSD直接采用卷積對不同的特征圖來進行提取檢測結果。對于形狀為m×n×p的特征圖,只需要采用3×3×p這樣比較小的卷積核得到檢測值。
????????(3)設置先驗框?
????????在Yolo中,每個單元預測多個邊界框,但是其都是相對這個單元本身(正方塊),但是真實目標的形狀是多變的,Yolo需要在訓練過程中自適應目標的形狀。而SSD借鑒了Faster R-CNN中anchor的理念,每個單元設置尺度或者長寬比不同的先驗框,預測的邊界框(bounding boxes)是以這些先驗框為基準的,在一定程度上減少訓練難度。一般情況下,每個單元會設置多個先驗框,其尺度和長寬比存在差異,如下圖所示,可以看到每個單元使用了5個不同的先驗框,圖片中不同物體采用最適合它們形狀的先驗框來進行訓練。
????????(4)預測物體類別
????????對每一個錨框我們需要預測它是不是包含了我們感興趣的物體,還是只是背景。使用一個3×3的卷積層來做預測,加上pad=1使用它的輸出和輸入一樣。同時輸出的通道數是num_anchors*(num_classes+1),每個通道對應一個錨框對某個類的置信度。假設輸出是Y,那么對應輸入中第n個樣本的第(i,j)像素的置信值是在Y[n,:,i,j]里。具體來說,對于以(i,j)為中心的第a個錨框。通道?a*(num_class+1)?是其只包含背景的分數,通道 a*(num_class+1)+1+b 是其包含第b個物體的分數。
????????(5)預測邊界框
????????因為真實的邊界框可以是任意形狀,我們需要預測如何從一個錨框變換成真正的邊界框。這個變換可以由一個長為4的向量來描述。同上一樣,我們用一個有num_anchors * 4通道的卷積。假設輸出是Y,那么對應輸入中第 n 個樣本的第 (i,j) 像素為中心的錨框的轉換在Y[n,:,i,j]里。具體來說,對于第a個錨框,它的變換在a*4到a*4+3通道里。
????????目標函數和常見的 Object Detection 的方法目標函數相同,分為兩部分:計算相應的 default box 與目標類別的置信度以及相應的bounding box回歸結果。
三、存在的問題
????????諸如R-CNN一類的依賴于候選的方法,由于使用了特定的方法提取候選區,替代以滑動窗口方法遍歷搜索的方式,需要候選區的數量較少,使基于卷積神經網絡的目標檢測在準確度和速度上都得到了較大提升。然而這些方法非常依賴候選區提取方法的準確度,如檢測場景復雜且目標不明顯,候選區提取方法很難捕獲到目標附近的區域,導致檢測不到目標。目前都是通過實驗來證明卷積神經網絡的有效性,訓練參數的設置大多依靠經驗和實踐,缺乏理論指導和量化分析; 另一方面,需要針對目標檢測設計更加合理的網絡結構,結合回復式神經網絡提升檢測效率,實現多尺度多類別的目標檢測。R-CNN,Fast-RCNN,Faster-RCNN等,目標檢測的準確度和精度具有優勢,但是很耗時,速度較慢。而類似于SSD好YOLO等算法,其速度快,但是精度性能相對較差。
????????主要挑戰存在如下幾點:
????????1.小尺度目標檢測。對于基于深度卷積神經網絡的目標檢測,由于深度網絡頂層神經元感受野較大,對于小尺度目標信息保存較不完整,故而小尺度目標檢測性能不高。
????????2.計算復雜度。目標檢測算法計算復雜度取決于特征提取網絡的前向傳播計算時間。網絡特征表達能力與網絡深度存在較強關系,一般而言,在一定深度范圍內,網絡越深,表達能力越強,目標檢測算法性能越好,但計算開銷隨之增大。
除此之外,深度卷積神經網絡需要大量的人工標注數據進行訓練,訓練數據的獲得對于目標檢測算法同樣至關重要。
?
?
總結
以上是生活随笔為你收集整理的基于CNN目标检测方法(RCNN,Fast-RCNN,Faster-RCNN,Mask-RCNN,YOLO,SSD)行人检测,目标追踪,卷积神经网络的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 我用一个设记师袜子换星辰女神的手部亏吗
- 下一篇: OpenCV图像序列生成视频,MATLA