yolo v1 detection_layer.c

数据标签的排序格式,即net.truth内存的排列方式:
第1个格子是否包含物体的confidence|第1个格子中20个种类的confidence|第1个格子中物体的坐标;
第2个格子是否包含物体的confidence|第2个格子中20个种类的confidence|第2个格子中物体的坐标;
.
.
.
第49个格子是否包含物体的confidence|第49个格子中20个种类的confidence|第49个格子中物体的坐标。








网络输出预测的数据格式,即l.output的内存排列方式:S x S x (5*B+C)
第1个格子预测的20类物体的confidence|第2个格子预测的20类物体的confidence|...|第49个格子预测的20类物体的confidence;(注意:每个格子的2个预测bounding box 共用这个)
第1个格子的第1个预测bounding box 是否包含物体的confidence|第1个格子的第2个预测bounding box 是否包含物体的confidence|...|第49个格子的第1个预测bounding box 是否包含物体的confidence|第49个格子的第2个预测bounding box 是否包含物体的confidence;
第1个格子的第1个预测bounding box的坐标|第1个格子的第2个预测bounding box的坐标|...|第49个格子的第1个预测bounding box的坐标|第49个格子的第2个预测bounding box的坐标。








流程顺序轮询7*7的格子


第1步,计算第n=1,2...49个格子的数据标签的内存索引,获取到当前格子是否包含物体is_obj;
第2步,局部子循环,计算当前格子预测的bounding box没有物体的误差:
       顺序获取当前格子内的2个预测bounding box的内存索引;
  假设都没有包含物体,计算对应的误差 l.delta[p_index] = l.noobject_scale*(0 - l.output[p_index]);
  累加当前bounding box输出的是否包含物体的值avg_anyobj;
第3步,根据第1步获取的is_obj判断是否包含物体,不包含返回第1步,继续轮询下一个格子,如果包含继续往第4步走,即第4步以下执行的前提是当前格子包含物体;
第4步,局部子循环,计算当前包含物体格子预测classes值的误差
  全部物体类别误差:l.delta[class_index+j] = l.class_scale * (net.truth[truth_index+1+j] - l.output[class_index+j]);
  累加具体哪一类物体预测输出值avg_cat:if(net.truth[truth_index + 1 + j]) avg_cat += l.output[class_index+j];
  累加全部物体类别预测输出值avg_allcat:avg_allcat += l.output[class_index+j];
  
第5步:获取当前包含物体格子的数据标签值 box truth,并进行归一化,即坐标中心(x,y)是以格子左上角为坐标原点;
第6步:局部子循环,循环当前包含物体格子的2个bounding box,获取当前包含物体格子中预测最好的bounding box:
       获取bounding box的内存索引box_index,然后根据索引获取坐标,并对坐标做归一化操作,即坐标中心(x',y')是相对格子左上角坐标原点的偏移值;
  根据当前包含物体格子的数据标签值box truth和当前包含物体格子预测的bounding box索引box_index,计算iou、rmse,选择最大的iou或者最小的rmse,并记录他们的索引box_index(是第1个bounding box还是第2个)
第7步:判断是否设置了强制或者随机选择最好的 box_index索引,如有,则强制或者随机更新第6步的box_index   
第8步:根据第6,7步获取到的box_index 重新计算当前包含物体格子被选择的bound box的内存索引值box_index;
        获取当前包含物体格子关于物体坐标的内存索引int tbox_index = truth_index + 1 + l.classes;
第9步:根据第8步,计算当前包含物体格子预测的bounding box的坐标值,并做归一化;
       计算当前包含物体格子的物体和当前包含物体格子预测bb的iou,
第10步:计算当前包含物体格子包含物体的误差:
        计算预测最好的bb关于 是否包含物体confidence 的索引值;
由于第二步的代价函数已经加上假设当前bb没有物体的输出值,这里需要减去*(l.cost) -= l.noobject_scale * pow(l.output[p_index], 2);
代价函数重新加上有物体的输出值 *(l.cost) += l.object_scale * pow(1-l.output[p_index], 2);
累加有物体的输出值到avg_obj: avg_obj += l.output[p_index];
第11步:计算当前格子包含物体的坐标与当前格子预测物体坐标的误差:
l.delta[box_index+0] = l.coord_scale*(net.truth[tbox_index + 0] - l.output[box_index + 0]); //x-xi
l.delta[box_index+1] = l.coord_scale*(net.truth[tbox_index + 1] - l.output[box_index + 1]); //y-yi
l.delta[box_index+2] = l.coord_scale*(net.truth[tbox_index + 2] - l.output[box_index + 2]); //h-hb
l.delta[box_index+3] = l.coord_scale*(net.truth[tbox_index + 3] - l.output[box_index + 3]); //w-wb
if(l.sqrt){
l.delta[box_index+2] = l.coord_scale*(sqrt(net.truth[tbox_index + 2]) - l.output[box_index + 2]);
l.delta[box_index+3] = l.coord_scale*(sqrt(net.truth[tbox_index + 3]) - l.output[box_index + 3]);
}


最后一步,当循环完所有的格子(7*7=49),计算误差平方和误差l.cost: *(l.cost) = pow(mag_array(l.delta, l.outputs * l.batch), 2);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值