yolo源码(二)basecfg函数

本楼为作者看yolo源码时做的一些笔记,顺道简单温习了c的一些小技巧,如果表达不对,或者理解错误的地方,欢迎指正.

按我们现在进入了train_yolo()函数中,开始一步一步解析,对于不需要细节讲解的可以直接跳转到

https://blog.csdn.net/hjxu2016/article/details/79543583

我们先看train_yolo的前几行.着重细节讲解一下basecfg函数,先看train_yolo

void train_yolo(char *cfgfile, char *weightfile)
{
    char *train_images = "/home/hjxu/Yolo/hjxu_train_code/2007_train.txt";   //指向刚刚生成的train.txt文件
    char *backup_directory = "/home/hjxu/Yolo/model_save/";  //训练生成的模型文件会保存在这里

    /*srand函数是随机数发生器的初始化函数。
    srand和rand()配合使用产生伪随机数序列。rand函数在产生随机数前,需要系统提供的生成伪随机数序列的
    种子,rand根据这个种子的值产生一系列随机数。如果系统提供的种子没有变化,每次调用rand函数生成的伪
    随机数序列都是一样的。*/
    srand(time(0));  
      /*第三个参数是:`cfg/yolo.train.cfg`,`basecfg()`这个函数把`cfg/yolo.train.cfg`变成了
    `yolo0train.cfg`,然后用base指针指向`yolo0train.cfg`*/
    char *base = basecfg(cfgfile);
    //打印"yolo"字样
    printf("%s\n", base);

从上面可以看到basecfg函数 是将cfgfile里面字符串类似于提取关键字,主要是先找/后面的,再找.后面的东西

详情记录一下basecfg里面的函数,如下:

#include<stdio.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <assert.h>
#include <unistd.h>
#include <float.h>

char *copy_string(char *s)
{
    char *copy = malloc(strlen(s)+1);//malloc 的意思是内存分配,这个就是给copy这个给定分类一个s大小的内存
    strncpy(copy, s, strlen(s)+1);//将s字符串中前strlen(s)+1复制到copy中
    return copy;
}

char *basecfg(char *cfgfile)
{
    char *c = cfgfile; //c指的是cfgfile这个字符串
    char *next;
    while((next = strchr(c, '/')))//strchr函数,返回第一次出现'/'字符的位置
    {
        c = next+1;//c又给到下一个,整个循环的目的是消除所有'/'前面的字符,在这里我有个疑问,为啥不直接调用strrchr,返回最后一次出现的位置
    }
    c = copy_string(c);//最近正在看操作系统,又复制一下,不是很清楚,应该是防止修改内存吧,有清楚的同学希望指导一下
    next = strchr(c, '.');//发现第一次出现. 的位置,返回这个指针
    if (next) *next = 0;
    return c;
}

void train_yolo(char *cfgfile)
{
    char *train_images = "/data/voc/train.txt";   //指向刚刚生成的train.txt文件
    char *backup_directory = "/home/pjreddie/backup/";  //训练生成的模型文件会保存在这里

    /*srand函数是随机数发生器的初始化函数。
    srand和rand()配合使用产生伪随机数序列。rand函数在产生随机数前,需要系统提供的生成伪随机数序列的
    种子,rand根据这个种子的值产生一系列随机数。如果系统提供的种子没有变化,每次调用rand函数生成的伪
    随机数序列都是一样的。*/
    srand(time(0));  
      /*第三个参数是:`cfg/yolo.train.cfg`,`basecfg()`这个函数把`cfg/yolo.train.cfg`变成了
    `yolo0train.cfg`,然后用base指针指向`yolo0train.cfg`*/
    char *base = basecfg(cfgfile);//跳到basecfg函数,这里base返回的是yolo
    printf("%s\n", base);
}

int main(int argc, char **argv)
{
    char *cfgfile = argv[1];//终端的第一个字符串
    train_yolo(cfgfile);//模仿yolo中跳转

}

百度看一看https://blog.csdn.net/hevvy/article/details/1880371

https://zhidao.baidu.com/question/40468782.html

函数malloc()和calloc()都可以用来动态分配内存空间,但两者稍有区别。malloc()函数有一个参数,即要分配的内存空间的大小:

void *malloc(size_t size);
calloc()函数有两个参数,分别为元素的数目和每个元素的大小,这两个参数的乘积就是要分配的内存空间的大小。
void *calloc(size_t numElements,size_t sizeOfElement);
如果调用成功,函数malloc()和函数calloc()都将返回所分配的内存空间的首地址。函数malloc()和函数calloc()的主要区别是前
者不能初始化所分配的内存空间,而后者能。如果由malloc()函数分配的内存空间原来没有被使用过,则其中的每一位可能都是0;反之,如果这部分内存曾经被分配过,则其中可能遗留有各种各样的数据。也就是说,使用malloc()函数的程序开始时(内存空间还没有被重新分配)能正常进行,但经过一段时间(内存空间还已经被重新分配)可能会出现问题。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值