yolo3算法講解

  1. 網絡結構  

假設輸入數據的大小爲416×416,經過Darknet-53特徵提取網絡後得到尺度爲13×13,26×26,52×52的特徵圖。其中每一個尺寸的特徵圖都有18(3×6,其中3是指每個grid-cell有3個anchor,每個anchor預測一個邊界框的4個座標值,1個置信度,還有一個類別概率值)個通道,將13×13×18的特徵圖和對應尺寸的anchor作爲Decode-Unit模塊的輸入,根據anchor的尺寸來生成相應的預測框。這個預測框的dx,dy,dw,dh是對應在416×416輸入圖片上的座標和寬高。將輸入圖片和圖片中的真實標框經過等比縮放變成圖片的尺寸爲416×416,圖片中的標框也相應的進行變化,求預測框和真實框的giou,然後計算邊界框的損失,其網絡結構圖如下圖所示。

     2. 輸入數據的預處理

首先對讀取的圖片數據和圖片中標準的真實框的數據做數據增強(平移、翻轉、裁剪)處理,從而來增加數據量。將圖片和真實框按照一定比例縮放,比如真實圖片數據的尺度是(767,512,3),神經網絡的輸入數據需要的尺寸是(416,416,3),其縮放比例爲416/767.Tensorflow的實現代碼如下所示。

def image_preporcess(image, target_size, gt_boxes=None):
    #image:輸入的圖片   target_size:416×416
    image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB).astype(np.float32)
    ih, iw    = target_size  #ih: 416 iw: 416
    h,  w, _  = image.shape  #h: 512  w: 767 _:3
    scale = min(iw/w, ih/h)  # 0.54237
    nw, nh  = int(scale * w), int(scale * h) #nw: 416   nh:277
    image_resized = cv2.resize(image, (nw, nh)) #將圖片resize成新的尺寸
    image_paded = np.full(shape=[ih, iw, 3], fill_value=128.0) #生成一塊畫布,畫布中的像素 
                                                               #值爲128
    dw, dh = (iw - nw) // 2, (ih-nh) // 2 #計算目標尺寸的寬和高和真實尺寸的寬和高的差距
    image_paded[dh:nh+dh, dw:nw+dw, :] = image_resized
    image_paded = image_paded / 255. #輸入數據進行歸一化處理
    if gt_boxes is None:
        return image_paded
    else:
        gt_boxes[:, [0, 2]] = gt_boxes[:, [0, 2]] * scale + dw #將圖片上的真實框按照比例進 
                                                               #行縮放
        gt_boxes[:, [1, 3]] = gt_boxes[:, [1, 3]] * scale + dh
        return image_paded, gt_boxes  # 返回的圖片的尺寸是416×416,此時的真實框的尺寸是在 
                                      #416×416上的框的尺寸

 

發佈了53 篇原創文章 · 獲贊 17 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章