Darknet 框架学习笔记 ---- 4

理解darknet中的cfg文件

darknet是通过cfg配置文件配置网络结构的:

如果想要自己搭建神经网络的话,需要对cfg文件的格式有个清除的认识。

含义解读

以yolov3-voc.cfg文件为例:

cfg网络结构文件是以中括号为界,分隔开网络的一层。

  • [net]或[network] 包含网络训练相关参数
    • batch,subdivisions:共同决定批大小。
      我的猜想是batch为批梯度下降的批大小,而batch÷subdivisions是训练过程中在内存中的批大小。
    • width,height,channels:网络输入尺寸
    • angle,saturation,exposure,hue:旋转角度,饱和度,曝光量,色调;(通过调整图片参数来生成更多数据集);
      • 例:angle=15,每次载入图片时,会随机载入旋转[-15°,+15°]的图片。
      • 例:hue=0.1,saturation=0.7,exposure=1.5,每次载入图片时,先将rgb格式转化为hsv格式,在h通道上加上[-0,1 ,0.1]之间的随机数;在s通道上一半几率乘上0.7,一半几率除与0.7;在v通道上一半几率乘上1.5,一半几率除与1.5。
    • learning_rate,momentum,decay:学习率,动量,衰减率,权重衰减正则项(防止过拟合)。
    • burn_in:在迭代次数小于burn_in时,其学习率的更新有一种方式,大于burn_in时,才采用policy的更新方式。
    • policy:学习率调整的策略。如果不写,默认为constant。学习率策略内容可以参考这个
    • steps,scales:共同决定学习率的变化。
      • 例:steps=40000,45000,scales=.2,.1,在迭代40000次时,学习率变为原来的0.2倍,45000次时,学习率继续下降0.1倍。
  • [convolutional]  包含卷积网络的配置
    • batch_normalize:是否使用batch normalization,为1使用,为0不使用。
    • filters,size,stride:卷积核个数,尺寸,步长。
    • pad:卷积是否进行补零操作,补零个数与卷积核尺寸有关。比如size=3时,补零个数为 3/2 = 1。
    • padding:手动指定补零个数。
    • groups:分组卷积组数。
    • activation:激活函数;默认为logistic。
    • binary:
    • xnor:
    • flipped:
    • dot:
  • [shortcut]  网络中的旁路,实现res层。
    • from:例:from=-3时,从之前的第三层网络旁路连接到此层。
    • activation:激活函数。
  • [yolo]  包含yolo目标检测参数
    • mask:使用anchor的索引。
      • 例:mask=0,1,2时,使用anchor选项中第1,2,3组的anchor宽高。
    • anchors:anchors尺寸。两两一组,代表宽高。
    • classes:类别个数。
    • num:每个grid cell总共预测几个box,和anchors的数量一致。
      • 例:anchors = 10,13,  16,30,  33,23,  30,61,  62,45,  59,119,  116,90,  156,198,  373,326;总共有9个anchor:(10×13),(16×30),(33×23),(30×61),(62×45),(59×119),(116×90),(156×198),(373×326);对应 num = 9。
    • jitter: 数据增强手段,此处jitter为随机调整宽高比的范围。
    • ignore_thresh:参与计算的IOU阈值大小.当预测的检测框与ground true的IOU大于ignore_thresh的时候,参与loss的计算,否则,检测框的不参与损失计算。
    • truth_thresh: 
    • random:为1打开随机多尺度训练,为0则关闭。当打开随机多尺度训练时,前面设置的网络输入尺寸width和height其实就不起作用了,width和height会在320到608之间随机取值,每10轮随机改变一次。
    • max:默认值90。
    • map:默认值0。
  • [route]  路由层,作用是拼接多个层,类似[shortcut] ,但没有激活函数。参考博客。
    • layers:拼接层的index;比如layers=-1,61时,将上一层跟第61层拼接起来,输入到下一层。
  • [upsample]  上采样层,也充当着下采样的作用
    • stride:步长,为正数时上采样,为负数时下采样;默认为2。
      • 例:stride=2,上采样,feature的宽高放大两倍。
      • 例:stride=-2,下采样,feature的宽高减小两倍
    • scale:缩放;默认为1。

定位源码

network *load_network(char *cfg, char *weights, int clear) 函数用来载入网络配置文件和网络权重文件;clear为1时,将网络已训练次数改为0。

parse_network_cfg(..) 函数用来从cfg文件中读取网络配置。

parse_net_options(..) 函数用来解析 [net]或[network] 部分的参数。

LAYER_TYPE string_to_layer_type(char * type) 函数用来解析中括号中的内容,返回层类型枚举类型。

  • 通过LAYER_TYPE枚举类型,可以看出darknet支持哪些层结构:
typedef enum {
    CONVOLUTIONAL,
    DECONVOLUTIONAL,
    CONNECTED,
    MAXPOOL,
    SOFTMAX,
    DETECTION,
    DROPOUT,
    CROP,
    ROUTE,
    COST,
    NORMALIZATION,
    AVGPOOL,
    LOCAL,
    SHORTCUT,
    ACTIVE,
    RNN,
    GRU,
    LSTM,
    CRNN,
    BATCHNORM,
    NETWORK,
    XNOR,
    REGION,
    YOLO,
    ISEG,
    REORG,
    UPSAMPLE,
    LOGXENT,
    L2NORM,
    BLANK
} LAYER_TYPE;
...
LAYER_TYPE string_to_layer_type(char * type)
{

    if (strcmp(type, "[shortcut]")==0) return SHORTCUT;
    if (strcmp(type, "[crop]")==0) return CROP;
    if (strcmp(type, "[cost]")==0) return COST;
    if (strcmp(type, "[detection]")==0) return DETECTION;
    if (strcmp(type, "[region]")==0) return REGION;
    if (strcmp(type, "[yolo]")==0) return YOLO;
    if (strcmp(type, "[iseg]")==0) return ISEG;
    if (strcmp(type, "[local]")==0) return LOCAL;
    if (strcmp(type, "[conv]")==0
            || strcmp(type, "[convolutional]")==0) return CONVOLUTIONAL;
    if (strcmp(type, "[deconv]")==0
            || strcmp(type, "[deconvolutional]")==0) return DECONVOLUTIONAL;
    if (strcmp(type, "[activation]")==0) return ACTIVE;
    if (strcmp(type, "[logistic]")==0) return LOGXENT;
    if (strcmp(type, "[l2norm]")==0) return L2NORM;
    if (strcmp(type, "[net]")==0
            || strcmp(type, "[network]")==0) return NETWORK;
    if (strcmp(type, "[crnn]")==0) return CRNN;
    if (strcmp(type, "[gru]")==0) return GRU;
    if (strcmp(type, "[lstm]") == 0) return LSTM;
    if (strcmp(type, "[rnn]")==0) return RNN;
    if (strcmp(type, "[conn]")==0
            || strcmp(type, "[connected]")==0) return CONNECTED;
    if (strcmp(type, "[max]")==0
            || strcmp(type, "[maxpool]")==0) return MAXPOOL;
    if (strcmp(type, "[reorg]")==0) return REORG;
    if (strcmp(type, "[avg]")==0
            || strcmp(type, "[avgpool]")==0) return AVGPOOL;
    if (strcmp(type, "[dropout]")==0) return DROPOUT;
    if (strcmp(type, "[lrn]")==0
            || strcmp(type, "[normalization]")==0) return NORMALIZATION;
    if (strcmp(type, "[batchnorm]")==0) return BATCHNORM;
    if (strcmp(type, "[soft]")==0
            || strcmp(type, "[softmax]")==0) return SOFTMAX;
    if (strcmp(type, "[route]")==0) return ROUTE;
    if (strcmp(type, "[upsample]")==0) return UPSAMPLE;
    return BLANK;
}

load_data_augment(..) 函数用来载入augment后的数据

枚举结构体ACTIVATION说明darknet支持哪些激活函数:

typedef enum{
    LOGISTIC, RELU, RELIE, LINEAR, RAMP, TANH, PLSE, LEAKY, ELU, LOGGY, STAIR, HARDTAN, LHTAN, SELU
} ACTIVATION;
...
ACTIVATION get_activation(char *s)
{
    if (strcmp(s, "logistic")==0) return LOGISTIC;
    if (strcmp(s, "loggy")==0) return LOGGY;
    if (strcmp(s, "relu")==0) return RELU;
    if (strcmp(s, "elu")==0) return ELU;
    if (strcmp(s, "selu")==0) return SELU;
    if (strcmp(s, "relie")==0) return RELIE;
    if (strcmp(s, "plse")==0) return PLSE;
    if (strcmp(s, "hardtan")==0) return HARDTAN;
    if (strcmp(s, "lhtan")==0) return LHTAN;
    if (strcmp(s, "linear")==0) return LINEAR;
    if (strcmp(s, "ramp")==0) return RAMP;
    if (strcmp(s, "leaky")==0) return LEAKY;
    if (strcmp(s, "tanh")==0) return TANH;
    if (strcmp(s, "stair")==0) return STAIR;
    fprintf(stderr, "Couldn't find activation function %s, going with ReLU\n", s);
    return RELU;
}

枚举结构体learning_rate_policy说明darknet支持哪些学习策略:

typedef enum {
    CONSTANT, STEP, EXP, POLY, STEPS, SIG, RANDOM
} learning_rate_policy;

参考博客:

[1]  YOLOV3实战4:Darknet中cfg文件说明和理解
[2]  常见优化算法 (caffe和tensorflow对应参数)

猜你喜欢

转载自blog.csdn.net/Jeff_zjf/article/details/102887673
今日推荐