yolo

目標檢測:一類基於Region Proposal的R-CNN系算法(R-CNN,Fast R-CNN,Faster R-CNN),它們是two-stage的,需要先使用啓發式方法(selective search)或者CNN網絡(RPN)產生Region Proposal,然後再在Region Proposal上做分類與迴歸。另一類是Yolo,SSD這類one-stage算法,其僅僅使用一個CNN網絡直接預測不同目標的類別與位置。第一類方法是準確度高一些,但是速度慢,但是第二類算法是速度快,但是準確性要低一些。

參考yoloV1

Yolo算法的特點:You Only Look Once說的是只需要一次CNN運算Unified指的是一個統一的框架,提供end-to-end的預測,而Real-Time體現是Yolo算法速度快。

滑動窗口與CNN

滑動窗口的目標檢測算法思路非常簡單,它將檢測問題轉化爲了圖像分類問題。原理就是採用不同大小和比例(寬高比)的窗口在整張圖片上以一定的步長進行滑動,然後對這些窗口對應的區域做圖像分類,實現對整張圖片的檢測。致命的缺點,就是你並不知道要檢測的目標大小是什麼規模,所以你要設置不同大小和比例的窗口去滑動,而且還要選取合適的步長。

這樣會產生很多的子區域,並且都要經過分類器去做預測,這需要很大的計算量,所以你的分類器不能太復雜,因爲要保證速度。解決思路之一就是減少要分類的子區域,這就是R-CNN的一個改進策略,其採用了selective search方法來找到最有可能包含目標的子區域(Region Proposal),其實可以看成採用啓發式方法過濾掉很多子區域,這會提升效率

如果你使用的是CNN分類器,那麼滑動窗口是非常耗時的,結合卷積運算的特點,我們可以使用CNN實現更高效的滑動窗口方法。這裏要介紹的是一種全卷積的方法,簡單來說就是網絡中用卷積層代替了全連接層,輸入圖片大小是16x16,經過一系列卷積操作提取了2x2的特徵圖,但是這個2x2的圖上每個元素都是和原圖是一一對應的,如圖上藍色的格子對應藍色的區域,這不就是相當於在原圖上做大小爲14x14的窗口滑動,且步長爲2,共產生4個字區域。最終輸出的通道數爲4,可以看成4個類別的預測概率值,這樣一次CNN計算就可以實現窗口滑動的所有子區域的分類預測

使用卷積運算,將16*16*3的圖像,得到2*2*4的特徵圖(包含信息一樣),實現滑動窗口的所有子區域的分類預測。

上面儘管可以減少滑動窗口的計算量,但是隻是針對一個固定大小與步長的窗口,這是遠遠不夠的。Yolo算法很好的解決了這個問題,它不再是窗口滑動了,而是直接將原始圖片分割成互不重合的小方塊,然後通過卷積最後生產這樣大小的特徵圖,基於上面的分析,可以認爲特徵圖的每個元素也是對應原始圖片的一個小方塊,然後用每個元素來可以預測那些中心點在該小方格內的目標

YOLOv1

YOLO算法採用一個單獨的CNN模型實現end-to-end的目標檢測,整個系統如下圖所示:首先將輸入圖片resize到448x448,然後送入CNN網絡,最後處理網絡預測結果得到檢測的目標

  1. Resize image  2、Run convolutional network 3、Non-max suppression

YOLO的CNN網絡將輸入的圖片分割成,其中前4個表徵邊界框的大小與位置,而最後一個值是置信度。

輸入圖片被劃分爲7*7個單元格,每個單元格獨立做檢測。

YOLO解決的問題是怎麼定位目標、怎麼對目標進行分類?

對於每一個單元格其還要給出預測出邊界框 類別 置信度 表徵的是該邊界框中目標屬於各個類別的可能性大小以及邊界框匹配目標的好壞。後面會說,一般會根據類別置信度來過濾網絡的預測框

每個單元格需要預測大小的張量。在下面的網絡結構中我們會詳細講述每個單元格的預測值的分佈位置。

個網絡預測值的依據是什麼,或者它根據什麼來預測。CNN之後得到圖像的特徵信息,怎麼根據特徵信息去定位、分類?

網絡設計

YOLO採用卷積網絡來提取特徵,然後使用全連接層(fully connected layer)得到預測值。

全連接層(fully connected layer):卷積取的是局部特徵,全連接就是把以前的局部特徵重新通過權值矩陣組裝成完整的圖。

因爲用到了所有的局部特徵,所以叫全連接。

BatchNormalization layer:批量歸一化

https://blog.csdn.net/myarrow/article/details/51848285

網絡結構參考GooLeNet模型,包含24個卷積層和2個全連接層,如圖8所示。對於卷積層,主要使用1x1卷積來做channle reduction,然後緊跟3x3卷積。對於卷積層和全連接層,採用Leaky ReLU激活函數:。但是最後一層卻採用線性激活函數。除了上面這個結構,文章還提出了一個輕量級版本Fast Yolo,其僅使用9個卷積層,並且卷積層中使用更少的卷積核

 

可以看到網絡的最後輸出爲邊界框的預測結果,這樣提取每個部分是非常方便的,這方面的訓練集預測時的計算。Yolov1輸出7*7*30的張量,7*7位圖像所分的格子數30爲 20個類別的概率,box1、box2的置信度,boundingbox(x,y,w,h)。

Faster R-CNN那種two-stage複雜的網絡結構而言,YOLOv1結構相對簡單,基本思想:預測框的位置,大小和物體分類都通過CNN暴力預測、輸出7*7*30的張量,代表能預測2個框的5個參數和20個種類。S*S(B*5+C)。深度只有30,意味着每個單元格只能預測兩個框(而且只認識20類物體),這對於密集型目標檢測和小物體都不能很好適用。

每個小格子怎麼判斷出該物體呢?換句話說該小格子的特徵,怎麼能代表整個物體的特徵?

YOLO的做法不是把每個單獨的網格作爲輸入feed到模型,在inference的過程中,網絡只是物體中心點位置的劃分之用,並不是對圖片進行切分,不會讓網格脫離整個的關係。(中心點爲目標定位,而每個小格子會預測兩個boudingbox,得到物體的邊界框,這就是目標定位問題

將原始圖像分割成互不重合的小方塊,然後通過卷積最後生產這樣大小的特徵圖。特徵圖的每個元素也是對應原始圖片的一個小方塊,然後利用每個元素來預測那些中心點在該小方格內的目標。根據什麼特徵來預測那個元素是中心點的?預測完中心點後wh即boundingbox怎麼預測?

每個cell本身並不知道判斷哪個是中心點,而是反過來,根據學習到的特徵判斷輸入網絡中圖片得到的特徵圖中哪個元素是 中心點,再根據元素位置找出圖像中cell。

邊界框怎麼預測?物體怎麼類別

網絡訓練

訓練之前,先在ImageNet上進行了預訓練,其預訓練的分類模型採用圖8中前20個卷積層,然後添加一個average-pool層和全連接層。預訓練之後,在預訓練得到的20層卷積層之上加上隨機初始化的4個卷積層和2個全連接層。由於檢測任務一般需要更高清的圖片,所以將網絡的輸入從224x224增加到了448x448。

卷積層:採用各種卷積覈對輸入圖片進行卷積處理。(平移不變性)

池化層(average-pool):降採用。(空間不變性)

全連接層:一個神經元在作用於整個slice,即filter的尺寸恰好爲一個slice的尺寸。

訓練損失函數的分析,Yolo算法將目標檢測看成迴歸問題,所以採用的是均方差損失函數。但是對不同的部分採用了不同的權重值。首先區分定位誤差和分類誤差。對於定位誤差,即邊界框座標預測誤差,採用較大的權重。

yolo是端到端訓練,對於預測框的位置、size、種類、置信度(score)等信息的預測都通過一個損失函數來訓練。

 

S表示網格數,這裏是7*7。B表示每個單元格預測框的個數,這裏是2;

第一行總方誤差(sum-squared error)來當作位置預測的損失函數,第二行用根號總方誤差來當作寬度和高度的損失函數第三行和第四行對置信度confidence也用SSE作爲損失函數第五行用SSE作類別概率的損失函數。最後將幾個損失函數加到一起,當作YOLOv1的損失函數。

由於每個單元格預測多個邊界框。但是其對應類別只有一個。那麼在訓練時,如果該單元格內確實存在目標,那麼只選擇與ground truth的IOU最大的那個邊界框來負責預測該目標,而其它邊界框認爲不存在目標。這樣設置的一個結果將會使一個單元格對應的邊界框更加專業化,其可以分別適用不同大小,不同高寬比的目標,從而提升模型性能

如果一個單元格內存在多個目標怎麼辦,其實這時候Yolo算法就只能選擇其中一個來訓練,這也是Yolo算法的缺點之一

要注意的一點時,對於不存在對應目標的邊界框,其誤差項就是隻有置信度,左標項誤差是沒法計算的。而只有當一個單元格內確實存在目標時,才計算分類誤差項,否則該項也是無法計算的。

卷積神經網絡相關概念

激活函數

根據一些列的輸入值,神經元之間連接的權值以及激勵規則,刺激神經元。leaky ReLU,相比普通RelU,leaky並不會讓負數直接爲0,而是乘以一個很小的係數(恆定),保留負數輸出,但衰減負數輸出;公式如下:

損失函數

在訓練階段,用於評估輸出結果和實際值的差異。然後用損失函數的值更新每個神經元之間的權重值。卷積神經網絡的訓練目的就是最小化損失函數值。

總結

YOLO優點是採用一個CNN網絡來實現檢測,是單管道策略,其訓練與預測都是end-to-end,所以yolo算法比較簡單且速度快。第二點yolo是對整個圖片做卷積,所以其在檢測目標有更大的視野,它不容易對背景誤判。全連接層起到attention的作用。另外,YOLO的泛化能力強,在做遷移時,模型魯棒性高。

YOLO缺點:YOLO各個單元格僅僅預測兩個邊界框,而且屬於一個類別。對於小物體,YOLO表現會不如人意。SSD在這方面做了個改進,採用多尺度單元格。Faster R-CNN,採用anchor boxes。YOLO對於物體在寬高比方面泛化率低,無法定位不尋常比例的物體,其定位不準確也是很大的問題。

 

圖解YOLOv3

圖片尺寸:input_shape = [height,width]

Resize 爲256*256併除以255進行歸一化;

標籤預處理:boxes轉換 爲(x,y,w,h,class)格式得到true_box,x,y,w,h除以圖像的input_shape進行歸一化;

標籤計算:將boxes resize到13*13得到box_output的x,y中心正好落在output的某個grid cell

Box_output中的每個元素box與所有anchors計算IOU,找到IOU最大值對應的anchor。

對每張圖偏的每個box

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章