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

红色石头Will 红色石头Will     2022-12-14     466

关键词:

上一篇: 

从零开始带你一步一步使用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 OPENCV
                cvNamedWindow("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 OPENCV
            cvNamedWindow("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测试自己的数据

上一篇: 从零开始带你一步一步使用YOLOv3训练自己的数据我给大家详细介绍了如何使用YOLOv3模型来训练自己的数据集。训练部分完成,本文将继续给大家详细介绍如何使用我们训练好的模型来进行图片的批量测试。一、... 查看详情

从零开始带你一步一步使用yolov3训练自己的数据(代码片段)

红色石头的个人网站:redstonewill.com知乎:https://www.zhihu.com/people/red_stone_wl公众号:AI有道(redstonewill)YOLOv3是比较常见和常用的深度学习目标检测(ObjectDection)算法。今天给大家介绍一下如何一步一步... 查看详情

从零开始带你一步一步使用yolov3训练自己的数据(代码片段)

红色石头的个人网站:redstonewill.com知乎:https://www.zhihu.com/people/red_stone_wl公众号:AI有道(redstonewill)YOLOv3是比较常见和常用的深度学习目标检测(ObjectDection)算法。今天给大家介绍一下如何一步一步... 查看详情

windows系统带你一步一步无脑使用babel

 不废话直接写看步骤:1、在F盘新建一个文件夹叫babel2、npminit初始化项目3、全局安装npminstallbabelbabel-cli-g4、项目安装npminstallbabel-cli--save-dev项目目录里会多一个node_modules包5、新建一个es6.js文件随便写一段es66、输入指令babeles... 查看详情

带你一步一步的解析arouter源码(代码片段)

ARouter是阿里推出的一款页面路由框架。由于项目中采用了组件化架构进行开发,通过ARouter实现了页面的跳转,之前看它的源码时忘了写笔记,因此今天来重新对它的源码进行一次分析。(顺手留下GitHub链接,需要获取相关面试... 查看详情

一个老王开枪案例带你一步一步领略程序开发的魅力(代码片段)

一、前言  我身边的很多同学都认为学计算机专业的人,代码写的好很正常,认为自己不是学计算机专业的,不会写代码很正常,或者这么说,觉得会写代码是一种天赋。其实不然,我们现在必须要清楚当代社会的局势,当代... 查看详情

公子奇带你一步一步了解java8中lambda表达式

在上一篇《公子奇带你一步一步了解Java8中行为参数化》中,我们演示到最后将匿名实现简写为1(Policepolice)->"浙江".equals(police.getPoliceNativePlace());这是一个带有箭头的函数,这种写法在Java8中即为Lambda表达式。那么我们就来好好... 查看详情

史上最细基于redis实现的分布式session解决单点登录问题,入门导师带你一步一步实现...(代码片段)

点击上方蓝色“终端研发部”,选择“设为星标”学最好的别人,做最好的我们 前戏最近正好在做一个电商项目,跟大家分享一下使用Redis实现分布式session完成单点登录,下一篇与大家分享一下使用Redis实现分布... 查看详情

linux驱动实践:带你一步一步编译内核驱动程序(代码片段)

作者:道哥,10+年嵌入式开发老兵,专注于:C/C++、嵌入式、Linux。文章目录学习的困惑实践环境编译进内核创建驱动程序目录创建源文件创建Kconfig文件创建Makefile文件编译编译为驱动模块编译所有的驱动... 查看详情

linux驱动实践:带你一步一步编译内核驱动程序(代码片段)

作者:道哥,10+年嵌入式开发老兵,专注于:C/C++、嵌入式、Linux。文章目录学习的困惑实践环境编译进内核创建驱动程序目录创建源文件创建Kconfig文件创建Makefile文件编译编译为驱动模块编译所有的驱动... 查看详情

一步一步带你分析requirejs

...我这篇分析的同学应该都下载下来了,好了,话不多说,开始: 代码的开头就出现3个全局变量: requirejs,require,definevarrequirejs,require,define;(function(global,setTimeout){balababla......})(this,(typeofsetTimeout===‘und 查看详情

带你一步一步理解c语言指针!(代码片段)

一直觉得C语言较其他语言最伟大的地方就是C语言中的指针,有些人认为指针很简单,而有些人认为指针很难,当然这里的对简单和难并不是等价于对指针的理解程度。为此作者在这里对C语言中的指针进行全面的总结... 查看详情

(第一篇)一步一步带你了解linqtoobject(代码片段)

...习匿名函数,我们必须学会委托,这是本文的宗旨。下面开始第一步。在第一步开始之前,我们做点准备工作,建立一个学生类和一个班级类,类结构如下publicclassStudentpublicintIdget;set;publicintCla 查看详情

如何使用我自己选择的枢轴快速排序这些数据(一步一步)

】如何使用我自己选择的枢轴快速排序这些数据(一步一步)【英文标题】:Howtoquicksortthisdata(stepbystep)withmyownchosenpivot【发布时间】:2013-06-2414:11:47【问题描述】:我有数据(3是支点):281374我左右移动两个指针首先我有2和4,... 查看详情

vue双向绑定原理,教你一步一步实现双向绑定(代码片段)

当今前端天下以Angular、React、vue三足鼎立的局面,你不选择一个阵营基本上无法立足于前端,甚至是两个或者三个阵营都要选择,大势所趋。所以我们要时刻保持好奇心,拥抱变化,只有在不断的变化中你才能利于不败之地,保... 查看详情

一步一步教你在docker容器下使用mmdetection训练自己的数据集

这里不再介绍mmdetection的安装和配置,使用mmdetection较简单的方法是使用已安装mmdetection的docker容器。这样直接省去了安装mmdetection的过程,让重心放在模型训练上!如果你对docker和mmdetection还不是很熟悉,请自行搜索一下,本文... 查看详情

vs2010单元测试入门实践教程

...方法是否正确,可你又从来没真正实践过,那么本教程将带你一步一步使用VS2010集成的UnitTest进行断言(Assert)式验证数据的正确性,及代码覆盖率的查看。 关键词:UnitTest、单元测试、代码覆盖率、Assert、Twif 查看详情

数据中心从何而来?华为云学院带你一探究竟!

数据中心的定义和概念都是随着时代的变迁而不断变化的,那么数据中心是从何而来如何发展的?我们又是如何一步一步的走入数据时代的呢?大家如果去查一下计算机发展的历史,可能会惊奇的发现,我们身边随处可见的计算... 查看详情