- 網絡結構
假設輸入數據的大小爲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上的框的尺寸