06 You Only Look Once-V1學習筆記

參考文章:

  1. https://blog.csdn.net/woduoxiangfeiya/article/details/80866155(質量一般,還得對照原文看)
  2. https://zhuanlan.zhihu.com/p/58716896

代碼以及訓練自己的數據:

  1. 官方源代碼:https://github.com/hizhangp/yolo_tensorflow,網絡的配置參數在yolo/config.py下
  2. 設置數據集文件的嵌套格式如下,Annotations存放的是用labelImg標註好的xml文件,一張圖片對應一個xml;JPEGImages下存放的是圖片;ImageSets需要稍微再處理一下,在VOC2007路徑中新建一個test.py, 並寫入以下代碼執行一下,執行後ImageSets/Main下會生成四個文件:trainval.txt、test.txt、train.txt、val.txt

    import os
    import random
    
    trainval_percent = 0.1
    train_percent = 0.9
    xmlfilepath = 'Annotations'
    txtsavepath = 'ImageSets\Main'
    total_xml = os.listdir(xmlfilepath)
    
    num = len(total_xml)
    list = range(num)
    tv = int(num * trainval_percent)
    tr = int(tv * train_percent)
    trainval = random.sample(list, tv)
    train = random.sample(trainval, tr)
    
    ftrainval = open('ImageSets/Main/trainval.txt', 'w')
    ftest = open('ImageSets/Main/test.txt', 'w')
    ftrain = open('ImageSets/Main/train.txt', 'w')
    fval = open('ImageSets/Main/val.txt', 'w')
    
    for i in list:
        name = total_xml[i][:-4] + '\n'
        if i in trainval:
            ftrainval.write(name)
            if i in train:
                ftest.write(name)
            else:
                fval.write(name)
        else:
            ftrain.write(name)
    
    ftrainval.close()
    ftrain.close()
    fval.close()
    ftest.close()
    
    # 參考的那篇文章給忘了,如有侵權,請在評論區留言並附上地址
    
  3. 訓練自己的數據集,參考網址有:yolo_tensorflow_v1訓練自己的數據集TensorFlow下使用YOLOv1訓練+測試自己的數據集,具體要修改的內容有三處吧,第一處修改config.py文件CLASSES = ['class1', 'class2', 'class2'....] ;第二處pascal_voc.py文件中
     labels = np.zeros(
                (self.batch_size, self.cell_size, self.cell_size, 8)) #25修改爲5+類別數

    第三處爲(具體原因:每個框有四個位置信息和一個置信度,每一個網格只能預測出一個類別)

     label = np.zeros((self.cell_size, self.cell_size, 8)) #25修改爲5+類別數

     

  4. 測試自己的模型:修改一下加載模型的路徑和要測試的圖片即可

(自己做的完整的代碼,見github


論文筆記:

摘要:

提出了一種新的目標檢測算法YOLO,在該論文中把目標檢測看做了一個迴歸問題來預測空間分離的邊界框和相關類別的概率;整個檢測過程是一個單一過程,預測速度極快。(住:ground truth表示真實的標註框)

1、介紹

YOLO的輸入爲448*448,與R-CNN兩階段的模型相比,YOLO是單一網絡,相比傳統網絡有以下優點:

  1.  速度很快,因爲YOLO中把物體檢測當做一個迴歸問題,可以達到45幀每秒,實現了實時監測;
  2. YOLO可以檢測到整體的圖像,不像fast-RCNN只檢測到局部,所以YOLO的背景誤差率相比fast-RCNN降低了一半;
  3. YOLO在自然物體(指實物)的圖中進行學習,用在藝術圖中的物體檢測效果也很好;

缺點是:

  1. 每個網格只對應兩個bounding box,當物體的長寬比不常見(訓練未覆蓋)時,效果較差;
  2. 原始圖片只劃分爲7*7的網格,兩個物體靠的很近時,效果很差;
  3. 最終每個網格只對應一個類別,容易出現漏檢;
  4. 對於圖片中較小的物體,效果比較差

2、Unified Detection(統一檢測) 

將一張圖劃分爲s*s個網格,如果一個物體的中心落在某個網格,則該網格負責檢測該物體 ,每個網格預測B個邊界框及每個框的confidence,conference反映了網格模型對該邊界框是否有物體的信心,以及邊界框位置預測的準確度,c=P_r(object) \cdot IOU^{truth}_{pred},其中P_r(object)=\left\{\begin{matrix} 1 & \\ 0 & \end{matrix}\right.,如果在該網格中沒有物體,則置信度得分爲0;否則置信度得分爲IOU。每個邊界框有五個預測值:x,y,w,h,confidence,其中(x,y)表示相對於網格單元邊界的框的中心,(w,h)表示相對於整個圖的寬和高。每個網格還會預測類別的條件概率P(classi|Object),每個網格只能給出一個類別概率,不管該網格有幾個框。在測試時,將條件概率和confidence相乘從而得到每個邊界框在各個類別的得分,這些得分表示某一類別出現在框中的概率以及預測框和真實框的擬合程度:P_r(classi|Object) \cdot confidence = P_r(classi) \cdot IOU^{truth}_{pred}

作者在PASCAL VOC數據集上評估YOLO時,令s=7, B=2, C=20,所以最終結果是7 \times 7 \times (2 \times 5 + 20)維。

 2.1 Network Design

  1. 用卷積層提取特徵,用FC預測概率和座標; 
  2. 在網絡中,1 \times 1的卷積後加一個3 \times 3卷積,用1 \times 1的卷積來降低前一層的特徵空間;
  3. 使用224 \times 224的輸入在ImageNet上預訓練模型,然後在檢測時加倍
  4. 普通的YOLO有24個卷積層,而fast YOLO只有9個卷積層,其餘一樣,加上兩個FC層,最後得到結果(普通的YOLO結構如下所示,注意:最後一層在代碼中是以全連接層的形式即最後輸出7 \times 7 \times 30 = 1470個結果,然後再reshape)

 2.2 training

  1. 在ImageNet上預訓練,用的是前20層conv,一個avgpool,一個FC層。得到預訓練模型後,在此基礎上隨機初始化4個卷積層和2個FC層,並將網絡輸入從224 \times 224 變到了448 \times 448;最後一層輸出類別概率和邊界框座標,並且在最後一層中使用了leaky-relu\left\{\begin{matrix} x & x>0 \\ 0.1x & otherwise \end{matrix}\right.
  2. 損失函數如下兩圖所示(損失函數,有點費解,代碼中更爲費解)。在文中,\lambda _{coord}=5, \lambda _{noobj}=0.5,增加了包含物體的邊界框預測的權重,並減少了不包含物體的邊界框的置信度預測損失的權重。(注:loss函數只在網格中出現物體時才懲罰分類錯誤,如果這個預測器負責預測真實邊界框(即所有網格的預測都有最高的IOU),他也僅懲罰預測座標損失)【不懂?】
  3. 在PASCAL VOC 2007和2012上,訓練了135個epochs,batch size=64, momentum=0.9, decay=0.0005
  4. 爲了防止過擬合使用了dropout(rate=0.5)和數據增強的方法。通過dropout降低層之間的聯合性,增強了泛化能力;數據增強:引入原始圖像的20%的隨即縮放和平移,在HSV色彩空間隨機調整圖像的曝光飽和達1.5倍

 2.3 前向傳播

  1. 檢測圖時網絡只需要執行一次,爲每個圖預測98個邊界框,每個邊界框一個置信度得分;
  2. 當一個大物體跨越多個網格,並被多個網格檢測出時,用NMS解決(YOLO-v1的NMS策略, 對比SSD的正負樣本匹配策略(還有SSD中的難負例例挖掘)以及faster rcnn中的RPN中正負樣本的標註策略的差別)

NMS方法並不複雜,其核心思想是:選擇得分最高的作爲輸出,與該輸出重疊的去掉,不斷重複這一過程直到所有備選處理完。YOLO的NMS計算方法如下:(參考網址:YOLO v1深入理解 9))

網絡輸出的7*7*30的張量,在每一個網格中,對象C_i位於第j個bounding box的得分:Score_{ij}=P(c_i|objeict) \times confidence_j它代表着某個對象C_i存在於第j個bounding box的可能性。

每個網格有:20個對象的概率*2個bounding box的置信度,共40個得分(候選對象)。49個網格共1960個得分。Andrew Ng建議每種對象分別進行NMS,那麼每種對象有 1960/20=98 個得分。

NMS步驟如下:

1)設置一個Score的閾值,低於該閾值的候選對象排除掉(將該Score設爲0)

2)遍歷每一個對象類別

2.1)遍歷該對象的98個得分

2.1.1)找到Score最大的那個對象及其bounding box,添加到輸出列表

2.1.2)對每個Score不爲0的候選對象,計算其與上面2.1.1輸出對象的bounding box的IOU

2.1.3)根據預先設置的IOU閾值,所有高於該閾值(重疊度較高)的候選對象排除掉(將Score設爲0)

2.1.4)如果所有bounding box要麼在輸出列表中,要麼Score=0,則該對象類別的NMS完成,返回步驟2處理下一種對象

3)輸出列表即爲預測的對象

2.4 YOLO侷限性

  1.  由於每個網格只預測兩個框,且每個網格只能有一個類,所以很多小物體檢測不出來;

3 與其他檢測系統對比

YOLO是通用的檢測器,可以檢測多個物體。 

4 試驗 YOLO的mAP達到了63.4%

6 結論

 以上就是學習的YOLO-v1的筆記,由於在做比賽,所以時間跨度有點久,感覺整體框架好理解,但是loss這一塊還是不是特別清楚,歡迎大家積極討論。以下附上手寫筆記。


YOLO-V2:

YOLO-v2(參考網址),由於事情比較多,所以這裏先補上之前做的yolo-v2筆記,如果日後有時間,會仔細補上yolo-v2的筆記。【原作地址:https://arxiv.org/pdf/1612.08242.pdf

參考網址:

  1. YOLO9000, Better, Faster, Stronger論文翻譯——中英文對照
  2. 淺析YOLO, YOLO-v2和YOLO-v3

  3. YOLO9000, Better, Faster, Stronger論文翻譯——中文版

 YOLO-v2(作者將主幹網絡稱爲Darknet-19)主要是精讀了第二章better,並對比YOLO-V1所做的改進之處做了如下筆記:

yolo v3參考網址 

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