上一篇:

从零开始带你一步一步使用YOLOv3训练自己的数据

我给大家详细介绍了如何使用 YOLOv3 模型来训练自己的数据集。训练部分完成,本文将继续给大家详细介绍如何使用我们训练好的模型来进行图片的批量测试。

一、修改 detector.c 文件

1. 替换 void test_detector 函数 

同样是在 darknet 目录下,打开 ./example 目录下的 detector.c 文件,找到 void test_detector 函数,将下面的代码替换原来的 void test_detector 函数:

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"修改成自己的路径

务必将其中的 /home/xny/yolov3/darknet/predictions/ 修改为自己的路径,这个路径可以是任意的,主要是用来存放测试结果图片的。

2. 添加 GetFilename(char p)函数 

还是打开 detector.c 文件,将下面这段代码全部复制添加在 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,如果你的测试集的图片的名字字符(不包括后缀)是其他长度,请改为你需要的长度(官方的默认的长度是6)return name;
}

注意有一处需要修改的地方:

 strncpy(name,q,6);    //注意后面的6,如果你的测试集的图片的名字字符(不包括后缀)是其他长度,请改为你需要的长度(官方的默认的长度是6)

其中,6 表示测试集图片的名字字符长度,需要根据你的实际情况进行修改。例如,图片名为“001.jpg”,则上面的 6 就应该改为 3。因此,为了测试方便,建议测试集所有图片的名字字符长度最好是一致的。

3. 重新编译 

修改完 detector.c 之后,回到 darknet 目录下,重新使用 make 命令进行重编译。

$ make

二、创建测试集

其实测试集我们在训练 yolov3 模型的时候已经创建了。打开 darknet 目录下的 2007_test.txt 文件:

这里面这号存放的是当时我们划分的测试集图片的实际路径。注意,这里可以看到每张测试集图片名字字符长度是 17,故 strncpy(name,q,17) 这样。

三、批量测试

在 darknet 目录下,进入 backup 目录,查看你在训练的时候的到的最终模型的名字。

例如,最终得到的模型是“yolov3-voc_final.weights”。

在 darknet 目录下,输入下面的批量测试命令:

./darknet detect cfg/yolov3-voc.cfg backup/yolov3-voc_final.weights

当终端显示“Enter Image Path: ”时,输入“2007_test.txt”的绝对路径,例如:

$ Enter Image Path: /home/xny/yolov3/darknet/2007_test.txt

之后就开始进行批量测试了,生成的图片在 /home/xny/yolov3/darknet/predictions/out/ 目录下。

好了,关于 YOLOv3 详细的测试步骤就介绍到这里。上一篇的训练教程加上这一篇的测试教程基本能满足大家对自己的数据集进行训练和测试的需求了,赶快试一试吧~


推荐阅读

(点击标题可跳转阅读)

干货 | 公众号历史文章精选

我的深度学习入门路线

我的机器学习入门路线图

重磅

AI有道年度技术文章电子版PDF来啦!

扫描下方二维码,添加 AI有道小助手微信,可申请入群,并获得2020完整技术文章合集PDF(一定要备注:入群 + 地点 + 学校/公司。例如:入群+上海+复旦

长按扫码,申请入群

(添加人数较多,请耐心等待)

感谢你的分享,点赞,在看三  

从零开始带你一步一步使用 YOLOv3 测试自己的数据相关推荐

  1. 从零开始带你一步一步使用YOLOv3测试自己的数据

    红色石头的个人网站:redstonewill.com 知乎:https://www.zhihu.com/people/red_stone_wl 公众号:AI有道(redstonewill) 上一篇: ...

  2. 一步一步教你如何将 yolov3/yolov4 转为 caffe 模型

    实际工作中,目标检测 yolov3 或者 yolov4 模型移植到 AI 芯片中,经常需要将其先转换为 caffe1.x 模型,大家可能或多或少也有这方面的需求.例如华为海思 NNIE 只支持caff ...

  3. 从零开始带你一步一步使用YOLOv3训练自己的数据

    红色石头的个人网站:redstonewill.com 知乎:https://www.zhihu.com/people/red_stone_wl 公众号:AI有道(redstonewill) YOLOv ...

  4. 手挽手带你学React:四档(上)一步一步学会react-redux (自己写个Redux)

    手挽手带你学React入门四档,用人话教你react-redux,理解redux架构,以及运用在react中.学完这一章,你就可以开始自己的react项目了. 之前在思否看到过某个大神的redux搭建 ...

  5. 新手linux安装vasp_一步一步教你如何在linux 下安装VASP 【真的是从零开始】

    首先我是一个linux 小白,只接触过linux 的基本用法, 听说VASP 编译很复杂,故想学习之. 如果大神见了,请直接飘过,非常期待和大家互动交流. 下面就直接进入主题. 如何在linux 下面 ...

  6. a4988 脉宽要求_Allegro MicroSystems 公司发布全新带过流保护的 DMOS 微步电动机驱动器 A4988...

    Allegro MicroSystems 公司发布全新带过流保护的 DMOS 微步电动机驱动器 A4988 热效率高.封装小巧精致 马萨诸塞州伍斯特-2010 年 4 月 29 日 - Allegro ...

  7. 如何从零开始一步一步学画漫画

    如何从零开始一步一步学画漫画?很多人都喜欢看动漫,也想画出好看的动漫人物,尤其是许多小朋友,但是对于大多数人来说都不是很会画画,更不要说漫画人物了,那要怎么画好动漫人物呢?对于画动漫人物来说,脸部很重 ...

  8. 一步一步,手把手带你用最简单的方法,在linux上安装anaconda

    1 前言 本文将会一步一步用最简单的方法,手把手带你在linux上安装anaconda,不改文件,不需要管理员权限,普通用户也可以操作! 当我们想利用服务器进行深度学习/数据分析时,我们通常需要使用P ...

  9. 一步一步教你从零开始写C语言链表(超详细)

    STM32 HAL开发完全指南 写文章 一步一步教你从零开始写C语言链表(超详细) 杨源鑫 嵌入式系统工程师.物联网创业合伙人,业务经理兼产品经理 285 人赞同了该文章 为什么要学习链表? 链表主要 ...

最新文章

  1. RabbitMQ消息confirm确认机制
  2. 2021年 面经面试题
  3. Solr集群搭建,zookeeper集群搭建,Solr分片管理,Solr集群下的DataImport,分词配置。
  4. 习题6-5 使用函数验证哥德巴赫猜想 (20 分)
  5. centos7 mysql数据库安装和配置
  6. 简述 JavaScript 作用域与词法分析
  7. CVPR 2019 神奇的超分辨率算法DPSR:应对图像模糊降质
  8. Ionic Cordova 环境配置window
  9. MySQL新建用户,授权,删去用户,修改密码操作
  10. 时间序列预测入门必读的4篇论文
  11. Kylin 与 Spark SQL相比,有哪些差异和优势?
  12. 思岚RPLIDAR A2激光雷达开箱
  13. ddos攻击怎么防御,一文了解如何防御DDoS攻击
  14. SAP GUI 770 百度网盘下载
  15. uni-app如何使用HBuildX云打包发布app
  16. 刚打印完色3D模型不能完成取下来
  17. nuc980 rt-thread spinand 程序烧录及Flash分区说明
  18. 炎炎夏日打造一个属于自己的“便携小空调”吧
  19. 英语美文-What will matter?
  20. 2018年第二届河北省大学生程序设计竞赛

热门文章

  1. 从Powershell 入侵脚本学到的如何执行后台runspace~
  2. JS获取浏览器高度 并赋值给类
  3. vs2013 编译 notepad++ 源代码 2014-7-23
  4. Cocos2d-x 在缓存创建图片
  5. Office Communication Server(OCS)2007 Communicator Web Access(CWA)的部署
  6. vc--少林72般绝技
  7. hdu 5419(数学期望)
  8. hdu 4907(并查集)
  9. poj 1948(搜索+剪枝)
  10. 《Head First Python》第四章--持久存储