解读darknet-YOLO V2代码(一)

来源:互联网 发布:bms读取软件 编辑:程序博客网 时间:2024/06/07 11:27

解读darknet中的YOLO V2移植到vs2015后的代码,作者是AlexeyAB,github地址是https://github.com/AlexeyAB/darknet。

命令参数:detector demo data/voc.data yolo-voc.cfg yolo-voc.weights -c 0

程序入口:darknet.c

由382行的run_detector()进入detector.c

void run_detector(int argc, char **argv){char *out_filename = find_char_arg(argc, argv, "-out_filename", 0);    char *prefix = find_char_arg(argc, argv, "-prefix", 0);    float thresh = find_float_arg(argc, argv, "-thresh", .24);    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;    }    char *gpu_list = find_char_arg(argc, argv, "-gpus", 0);    int *gpus = 0;    int gpu = 0;    int ngpus = 0;    if(gpu_list){        printf("%s\n", gpu_list);        int len = strlen(gpu_list);        ngpus = 1;        int i;        for(i = 0; i < len; ++i){            if (gpu_list[i] == ',') ++ngpus;        }        gpus = calloc(ngpus, sizeof(int));        for(i = 0; i < ngpus; ++i){            gpus[i] = atoi(gpu_list);            gpu_list = strchr(gpu_list, ',')+1;        }    } else {        gpu = gpu_index;        gpus = &gpu;        ngpus = 1;    }    int clear = find_arg(argc, argv, "-clear");    char *datacfg = argv[3];    char *cfg = argv[4];    char *weights = (argc > 5) ? argv[5] : 0;if(weights)if (weights[strlen(weights) - 1] == 0x0d) weights[strlen(weights) - 1] = 0;    char *filename = (argc > 6) ? argv[6]: 0;    if(0==strcmp(argv[2], "test")) test_detector(datacfg, cfg, weights, filename, thresh);    else if(0==strcmp(argv[2], "train")) train_detector(datacfg, cfg, weights, gpus, ngpus, clear);    else if(0==strcmp(argv[2], "valid")) validate_detector(datacfg, cfg, weights);    else if(0==strcmp(argv[2], "recall")) validate_detector_recall(datacfg, cfg, weights);    else if(0==strcmp(argv[2], "demo")) {        list *options = read_data_cfg(datacfg);        int classes = option_find_int(options, "classes", 20);        char *name_list = option_find_str(options, "names", "data/names.list");        char **names = get_labels(name_list);if(filename)if (filename[strlen(filename) - 1] == 0x0d) filename[strlen(filename) - 1] = 0;        demo(cfg, weights, thresh, cam_index, filename, names, classes, frame_skip, prefix, out_filename);    }}

find_char_arg()函数将输入的argv参数转换为程序需要的变量,程序在utils.c中实现。

char *out_filename = find_char_arg(argc, argv, "-out_filename", 0);
char *find_char_arg(int argc, char **argv, char *arg, char *def){    int i;    for(i = 0; i < argc-1; ++i){        if(!argv[i]) continue;//argv[0]代表了程序第一个参数,即:darknet.exe,argv[1]为detector,argv[2]为demo,argv[3]为data/voc.data        if(0==strcmp(argv[i], arg)){//strcmp是c、c++函数,用来比较str1,str2两个字符串,=为0,<为负数,>为正数
            def = argv[i+1];            del_arg(argc, argv, i);            del_arg(argc, argv, i);            break;        }    }    return def;}


未完待续