關於影像辨識,所有你應該知道的深度學習模型 - Medium

文章推薦指數: 80 %
投票人數:10人

關於影像辨識,所有你應該知道的深度學習模型. Computer vision object detection models: R-CNN, Fast R-CNN, Faster R-CNN, Mask R-CNN, YOLO ... GetunlimitedaccessOpeninappHomeNotificationsListsStoriesWritePublishedinCuboAI關於影像辨識,所有你應該知道的深度學習模型Computervisionobjectdetectionmodels:R-CNN,FastR-CNN,FasterR-CNN,MaskR-CNN,YOLOComputervisionobjectdetectionmodels:R-CNN,FastR-CNN,FasterR-CNN,MaskR-CNN,YOLO這篇是簡介一些用來辨識影像中物體的AI模型。

在前面有提到,透過CNN模型,你可以輸入一張圖片,得到該圖片屬於哪種類別的結果,這過程我們把他稱作分類(Classification)。

但在真實世界的應用情境通常要從一張圖片中辨識所有出現的物體,並且標示出位置來(標出位置稱之為ObjectLocalization)。

你一定在網路上看過類似底下的影片,這段影片可以看出中國閉路攝影機(CCTV)發展的概況,不只是可以框出影像中每個物件,辨別物件種類,偵測出移動物體的動量,甚至是人臉辨識,實現楚門世界的惡夢。

要做到這就需要靠深度學習中的ObjectDetection演算法,這也是最近幾年來深度學習最蓬勃發展的一塊領域。

基本的想法是,既然CNN對於物體的分類又快又好,那我們可不可以拿CNN來掃描並辨識圖片中的任何物體?答案當然是—可以。

最簡單的作法就是用SlidingWindows的概念,也就是用一個固定大小的框框,逐一的掃過整張圖片,每次框出來的圖像丟到CNN中去判斷類別。

由於物體的大小是不可預知的,所以還要用不同大小的框框去偵測。

但是SlidingWindow是非常暴力的作法,對單一影像我們需要掃描非常多次,每掃一次都需要算一次CNN,這將會耗費大量的運算資源,而且速度慢,根本無法拿來應用!AndrewNg—objectdetectionwithslidingwindows所以後來就有人提出了R-CNN(RegionswithCNN)R-CNN與其用SlidingWindow的方式掃過一輪,R-CNN的作法是預先篩選出約2000個可能的區域,再將這2000區域個別去作分類,所以他的演算法流程如下:產生一群約2000個可能的區域(RegionProposals)經由一個預先訓練好的CNN模型如AlexNet擷取特徵,將結果儲存起來。

然後再以SVM(SupportVectorMachine)分類器來區分是否為物體或者背景。

最後經由一個線性回歸模型來校正boundingbox位置。

SelectiveSearchR-CNN用來篩選RegionProposals的方法稱之為SelectiveSearch,而SelectiveSearch又是基於Felzenszwal於2004年發表的論文GraphBaseImageSegmentation。

圖像經由GraphBaseImageSegmentation可以切出數個Segment來,如下圖:Graphbaseimagesegmentation而SelectiveSearch的作法是將Segment的結果先各自畫出boundingbox,然後以一個迴圈,每次合併相似度最高的兩個box,直到整張圖合併成單一個box為止,在這過程中的所有box便是selectivesearch出來的regionproposals。

SelectiveSearch的演算法如下:取自SelectiveSearch論文。

先以Graphbaseimagesegmentation取得一些區域,計算每個區域間的相似度,每次合併相似度最高的兩個區域,直到整張圖片成為單一區域為止但是R-CNN存在一些問題,速度仍然不夠快:R-CNN一開始必須先產生約2000個區域,每個區域都要丟進CNN中去擷取特徵,所以需要跑過至少2000次的CNNR-CNN的model是分開成三部份,分別是用來取出特徵的CNN,分類的SVM,以及優化boundingbox的線性回歸。

所以R-CNN不容易作訓練。

所以R-CNN的其中一個作者RossGirshick(RBG大神)在2015年又提出了一個改良版本,並稱之為FastR-CNNFastR-CNNFastR-CNN的想法很簡單,在R-CNN中,2000多個區域都要個別去運算CNN,這些區域很多都是重疊的,也就是說這些重疊區域的CNN很多都是重複算的。

所以FastR-CNN的原則就是全部只算一次CNN就好,CNN擷取出來的特徵可以讓這2000多個區域共用!FastR-CNN採用的作法就是RoIPooling(RegionofInterestPooling)。

RoIPoolingFastRCNNarchitectureFastRCNN一樣要預選Regionproposals,但是只做一次CNN。

在跑完Convolutionlayers的最後一層時,會得到一個HxW的featuremap,同時也要將regionproposals對應到HxW上,然後在featuremap上取各自region的MaxPooling,每個region會得到一個相同大小的矩陣(例如2x2)。

fromhttps://blog.deepsense.ai/region-of-interest-pooling-explained/然後各自連接上FC網路,以及softmax去作分類。

在分類的同時也作boundingbox的線性回歸運算。

FastRCNN的優點是:只需要作一次CNN,有效解省運算時間使用單一網絡,簡化訓練過程FasterR-CNN不管是R-CNN還是FastR-CNN都還是要先透過selectivesearch預選regionproposals,這是一個緩慢的步驟。

在2015年時,Microsoft的ShaoqingRen,KaimingHe,RossGirshick,以及JianSun提出了FasterR-CNN,一個更快的R-CNN。

FasterR-CNN的想法也很直覺,與其預先篩選regionproposals,到不如從CNN的featuremap上選出regionproposals。

RegionProposalNetworkRPN(RegionProposalNetwork)也是一個ConvolutionNetwork,Input是之前CNN輸出的featuremap,輸出是一個boundingbox以及該boundingbox包含一個物體的機率。

RPN在featuremap上取slidingwindow,每個slidingwindow的中心點稱之為anchorpoint,然後將事先準備好的k個不同尺寸比例的box以同一個anchorpoint去計算可能包含物體的機率(score),取機率最高的box。

這k個box稱之為anchorbox。

所以每個anchorpoint會得到2k個score,以及4k個座標位置(box的左上座標,以及長寬,所以是4個數值)。

在FasterR-CNN論文裡,預設是取3種不同大小搭配3種不同長寬比的anchorbox,所以k為3x3=9。

經由RPN之後,我們便可以得到一些最有可能的boundingbox,雖然這些boundingbox不見得精確,但是透過類似於FastRCNN的RoIPooling,一樣可以很快的對每個region分類,並找到最精確的boundingbox座標。

MaskR-CNN前述幾個方法都是在找到物體外圍的boundingbox,boundingbox基本上都是方形,另外一篇有趣的論文是FacebookAIresearcherKaimingHe所提出的MaskR-CNN,透過MaskR-CNN不只是找到boundingbox,可以做到接近pixellevel的遮罩(圖像分割Imagesegmentation)。

要了解MaskR-CNN如何取遮罩,要先看一下FCN(FullyConvolutionalNetwork)FCN(FullyConvolutionalNetwork)forImageSegmentation有別於CNN網絡最後是連上一個全連接(FullyConnected)的網絡,FCN(FullyConvolutionalNetwork)最後接上的是一個卷積層。

一般的CNN只能接受固定大小的Input,但是FCN則能接受任何大小的Input,例如WxH。

圖上方一般的CNN網絡,只能接受大小固定的輸入,得到單一維度的輸出,分別代表每個類別的機率。

圖下則是FCN網路,最後兩層由卷積取代,輸出為hxwx1000,代表每個pixel種類的機率,可以視為一個heapmap在CNN的過程中會一直作downsampling,所以FCN最後的輸出可能為H/32xW/32,實際上得到的會是一個像heapmap的結果。

但是由於這過程是downsampling,所以Segment的結果是比較粗糙,為了讓Segment的效果更好,要再做upsampling,來補足像素。

upsamping的作法是取前面幾層的結果來作差補運算。

FCN的結果會跟前面幾層的輸出作差補運算MaskR-CNN是建構於FasterR-CNN之上,如果是透過RoIPooling取得Regionproposals之後,針對每個region會再跑FCN取得遮罩分割,但是由於RoIPooling在做Maxpooling時,會使用最近插值法(NearestNeighborInterpolation)取得數值,所以出來的遮罩會有偏移現象,再加上pooling下來的結果,會讓region的尺寸出現非整數的情況,然後取整數的結果就是沒辦法做到Pixel層級的遮罩。

所以MaskR-CNN改採用雙線性插值法(BilinearInterpolation)來改善RoIPooling,稱之為RoIAlign,RoIAlign會讓遮罩位置更準確。

MaskRCNN架構,將原有的RoIPooling改成RoIAlignFastR-CNN的RoIPool。

將一個7x5的Anchorbox取2x2的MaxPool,由於使用最近插值法,會有偏差RoIAlign的作法是使用雙線性插值法(BilinearInterpolation),減少mis-alignment的問題YOLO:YouOnlyLookOnceYOLO有個很討喜的名字,取自YouOnlyLiveOnce,但用在Objectdetection上則為Youonlylookonce,意思是說YOLO模型的特性只需要對圖片作一次CNN便能夠判斷裡面的物體類別跟位置,大大提升辨識速度。

R-CNN的概念是先提出幾個可能包含物體的Regionproposal,再針對每個region使用CNN作分類,最後再以regression修正boundingbox位置,速度慢且不好訓練。

YOLO的好處是單一網路設計,判斷的結果會包含boundingbox位置,以及每個boundingbox所屬類別及概率。

整個網路設計是end-to-end的,容易訓練,而且速度快。

YOLO速度快,在TitanXGPU上可以達到每秒45禎的速度,簡化版的YOLO甚至可以達到150fps的速度。

這意味著YOLO已經可以對影像作即時運算了。

準確度(mAP)也狠甩其他深度學習模型好幾條街。

看看底下YOLO2的demo視頻,這偵測速度會嚇到吃手手了2.有別於R-CNN都是先提region再做判斷,看的範圍比較小,容易將背景的backgroundpatch看成物體。

YOLO在訓練跟偵測時都是一次看整張圖片,背景錯誤偵測率(backgrounderror,抑或falsepositive)都只有FastR-CNN的一半。

3.YOLO的泛用性也比R-CNN或者DPM方式來得好很多,在新的domain使用YOLO依舊可以很穩定。

YOLO的概念是將一張圖片切割成SxS個方格,每個方格以自己為中心點各自去判斷B個boundingboxes中包含物體的confidencescore跟種類。

confidencescore=Pr(Object)*IOU(groundtruth)如果該boundingbox不包含任何物體(Pr(Object)=0),confidencescore便為零,而IOU則為boundingbox與groundtruth的交集面積,交集面積越大,分數越高。

每個方格預測的結果包含5個數值,x、y、w、h跟confidence,x與y是boundingbox的中間點,w與h是boundingbox的寬跟高。

S=7,B=2,PASCALVOClabel20種種類,所以tensor為SxSx(5*B+C)=7x7x30YOLO的網路設計包含了24個卷積層,跟2層的FC網絡。

包含24個卷積層,2層的FC網路,另外一個版本的YOLOFast則只有9個卷積層,不過最後的輸出都是7x7x30的tensor。

YOLO的缺點由於YOLO對於每個方格提兩個boundingbox去作偵測,所以不容易去區分兩個相鄰且中心點又非常接近的物體只有兩種boundingbox,所以遇到長寬比不常見的物體的檢測率較差YOLO與其他模型的比較YOLO在速度跟準確率上都有相當好的表現YOLO有比較少的backgrounderror(falsepositive),但是boundingbox的locationerror比較高YOLO2YOLO2建構於YOLO之上,但是有更好的準確度,更快速的判斷速度,能夠判斷更多的物件種類(多達9000種),所以是更好(Better)、更快(Faster)、更強大(Stronger)!YOLO2在準確度上比YOLO好,且追上甚至超越其他模型像是FasterR-CNN或者SSD等,速度還是別人的2–10倍以上。

YOLO2採用了許多改善方式,例如batchnormalization、anchorbox等,使用了這些改良方式讓YOLO2不管在辨識速度還是準確率上都有了提升,此外對於不同圖檔大小也有很好的相容性,提供了在速度與準確性上很好的平衡,所以也很適合運用在一些便宜的GPU或者CPU上,依舊提供水準以上的速度與準確率。

不同版本的YOLO2與其他模型的mAP跟FPS比較結語物體辨識(Objectdetection)的進展飛快,為了整理這篇大概也看了七八篇論文,還有很多都還沒涵蓋到的,例如SSD(SingleShotMulitboxDetector)。

如果想更了解AI在ComputerVision最近幾年的發展,也可以參考這篇搜文AYearinComputervision,內容涵蓋了Classification、Objectdetection、Objecttracking、Segmentation、Styletransfer、Actionrecognition、3Dobject、Humanpostrecognition等等,看完會大致知道在ComputerVision中有哪些AI所做的努力,以及各自的進展。

Google的Tensorflow也有提供ObjectdetectionAPI,透過使用API,不用理解這些模型的實作也能快速實作出速度不錯涵蓋率又廣的objectdetection。

tensorflowobjectdetection支援的模型列表會寫這篇純粹是我自己也想多了解這些不同模型的差異,下一篇文章說明怎麼在iOS上用CoreML實踐YOLO2演算法。

YOLOwithCoreMLRunobjectdetectionYOLOneuralnetworkwithCoreMLoniOSmedium.com覺得我寫的還可以請幫我拍手三下👏👏👏如果想要給我更多鼓勵可以給我更多的拍手👏👏👏👏👏👏👏👏感恩🙏🙏MorefromCuboAITechnicalsharingfromCuboAIsmartbabymonitorReadmorefromCuboAIAboutHelpTermsPrivacyGettheMediumappGetstartedStevenShen1.4KFollowersCo-founder/CTOofCubo,SmartAIBabyMonitorFollowMorefromMediumAswathyRavikumarBreastcancerimageanalyticsusingTransferLearninginHPC — GPUPlatformAshishPandeySocialdistancingviolationdetectorVishnuvaranasiMixupwayofDataAugmentationShivarajkarkiIntelOpenVinoBoostSemanticSegmentationpredictionHelpStatusWritersBlogCareersPrivacyTermsAboutKnowable



請為這篇文章評分?