作者:木凌
时间:2016年11月。
文章连接:http://blog.csdn.net/u014540717
QQ交流群:554590241
最近一直有人在问,把图像分为7*7个网格,每个网格推荐两个框是什么意思,一直没搞明白,今天我们就从源码入手,追本溯源,彻底理解7*7个grid
在YOLO源码详解(三)- 前向传播(forward)里,我们分析了detection_layer.c层的代码,我们来看一下truth_index
是怎么定义的:
int truth_index = (b*locations + i)*(1+l.coords+l.classes);
这里参数意义如下:
locations:7*7
b :batch size的索引
i :locations的索引
1 :置信度
l.coords :值为4,分别表示x,y,w,h
l.classes : 20
然后在下面我们可以看到如下代码段
//l.n就是一个网格要推荐几个框,论文中l.n=2
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;
}
}
}
上述代码中最重要的是box_iou(out, truth);
这句代码,这句代码是要计算你输出的框和真实框的IOU,truth的定义如下:
box truth = float_to_box(state.truth + truth_index + 1 + l.classes);<