本楼为作者看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()函数的程序开始时(内存空间还没有被重新分配)能正常进行,但经过一段时间(内存空间还已经被重新分配)可能会出现问题。