darknet原始碼剖析(二)
阿新 • • 發佈:2018-12-18
進入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。