目標檢測面面觀

內容來源:2018 年 04 月 21 日,AI教育求職平臺景略集智創始人王文凱在「百度深度學習公開課·北京站:AI工程師的快速進階之路」進行《目標檢測面面觀》演講分享。IT 大咖說(微信id:itdakashuo)做爲獨家視頻合做方,經主辦方和講者審閱受權發佈。python

閱讀字數:4339 | 11分鐘閱讀bash

獲取嘉賓演講視頻及PPT: suo.im/57DI1D

摘要

本次演講主要介紹視覺識別領域中目標檢測的相關技術,對其中各類不一樣的檢測方法進行解析和對比。微信

Visual Recognition


最簡單的視覺識別是根據圖片中的物體對圖片進行分類,典型的就是判斷一張照片是貓仍是狗。再進一步不只要識別圖片中物體,還要對它進行定位。網絡

實際工程中,圖片通常會同時存在多個物體,面對這種複雜場景須要應用目標檢測,同時包含分類和定位。比目標檢測更深刻的是語義分割,從上圖能夠看到目標檢測只是簡單的框出了物體,而語義分析會挖掘出圖像中更深層次的信息。框架

Classification

對分類領域稍有熟悉的朋友可能都知道MNIST(手寫數字)數據集,它被稱爲DeepLearning中的hello world,主流的深度學習框架都會提供該數據集的相應的接口。ide

上圖左邊是人眼所看到的圖像,在計算機中被轉化成了右方這樣的矩陣,0表示的是0像素,中間的數字表示顏色由淺到深的過渡。函數

對於上面圖片的分類,首先會將圖片以像素爲單位拆解成特徵向量輸入到神經網絡中,而後輸出猜想——長度爲10的向量。這種方法是將二維矩陣展開爲一維向量,過程當中必然會損失必定的信息。因此在深度學習領域更常見的作法是使用卷積神經網絡。性能

CNN

這裏輸入的一樣是數字圖片,輸出爲10維度向量。不過中間部分有些不一樣,它是由convolution、subsampling、Pooling構成,核心在於convolution(卷積)。學習

任意的圖片均可以被轉換爲矩陣,圖中中間部分的3*3的小矩陣被稱爲卷積核。咱們會將卷積核放到圖片矩陣中滑動,重疊部分一樣也是一個3*3的矩陣,對他們進行計算後會獲得一個結果,計算公式爲對應像素位置的值相乘而後求和。ui

不一樣的卷積覈對應不一樣的特徵,如圖中動物圖片的卷積核取值,中間是8,周圍是-1,這表示一個邊緣檢測。在通過滑動計算後展示的就是右邊的feature map(特徵映射),能夠看到原圖中的邊緣區域都被高亮了,總體圖片雖然變成了黑白的,可是信息對比更增強烈。

Pooling & ReLu

Pooling是在獲得特徵映射後進一步對信息進行簡約化處理,如上圖對某個特徵映射作2*2的切分,每4個點取一個最大值,減少網絡中的計算量只保留最主要的特徵信息。ReLu叫作整流線性單元,它是一個激活函數,小於0的時候值一直爲0,大於0的時候恢復正常。

VGG16

卷積神經網絡衍生出過不少不一樣的版本,VGG16就是其中之一 ,它被不少的目標檢測方案用做特徵提取。VGG16接收的輸入圖片尺寸是224*224。圖中黑色方塊爲一個卷積層,後面接着激活函數,紅色塊是石化層。卷積核獲得的特徵映射會逐漸縮小,越日後特徵映射的點對應的原圖區域越大。

VGG16一共有16個帶有權重的層,其中13個卷積層和3個全連接層,咱們能夠將卷積核、激活函數、石化層視爲一個block模塊。VGG16的整個網絡有138M個參數。

import paddle.v2 as pal

pdl.networks.vgg_16_network(input_image, num_channels,num_classes=1000)複製代碼

這樣龐大的網絡,使用上圖的方法是最簡單的。這是一段python代碼,經過導入pdI模塊使用VGG16網絡,僅用輸入3個參數,輸入的圖片、通道數、分類數。不過僅用這種方式確定是沒法知足大多數狀況。

import paddle.v2 as pal

def vgg16(input):
   def conv_block(ipc, num_filter, groups, dropouts, num_channels=None):
       return pdl.networks.img_conv_group(input=ipt, num_channels=num_channels,
               pool_type=pdl.pooling.Max(), pool_size=2, pool_stride=2,
               conv_num_filter=[num_filter]*groups, conv_filter_size=3,
               conv_act=pdl.activation.Rolu(), conv_with_batchnorm=True,
               conv_batchnorm_drop_rate=dropouts)
   
   conv1 = conv_block(input, 64, 2, [0.3, 0], 3)
   conv2 = conv_block(input, 128, 2, [0.4, 0])
   conv3 = conv_block(input, 256, 3, [0.4, 0])
   conv4 = conv_block(input, 512, 3, [0.4, 0.4, 0])
   conv5 = conv_block(input, 512, 3, [0.4, 0.4, 0])

   fc1 = pdl.layer.fc(input=conv5, size=4096, act=pdl.activation.Linear())
   fc2 = pdl.layer.fc(input=fc1, size=4096, act=pdl.activation.Linear())
   fc3 = pdl.layer.fc(input=fc2, size=1000, act=pdl.activation.Linear())複製代碼

這是另外一種稍顯複雜的寫法,下方定義了5個卷積層和3個全連接層。它的好處在於整個模塊都是咱們自定義的,能夠隨時進行修改。

前面提到過VGG16網絡有138M個參數,若是每一個視覺分類的任務都須要從新訓練,整個任務規模仍是很是大的。因此經常使用的作法是基於ImageNet數據集,它有1000類,共1400萬張圖片。通常咱們會使用數據集中那些已經被訓練好參數來作。

Object Detection

PASCAL VOC

Object Detection目標檢測須要用到PASCAL VOC數據集,它只有20個類別,雖然相對ImageNet要少不少,可是每張圖片的信息更爲豐富。

實現目標檢測最簡單暴力的方法是使用滑動窗口,如上圖讓綠色窗口在圖片上不斷滑動。不過因爲沒法肯定窗口的大小是否匹配要檢測的物體,因此要不斷的縮放圖片來進行匹配,同時線框的形狀也要進行調整,這無疑增大了複雜度。

Region Proposal——selective search

Region Proposal會幫咱們限制圖像搜索的空間。它首先假設圖上的每一個點爲獨立集團,而後根據顏色、紋理、尺寸、包含關係等進行合併。

好比這張圖,最初有很是多的點,以後隨着不斷合併造成了幾個大的集團,下方的線框也就僅剩幾個了,最後再進行分類。這樣的話計算性能有了很大的提高。

Region – based CNN

在經過提名方式大體猜想出圖片中物體種類後,接下來要作的就是對這些塊進行分類。這要用到卷積神經網絡,更具體的是Region based CNN。輸入圖片後提取出region proposals,而後將這些region proposals圖片縮放成統一大小的正方形輸入到CNN中,最後CNN會給出分類結果。

R-CNN Training

R-CNN訓練過程當中,首先會在ImageNet上訓練卷積部分提取物體特徵的能力,在嫁接到PASCAL以前還要對網絡進行改造,讓它只輸入21類,多出的1類爲背景。這種對神經網絡的改造,用到就是前面展現的相對複雜的代碼。

Fast R-CNN

R-CNN針對每張圖片可能會提取出2000多個region proposals,而對這些region proposals都須要作一遍卷積操做,計算量無形中增大了2000倍,顯然會拖慢運行效率。

爲此如今又提出了Fast R-CNN。咱們知道圖片通過卷積以後獲得的特徵映射,雖然信息量下降了,可是保留下了分類相關的信息。所以region proposals就徹底能夠不在原圖上進行,而在特徵映射上完成。原先要將圖片切成多份,每份單獨進行一次卷積提取特徵。如今只須要先總體進行一次提取,而後在特徵映射上作若干個區域提名。

Faster RCNN

Fast RCNN相對普通的RCNN速度雖有所提高,不過還能夠進一步提升。咱們能夠將生成Proposal的過程也經過神經網絡完成,至關於神經網絡中又嵌套着一層神經網絡,使整個過程所有經過GPU加速,這種方式被稱爲Faster RCNN。

You Only Look Once(YOLO)

Faster RCNN整個流程分爲兩個分支,一部分是區域提名,另外一部分是特徵提取以及位置分類的計算,一次任務要走兩步。所以雖然在靜態圖片識別上Faster RCNN能很好的完成任務,可是還不知足在視頻領域實時圖像的識別。

因此又出現了一種新的方法——You Only Look Once。它先對圖片作固定數量切分,在此基礎上進行各類猜想,而後對這些猜想框進行分類以及四個角的迴歸,使迴歸和分類就融合到同一個神經網絡中,實現端到端的訓練。

Single Shot Multi-box Detector(SSD)

這類將區域提名以及位置和分類合併到一塊兒的方法被稱爲single shot,上圖是Single Shot的另外一種方式multi-box detector的結構圖。multi-box detector也用到了VGG16,不過僅有前三個conv_block,剔除了全連接層,原先的FC六、FC7又添加了新的卷積。能夠看到其中有若干個卷積塊鏈接到了最後的detections,也就是在不一樣尺度的特徵映射上都進行一次物體猜想,這樣精度會稍有提升,對於尺度變化較大的物體也能起到較好的效果。

前面提到的這些方法其本質都是在效率和功率上尋找折中,上圖是對一些經典方法的總結,橫軸是速度,縱軸是MVP。能夠看到single shot類的方法明顯要更快一些,不過它的實時性是基於犧牲必定的精度。

相關文章
相關標籤/搜索