1. 程式人生 > 實用技巧 >飛槳|PaddlePaddle YoloV3學習筆記

飛槳|PaddlePaddle YoloV3學習筆記

學習了兩週PaddlePaddle,剛開始都是比較簡單的網路,直到遇到YoloV3這個大傢伙,它的程式內容涉及影象增廣(訓練資料擴充),錨框生成(以及微調),候選區域生成、目標標註、特徵提取、特徵位置對應、損失函式構建、多尺度檢測等等,最終構成的是一個end2end的目標識別程式。我並沒有看原論文,直接按照Paddle課程中的ipython notebook過了一遍,把碰到的難點全部記錄下來。


一、目標檢測及其著名模型

目標檢測是影象識別的升級版,需要識別出圖片中包含的物體(多種物體),並且標註出位置資訊(用框標出來)。如果目標檢測演算法足夠快,便可處理視訊幀,做到視訊目標檢測。

用最基本的方法,記得吳恩達的機器學習公開課上提過,假設我們已經有了用於影象識別的模型,但是無法標註出位置資訊,我們可以使用不同大小的滑動視窗,在輸入圖片上進行滑動(從左到右從上往下全覆蓋,並且使用多種尺寸的滑動視窗),判斷目標並得到位置。但這樣計算量太大了,沒法使用。

所以新的目標檢測演算法,會生成可能包含物體的候選區域,只在候選區域上進行識別。著名的演算法有利用Selective Search的R-CNN,Fast R-CNN、使用RPN的Faster R-CNN,Mask R-CNN等。

YoloV3演算法只使用一個網路同時產生候選區域並預測出物體的類別和位置,叫做單階段檢測演算法。


二、基礎知識、術語等概念

在圖片中,把物體框出來的方框,叫做bounding box 邊界框,一個方框可用兩種表達方式記錄,一般叫做xyxy(記錄方框最上角和右下角的座標)和xywh(記錄方框中心座標及長度和寬度)。

訓練集中,真實的包含目標的方框(一般是人工標註的)叫做ground truth box,真實框;模型預測出來的框叫prediction box預測框。

還有一種框,是人們假想出來的框,也可以是隨機生成的框,叫做錨框(anchor box),影象識別就發生在錨框裡。

# 繪製錨框
def draw_anchor_box(center, length, scales, ratios, img_height, img_width):
    """
    以center為中心,產生一系列錨框
    其中length指定了一個基準的長度
    scales是包含多種尺寸比例的list
    ratios是包含多種長寬比的list
    img_height和img_width是圖片的尺寸,生成的錨框範圍不能超出圖片尺寸之外
    """
    bboxes = []
    for scale in scales:
        for ratio in ratios:
            h = length*scale*math.sqrt(ratio)
            w = length*scale/math.sqrt(ratio) 
            x1 = max(center[0] - w/2., 0.)
            y1 = max(center[1] - h/2., 0.)
            x2 = min(center[0] + w/2. - 1.0, img_width - 1.0)
            y2 = min(center[1] + h/2. - 1.0, img_height - 1.0)
            print(center[0], center[1], w, h)
            bboxes.append([x1, y1, x2, y2])

    for bbox in bboxes:
        draw_rectangle(currentAxis, bbox, edgecolor = 'b')

藍色方框就是生成的3個不同長寬比的錨框。