Windows环境下yolov3+darknet批量处理图片完整教程

windows环境下,需要用到VS

1.下载Darknet和yolov3
下载Darknet

如果有git的话 git clone https://github.com/AlexeyAB/darknet
下载master版本的

首先打开darknet_no_gpu.sln

打开后修改detector.c
替换原先的detector.c文件


void test_detector(char *datacfg, char *cfgfile, char *weightfile, char *filename, float thresh,
	float hier_thresh, int dont_show, int ext_output, int save_labels, char *outfile, int letter_box, int benchmark_layers)
{
    
    
	list *options = read_data_cfg(datacfg);
	char *name_list = option_find_str(options, "names", "data/names.list");
	int names_size = 0;
	char **names = get_labels_custom(name_list, &names_size); //get_labels(name_list);

	image **alphabet = load_alphabet();
	network net = parse_network_cfg_custom(cfgfile, 1, 1); // set batch=1
	if (weightfile) {
    
    
		load_weights(&net, weightfile);
	}
	if (net.letter_box) letter_box = 1;
	net.benchmark_layers = benchmark_layers;
	fuse_conv_batchnorm(net);
	calculate_binary_weights(net);
	if (net.layers[net.n - 1].classes != names_size) {
    
    
		printf("\n Error: in the file %s number of names %d that isn't equal to classes=%d in the file %s \n",
			name_list, names_size, net.layers[net.n - 1].classes, cfgfile);
		if (net.layers[net.n - 1].classes > names_size) getchar();
	}
	srand(2222222);
	char buff[256];
	char *input = buff;
	char *json_buf = NULL;
	int json_image_id = 0;
	FILE* json_file = NULL;
	if (outfile) {
    
    
		json_file = fopen(outfile, "wb");
		if (!json_file) {
    
    
			error("fopen failed", DARKNET_LOC);
		}
		char *tmp = "[\n";
		fwrite(tmp, sizeof(char), strlen(tmp), json_file);
	}
	int j;
	float nms = .45;    // 0.4F
	while (1) {
    
    
		if (filename) {
    
    
			strncpy(input, filename, 256);
			
			list *plist = get_paths(input);
			char **paths = (char **)list_to_array(plist);
			printf("Start Testing!\n");
			int m = plist->size;
			int i;
			for (i = 0; i < m; ++i) {
    
    
				char *path = paths[i];
				image im = load_image(path, 0, 0, net.c);
				int letterbox = 0;
				image sized = resize_image(im, net.w, net.h);
				//image sized = letterbox_image(im, net.w, net.h); letterbox = 1;
				layer l = net.layers[net.n - 1];
				float *X = sized.data;
				double time = get_time_point();
				network_predict(net, X);
				printf("%s: Predicted in %lf milli-seconds.\n", input, ((double)get_time_point() - time) / 1000);
				printf("Try Very Hard:");
				printf("%s: Predicted in %lf milli-seconds.\n", path, ((double)get_time_point() - time) / 1000);
				int nboxes = 0;
				detection *dets = get_network_boxes(&net, im.w, im.h, thresh, hier_thresh, 0, 1, &nboxes, letterbox);
				if (nms) do_nms_sort(dets, nboxes, l.classes, nms);
				draw_detections_v3(im, dets, nboxes, thresh, names, alphabet, l.classes, ext_output);

				char b[2048];
				sprintf(b, "E:\\darknet-Yolo_v3\\train\\test_result\\%d", i); //这里换上自己的路径,即你希望生成图片所保存的位置
				save_image(im, b);
				printf("save %s successfully!\n", b);

				if (save_labels)
				{
    
    
					char labelpath[4096];
					replace_image_to_label(input, labelpath);

					FILE* fw = fopen(labelpath, "wb");
					int i;
					for (i = 0; i < nboxes; ++i) {
    
    
						char buff[1024];
						int class_id = -1;
						float prob = 0;
						for (j = 0; j < l.classes; ++j) {
    
    
							if (dets[i].prob[j] > thresh && dets[i].prob[j] > prob) {
    
    
								prob = dets[i].prob[j];
								class_id = j;
							}
						}
						if (class_id >= 0) {
    
    
							sprintf(buff, "%d %2.4f %2.4f %2.4f %2.4f\n", class_id, dets[i].bbox.x, dets[i].bbox.y, dets[i].bbox.w, dets[i].bbox.h);
							fwrite(buff, sizeof(char), strlen(buff), fw);
						}
					}
					fclose(fw);
				}
			}
		}
		else {
    
    
			/*printf("Enter Image Path: ");
			fflush(stdout);
			input = fgets(input, 256, stdin);
			if (!input) break;
			strtok(input, "\n");
			*/
		}
		//image im;
		//image sized = load_image_resize(input, net.w, net.h, net.c, &im);
		
		image im = load_image(input, 0, 0, net.c);
		image sized;
		
		if (letter_box) sized = letterbox_image(im, net.w, net.h);
		else sized = resize_image(im, net.w, net.h);

		layer l = net.layers[net.n - 1];
		int k;
		for (k = 0; k < net.n; ++k) {
    
    
			layer lk = net.layers[k];
			if (lk.type == YOLO || lk.type == GAUSSIAN_YOLO || lk.type == REGION) {
    
    
				l = lk;
				printf(" Detection layer: %d - type = %d \n", k, l.type);
			}
		}
		
		//box *boxes = calloc(l.w*l.h*l.n, sizeof(box));
		//float **probs = calloc(l.w*l.h*l.n, sizeof(float*));
		//for(j = 0; j < l.w*l.h*l.n; ++j) probs[j] = (float*)xcalloc(l.classes, sizeof(float));

		float *X = sized.data;

		//time= what_time_is_it_now();
		double time = get_time_point();
		network_predict(net, X);
		//network_predict_image(&net, im); letterbox = 1;
		printf("%s: Predicted in %lf milli-seconds.\n", input, ((double)get_time_point() - time) / 1000);
		//printf("%s: Predicted in %f seconds.\n", input, (what_time_is_it_now()-time));

		int nboxes = 0;
		detection *dets = get_network_boxes(&net, im.w, im.h, thresh, hier_thresh, 0, 1, &nboxes, letter_box);
		if (nms) {
    
    
			if (l.nms_kind == DEFAULT_NMS) do_nms_sort(dets, nboxes, l.classes, nms);
			else diounms_sort(dets, nboxes, l.classes, nms, l.nms_kind, l.beta_nms);
		}
		draw_detections_v3(im, dets, nboxes, thresh, names, alphabet, l.classes, ext_output);
		save_image(im, "predictions");
		if (!dont_show) {
    
    
			show_image(im, "predictions");
		}

		if (json_file) {
    
    
			if (json_buf) {
    
    
				char *tmp = ", \n";
				fwrite(tmp, sizeof(char), strlen(tmp), json_file);
			}
			++json_image_id;
			json_buf = detection_to_json(dets, nboxes, l.classes, names, json_image_id, input);

			fwrite(json_buf, sizeof(char), strlen(json_buf), json_file);
			free(json_buf);
		}

		// pseudo labeling concept - fast.ai
		

		free_detections(dets, nboxes);
		free_image(im);
		free_image(sized);

		if (!dont_show) {
    
    
			wait_until_press_key_cv();
			destroy_all_windows_cv();
		}

		if (filename) break;
	}

	if (json_file) {
    
    
		char *tmp = "\n]";
		fwrite(tmp, sizeof(char), strlen(tmp), json_file);
		fclose(json_file);
	}


	// free memory
	free_ptrs((void**)names, net.layers[net.n - 1].classes);
	free_list_contents_kvp(options);
	free_list(options);


	int i;

	const int nsize = 8;
	for (j = 0; j < nsize; ++j) {
    
    
		for (i = 32; i < 127; ++i) {
    
    
			free_image(alphabet[j][i]);
		}
		free(alphabet[j]);
	}
	free(alphabet);

	free_network(net);
}

2、然后编译生成exe文件

3、生成包括批量的图片txt,txt包括每一张代检测图片的绝对路径
最后执行下面命令来批量检测:

darknet_no_gpu.exe detector test cfg/coco.data cfg/yolov3.cfg yolov3.weights D:\Ctext\input_image_list.txt  

得到检测结果!

猜你喜欢

转载自blog.csdn.net/QQ_778132974/article/details/120966283