yolo源码(一)run_yolo中的函数介绍

发现网上关于yolo源码,很少有关于小函数介绍的.长时间用python写脚本,c已经忘记脑后.本楼为作者看yolo源码时做的一些笔记,顺道简单温习了c的一些小技巧,如果表达不对,或者理解错误的地方,欢迎指正.

首先来看一下run_yolo的代码

void run_yolo(int argc, char **argv)
{
    char *prefix = find_char_arg(argc, argv, "-prefix", 0); //寻找是否有参数prefix
    float thresh = find_float_arg(argc, argv, "-thresh", .2); //寻找是否有thresh参数,thresh为输出的阈值
    int cam_index = find_int_arg(argc, argv, "-c", 0);
    int frame_skip = find_int_arg(argc, argv, "-s", 0);
    if(argc < 4){
        fprintf(stderr, "usage: %s %s [train/test/valid] [cfg] [weights (optional)]\n", argv[0], argv[1]);
        return;
    }

    int avg = find_int_arg(argc, argv, "-avg", 1);
    char *cfg = argv[3]; //第三个参数是cfg
    char *weights = (argc > 4) ? argv[4] : 0;//是否有第四个参数,如果有返回第四个参数,如果没有返回0
    char *filename = (argc > 5) ? argv[5]: 0;//是否有第五个参数,如果有返回第五个参数.如果没有返回0
    if(0==strcmp(argv[2], "test")) test_yolo(cfg, weights, filename, thresh);
    else if(0==strcmp(argv[2], "train")) train_yolo(cfg, weights);//第二个参数是train,所以跳转到train_yolo函数
    else if(0==strcmp(argv[2], "valid")) validate_yolo(cfg, weights);
    else if(0==strcmp(argv[2], "recall")) validate_yolo_recall(cfg, weights);
    else if(0==strcmp(argv[2], "demo")) demo(cfg, weights, thresh, cam_index, filename, voc_names, 20, frame_skip, prefix, avg, .5, 0,0,0,0);
}
void run_yolo(int argc, char **argv)

有两个参数,第一个参数:int argc是指命令行输入参数的个数;第二个char **argv则是命令行参数.在c++中,从命令行输入参数可以char *argv[],yolo里面全是用c写的,所以用**argv 指针来表示一串字符.

argv[0]指向程序的全路径名

argv[1]指向命令行执行程序的第一个字符串

argv[2]指向第二个字符串

值得强调的是 argc 指的是输入参数的个数,但是如果没有参数,还是返回1;如果有一个字符串,则返回2

以下面这个函数为例:

char *prefix = find_char_arg(argc, argv, "-prefix", 0); //寻找是否有参数prefix

这个函数,四个参数,argc指参数个数,argv指参数,第三个是指定的字符串,第四个是指返回的值,如果没有返回0的意思

void del_arg(int argc, char **argv, int index)//我们来看一下这个函数,参数应该都知道,index指的是关键词的位置,前面都查过了,当然不需要再看了
{
    int i;
    for(i = index; i < argc-1; ++i) argv[i] = argv[i+1];//i从关键字符位置开始,后面一次把前面的覆盖,第i个关键词自然就被删除了
    argv[i] = 0;//最后一个和倒数第二个是一样的,给个0就行了
 }



char *find_char_arg(int argc, char **argv, char *arg, char *def)
{
    int i;
    for(i = 0; i < argc-1; ++i){//argc大家应该知道,参数个数的意思,这里从第0个参数开始,查询每一个字符串
        if(!argv[i]) continue; //如果argv[i]为空,直接下一步循环
        if(0==strcmp(argv[i], arg)){ //如果argv[i] 和arg 也就是第三个参数相等 strcmp函数待会简单介绍一下
            def = argv[i+1]; //def直接赋值下一个字符串 比如prefix ** 发现prefix了,def赋值prefix后面的参数
            del_arg(argc, argv, i); //这个函数的意思把prefix后面的字符串向前移动一个,也就是把prefix删除了
            del_arg(argc, argv, i); //出现两个意思,肯定也要把prefix后面的参数给删除啊,不然参数几百个,每次还得遍历几百次呢,为后面查询其他关键字节约时间
            break; //只要发现一次相等,就跳出循环
        }
    }
    return def; //返回def,比如train后面的参数
}

简单介绍一下strcmp这个函数,主要用来比较两个字符串是否相等

strcmp(char *str, char *str2)

如果str1和str2相同,返回0

如果不同,在不同的字符处,如果str1的字符大于str2,返回1;

否则返回-1.


  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值