更多修改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