1. 程式人生 > >darknet原始碼剖析(二)

darknet原始碼剖析(二)

進入run_detector函式:

char *prefix = find_char_arg(argc, argv, "-prefix", 0);

其中find_char_arg位於src/utils.c檔案中,

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;
        if(0==strcmp(argv[i], arg)){
            def = argv[i+1];
            del_arg(argc, argv, i);
            del_arg(argc, argv, i);
            break;
        }
    }
    return def;
}

-prefix引數作用不明,不過通過分析上述程式碼的功能可以瞭解,若設定-prefix引數,則使用設定值,否則使用預設值,在當前程式碼中是0。兩次del_arg函式的作用是刪除-prefix與其對應的值。

float thresh = find_float_arg(argc, argv, "-thresh", .5);
float hier_thresh = find_float_arg(argc, argv, "-hier", .5);
int cam_index = find_int_arg(argc, argv, "-c", 0);
int frame_skip = find_int_arg(argc, argv, "-s", 0);
int avg = find_int_arg(argc, argv, "-avg", 3);
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);
char *outfile = find_char_arg(argc, argv, "-out", 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;
    }

上述程式碼用於設定訓練GPU,由於沒有設定gpu_list,因此進入else分支,gpu_index在cuda.c檔案中,

int gpu_index = 0;

因此gpu為0,ngpus為1。

    int clear = find_arg(argc, argv, "-clear");
    int fullscreen = find_arg(argc, argv, "-fullscreen");
    int width = find_int_arg(argc, argv, "-w", 0);
    int height = find_int_arg(argc, argv, "-h", 0);
    int fps = find_int_arg(argc, argv, "-fps", 0);

上述引數沒有設定,使用預設值,均為0。

    char *datacfg = argv[3];
    char *cfg = argv[4];
    char *weights = (argc > 5) ? argv[5] : 0;
    char *filename = (argc > 6) ? argv[6]: 0;

上述引數分別為cfg/data.voc,用於指定資料集儲存地址,模型檔案儲存地址等資訊。cfg/yolov3-voc.cfg,用於指定訓練模型配置,darknet53.conv.74用於指定預訓練模型。

else if(0==strcmp(argv[2], "train")) train_detector(datacfg, cfg, weights, gpus, ngpus, clear);

根據引數“train”,進入train_detector函式,引數分別為cfg/data.voc,cfg/yolov3-voc.cfg,以上檔案位於cfg資料夾中,darknet53.conv.74從官網上下載,gpus=0,ngpus=0,clear=0。