YOLOV3筆記

  • 發展進程
    • RCNN(2013年)-解決通用多目標捕獲問題
      • 第一次提出候選區(Selective Search)的方法
      • 處理模式:先提出候選框再識別對象

      • 利用卷及神經網絡來做目標檢測的開山之作
      • 解決的問題
        • 1.速度:傳統區域選擇使用滑窗,每滑一個窗口檢測一次,相鄰窗口信息重疊度高,檢測速度慢。R-CNN使用一個啓發式方法(selective search),先生成候選區域再檢測,降低信息冗餘程度,從而提高檢測速度。
        • 2.特徵提取:傳統手工提取特徵魯棒性差。用神經網絡提取特徵提升了檢測率。
      • 存在問題
        • 1.算力冗餘:先生成候選框,再對區域進行卷積。一是候選區域會有一定程度的重疊,對相同區域進行重複卷積;二是每個區域進行新的卷積需要新的存儲空間。
        • 2.圖片縮放:剪裁(crop)和縮放(wrap)在很大程度上會丟失圖片原有的信息導致訓練效果不好。
    • SSP NET(2014年 何愷明)
      • SSP(Spatial Pyramid Pooling)是根據R-CNN存在的兩個問題而提出的

      • 將原圖傳到網絡中,發現FC層需要確定輸入維度,於是就在FC前面定義了一個特殊池化,將輸入的任意尺度feature maps 組合成特定維度的輸出,這個組合可以不同大小拼湊。
        FCN是同年11月發表的,SSP net 是4月發表的
      • 不僅減少了計算冗餘,更重要的是打破了固定尺寸輸入這一束縛。
    • Fast-RCNN(2015年)
      • 比RCNN相對來說快一點,提高了一點精度
      • 引用了SSP net的工作
      • 將串行網絡改成並行網絡

    • Faster—RCNN(2015年) ——檢測一張圖片在秒以內,反覆多次,精度較準
      https://zhuanlan.zhihu.com/p/33981103https://zhuanlan.zhihu.com/p/59398728https://zhuanlan.zhihu.com/p/34142321
      • 針對於 生成候選區域都是用的一系列啓發式算法。基於Low Level特徵生成區域。這裏存在兩個問題。
        • 1.生成區域的靠譜程度隨緣,而兩刀流算法正式依靠生成區域的靠譜程度—生成大量無效區域則會造成算力的浪費、少生成區域則會漏檢;
        • 2.生成候選區域的算法是在CPU上運行的而,我們訓練在GPU上,跨結構交互必定會有損失效率。
      • 針對這個問題,利用神經網絡自己學習生成候選區域。這種方法同時解決了上面的兩個問題,神經網絡可以學習到更高層。語義、抽象的特徵,生成的候選區域的可靠程度大大提高。

      • 在RPNS中引入了anchor,feature map中每個滑窗位置都會生成K個anchors,然後判斷anchor覆蓋的圖像是前景還是背景,同時迴歸bbox的精確位置,預測的bbox更精確。

    • Mask R—CNN(2017年,何愷明)
      • 加一條通道:發現SSPnet升級爲Fast R-CNN時結合了兩個loss,也就是說網絡輸入兩種信息去訓練,結果精度大大提高了。所以就想到再加一個信息輸入,即圖像mask。
      • Mask R-CNN 不僅可以做目標檢測還可以做語義分割,將兩個計算機視覺基本任務融入一個框架,性能有明顯提升
    • yolov1——Facebook弄出來的,只看一次,精度不夠,偏差大
      • 將候選區和對象識別兩個階段合二爲一(看一眼就能知道哪些對象及位置)
      • 過程:
        • 物體中心落在哪個格子,哪個格子負責預測整個物體。
    • SSD——精度和性能上都好於yolov1
    • yolov2——在精度和速度上跟SSD差不多
      • 採用K-means聚類來得到先驗框-(10x13),(16x30),(33x23),(30x61),(62x45),(59x119),(116x90),(156x198),(373x326)
    • yolo9000——yolov2的姊妹版,v1,v2是別的物體是有限的,9000就是可以識別9000個物體
    • yolov3——精度速度都很好了
      • 延續使用yolov2的建議框
    • 二維卷積目標檢測實現和優化方向包括backbone,IoU、損失函數、NMS、anchor、one shot learning、zero shotlearning等。
    • 最近的發展方向把建議框去掉(free anchor)
  • 基本原理
    • 細節
      • 數據
        • 算出縮放後中心點,寬高
      • 流程
        • 首先通過特徵提取網絡對輸入的圖像提取特徵,得到一定size的feature map,eg:13*13

        • 遍歷特徵圖中的每一個格子,判斷是否有物體的中心點(神經網絡猜的)
        • 是中心點的話,就用三種框去框。
          • 中心點偏移量:

          • 上面兩個圖是網上的做法,秦總的做法如下
          • 求偏移量爲啥加log
            • 1.保證w,h爲正
            • 2.對比例放大,讓小物體檢測更準確
            • 3.偵測穩定性更高
          • 反算公式:

          •  
        • 分別與標籤做IOU,IOU最大的留下,此時的IOU值就是這個框的置信度
        • 同類別做nms取最大
        • 輸出的feature map有3個維度,13*13*[B*(5+C)]
      • 建議框(和yolov2一樣用K—means聚類出來的,coco數據集所用的)
        • 9種建議框(三種形狀-正方形,豎長方形,橫長方形分別三種尺寸)
          • 大圖像(52*52)用小尺寸的框,檢測較小對象;中等圖像(26*26)用中尺寸的框,檢測中等對象;小圖像(13*13)用大尺寸的框,檢測較大對象

        • 也可以用k-means聚類來找框
      • 網絡
        • 如圖

        • 細粒度圖像就是圖像所屬類別的力度更爲精細。eg:你走在大街上看到一條很漂亮的狗狗,但是你不知道這是什麼品種。你去花園賞花看到花都很好看很香,但是不知道是什麼花。而資深的植物專家來賞花就能知道每種花具體叫什麼名字。CV中有專門的研究方向就是細粒度圖像分析。
        • 1.卷積網絡在79層後,經過下方几個黃色的卷積層得到一種尺寸的檢測結果。相比輸入圖像,這裏用於檢測的特徵圖有32倍(5次)的下采樣。比如輸入416*416的話,這裏的特徵圖就是13*13.由於下采樣倍數高,這裏特徵圖的感受野比較大,因此適合檢測圖像中尺寸較大的對象。
        • 2.爲了實現細粒度檢測,79層特徵圖還要做上採樣(79層往右開始上採樣卷積),然後與61層特徵圖融合(Concatenation),這樣得到91層較細粒度的特徵圖,同樣經過幾個卷積層後得到相對輸入圖像16倍下采樣的特徵圖。適合檢測中等尺度的對象。
        • 3.91層特徵圖再次上採樣,並與36層特徵圖融合(Concatenation),最後得到相對於輸入圖像8倍下采樣的特徵圖。適合檢測小尺寸的對象
        • 主網絡只運行一次提取特徵,整個網絡相當於32*32的卷積
        • darknet-53借用resnet的思想在網絡中加入殘差,有利於解決深層次網絡的梯度問題
        • 整個網絡中沒有池化和全連接,網絡的下采樣是通過設置卷積的stride爲2來達到的
        • concat:張量拼接。將darknet中間層和後面的某一層的上採樣進行拼接。拼接的操作和殘差層add的操作是不一樣的,拼接會擴充張量的維度,而add只是直接相加不會導致張量維度的改變。
        • 爲什麼不在主網絡的52*52,26*26和13*13的位置上直接偵測
          • 因爲此處的像素融合不夠,層次比較淺,直接在此處偵測的是SSD的思想
        • 常用卷積核1*1用的(1,1,0)—表示w,h不變, 3*3用的(3,1,1)—表示w,h不變和(3,2,1)—表示w,h減半
        • 形狀
      • 損失函數
        • 置信度損失:預測目標矩形內存在目標的概率,採用Binary Cross Entroy loss配合sigmoid激活函數->直接用BCEWithLogitsLoss。Oi∈{0,1}表示預測目標邊框I中是否真實存在目標。
        • 類別損失:多類別交叉熵(採用二值交叉熵是同一目標可以同時歸爲多類,比如貓可以歸爲貓類和動物類,這樣能夠應對複雜場景。但是實踐中發現多類別交叉熵損失效果要好一些,因爲是統一將識別的目標歸爲一類,沒有同時歸屬於很多類。)Oij∈{0,1}表示預測目標邊界框i中是否真實存在第j類目標
        • 寬高損失:採用的是真實偏差值與預測偏差值差值的平方和MSELoss.
        • 中心點損失:採用BCEWithLogitsLoss在訓練中損失之前不用加sigmoid,但是在使用的時候要加上sigimoid,因爲這裏的中心點是採用索引+偏移的方式,偏移量是小數。
        • output有cell number*B(對第一層是13*13*3)個這樣的結構,而ground truth纔有目標(假定對一幅圖的最大檢測目標個數爲20個)。13*13*3與20如何做MSE或者交叉熵呢?
          • 常見做法是,對13*13*3作某種grouping算法得出與ground truth相同shape的scalar或者tensor與ground truth比較。但是YOLOV3剛好相反,是爲20個找到13*13*3個格子中的20個格子,來安放ground truth,然後把其餘格子全部置0。如何找到這些格子呢?
          • 對於width和height這2個維度是比較簡單的,就是根據中心點重合。對於depth(即B)這個維度,他是找到與ground truth的bbox有最大iou的anchor box對應的格式。這裏有個侷限,一個格子只能容納一個目標。假如一個人坐在一張椅子上中心位置和寬高大小比例都相同,本來同屬於一個格子,那麼即使打標時打了兩個標,在訓練時,也只有一個標會生效,後面一個樣本會覆蓋前面一個樣本。從設計上就註定了訓練時的這種侷限。不過,頂多就浪費一個樣本。
        • 訓練過程中網絡輸出特徵圖中有目標的數量要比沒有目標的數量少很多,所以在計算loss時,要將正負樣本分開計算,然後乘上一個平衡參數

      • 訓練
        • 訓練方法
          • 方法一:端到端訓練-直接訓練
          • 方法二:遷移學習-1,先將主網絡加一個softmax訓練,然後保存參數(virable 權重的requirable設置爲False),再把softmax去掉。2,將參數傳到偵測網絡中
            • 訓練速度儘量小(步長小),儘量用溫和的訓練器(SGD)
      • 使用
        • 將置信度的閾值設爲0.5是先驗值。
      • 優化
        • 推遲下采樣,下采樣可以通過增大卷積步長或者引入pooling層來實現,大步長或者加入pooling會使得feature map變小。一個很直觀的想法是,大特徵圖會帶來更高的分類精度,而在網絡太靠前的層使用下采樣會使後面大部分特徵圖變小,這個想法在何愷明等人的研究中也得到了證實。之前兩個策略已經減少了參數,最後這個策略則是試圖在參數受限的情況下恢復精度。

  • 常見問題
    • Q1:爲什麼輸入的圖片要是32的倍數
      • 前向過程中,張量的尺寸變換是通過改變卷積核的步長來實現的,eg:stride=(2,2)這就等於將圖像的邊長縮小一半(面積縮小到原來的1/4),v2中經歷5次縮小,將特徵圖縮小到原輸入尺寸的1/2^5,v3和v2一樣也將特徵圖縮小到原輸入尺寸的1/2^5。所以通常要輸入圖片是32的倍數。

    • Q2:爲什麼輸入的圖片是416*416
      • 採用416*416大小的圖片是因爲YOLOv3模型下采樣的總步長爲32,對於416*416大小的圖片,最終得到的特徵圖大小爲13*13,維度是奇數,這樣特徵圖恰好只有一箇中心位置。對於一些大物體,它們中心點往往落入圖片中心位置,此時使用特徵圖的一箇中心點去預測這些物體的邊界框相對容易些。
    • Q3:mAP是啥
      • PR曲線
      • AP值
        • Average Precision,即 平均精確度 。
        • 如何衡量一個模型的性能,單純用 precision 和 recall 都不科學。於是人們想到,哎嘛爲何不把 PR曲線下的面積 當做衡量尺度呢?於是就有了 AP值 這一概念。這裏的 average,等於是對 precision 進行取平均 。
      • mAP值
        • Mean Average Precision,即 平均AP值 。
        • 是對多個驗證集個體 求 平均AP值 。

    • Q4:標籤的形狀
      • 老師在視頻中講的是5個偏移量加n個類別
      • 但實際應該是5個偏移量加1個類別個數
  • 改進
  • 總體
    • 優點:
      • 1、YOLO的速度非常快。在Titan X GPU上的速度是45 fps(frames per second),加速版的YOLO差不多是150fps。
      • 2、YOLO是基於圖像的全局信息進行預測的。這一點和基於sliding window以及region proposal等檢測算法不一樣。與Fast R-CNN相比,YOLO在誤檢測(將背景檢測爲物體)方面的錯誤率能降低一半多。
      • 3、YOLO可以學到物體的generalizable representations。可以理解爲泛化能力強。
      • 4、準確率高,有實驗證明。
      • 5、相對於v2,v3在解決覆蓋率高的圖像的檢測問題效果是十分顯著的
    • 缺點:
      • 1、位置精確性差,對於小目標物體以及物體比較密集的也檢測不好,比如一羣小鳥。
      • 2、YOLO雖然可以降低將背景檢測爲物體的概率,但同時導致召回率較低。
  • PPT流程
    • 歷史
      • 目前爲止,目標檢測大家族主要劃分爲兩大派系,一個是兩刀流,一個是一刀流。
        • 兩刀流:1,生成可能區域(region proposal)&CNN提取特徵;2,放入分類器分類並修正位置。
          • 側重點在於:準
          • R-CNN -> SPP Net -> Fast R-CNN -> Faster R-CNN -> Mask R-CNN
        • 一刀流:直接對預測的目標物體進行迴歸。代表:YOLO,SSD
          • 側重點在於:快
    • 概述
      • 應用場景
        • 細粒度圖像檢索,精準廣告,內容推薦,場景分析,圖像美顏,相冊管理
        • 智能安防:犯人追蹤,陌生人進入;智能交通:車流量監測;
      • 改進
        • 1.多尺度預測:解決了對小目標效果不好的問題。v2只有一個偵測,v3有3個偵測。v2單層預測5個bbox,v3是單層3種bbox
        • 2.softmaxloss變成logistic loss,一個目標屬於不同類別(女人,人)
        • 3.加深網絡:darknet19->darknet53,3*3卷積用於增加通道,1*1卷積用於壓縮3*3卷積後的特徵
    • 細節
      • 數據
        • 直接壓縮成416的
        • 標籤多維圖
        • 反算加log的作用
      • 建議框多尺度檢測
      • 網絡
        • 爲什麼不在主網絡的52*52,26*26和13*13的位置上直接偵測
          • 因爲此處的像素融合不夠,層次比較淺,直接在此處偵測的是SSD的思想
        • 殘差網絡的作用
        • 特徵金字塔?
      • 損失
        • 分類用bce
        • 迴歸】
        • 中心點bcelogist,中心點偏移量在0-1之間
        • 負樣本只做置信度損失是論文裏的
        • celoss裏自帶softmax和onehot?
      • 訓練
      • 使用
        • 分類別做nms
  • 參考

 

以上是參考了很多博客的思想。

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