更多修改darknet訓練圖像分類筆記,見:修改darknet源代碼,使其能夠直接訓練二進制圖像數據。
classifier.c文件中的train_classifier()函數聲明:
void train_classifier(char *datacfg, char *cfgfile, char *weightfile, int *gpus, int ngpus, int clear, int dont_show, int mjpeg_port, int calc_topk);
其中包括參數:
char *datacfg,數據說明文件路徑,圖像分類數據說明文件一般命名爲meta.data
char *cfgfile,網絡結構說明文件路徑,一般以*.cfg命名
char *weightfile,權重文件路徑.
int *gpus,訓練圖像分類使用gpu編號
int ngpus,訓練圖像分類使用gpu數量
int clear,
int dont_show,
int mjpeg_port,
int calc_topk
classifier.c中run_classifier()函數調用train_classifier()代碼:
char *data = argv[3];
char *cfg = argv[4];
char *weights = (argc > 5) ? argv[5] : 0;
int clear = find_arg(argc, argv, "-clear");
int dont_show = find_arg(argc, argv, "-dont_show");
int mjpeg_port = find_int_arg(argc, argv, "-mjpeg_port", -1);
int calc_topk = find_arg(argc, argv, "-topk");
train_classifier(data, cfg, weights, gpus, ngpus, clear, dont_show, mjpeg_port, calc_topk);
darknet訓練圖像分類指令:
darknet classifier train data/METAL/metal.data data/METAL/darknet19_448.cfg pretrained_weights/darknet19_448.conv.23
data:訓練圖像分類指令中第四個參數,即data/METAL/metal.data,分類數據描述文件路徑
cfg:訓練圖像分離指令第五個參數,即data/METAL/darknet19_448.cfg,網絡模型文件路徑
weights:訓練圖像分類指令第六個參數,即pretrained_weights/darknet19_448.conv.23,權重文件路徑
clear
dont_show
mjpeg_port
calc_topk
1.參數gpus,ngpus, gpu_index
ngpus是訓練使用gpu個數,
gpus是一個數組,數組中存放gpu編號
指令中通過-gpus指定gpu的編號,如果沒有使用-gpus指定,則默認使用1個gpu訓練圖像分類任務,gpus中存放gpu_index.
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 = (int*)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_index:darknet訓練圖像指令,通過-i參數來指定,如果沒有指定,調用cuda_set_device設置。
gpu_index = find_int_arg(argc, argv, "-i", 0);
if(find_arg(argc, argv, "-nogpu")) {
gpu_index = -1;
printf("\n Currently Darknet doesn't support -nogpu flag. If you want to use CPU - please compile Darknet with GPU=0 in the Makefile, or compile darknet_no_gpu.sln on Windows.\n");
exit(-1);
}
#ifndef GPU
gpu_index = -1;
#else
if(gpu_index >= 0){
cuda_set_device(gpu_index);
CHECK_CUDA(cudaSetDeviceFlags(cudaDeviceScheduleBlockingSync));
}
#endif