从零开始带你一步一步使用YOLOv3测试自己的数据
紅色石頭的個(gè)人網(wǎng)站:redstonewill.com
 知乎:https://www.zhihu.com/people/red_stone_wl
 公眾號(hào):AI有道(redstonewill)
上一篇:
從零開始帶你一步一步使用YOLOv3訓(xùn)練自己的數(shù)據(jù)
我給大家詳細(xì)介紹了如何使用 YOLOv3 模型來訓(xùn)練自己的數(shù)據(jù)集。訓(xùn)練部分完成,本文將繼續(xù)給大家詳細(xì)介紹如何使用我們訓(xùn)練好的模型來進(jìn)行圖片的批量測(cè)試。
一、修改 detector.c 文件
1. 替換 void test_detector 函數(shù)
同樣是在 darknet 目錄下,打開 ./example 目錄下的 detector.c 文件,找到 void test_detector 函數(shù),將下面的代碼替換原來的 void test_detector 函數(shù):
void test_detector(char *datacfg, char *cfgfile, char *weightfile, char *filename, float thresh, float hier_thresh, char *outfile, int fullscreen) {list *options = read_data_cfg(datacfg);char *name_list = option_find_str(options, "names", "data/names.list");char **names = get_labels(name_list);image **alphabet = load_alphabet();network *net = load_network(cfgfile, weightfile, 0);set_batch_network(net, 1);srand(2222222);double time;char buff[256];char *input = buff;float nms=.45;int i=0;while(1){if(filename){strncpy(input, filename, 256);image im = load_image_color(input,0,0);image sized = letterbox_image(im, net->w, net->h);//image sized = resize_image(im, net->w, net->h);//image sized2 = resize_max(im, net->w);//image sized = crop_image(sized2, -((net->w - sized2.w)/2), -((net->h - sized2.h)/2), net->w, net->h);//resize_network(net, sized.w, sized.h);layer l = net->layers[net->n-1];float *X = sized.data;time=what_time_is_it_now();network_predict(net, X);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);//printf("%d\n", nboxes);//if (nms) do_nms_obj(boxes, probs, l.w*l.h*l.n, l.classes, nms);if (nms) do_nms_sort(dets, nboxes, l.classes, nms);draw_detections(im, dets, nboxes, thresh, names, alphabet, l.classes);free_detections(dets, nboxes);if(outfile){save_image(im, outfile);}else{save_image(im, "predictions"); #ifdef OPENCVcvNamedWindow("predictions", CV_WINDOW_NORMAL); if(fullscreen){cvSetWindowProperty("predictions", CV_WND_PROP_FULLSCREEN, CV_WINDOW_FULLSCREEN);}show_image(im, "predictions");cvWaitKey(0);cvDestroyAllWindows(); #endif}free_image(im);free_image(sized);if (filename) break;} else {printf("Enter Image Path: ");fflush(stdout);input = fgets(input, 256, stdin);if(!input) return;strtok(input, "\n");list *plist = get_paths(input);char **paths = (char **)list_to_array(plist);printf("Start Testing!\n");int m = plist->size;if(access("/home/xny/yolov3/darknet/predictions/out",0)==-1) //"/home/xny/yolov3/darknet/predictions"修改成自己的路徑{if (mkdir("/home/xny/yolov3/darknet/predictions/out",0777)) //"/home/xny/yolov3/darknet/predictions"修改成自己的路徑{printf("creat file bag failed!!!");}}for(i = 0; i < m; ++i){char *path = paths[i];image im = load_image_color(path,0,0);image sized = letterbox_image(im, net->w, net->h);//image sized = resize_image(im, net->w, net->h);//image sized2 = resize_max(im, net->w);//image sized = crop_image(sized2, -((net->w - sized2.w)/2), -((net->h - sized2.h)/2), net->w, net->h);//resize_network(net, sized.w, sized.h);layer l = net->layers[net->n-1];float *X = sized.data;time=what_time_is_it_now();network_predict(net, X);printf("Try Very Hard:");printf("%s: Predicted in %f seconds.\n", path, 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);//printf("%d\n", nboxes);//if (nms) do_nms_obj(boxes, probs, l.w*l.h*l.n, l.classes, nms);if (nms) do_nms_sort(dets, nboxes, l.classes, nms);draw_detections(im, dets, nboxes, thresh, names, alphabet, l.classes);free_detections(dets, nboxes);if(outfile){save_image(im, outfile);}else{char b[2048];sprintf(b,"/home/xny/yolov3/darknet/predictions/out/%s",GetFilename(path));//"/home/xny/yolov3/darknet/predictions"修改成自己的路徑save_image(im, b);printf("save %s successfully!\n",GetFilename(path)); #ifdef OPENCVcvNamedWindow("predictions", CV_WINDOW_NORMAL); if(fullscreen){cvSetWindowProperty("predictions", CV_WND_PROP_FULLSCREEN, CV_WINDOW_FULLSCREEN);}show_image(im, "predictions");cvWaitKey(0);cvDestroyAllWindows(); #endif}free_image(im);free_image(sized);if (filename) break;}}} }注意上面有三處需要修改的地方,分別是:
if(access("/home/xny/yolov3/darknet/predictions/out",0)==-1) //"/home/xny/yolov3/darknet/predictions"修改成自己的路徑 if (mkdir("/home/xny/yolov3/darknet/predictions/out",0777)) //"/home/xny/yolov3/darknet/predictions"修改成自己的路徑 sprintf(b,"/home/xny/yolov3/darknet/predictions/out/%s",GetFilename(path));//"/home/xny/yolov3/darknet/predictions"修改成自己的路徑務(wù)必將其中的 /home/xny/yolov3/darknet/predictions/ 修改為自己的路徑,這個(gè)路徑可以是任意的,主要是用來存放測(cè)試結(jié)果圖片的。
2. 添加 GetFilename(char p)函數(shù)
還是打開 detector.c 文件,將下面這段代碼全部復(fù)制添加在 detctor.c 文件的開頭。
#include "darknet.h" #include <sys/stat.h> #include<stdio.h> #include<time.h> #include<sys/types.h> static int coco_ids[] = {1,2,3,4,5,6,7,8,9,10,11,13,14,15,16,17,18,19,20,21,22,23,24,25,27,28,31,32,33,34,35,36,37,38,39,40,41,42,43,44,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,67,70,72,73,74,75,76,77,78,79,80,81,82,84,85,86,87,88,89,90};char *GetFilename(char *p) { static char name[20]={""};char *q = strrchr(p,'/') + 1;strncpy(name,q,6); //注意后面的6,如果你的測(cè)試集的圖片的名字字符(不包括后綴)是其他長度,請(qǐng)改為你需要的長度(官方的默認(rèn)的長度是6)return name; }注意有一處需要修改的地方:
strncpy(name,q,6); //注意后面的6,如果你的測(cè)試集的圖片的名字字符(不包括后綴)是其他長度,請(qǐng)改為你需要的長度(官方的默認(rèn)的長度是6)其中,6 表示測(cè)試集圖片的名字字符長度,需要根據(jù)你的實(shí)際情況進(jìn)行修改。例如,圖片名為“001.jpg”,則上面的 6 就應(yīng)該改為 3。因此,為了測(cè)試方便,建議測(cè)試集所有圖片的名字字符長度最好是一致的。
3. 重新編譯
修改完 detector.c 之后,回到 darknet 目錄下,重新使用 make 命令進(jìn)行重編譯。
$ make二、創(chuàng)建測(cè)試集
其實(shí)測(cè)試集我們?cè)谟?xùn)練 yolov3 模型的時(shí)候已經(jīng)創(chuàng)建了。打開 darknet 目錄下的 2007_test.txt 文件:
這里面這號(hào)存放的是當(dāng)時(shí)我們劃分的測(cè)試集圖片的實(shí)際路徑。注意,這里可以看到每張測(cè)試集圖片名字字符長度是 17,故 strncpy(name,q,17) 這樣。
三、批量測(cè)試
在 darknet 目錄下,進(jìn)入 backup 目錄,查看你在訓(xùn)練的時(shí)候的到的最終模型的名字。
例如,最終得到的模型是“yolov3-voc_final.weights”。
在 darknet 目錄下,輸入下面的批量測(cè)試命令:
./darknet detect cfg/yolov3-voc.cfg backup/yolov3-voc_final.weights當(dāng)終端顯示“Enter Image Path: ”時(shí),輸入“2007_test.txt”的絕對(duì)路徑,例如:
$ Enter Image Path: /home/xny/yolov3/darknet/2007_test.txt之后就開始進(jìn)行批量測(cè)試了,生成的圖片在 /home/xny/yolov3/darknet/predictions/out/ 目錄下。
好了,關(guān)于 YOLOv3 詳細(xì)的測(cè)試步驟就介紹到這里。上一篇的訓(xùn)練教程加上這一篇的測(cè)試教程基本能滿足大家對(duì)自己的數(shù)據(jù)集進(jìn)行訓(xùn)練和測(cè)試的需求了,趕快試一試吧~
總結(jié)
以上是生活随笔為你收集整理的从零开始带你一步一步使用YOLOv3测试自己的数据的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: Python基本语法,python入门到
- 下一篇: 实现文件拖放的一种简洁方法
