內容來源:2018 年 04 月 21 日,AI教育求職平臺景略集智創始人王文凱在“百度深度學習公開課·北京站:AI工程師的快速進階之路”進行《目標檢測面面觀》演講分享。IT 大咖說(微信id:itdakashuo)作為獨家視訊合作方,經主辦方和講者審閱授權釋出。
閱讀字數:4339 | 11分鐘閱讀
摘要
本次演講主要介紹視覺識別領域中目標檢測的相關技術,對其中各種不同的檢測方法進行解析和對比。
Visual Recognition
最簡單的視覺識別是根據圖片中的物體對圖片進行分類,典型的就是判斷一張照片是貓還是狗。再進一步不僅要識別圖片中物體,還要對它進行定位。
實際工程中,圖片一般會同時存在多個物體,面對這種複雜場景需要應用目標檢測,同時包含分類和定位。比目標檢測更深入的是語義分割,從上圖可以看到目標檢測只是簡單的框出了物體,而語義分析會挖掘出影象中更深層次的資訊。
Classification
對分類領域稍有熟悉的朋友可能都知道MNIST(手寫數字)資料集,它被稱為DeepLearning中的hello world,主流的深度學習框架都會提供該資料集的相應的介面。
上圖左邊是人眼所看到的影象,在計算機中被轉化成了右方這樣的矩陣,0表示的是0畫素,中間的數字表示顏色由淺到深的過渡。
對於上面圖片的分類,首先會將圖片以畫素為單位拆解成特徵向量輸入到神經網路中,然後輸出猜測——長度為10的向量。這種方法是將二維矩陣展開為一維向量,過程中必然會損失一定的資訊。所以在深度學習領域更常見的做法是使用卷積神經網路。
CNN
這裡輸入的同樣是數字圖片,輸出為10維度向量。不過中間部分有些不同,它是由convolution、subsampling、Pooling構成,核心在於convolution(卷積)。
任意的圖片都可以被轉換為矩陣,圖中中間部分的3*3的小矩陣被稱為卷積核。我們會將卷積核放到圖片矩陣中滑動,重疊部分同樣也是一個3*3的矩陣,對他們進行計算後會得到一個結果,計算公式為對應畫素位置的值相乘然後求和。
不同的卷積核對應不同的特徵,如圖中動物圖片的卷積核取值,中間是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,剔除了全連結層,原先的FC6、FC7又新增了新的卷積。可以看到其中有若干個卷積塊連線到了最後的detections,也就是在不同尺度的特徵對映上都進行一次物體猜測,這樣精度會稍有提高,對於尺度變化較大的物體也能起到較好的效果。
前面提到的這些方法其本質都是在效率和功率上尋找折中,上圖是對一些經典方法的總結,橫軸是速度,縱軸是MVP。可以看到single shot類的方法明顯要更快一些,不過它的實時性是基於犧牲一定的精度。