darknet之detection_layer源码分析

  • 最关键的函数,以yolov1为例
  • yolov1没有anchor,直接使用网络输出计算IOU
void forward_detection_layer(const detection_layer l, network_state state)
{
   
    // locations是cell的个数,yolov1是49
    int locations = l.side*l.side;
    int i,j;
    memcpy(l.output, state.input, l.outputs*l.batch*sizeof(float));
    //if(l.reorg) reorg(l.output, l.w*l.h, size*l.n, l.batch, 1);
    int b;
    // 如果需要,计算softmax
    if (l.softmax){
   
        for(b = 0; b < l.batch; ++b){
   
            int index = b*l.inputs;
            for (i = 0; i < locations; ++i) {
   
                int offset = i*l.classes;
                softmax(l.output + index + offset, l.classes, 1,
                        l.output + index + offset, 1);
            }
        }
    }
    // 后面的代码都在这个if里
    if(state.train){
   
        float avg_iou = 0;
        float avg_cat = 0;
        float avg_allcat = 0;
        float avg_obj = 0;
        float avg_anyobj = 0;
        int count = 0;
        *(l.cost) = 0;
        // yolov1 : l.inputs = 7*7*(5*2+20)
        int size = l.inputs * l.batch;
        memset(l.delta, 0, size * sizeof(float));
        for (b = 0; b < l.batch; ++b){
   
            int index = b*l.inputs;
            // 对每7*7*(5*2+20)个数据,后面的索引都是在一组7*7*(5*2+20)里说
            for (i = 0; i < locations; ++i) {
   
                int truth_index = (b*locations + i)*(1+l.coords+l.classes);
                // 索引0的值
                int is_obj = state.truth[truth_index];
                // l.n是框的个数
                for (j = 0; j < l.n; ++j) {
   
                    int p_index = index + locations*l.classes + i*l.n + j
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刀么克瑟拉莫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值