yolov3源码中对于yolov3-voc.cfg文件如何读入到神经网络进行解释

yolov3源码中对于yolov3-voc.cfg文件如何读入到神经网络进行解释

在这里插入图片描述查看load_network函数的定义:
在这里插入图片描述
继续调用parse_network_cfg(cfg),这个输入的是yolov3-voc.cfg的路径,继续查看parse_network_cfg的函数定义:
在这里插入图片描述
定位到read_cfg(filename)这个函数,这个函数实现将yolov3-voc.cfg读入到链表中,具体分析开始:
在这里插入图片描述
fopen函数打开cfg文件,make_list()函数初始化一个list结构体options,结构体的声明如下:在这里插入图片描述
make_list()的定义:
在这里插入图片描述
创建一个section结构体的指针current,section结构体的声明如下:
在这里插入图片描述

通过while循环持续读入cfg文件每行的内容,通过switch判断每行的第一个字符,和case进行比对,cfg第一行是[net], line[0]==’[’, 将current进行初始化,进而通过list_insert函数,输入options和current
在这里插入图片描述
初始化一个node类型的指针new
在这里插入图片描述
new->val = current
new->next=0
因为option->back=0 , 所以options->front = new , new->prev=0
总结:当line[0] == ‘[’ 时,创建node节点,里面放入current,current里的内容type存的是[xx],又建立一个空的list。然后继续读取line,当下一行是batch=1时,switch语句匹配到default,运行read_option(line,current->option):
在这里插入图片描述
将line的等号前后进行分离存储到kvp结构体的key,val ,再将current->option和kvp放到list_insert(),再开辟新的节点,里面的val=kvp , node->next = 0(这个node的下一个节点地址初始化为0),if判断,因为current->options->back=0,所以将options里的back和front都添加这个node的地址(这个是为了下一次的新的node中,将上一个Node的地址和新的node地址进行双向链接),node->prev=0(这个节点是链表头)。继续读取下一行,subdivision=1,同样,将这句话进行健值分离,然后存入新的kvp,开辟新的节点node,将kvp存入到node->val中,这个节点的next仍不知道,所以初始化为0,但是由于current->option->back存了上一个node的地址,所以将current->option->back->next(这个也就是上个一个节点的next)存放这个节点的地址,同时将上一个节点的地址作为这个新节点的prev,这样就完成了链表的存入,值得注意的是current->option->back每次都存入新的节点,这里的current->option实际上只起到一个中介的作用,每当建立新节点,就将新节点的地址存到旧节点的下一个节点,将新节点的上一个节点存放旧节点的地址,完成这样的双向链接。而current->option->front存的是每个[xx]里配置参数的链表刚开始的节点地址,current->options->back每次都存入新节点的地址,最后为每个[xx]里配置的最后一个参数的地址,而option里的front和back存入的是第一个[xx]的地址和最后一个[xx]的地址。**

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值