目標檢測最常用的三個模型:Faster R-CNN、SSD和YOLO
Faster R-CNN架構
在Faster RCNN中,候選框是經過RPN產生的,然后再把各個“候選框”映射到特征圖上,得到RoIs。
Faster R-CNN步驟:
(1) 由輸入圖片產生的區域候選
(2) 最后一層卷積輸出的所有通道
(3) ROI pooling
注解:ROI Pooling的意義
ROIs Pooling。顧名思義,是Pooling層的一種,而且是針對RoIs的Pooling,他的特點是輸入特征圖尺寸不固定,但是輸出特征圖尺寸固定;
ROI pooling總結:
(1)用于目標檢測任務;
(2)允許我們對CNN中的feature map進行reuse;
(3)可以顯著加速training和testing速度;
(4)允許end-to-end的形式訓練目標檢測系統。
整個Faster RCNN訓練過程可分為4步:
第一步:用在ImageNet數據集上訓練好的model初始化模型,訓練一個RPN網絡;
第二步:用在ImageNet數據集上訓練好的model初始化模型,同時用第一步中訓練好的RPN網絡生成的region proposal作為輸入,訓練一個Fast RCNN;
第三步:用第二步訓練好的Fast RCNN的網絡參數初始化RPN網絡,但是將RPN與Fast RCNN共享的網絡層的learning rate設置為0,僅微調RPN獨有的網絡層。
第四步:固定共享的網絡層,僅微調Fast RCNN所獨有的fc層。
網絡結構
可以清晰的看到該網絡對于一副任意大小PxQ的圖像,首先縮放至固定大小MxN,然后將MxN圖像送入網絡;而Conv layers中包含了13個conv層+13個relu層+4個pooling層;RPN網絡首先經過3x3卷積,再分別生成positive anchors和對應bounding box regression偏移量,然后計算出proposals;而Roi Pooling層則利用proposals從feature maps中提取proposal feature送入后續全連接和softmax網絡作classification(即分類proposal到底是什么object)。
復現方式
SSD架構
一 介紹
SSD–single shot multibox detection,是目標識別領域中對 不同類的物體(汽車,人。。。)的識別,識別的表示方式是對被識別的物體畫bounding box(包圍框)。除此之外還有其他種類的目標識別,比如下圖:
SSD網絡的特點是:對不同尺度下的 feature map 中每一個點都設置一些 default box, 這些default box有不同的大小和橫縱比例,對這些default box進行分類和邊框回歸的操作。在預測階段,SSD會對每個default box 生成一個分類標簽(屬于每一類的概率構成的向量)以及位置坐標的調整
二 SSD網絡結構:
SSD網絡由兩部分組成,前部分是一些經典的特征提取網絡,在這里作為base network,使用的是VGG16。后半部分是作者增加的網絡,提取成特征的基礎之上處理得到不同尺度的feature map,生成許多組default box進行預測分類和位置調整信息。
SSD除了在最終特征圖上做目標檢測之外,還在之前選取的5個特特征圖上進行預測。檢測過程不僅在填加特征圖(conv8_2, conv9_2, conv_10_2, pool_11)上進行,為了保證網絡對小目標有很好檢測效果,檢測過程也在基礎網絡特征圖(conv4_3, conv_7)上進行
SSD 方法的核心就是?predict?object(物體),以及其歸屬類別的 score(得分);同時,在feature map上使用小的卷積核去?predict?一系列 bounding boxes 的?box offsets,為了得到高精度的檢測結果,在不同層次的 feature maps 上去 predict?object、box offsets,同時,還得到不同?aspect ratio?的 predictions。?
這里簡單介紹一下default map cell以及 feature box
1、feature map?cell就是將feature?map切分成n*n的格子。
2、default box就是每一個格子上,生成一系列固定大小的?box,即圖中虛線所形成的一系列 boxes。
算法流程:
首先來看一下SSD的基本步驟:
1、輸入一幅圖片,讓圖片經過卷積神經網絡(CNN)提取特征,并生成 feature map
2、抽取其中六層的feature map,然后再 feature map 的每個點上生成 default box(各層的個數不同,但每個點都有)
3、將生成的所有 default box 都集合起來,全部丟到 NMS(極大值抑制)中,輸出篩選后的 default box,并輸出
算法框架
YOLO架構
YOLO(You Only Look Once)是一種基于深度神經網絡的對象識別和定位算法,其最大的特點是運行速度很快,可以用于實時系統。
輸入一張圖片,要求輸出其中所包含的對象,以及每個對象的位置(包含該對象的矩形框)。
對象識別和定位,可以看成兩個任務:找到圖片中某個存在對象的區域,然后識別出該區域中具體是哪個對象。對象識別這件事(一張圖片僅包含一個對象,且基本占據圖片的整個范圍),最近幾年基于CNN卷積神經網絡的各種方法已經能達到不錯的效果了。所以主要需要解決的問題是,對象在哪里。
最簡單的想法,就是遍歷圖片中所有可能的位置,地毯式搜索不同大小,不同寬高比,不同位置的每個區域,逐一檢測其中是否存在某個對象,挑選其中概率最大的結果作為輸出。顯然這種方法效率太低。
RCNN/Fast RCNN/Faster RCNN
RCNN開創性的提出了候選區(Region Proposals)的方法,先從圖片中搜索出一些可能存在對象的候選區Selective Search,大概2000個左右,然后對每個候選區進行對象識別。大幅提升了對象識別和定位的效率。不過RCNN的速度依然很慢,其處理一張圖片大概需要49秒。因此又有了后續的Fast RCNN 和 Faster RCNN,針對RCNN的神經網絡結構和候選區的算法不斷改進,Faster RCNN已經可以達到一張圖片約0.2秒的處理速度。
YOLO創造性的將候選區和對象識別這兩個階段合二為一,看一眼圖片就能知道有哪些對象以及它們的位置。實際上,YOLO并沒有真正去掉候選區,而是采用了預定義的候選區(準確說應該是預測區,并不是Faster RCNN所采用的Anchor)。也就是將圖片劃分為 7*7=49 個網格(grid),每個網格允許預測出2個邊框(bounding box,包含某個對象的矩形框),總共 49*2=98 個bounding box。可以理解為98個候選區,它們很粗略的覆蓋了圖片的整個區域。
YOLO結構
去掉候選區這個步驟以后,YOLO的結構非常簡單,就是單純的卷積、池化最后加了兩層全連接。最大的差異是最后輸出層用線性函數做激活函數,因為需要預測bounding box的位置(數值型),而不僅僅是對象的概率。YOLO網絡結構由24個卷積層與2個全連接層構成,網絡入口為448x448(v2為416x416),圖片進入網絡先經過resize,網絡的輸出結果為一個張量,維度為:
其中,S為劃分網格數,B為每個網格負責的邊框個數,C為類別個數。每個小格會對應B個邊界框,邊界框的寬高范圍為全圖,表示以該小格為中心尋找物體的邊界框位置。每個邊界框對應一個分值,代表該處是否有物體及定位準確度:,每個小格會對應C個概率值,找出最大概率對應的類別P(Class|object),并認為小格中包含該物體或者該物體的一部分。
輸入和輸出的映射關系
輸入
輸入就是原始圖像,唯一的要求是縮放到448*448的大小。主要是因為YOLO的網絡中,卷積層最后接了兩個全連接層,全連接層是要求固定大小的向量作為輸入,所以倒推回去也就要求原始圖像有固定的尺寸。那么YOLO設計的尺寸就是448*448。
輸出是一個 7*7*30 的張量(tensor)。
輸入圖像被劃分為 7*7 的網格(grid),輸出張量中的 7*7 就對應著輸入圖像的 7*7 網格。或者我們把 7*7*30 的張量看作49個30維的向量,也就是輸入圖像中的每個網格對應輸出一個30維的向量。參考上圖,比如輸入圖像左上角的網格對應到輸出張量中左上角的向量。
要注意的是,并不是說僅僅網格內的信息被映射到一個30維向量。經過神經網絡對輸入圖像信息的提取和變換,網格周邊的信息也會被識別和整理,最后編碼到那個30維向量中。具體來看每個網格對應的30維向量中包含了哪些信息?
網絡結構
網絡方面主要采用GoogLeNet,卷積層主要用來提取特征,全連接層主要用來預測類別概率和坐標。最后的輸出是7*7*30,7*7是grid cell的數量。
YOLO存在的優點是:
1.速度快,處理速度可以達到45fps,其快速版本(網絡較小)甚至可以達到155fps。這得益于其識別和定位合二為一的網絡設計,而且這種統一的設計也使得訓練和預測可以端到端的進行,非常簡便。
2.泛化能力強 ,可以廣泛適用于其他測試集。
3.背景預測錯誤率低,因為是整張圖片放到網絡里面進行預測。
YOLO存在的缺點是:
精度低,小目標和鄰近目標檢測效果差,小對象檢測效果不太好(尤其是一些聚集在一起的小對象),對邊框的預測準確度不是很高,總體預測精度略低于Fast RCNN。主要是因為網格設置比較稀疏,而且每個網格只預測兩個邊框,另外Pooling層會丟失一些細節信息,對定位存在影響。
YOLOv2架構
V1 缺陷之處:
1、輸入尺寸固定:由于輸出層為全連接層,因此在檢測時,YOLO 訓練模型只支持與訓練圖像相同的輸入分辨率。其它分辨率需要縮放成此固定分辨率;
2、占比小的目標檢測效果不好:雖然每個格子可以預測 B 個 bounding box,但是最終只選擇只選擇 IOU 最高的bbox作為物體檢測輸出,即每個格子最多只預測出一個物體。當物體占畫面比例較小,如圖像中包含畜群或鳥群時,每個格子包含多個物體,但卻只能檢測出其中一個。
YOLOv2的結構示意圖如下:
YOLOv2 引入了 faster rcnn 中 anchor box 的思想,對網絡結構的設計進行了改進,使得模型更易學習。
YOLOv2提出了一種新的分類模型Darknet-19。主要使用3x3卷積并在pooling之后channel數加倍(VGG);global average pooling替代全連接做預測分類,并在3x3卷積之間使用1x1卷積壓縮特征表示(Network in Network);使用 batch normalization 來提高穩定性,加速收斂,對模型正則化。Darknet-19的結構如下表:
包含 19 conv + 5 maxpooling.用 1x1 卷積層替代 YOLOv1 的全連接層。1x1 卷積層( 為了跨通道信息整合)如上圖的紅色矩形框部分。
升級版YOLO v3
YOLO的V1和V2都不如SSD的算法,主要原因是V1的448尺寸和V2版本的416尺寸都不如SSD的300,以上結論都是實驗測試的,V3版本的416跟SSD512差不多好,但速度快很多。yolov2有個毛病就是對小物體的檢測不敏感,而增加了多尺度預測之后,yolov3在對小物體檢測方便有了好轉,但是現在的毛病是對中、大size的物體表現的不是那么好。
YOLO V2是一個縱向自上而下的網絡架構,隨著通道數目的不斷增加,FLOPS是不斷增加的,而V3網絡架構是橫縱交叉的,看著卷積層多,其實很多通道的卷積層沒有繼承性,另外,雖然V3增加了anchor centroid,但是對GT的估計變得更加簡單,每個GT只匹配一個先驗框,而且每個尺度只預測3個框,V2預測5個框,這樣的話也降低了復雜度。
Mask R-CNN
Mask R-CNN:像素級目標檢測,不僅給出其邊界框,并且對邊界框內的各個像素是否屬于該物體進行標記。
可以看出MaskRCNN在有效檢測目標的同時輸出高質量的實例分割mask
可以看出MaskRCNN的網絡結構,作為FasterRCNN的擴展
1):用RolAlign代替了RoIPooling,RoIPooling使用取整量化,導致特征圖RoI映射回原圖RoI時空間不對齊明顯,造成誤差;RolAlign不使用取整量化而是采用雙線性插值,完成像素級的對齊;
2):FasterRcnn為每個候選對象ROI提供兩個輸出,一個類標簽,一個邊界框偏移量,為此,MaskRCNN并行添加了第三個分割mask的分支,mask分支是應用到每一個ROI上的一個小的FCN(Fully Convolutional Network),以pix2pix的方式預測分割mask。
分割
分割模型一般DeepLabv3+,U-net
U-net
U-net網絡非常簡單,前半部分作用是特征提取,后半部分是上采樣。在一些文獻中也把這樣的結構叫做編碼器-解碼器結構。由于此網絡整體結構類似于大寫的英文字母U,故得名U-net。
1、特征提取部分,每經過一個池化層就一個尺度,包括原圖尺度一共有5個尺度。
2、上采樣部分,每上采樣一次,就和特征提取部分對應的通道數相同尺度融合,但是融合之前要將其crop。這里的融合也是拼接。
U-net與其他常見的分割網絡有一點非常不同的地方:U-net采用了完全不同的特征融合方式:拼接,U-net采用將特征在channel維度拼接在一起,形成更厚的特征。
代碼復現