YOLOv1中的grid與b-box

YOLOv1在最後生成一個7*7的feature map,channel數爲30((4+1)*2+20)。即一共49個grid,每個grid對應20個類別和2個b-box(4個座標和1個置信度);這也就意味着,這兩個b-box都只能是同一個類別。

然後我就有一個疑問,那ground truth怎麼對應到這兩個不同的b-box predictor上,loss到底怎麼訓練?仔細看了論文也沒有找到答案,看來只有看作者的源碼才能知道這個細節問題了。

for(j = 0; j < l.n; ++j){
                    int box_index = index + locations*(l.classes + l.n) + (i*l.n + j) * l.coords;
                    box out = float_to_box(l.output + box_index);
                    out.x /= l.side;
                    out.y /= l.side;

                    if (l.sqrt){
                        out.w = out.w*out.w;
                        out.h = out.h*out.h;
                    }

                    //計算iou的值
                    float iou  = box_iou(out, truth);
                    //iou = 0;
                    //計算均方根誤差(root-mean-square error)
                    float rmse = box_rmse(out, truth);
                    //選出iou最大或者均方根誤差最小的那個框作爲最後預測框~
                    if(best_iou > 0 || iou > 0){
                        if(iou > best_iou){
                            best_iou = iou;
                            best_index = j;
                        }
                    }else{
                        if(rmse < best_rmse){
                            best_rmse = rmse;
                            best_index = j;
                        }
                    }
                }

上面代碼中:

l.n對應論文中的B(b-box predictor的數量),即是2。代碼很明顯,會挑出最好的一個b-box,用來計算loss,選擇條件就是iou最大或者rmse最小,所以每個grid只有一個b-box會參與loss的計算。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章