【darknet源码解析-17】detection_layer.h 和 detection_layer.c 解析

本文深入解析darknet框架中的detection_layer.h和detection_layer.c文件,重点探讨YOLOv1模型的最后一层——7*7*30结构,该部分是YOLOv1算法的核心。
摘要由CSDN通过智能技术生成

本系列为darknet源码解析,本次解析src/detection_layer.h 与 src/detection_layer.c 两个。detection_layer主要完成了yolo v1最后一层7*7*30,是yolo v1这篇论文的核心部分。

detection_layer.h 的定义如下:

#ifndef DETECTION_LAYER_H
#define DETECTION_LAYER_H

#include "layer.h"
#include "network.h"

typedef layer detection_layer;

// 构造detection层
detection_layer make_detection_layer(int batch, int inputs, int n, int size, int classes, int coords, int rescore);

// detection层前向传播函数
void forward_detection_layer(const detection_layer l, network net);
// detection层反向传播函数
void backward_detection_layer(const detection_layer l, network net);

#ifdef GPU
void forward_detection_layer_gpu(const detection_layer l, network net);
void backward_detection_layer_gpu(detection_layer l, network net);
#endif

#endif

detection_layer.c 的详细分析如下:

#include "detection_layer.h"
#include "activations.h"
#include "softmax_layer.h"
#include "blas.h"
#include "box.h"
#include "cuda.h"
#include "utils.h"

#include <stdio.h>
#include <assert.h>
#include <string.h>
#include <stdlib.h>

/**
 * 构建detection层,yolov1中最后一层
 * @param batch 一个batch包含图片的张数
 * @param inputs detection层一张输入图片元素个数
 * @param n yolov1一个grid cell预测bbox的数量 2
 * @param side // grid cell的大小 7
 * @param classes yolov1 预测类的个数
 * @param coords 一个bbox包含的坐标数量 4
 * @param rescore
 * @return
 */
detection_layer make_detection_layer(int batch, int inputs, int n, int side, int classes, int coords, int rescore)
{
    detection_layer l = {0};
    l.type = DETECTION; // 层类别

    l.n = n; // 一个grid cell预测bbox的数量,在yolov1 n = 2
    l.batch = batch; // 一个batch包含图片的张数
    l.inputs = inputs; // detection层一张输入图片元素个数
    l.classes = classes; // yolov1 预测类别数, 在yolov1 classes=20
    l.coords = coords; // [x, y, w, h] bbox包含的点个数, 在yolov1 coords=4
    l.rescore = rescore; //
    l.side = side; // grid cell 大小
    l.w = side; // grid cell的宽度
    l.h = side; // grid cell的高度
    assert(side*side*((1 + l.coords)*l.n + l.classes) == inputs); // 7*7*(1 + 4) * 2 + 30 ) = 7*7*30
    l.cost = calloc(1, sizeof(float)); // detection层的总损失
    l.outputs = l.inputs; // detection层对应输入图片的输出元素个数,detection层不改变输入输出大小
    l.truths = l.side*l.side*(1+l.coords+l.classes); // GT:7*7*(1+4+20) 只有一个bbox和置信度
    l.output = calloc(batch*l.outputs, sizeof(float)); // detection层所有输出(包含整个batch的)
    l.delta = calloc(batch*l.outputs, sizeof(float)); // detection层误差项(包含整个batch的)

    l.forward = forward_detection_layer; // detection层前向传播
    l.backward = backward_detection_layer; // detection层反向传播
#ifdef GPU
    l.forward_gpu = forward_detection_layer_gpu;
    l.backward_gpu = backward_detection_layer_gpu;
    l.output_gpu = cuda_make_array(l.output, batch*l.outputs);
    l.delta_gpu = cuda_make_array(l.delta, batch*l.outputs);
#endif

    fprintf(stderr, "Detection Layer\n");
    srand(
Linux创始人LinusTorvalds有一句名言:Talk is cheap, Show me the code.(冗谈不够,放码过来!)。 代码阅读是从入门到提高的必由之路。尤其对深度学习,许多框架隐藏了神经网络底层的实现,只能在上层调包使用,对其内部原理很难认识清晰,不利于进一步优化和创新。  YOLOv3是一种基于深度学习的端到端实时目标检测方法,以速度快见长。YOLOv3的实现Darknet是使用C语言开发的轻型开源深度学习框架,依赖少,可移植性好,可以作为很好的代码阅读案例,让我们深入探究其实现原理。  本课程将解析YOLOv3的实现原理和源码,具体内容包括: YOLO目标检测原理  神经网络及Darknet的C语言实现,尤其是反向传播的梯度求解和误差计算 代码阅读工具及方法 深度学习计算的利器:BLAS和GEMM GPU的CUDA编程方法及在Darknet的应用 YOLOv3的程序流程及各层的源码解析本课程将提供注释后的Darknet源码程序文件。  除本课程《YOLOv3目标检测:原理与源码解析》外,本人推出了有关YOLOv3目标检测的系列课程,包括:   《YOLOv3目标检测实战:训练自己的数据集》  《YOLOv3目标检测实战:交通标志识别》  《YOLOv3目标检测:原理与源码解析》  《YOLOv3目标检测:网络模型改进方法》 建议先学习课程《YOLOv3目标检测实战:训练自己的数据集》或课程《YOLOv3目标检测实战:交通标志识别》,对YOLOv3的使用方法了解以后再学习本课程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值