logo
Loading...

YOLOv3輸入資料的尺寸問題 - Cupoy

專家們好~YOLOV3可以接受任意尺寸的輸入圖片, 預設為416*4161. 若是我輸入1080*8...

yolo

YOLOv3輸入資料的尺寸問題

2020/05/16 下午 08:13
電腦視覺深度學習討論版
陳政陽
觀看數:520
回答數:1
收藏數:0
yolo

專家們好~


YOLOV3可以接受任意尺寸的輸入圖片, 預設為416*416

1. 若是我輸入1080*800, 那麼YOLO會怎麼處理我的資料呢? 直接把我圖片resize成416*416, 還是按比例縮小到416*416以內?


2. 若YOLO會進行resize處理, 那我原本標註的資料也會一起被resize嗎?


3. 雖然YOLO可以接受任意尺寸圖片, 如果我先將資料resize成416*416~608*608之間等YOLO可接受範圍, 再進行標註, 這樣對於YOLO訓練的準確率會有提升嗎?


4. 如果我想用k-means重新計算anchor尺寸, 是否需要先將輸入資料resize成YOLO可接受範圍再計算?

若依照原尺寸(1080*800), 算出來的尺寸會超過416*416甚至608*608


不好意思, 我想問的問題比較多, 再麻煩各位專家幫我解惑, 謝謝~

回答列表

  • 2020/05/17 下午 10:31
    Jeffrey
    贊同數:0
    不贊同數:0
    留言數:0

    這是 darknet src/yolo_layer.c

    void correct_yolo_boxes(detection *dets, int n, int w, int h, int netw, int neth, int relative)

    {

    int i;

    // 此處new_w表示輸入圖片經壓縮後在網路輸入大小的letter_box中的width,new_h表示在letter_box中的height,

    // 以1280*720的輸入圖片為例,在進行letter_box的過程中,原圖經resize後的width為416, 那麼resize後的對應height為720*416/1280,

    //所以height為234,而超過234的上下空余部分在作為網路輸入之前填充了128,new_h=234

    int new_w=0;

    int new_h=0;

    // 如果w>h說明resize的時候是以width/圖像的width為resize比例的,先得到中間圖的width,再根據比例得到height

    if (((float)netw/w) < ((float)neth/h)) {

    new_w = netw;

    new_h = (h * netw)/w;

    } else {

    new_h = neth;

    new_w = (w * neth)/h;

    }

    for (i = 0; i < n; ++i){

    box b = dets[i].bbox;

    // 此處的公式很不好理解還是接著上面的例子,現有new_w=416,new_h=234,因為resize是以w為長邊壓縮的

    // 所以x相對於width的比例不變,而b.y表示y相對於圖像高度的比例,在進行這一步的轉化之前,b.y表示

    // 的是預測框的y座標相對於網路height的比值,要轉化到相對於letter_box中圖像的height的比值時,需要先

    // 計算出y在letter_box中的相對座標,即(b.y - (neth - new_h)/2./neth),再除以比例

    b.x = (b.x - (netw - new_w)/2./netw) / ((float)new_w/netw); 

    b.y = (b.y - (neth - new_h)/2./neth) / ((float)new_h/neth); 

    b.w *= (float)netw/new_w;

    b.h *= (float)neth/new_h;

    if(!relative){

    b.x *= w;

    b.w *= w;

    b.y *= h;

    b.h *= h;

    }

    dets[i].bbox = b;

     }

    }