主要參考(幾乎是全部複製)了這位前輩的關於YOLOV3批量檢測圖片的程序
1.修改src/detector.c中的while(1)函數的內容
修改後如下
修改後要重新編譯,生成新的darknet可執行文件
while (1) {
if (filename) {
strncpy(input, filename, 256);
if (strlen(input) > 0)
//去掉最後的回車符號 0x0d
if (input[strlen(input) - 1] == 0x0d) input[strlen(input) - 1] = 0;
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];
//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");
}
}
else {
printf("Enter Image Path: ");
fflush(stdout);
input = fgets(input, 256, stdin);
if (!input) break;
strtok(input, "\n");
//開始更改
list *plist = get_paths(input);
char **pic_paths = (char **)list_to_array(plist);
//printf("%s\n",pic_paths[0]);
printf("Start Testing!\n");
int m = plist->size;
printf("the len of m is %d\n",m);
if(access("/home/longlong/Result_yolov4/result_1",0)==-1)//"/home/longlong/Result_yolov4"修改成自己的路徑
{
if(mkdir("/home/longlong/Result_yolov4/result_1",0777))//"/home/longlong/Result_yolov4"修改成自己的路徑
{
printf("creat file bag failed!!!\n");
}
}
for(int i=0;i<m;i++)
{
char *path = pic_paths[i];
input = pic_paths[i];
filename = input;
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];
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));
FILE *fp = fopen("result_info.txt","a+");
fprintf(fp,"%s\n",filename);
fclose(fp);
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);
char b[2048];
char *pic_file = basecfg(filename);
sprintf(b,"/home/longlong/Result_yolov4/result_1/%s",pic_file);//"/home/longlong/Result_yolov4"修改成自己的路徑
save_image(im, b);
if (!dont_show) {
show_image(im, b);
}
}
//結束更改,其餘部分根據個人理解自己修改也可以
}
2.測試指令
如果想直接檢測單圖
./darknet detector test cfg/voc.data cfg/yolo-obj.cfg yolov4.weights data/dog.jpg
如果檢測目標文件夾下的圖片
(1)把待檢測圖片地址寫入text.txt中
可以參考這個腳本
# -*- coding:utf-8 -*-
import sys # sys.path.append('E:\\Anaconda\\libs')
import os #os:操作系統相關的信息模塊
import random #導入隨機函數
#存放原始圖片地址
data_base_dir = "E:\\dyg\\yolov4\\test_1213Data"
file_list = [] #建立列表,用於保存圖片信息
#讀取圖片文件,並將圖片地址、圖片名和標籤寫到txt文件中
write_file_name = 'E:\\dyg\\yolov4\\test_1213Data.txt'
write_file = open(write_file_name, "w") #以只寫方式打開write_file_name文件
for file in os.listdir(data_base_dir): #file爲current_dir當前目錄下圖片名
if file.endswith(".bmp"): #如果file以jpg結尾
write_name = file #圖片路徑 + 圖片名 + 標籤
file_list.append('/home/longlong/1213Train/test_1213Data/'+write_name) #將write_name添加到file_list列表最後
sorted(file_list) #將列表中所有元素隨機排列
number_of_lines = len(file_list) #列表中元素個數
#將圖片信息寫入txt文件中,逐行寫入
for current_line in range(number_of_lines):
write_file.write(file_list[current_line] + '\n')
#關閉文件
write_file.close()
(2)檢測指令
先輸入./darknet detector test cfg/voc.data cfg/yolo-obj.cfg yolov4.weights
再輸入 path of [test.txt]
就會在代碼中修改的地址中的result_1文件夾中看到批量檢測結果。
調用GPU檢測等操作,後續更新,先簡單記錄一下