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的计算。