YOLOv2源码分析(二)

本文深入分析YOLOv2的源码,涵盖parse_network_cfg函数,包括parse_net_options、学习率策略的设置,以及convolutional层的解析。详细解释了如何从配置文件中读取网络结构、学习率策略,并转换为程序内部的数据结构。
摘要由CSDN通过智能技术生成

文章全部YOLOv2源码分析

0x01 parse_network_cfg

我们继续前面没有说完的parse_network_cfg

    //parse_network_cfg
    node *n = sections->front;
    if(!n) error("Config file has no sections");    

我么先要了解一下list结构

typedef struct list{
    int size;
    node *front;
    node *back;
} list;
typedef struct node{
    void *val;
    struct node *next;
    struct node *prev;
} node;

这其实是一个双向链表,前向和后项都是一个node数据结构。这里,如果,这个链表后没有节点的话,就报错。

接着往后

    //parse_network_cfg
    network *net = make_network(sections->size - 1);

这里使用了一个make_network函数

network *make_network(int n)
{
    network *net = calloc(1, sizeof(network));
    net->n = n;
    net->layers = calloc(net->n, sizeof(layer));
    net->seen = calloc(1, sizeof(size_t));
    net->t    = calloc(1, sizeof(int));
    net->cost = calloc(1, sizeof(float));
    return net;
}

注意这里的这个make_network可能和早期的不太一样。我们先看看这里他做了什么。先看看network这个结构

//这个文件现在放在了darknet.h文件中
typedef enum {
    CONSTANT, STEP, EXP, POLY, STEPS, SIG, RANDOM
} learning_rate_policy;
typedef struct network{
    int n;              //网络总层数
    int batch;          //一个batch包含的图片数目,看下面的subdivisions
    size_t *seen;       //已经读取的图片数量
    int *t;
    float epoch;        //训练的次数
    int subdivisions;   //注意前面的batch/subdivisions才是网络的batch大小,可能目的是防止gpu显存不够
    layer *layers;      //指向网络的层
    float *output;
    learning_rate_policy policy;//学习率的策略,是一个枚举类型

    float learning_rate;//学习率
    float momentum;     //动量,一般0.9
    float decay;        //权重衰减正则项,防止过拟合
    float gamma;        //用于计算学习率,见后面0x0102
    float scale;        //用于计算学习率,见后面0x0102
    float power;        //用于计算学习率,见后面0x0102
    int time_steps;
    int step;           //用于计算学习率,见后面0x0102
    int max_batches;    //最大的训练batch数目
    float *scales;      //用于计算学习率,见后面0x0102
    int   *steps;       //用于计算学习率,见后面0x0102
    int num_steps;      //steps中的数据个数
    int burn_in;

    int adam;           //adam算法
    float B1;           //一阶矩估计的指数衰减率
    float B2;           //二阶矩估计的指数衰减率
    float eps;          //为了防止在实现中除以零

    int inputs;         //h*w*c
    int outputs;
    int truths;
    int notruth;
    int h, w, c;            //输入图像的高,宽,通道数
    int max_crop;           //控制图片缩放的最大值
    int min_crop;           //控制图片缩放的最小值
    float max_ratio;        //控制图片缩放的最大比例
    float min_ratio;        //控制图片缩放的最小比例
    int center;
    float angle;            //设置旋转角度,扩充数据
    float aspect;           //设置方位,扩充数据
    float exposure;         //设置曝光量,扩充数据
    float saturation;       //设置饱和度,扩充数据
    float hue;              //设置色调,扩充数据
    int random;             //random为1时随机使用不同尺寸的图片进行训练

    int gpu_index;          //设置第几个gpu
    tree *hierarchy;

    float *input;
    float *truth;
    float *delta;
    float *workspace;
    int train;
    int index;
    float *cost;

#ifdef GPU
    float *input_gpu;
    float *truth_gpu;
    float *delta_gpu;
    float *output_gpu;
#endif

} network;

由于参数太多,用到哪个说哪个,这个结构的主要作用就是存储网络的配置参数。make_network的作用就是产生network这种数据结构。接着往下

    //parse_network_cfg
    net->gpu_index = gpu_index;//设置gpu
    size_params params;

又出现一个新的结构size_params

typedef struct size_params{
    int batch;      //一个batch包含的图片数目
    int inputs;
    int h;          //图像的高
    int w;          //输入图像的宽
    int c;          //输入图像的通道数
    int index;
    int time_steps;
    network *net;
} size_params;

接着往下

    //parse_network_cfg
    section *s = (section *)n->val;//section这个结构我在(一)中提过

n是一个node结构,这个结构中的val是一个void*,所以这里就是将node结构中的val强转为section*,相当于我在(一)中图上画的[net]等节点。

    //parse_network_cfg   
    list *options = s->options;//这里就是之前说的kvp,也就是size=3,stride=1,pad=1这些
    if(!is_network(s)) error("First section must be [net] or [network]");    

看一下这个is_network函数

int is_network(section *s)
{
    return (strcmp(s->type, "[net]")==0
            || strcmp
需要学习Windows系统YOLOv4的同学请前往《Windows版YOLOv4目标检测实战:原理与源码解析》,课程链接 https://edu.csdn.net/course/detail/29865【为什么要学习这门课】 Linux创始人Linus Torvalds有一句名言:Talk is cheap. Show me the code. 冗谈不够,放码过来!  代码阅读是从基础到提高的必由之路。尤其对深度学习,许多框架隐藏了神经网络底层的实现,只能在上层调包使用,对其内部原理很难认识清晰,不利于进一步优化和创新。YOLOv4是最近推出的基于深度学习的端到端实时目标检测方法。YOLOv4的实现darknet是使用C语言开发的轻型开源深度学习框架,依赖少,可移植性好,可以作为很好的代码阅读案例,让我们深入探究其实现原理。【课程内容与收获】 本课程将解析YOLOv4的实现原理和源码,具体内容包括:- YOLOv4目标检测原理- 神经网络及darknet的C语言实现,尤其是反向传播的梯度求解和误差计算- 代码阅读工具及方法- 深度学习计算的利器:BLAS和GEMM- GPU的CUDA编程方法及在darknet的应用- YOLOv4的程序流程- YOLOv4各层及关键技术的源码解析本课程将提供注释后的darknet的源码程序文件。【相关课程】 除本课程《YOLOv4目标检测:原理与源码解析》外,本人推出了有关YOLOv4目标检测的系列课程,包括:《YOLOv4目标检测实战:训练自己的数据集》《YOLOv4-tiny目标检测实战:训练自己的数据集》《YOLOv4目标检测实战:人脸口罩佩戴检测》《YOLOv4目标检测实战:中国交通标志识别》建议先学习一门YOLOv4实战课程,对YOLOv4的使用方法了解以后再学习本课程。【YOLOv4网络模型架构图】 下图由白勇老师绘制  
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值