YOLOv3輸入資料的尺寸問題
專家們好~
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:31Jeffrey贊同數: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;
}
}