从零开始带你一步一步使用 YOLOv3 测试自己的数据
上一篇:?
從零開始帶你一步一步使用YOLOv3訓(xùn)練自己的數(shù)據(jù)
我給大家詳細(xì)介紹了如何使用 YOLOv3 模型來訓(xùn)練自己的數(shù)據(jù)集。訓(xùn)練部分完成,本文將繼續(xù)給大家詳細(xì)介紹如何使用我們訓(xùn)練好的模型來進(jìn)行圖片的批量測試。
一、修改 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/ 修改為自己的路徑,這個路徑可以是任意的,主要是用來存放測試結(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,如果你的測試集的圖片的名字字符(不包括后綴)是其他長度,請改為你需要的長度(官方的默認(rèn)的長度是6)return name; }注意有一處需要修改的地方:
?strncpy(name,q,6);????//注意后面的6,如果你的測試集的圖片的名字字符(不包括后綴)是其他長度,請改為你需要的長度(官方的默認(rèn)的長度是6)其中,6 表示測試集圖片的名字字符長度,需要根據(jù)你的實(shí)際情況進(jìn)行修改。例如,圖片名為“001.jpg”,則上面的 6 就應(yīng)該改為 3。因此,為了測試方便,建議測試集所有圖片的名字字符長度最好是一致的。?
3. 重新編譯?
修改完 detector.c 之后,回到 darknet 目錄下,重新使用 make 命令進(jìn)行重編譯。
$?make二、創(chuàng)建測試集?
其實(shí)測試集我們在訓(xùn)練 yolov3 模型的時候已經(jīng)創(chuàng)建了。打開 darknet 目錄下的 2007_test.txt 文件:
這里面這號存放的是當(dāng)時我們劃分的測試集圖片的實(shí)際路徑。注意,這里可以看到每張測試集圖片名字字符長度是 17,故 strncpy(name,q,17) 這樣。
三、批量測試?
在 darknet 目錄下,進(jìn)入 backup 目錄,查看你在訓(xùn)練的時候的到的最終模型的名字。
例如,最終得到的模型是“yolov3-voc_final.weights”。?
在 darknet 目錄下,輸入下面的批量測試命令:
./darknet?detect?cfg/yolov3-voc.cfg?backup/yolov3-voc_final.weights當(dāng)終端顯示“Enter Image Path: ”時,輸入“2007_test.txt”的絕對路徑,例如:
$?Enter?Image?Path:?/home/xny/yolov3/darknet/2007_test.txt之后就開始進(jìn)行批量測試了,生成的圖片在 /home/xny/yolov3/darknet/predictions/out/ 目錄下。?
好了,關(guān)于 YOLOv3 詳細(xì)的測試步驟就介紹到這里。上一篇的訓(xùn)練教程加上這一篇的測試教程基本能滿足大家對自己的數(shù)據(jù)集進(jìn)行訓(xùn)練和測試的需求了,趕快試一試吧~?
推薦閱讀
(點(diǎn)擊標(biāo)題可跳轉(zhuǎn)閱讀)
干貨 | 公眾號歷史文章精選
我的深度學(xué)習(xí)入門路線
我的機(jī)器學(xué)習(xí)入門路線圖
重磅!
AI有道年度技術(shù)文章電子版PDF來啦!
掃描下方二維碼,添加?AI有道小助手微信,可申請入群,并獲得2020完整技術(shù)文章合集PDF(一定要備注:入群?+ 地點(diǎn) + 學(xué)校/公司。例如:入群+上海+復(fù)旦。?
長按掃碼,申請入群
(添加人數(shù)較多,請耐心等待)
感謝你的分享,點(diǎn)贊,在看三連??
總結(jié)
以上是生活随笔為你收集整理的从零开始带你一步一步使用 YOLOv3 测试自己的数据的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 实现文件拖放的一种简洁方法
- 下一篇: 我,35岁,程序员,华为工作10年,上个