YOLOV4嚐鮮----C版YOLOV4批量檢測圖片

主要參考(幾乎是全部複製)了這位前輩的關於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檢測等操作,後續更新,先簡單記錄一下

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章