精华内容
下载资源
问答
  • 进入工程目录,darknet\build\darknet 找到darknet.sln,vs2017打开 此处改为 修改属性页 cuda位置 opencv配置 包含目录 用属性下的VC++目录,右边会有包含目录和库目录,点击包含目录,添加以下三条路径,其实...

    项目下载

    https://github.com/AlexeyAB/darknet
    在这里插入图片描述

    进入工程目录,darknet\build\darknet

    在这里插入图片描述

    找到darknet.sln,vs2017打开

    在这里插入图片描述
    此处改为
    在这里插入图片描述

    修改属性页

    在这里插入图片描述

    cuda位置

    在这里插入图片描述

    opencv配置

    包含目录

    在这里插入图片描述

    用属性下的VC++目录,右边会有包含目录和库目录,点击包含目录,添加以下三条路径,其实这些都是刚才OpenCV相关解压文件所在的目录
    opencv\build\include
    opencv\build\include\opencv2\core
    opencv\build\include\opencv2

    库目录

    在这里插入图片描述
    opencv\build\x64\vc14\lib

    链接器

    在这里插入图片描述
    选择输入,会在右侧看到附加依赖项,opencv_world452d.lib

    修改文件

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    CUDA 10.0.props CUDA 10.0.targets

    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    四个文件全部复制到第二个目录

    Makefile

    在这里插入图片描述
    在这里插入图片描述

    生成解决方案

    在这里插入图片描述

    darknet\src\network_kernels.cu"”已退出,返回代码为 1

    在这里插入图片描述
    在这里插入图片描述
    打开network_kernels.cu,使用快捷键ctrl+F查找关键词cudaStreamCaptureModeGlobal,只有这一处,删除保存即可

    no such file or directory

    在这里插入图片描述
    找到缺失文件位置,将路径添加进去

    opencv2/opencv.hpp": no such file or directory

    在这里插入图片描述

    “cudnn.h”: No such file or directory

    在这里插入图片描述

    msb372返回代码为1

    在这里插入图片描述CUDA10.0 , compute_75,sm_75 ,根据实际情况型号修改。

    最后结果

    在这里插入图片描述

    展开全文
  • 要求 Linux or Windows CUDA >= 10.0 Opencv >=2.4 cndnn >=7.0 for CUDA GPU with CC>...Linux: GCC or Clang ...进入darknet的根目录下 MAKE 首先修改Makefile, 如果你要用到GPU,那么第一行设置为

    要求

    • Linux or Windows
    • CUDA >= 10.0
    • Opencv >=2.4
    • cndnn >=7.0 for CUDA
    • GPU with CC>=3.0
    • Linux: GCC or Clang

    下载

    下载代码的压缩包或者执行如下指令:

    • git clone https://github.com/AlexeyAB/darknet.git
    • cd darknet

    进入darknet的根目录下

    MAKE

    首先修改Makefile, 如果你要用到GPU,那么第一行设置为

    • GPU=1

    如果要利用cudnn加速,那么第二行设置为

    • CUDNN=1

    如果要和opencv一起编译,那么第四行设置为

    • OPENCV=1

    之后输入指令

    • make

    在这个过程中有可能会碰到错误:

    YOLOv3darknet:/make:[obj/convolutional_kernels.o] Error 127

    这时候是因为nvcc的环境变量设置有问题,我的方法是修改Makefile,修改nvcc那一行为:

    • NVCC=/usr/local/cuda/bin/nvcc

    即可,之后再输入make,等待一段时间后就可以顺利编译完成。

    训练

    AB的数据集的格式和darknet yolov3的官网的要求不太一样,但是对.txt文件的要求是一样的。

    darknet yolov3 官网

    我们在对数据完成标注之后,把它放到
    < path >/images
    下,每一张图片为 image_id.jpg的格式。而标注则放在同目录的文件夹下
    < path >/labels
    下,格式为,image_id.txt。每一个image_id 都要与图片的一个要对应。

    image_id.txt的格式为

    < object-class> < x> < y> < width> < height>
    其中oject-class 为图片类别,为整数,范围为0~class_num-1。
    x,y代表的是物体中心点的位置,w代表物体的宽,h代表物体的高

    !!记住这里所有的x,y,w,h都是图片的相对位置和长度!!

    除此之外我们还需要准备一个.txt文件用来存放数据的信息。 我们假设为 train.txt,这个文件里面存放着所有的图片的绝对位置。所以我们最后的数据格式如下

    –root

    ----images

    ------1.jpg

    ------2.jpg

    ------3.jpg

    ----labels

    ------1.txt

    ------2.txt

    ------3.txt

    train.txt的文件格式为:

    /root/images/1.jpg
    /root/images/2.jpg
    /root/images/3.jpg

    这样我们的数据就准备完毕了

    AB darknet

    AB的格式要求和官网的有一点不一样,那就是.txt文件不需要另外开一个labels文件夹,只需要和.jpg文件一起放在同一个文件夹下面就行,比如
    –root
    ----images
    ------1.jpg
    ------1.txt
    即可。

    当所有的数据准备完成之后,我们就可以进行训练了。首先我们下载darknet53的预训练权重

    • wget https://pjreddie.com/media/files/darknet53.conv.74

    然后就是准备相关配置工作:我们一共需要修改三个文件

    xxx.data

    这个文件通常存放在 ./cfg/ 文件夹下,这里存放着我们需要的类别信息和训练集、测试集位置等
    第一行: classes 就是一共有几类
    第二行: train 这一行代表着你上面存放数据位置的 train.txt 的路径
    第三行: valid 这一行代表着同样格式存放数据位置的 valid.txt 的路径,代表验证集
    第四行: names 是存放数据类别名称的文件路径
    第五行: 模型权重保存路径

    xxx.names

    这个文件一共有classes行,每一行是一个名字,代表着object class数字对应的类别名称,通常存放在 ./data/ 文件下。

    xxx.cfg

    这个文件就是整个网络的架构文件,我训练的时候是直接从yolov3改过来的。我们要修改的就是batch大小和subdivisions大小,如果需要可以修改输入的高度和宽度。
    最终要的一点: 我们要修改最下面yolo层和该层上面卷积层的过滤器数量
    yolo层的 classes 修改为你所要预测的classes数量,上面一层的卷积层,filters 修改为(1+4+classes)*3 的数量,并且不能直接用这个公式,要直接写数字。 如果classes为1,那么filters就要修改为18。并且记住,一共要修改三个地方(yolov3)

    一切准备完毕之后,就可以开始训练:

    • ./darknet detector train cfg/xxx.data cfg/xxx.cfg darknet53.conv.74

    在AB版本当中是每1000轮保存一次权重,最新权重名称为 xxx_last.weights。而官网的是每100轮保存一次,最新权重名称为 xxx.backup
    如果要断点续训,则

    • ./darknet detector train cfg/xxx.data cfg/xxx.cfg backup/xxx_last.weights

    测试

    测试很简单,给定一个图片,输出为根目录下的 prediecitons.jpg

    • ./darknet detect cfg/xxx.cfg ./backup/xxx.weights data/test.jpg
    展开全文
  • darknet-yolov3训练自己的数据集,keras模型测试(超详细完整版) 一. darknet官网下载源码-----编译-----测试 ...进入darknet目录: cd darknet 如果是cpu直接make,否则需要修改配置文件Makefile: ...

    一. darknet官网下载源码-----编译-----测试

    1. 配置Darknet
    下载darknet源码:git clone https://github.com/pjreddie/darknet
    进入darknet目录: cd darknet
    如果是cpu直接make,否则需要修改配置文件Makefile:

    GPU=1         # 如果使用GPU设置为1,CPU设置为0
    CUDNN=1       # 如果使用CUDNN设置为1,否则为0
    OPENCV=0
    OPENMP=0
    DEBUG=0
    

    2.开始编译
    darknet目录下运行make

    3.下载yolov3预训练模型
    wget https://pjreddie.com/media/files/yolov3.weights

    4.测试
    ./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg
    你会看到下面的输出:
    在这里插入图片描述
    会在darknet目录下产生测试结果图片predictions.jpg,如下:
    在这里插入图片描述

    二. 准备自己的数据集-----训练

    1. 在darknet目录下创建myData文件夹,目录结构如下,将之前labelImg标注好的xml文件和图片放到对应目录下
      myData
      …JPEGImages # 存放图像
      …Annotations # 存放图像对应的xml文件
      …ImageSets/Main #之后会在Main文件夹内自动生成train.txt,val.txt,test.txt和trainval.txt四个文件,存放训练集、验证集、测试集图片的名字(无后缀.jpg)

    将自己的数据集图片拷贝到JPEGImages目录下,将数据集label文件拷贝到Annotations目录下。在myData下创建test.py,将下面代码拷贝进去运行,将生成四个文件:train.txt,val.txt,test.txt和trainval.txt。

    import os
    import random
    
    trainval_percent = 0.1
    train_percent = 0.9
    xmlfilepath = 'Annotations'
    txtsavepath = 'ImageSets/Main'
    total_xml = os.listdir(xmlfilepath)
    num = len(total_xml)
    list = range(num)
    tv = int(num * trainval_percent)
    tr = int(tv * train_percent)
    trainval = random.sample(list, tv)
    train = random.sample(trainval, tr)
    
    ftrainval = open('ImageSets/Main/trainval.txt', 'w')
    ftest = open('ImageSets/Main/test.txt', 'w')
    ftrain = open('ImageSets/Main/train.txt', 'w')
    fval = open('ImageSets/Main/val.txt', 'w')
    
    for i in list:
        name = total_xml[i][:-4] + '\n'
        if i in trainval:
            ftrainval.write(name)
            if i in train:
                ftest.write(name)
            else:
                fval.write(name)
        else:
            ftrain.write(name)
    
    ftrainval.close()
    ftrain.close()
    fval.close()
    ftest.close()
    

    运行test.py
    在这里插入图片描述
    2.将数据转换成darknet支持的格式
    yolov3提供了将VOC数据集转为YOLO训练所需要的格式的代码,在scripts/voc_label.py文件中。我在这里提供一个修改版本,在darknet文件夹下新建一个my_lables.py文件,内容如下:

    import xml.etree.ElementTree as ET
    import pickle
    import os
    from os import listdir, getcwd
    from os.path import join
     
    #源代码sets=[('2012', 'train'), ('2012', 'val'), ('2007', 'train'), ('2007', 'val'), ('2007', 'test')]
    sets=[('myData', 'train'), ('myData', 'test')]   # 改成自己建立的myData
    
    # 改成自己的类别
    classes = ["aeroplane", "bicycle", "bird", "boat", "bottle", "bus", "car", "cat", "chair", "cow", "diningtable",
               "dog", "horse", "motorbike", "person", "pottedplant", "sheep", "sofa", "train", "tvmonitor"]  
     
    def convert(size, box):
        dw = 1./(size[0])
        dh = 1./(size[1])
        x = (box[0] + box[1])/2.0 - 1
        y = (box[2] + box[3])/2.0 - 1
        w = box[1] - box[0]
        h = box[3] - box[2]
        x = x*dw
        w = w*dw
        y = y*dh
        h = h*dh
        return (x,y,w,h)
     
    def convert_annotation(year, image_id):
        in_file = open('myData/Annotations/%s.xml'%(image_id))  # 源代码VOCdevkit/VOC%s/Annotations/%s.xml
        out_file = open('myData/labels/%s.txt'%(image_id), 'w')  # 源代码VOCdevkit/VOC%s/labels/%s.txt
        tree=ET.parse(in_file)
        root = tree.getroot()
        size = root.find('size')
        w = int(size.find('width').text)
        h = int(size.find('height').text)
     
        for obj in root.iter('object'):
            difficult = obj.find('difficult').text
            cls = obj.find('name').text
            if cls not in classes or int(difficult)==1:
                continue
            cls_id = classes.index(cls)
            xmlbox = obj.find('bndbox')
            b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text), float(xmlbox.find('ymax').text))
            bb = convert((w,h), b)
            out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')
     
    wd = getcwd()
     
    for year, image_set in sets:
        if not os.path.exists('myData/labels/'):  # 改成自己建立的myData
            os.makedirs('myData/labels/')
        image_ids = open('myData/ImageSets/Main/%s.txt'%(image_set)).read().strip().split()
        list_file = open('myData/%s_%s.txt'%(year, image_set), 'w')
        for image_id in image_ids:
            list_file.write('%s/myData/JPEGImages/%s.jpg\n'%(wd, image_id))
            convert_annotation(year, image_id)
        list_file.close()
    

    3.运行代码python my_lables.py
    会在myData目录下自动生成一个labels文件夹和两个txt文件(myData_train.txt和myData_test.txt) ,这两个txt文件会在训练模型时用到;lables文件中的每个txt文件内的内容含义为:
    在这里插入图片描述
    具体的每一个值的计算方式是这样的:假设一个标注的boundingbox的左下角和右上角坐标分别为(x1,y1)(x2,y2),图像的宽和高分别为w,h
    归一化的中心点x坐标计算公式:((x2+x1) / 2.0)/ w
    归一化的中心点y坐标计算公式:((y2+y1) / 2.0)/ h
    归一化的目标框宽度的计算公式: (x2-x1) / w
    归一化的目标框高度计算公式:((y2-y1)/ h
    4.修改darknet/cfg下的voc.data和yolov3-voc.cfg文件
    1)打开cfg/voc.data文件,进行如下修改:

    classes= 20  # 自己数据集的类别数
    train = /home/xxx/darknet/myData/myData_train.txt  # train文件的路径
    valid = /home/xxx/darknet/myData/myData_test.txt   # test文件的路径
    names = /home/xxx/darknet/myData/myData.names   # 用绝对路径(需要手动创建label name)
    backup = backup  # 训练模型保存的文件夹
    

    在myData文件夹下新建myData.names文件,将label name一行一个name写入,如下:

    aeroplane
    bicycle
    ......
    tvmonitor
    

    2)打开cfg/yolov3-voc.cfg文件,进行如下修改:
    编辑器内按 Ctrl+F 搜索yolo, 总共会搜出3个含有yolo的地方。
    每个地方都必须要改2处, filters:3*(5+len(classes));
    其中:我展示的classes: len(classes) = 20,这里以我的工程为例
    filters = 75 # 3*(5+20)
    classes = 20
    可修改:random = 1:原来是1,显存小改为0。(是否要多尺度输出。)
    3个yolo显示的地方都要修改。
    在这里插入图片描述
    5.可以指定训练批次和训练轮数
    编辑器打开cfg/yolov3-voc.cfg文件,在最上面
    在这里插入图片描述
    解释一下:

    [net]
    # Testing            ### 测试模式                                          
    # batch=1
    # subdivisions=1
    # Training           ### 训练模式,每次前向的图片数目 = batch/subdivisions 
    batch=256
    subdivisions=8
    width=416            ### 网络的输入宽、高、通道数
    height=416
    channels=3
    momentum=0.9         ### 动量 
    decay=0.0005         ### 权重衰减
    angle=0
    saturation = 1.5     ### 饱和度
    exposure = 1.5       ### 曝光度 
    hue=.1               ### 色调
    learning_rate=0.001  ### 学习率 
    burn_in=1000         ### 学习率控制的参数
    max_batches = 50200  ### 迭代次数                                          
    policy=steps         ### 学习率策略 
    steps=40000,45000    ### 学习率变动步长
    

    因为是训练,所以注释Testing,打开Training,其中
    batch=256 每batch个样本更新一次参数。
    subdivisions=8 如果内存不够大,将batch分割为subdivisions个子batch,每个子batch的大小为batch/subdivisions。
    6.下载预训练权重
    wget https://pjreddie.com/media/files/darknet53.conv.74
    7.开始训练
    如果你想使用gpu训练,运行如下命令:
    ./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg darknet53.conv.74 -gpus 0,1,2,3
    0 1 2 3…是GPU 的编号,根据自己的情况指定。
    训练过程参数的意义
    —Region xx: cfg文件中yolo-layer的索引;
    —Avg IOU:当前迭代中,预测的box与标注的box的平均交并比,越大越好,期望数值为1;
    —Class: 标注物体的分类准确率,越大越好,期望数值为1;
    —obj: 越大越好,期望数值为1;
    —No obj: 越小越好;
    —.5R: 以IOU=0.5为阈值时候的recall; recall = 检出的正样本/实际的正样本
    —0.75R: 以IOU=0.75为阈值时候的recall;
    —count:正样本数目。
    训练过程示例:

    Loaded: 0.000034 seconds
    Region 82 Avg IOU: -nan, Class: -nan, Obj: -nan, No Obj: 0.000009, .5R: -nan, .75R: -nan,  count: 0
    Region 94 Avg IOU: 0.790078, Class: 0.996943, Obj: 0.777700, No Obj: 0.001513, .5R: 1.000000, .75R: 0.833333,  count: 6
    Region 106 Avg IOU: 0.701132, Class: 0.998590, Obj: 0.710799, No Obj: 0.000800, .5R: 0.857143, .75R: 0.571429,  count: 14
    Region 82 Avg IOU: -nan, Class: -nan, Obj: -nan, No Obj: 0.000007, .5R: -nan, .75R: -nan,  count: 0
    Region 94 Avg IOU: 0.688576, Class: 0.998360, Obj: 0.855777, No Obj: 0.000512, .5R: 1.000000, .75R: 0.500000,  count: 2
    Region 106 Avg IOU: 0.680646, Class: 0.998413, Obj: 0.675553, No Obj: 0.000405, .5R: 0.857143, .75R: 0.428571,  count: 7
    Region 82 Avg IOU: 0.478347, Class: 0.999972, Obj: 0.999957, No Obj: 0.000578, .5R: 0.000000, .75R: 0.000000,  count: 1
    Region 94 Avg IOU: 0.901106, Class: 0.999994, Obj: 0.999893, No Obj: 0.000308, .5R: 1.000000, .75R: 1.000000,  count: 1
    Region 106 Avg IOU: -nan, Class: -nan, Obj: -nan, No Obj: 0.000025, .5R: -nan, .75R: -nan,  count: 0
    Region 82 Avg IOU: 0.724108, Class: 0.988430, Obj: 0.765983, No Obj: 0.003308, .5R: 1.000000, .75R: 0.400000,  count: 5
    Region 94 Avg IOU: 0.752382, Class: 0.996165, Obj: 0.848303, No Obj: 0.002020, .5R: 1.000000, .75R: 0.500000,  count: 8
    Region 106 Avg IOU: 0.652267, Class: 0.998596, Obj: 0.646115, No Obj: 0.000728, .5R: 0.818182, .75R: 0.545455,  count: 11
    Region 82 Avg IOU: 0.755896, Class: 0.999879, Obj: 0.999514, No Obj: 0.001232, .5R: 1.000000, .75R: 1.000000,  count: 1
    Region 94 Avg IOU: 0.749224, Class: 0.999670, Obj: 0.988916, No Obj: 0.000441, .5R: 1.000000, .75R: 0.500000,  count: 2
    Region 106 Avg IOU: 0.601608, Class: 0.999661, Obj: 0.714591, No Obj: 0.000147, .5R: 0.750000, .75R: 0.250000,  count: 4
    Region 82 Avg IOU: -nan, Class: -nan, Obj: -nan, No Obj: 0.000011, .5R: -nan, .75R: -nan,  count: 0
    Region 94 Avg IOU: 0.797704, Class: 0.997323, Obj: 0.910817, No Obj: 0.001006, .5R: 1.000000, .75R: 0.750000,  count: 4
    Region 106 Avg IOU: 0.727626, Class: 0.998225, Obj: 0.798596, No Obj: 0.000121, .5R: 1.000000, .75R: 0.500000,  count: 2
    Region 82 Avg IOU: 0.669070, Class: 0.998607, Obj: 0.958330, No Obj: 0.001297, .5R: 1.000000, .75R: 0.000000,  count: 2
    Region 94 Avg IOU: 0.832890, Class: 0.999755, Obj: 0.965164, No Obj: 0.000829, .5R: 1.000000, .75R: 1.000000,  count: 1
    Region 106 Avg IOU: 0.613751, Class: 0.999541, Obj: 0.791765, No Obj: 0.000554, .5R: 0.833333, .75R: 0.333333,  count: 12
    Region 82 Avg IOU: -nan, Class: -nan, Obj: -nan, No Obj: 0.000007, .5R: -nan, .75R: -nan,  count: 0
    Region 94 Avg IOU: 0.816189, Class: 0.999966, Obj: 0.999738, No Obj: 0.000673, .5R: 1.000000, .75R: 1.000000,  count: 2
    Region 106 Avg IOU: 0.756419, Class: 0.999139, Obj: 0.891591, No Obj: 0.000712, .5R: 1.000000, .75R: 0.500000,  count: 12
    12010: 0.454202, 0.404766 avg, 0.000100 rate, 2.424004 seconds, 768640 images
    Loaded: 0.000034 seconds
    

    这段代码展示了一个批次(batch),批次大小的划分根据yolov3-voc.cfg的subdivisions参数。在我使用的 .cfg 文件中 batch=256,subdivision = 8,所以在训练输出中,训练迭代包含了32组,每组又包含了8张图片,跟设定的batch和subdivision的值一致。

    批输出针对上面的bacth的最后一行输出来说,12010代表当前训练的迭代次数,0.454202代表总体的loss,0.404766 avg代表平均损失,这个值越低越好,一般来说一旦这个数值低于0.060730 avg就可以终止训练了。0.0001代表当前的学习率,2.424004 seconds代表当前批次花费的总时间。768640代表3002*256代表当前训练的图片总数。
    从停止处继续接着训练
    当训练到一定程度需要测试效果时,可以终止一下训练(ctrl+c),此时在backup文件夹下有好多训练权重(.weight)文件。选用其中一个最好的权重(.weight)文件(一般是最后一个)进行测试,测试方法参见下文(三.测试)。待测试完毕后想接着继续训练模型时,则用如下代码:
    ./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg backup/my_yolov3_30000.weights -gpus 0,1,2,3

    三.测试
    1.darknet模型转换为keras的h5模型
    由于darknet是C++编译,修改代码每次需要重新编译,因此可以将darknet训练的模型my_yolov3_final.weights转换为可以用于keras的h5文件,然后写keras版python代码进行测试。
    需要用到keras版yolo3文件夹下的文件,贴出本文主要参考的下载出处:
    https://github.com/qqwweee/keras-yolo3,下载copy此处的yolo3文件夹和font字体文件夹和convert.py文件到darknet目录下,运行命令:
    python convert.py cfg/yolov3-voc.cfg backup/my_yolov3_final.weights backup/yolo.h5 生成的h5被保存在训练模型保存的路径backup文件夹下。
    2.从所有数据集中复制出测试图片数据集
    在myData文件夹下创建TestImages文件夹,用来存放测试图片数据;创建TestResults文件夹,用来存放测试结果。创建select_testImg.py文件,用来从所有图片中copy出测试图片,代码内容如下:

    # -*- coding:utf-8 -*- 
    
    import shutil
    
    def objFileName():
        local_file_name_list = "ImageSets/Main/test.txt"
        obj_name_list = []
        for i in open(local_file_name_list, 'r'):
            i = i + '.jpg'
            obj_name_list.append(i.replace('\n', ''))
        return obj_name_list
    
    def copy_img():
        local_img_name = 'JPEGImages'  # 指定要复制的图片路径
        path = 'TestImages'            # 指定要存放图片的路径
        for i in objFileName():
            new_obj_name = i
            shutil.copy(local_img_name + '/' + new_obj_name, path + '/' + new_obj_name)
    
    if __name__ == '__main__':
        copy_img()
    

    3.批量测试并保存测试结果
    测试代码需要用到的几个文件:my_anchors.txt和my_classes.txt。
    在myData文件夹下创建model_data文件夹,在model_data文件夹内创建my_anchors.txt文件,手动写入anchors,anchors来自cfg/yolov3-voc.cfg文件内,如下21,19, 13,41, 58,13, 26,33, 36,26, 19,79, 39,40, 85,20, 52,50
    同时在model_data文件夹内创建my_classes.txt,手动写入label name,一行一个name。
    在darknet目录下创建yolo_test.py测试代码文件,内容如下:

    # -*- coding: utf-8 -*-
    """
    功能:keras-yolov3 进行批量测试并保存结果
    """
    import colorsys
    import os
    from timeit import default_timer as timer
    import time
    import tensorflow as tf
    
    import numpy as np
    from keras.models import load_model
    from keras.layers import Input
    from PIL import Image, ImageFont, ImageDraw
    
    from yolo3.model import yolo_eval, yolo_body, tiny_yolo_body
    from yolo3.utils import letterbox_image
    from keras.utils import multi_gpu_model
    
    os.environ["CUDA_VISIBLE_DEVICES"] = "0"
    from keras import backend as K
    config = tf.ConfigProto()
    # config.gpu_options.allow_growth = True   # 当allow_growth设置为True时,分配器将不会指定所有的GPU内存,而是根据需求增长
    config.gpu_options.per_process_gpu_memory_fraction = 0.50  # 占用50%显存
    sess = tf.Session(config=config)
    K.set_session(sess)
    
    path = 'myData/TestImages/'  # 待检测图片的位置
    
    # 创建创建一个存储检测结果的dir
    result_path = 'myData/TestResults'
    if not os.path.exists(result_path):
        os.makedirs(result_path)
    
    # result如果之前存放的有文件,全部清除
    for i in os.listdir(result_path):
        path_file = os.path.join(result_path, i)
        if os.path.isfile(path_file):
            os.remove(path_file)
    
    # 创建一个记录检测结果的文件
    txt_path = result_path + '/result.txt'
    file = open(txt_path, 'w')
    
    
    class YOLO(object):
        _defaults = {
            "model_path": 'backup/yolo.h5',
            "anchors_path": 'myData/model_data/my_anchors.txt',
            "classes_path": 'myData/model_data/my_classes.txt',
            "score": 0.3,
            "iou": 0.45,
            "model_image_size": (416, 416),
            "gpu_num": 1,
        }
    
        @classmethod
        def get_defaults(cls, n):
            if n in cls._defaults:
                return cls._defaults[n]
            else:
                return "Unrecognized attribute name '" + n + "'"
    
        def __init__(self, **kwargs):
            self.__dict__.update(self._defaults)  # set up default values
            self.__dict__.update(kwargs)  # and update with user overrides
            self.class_names = self._get_class()
            self.anchors = self._get_anchors()
            self.sess = K.get_session()
            self.boxes, self.scores, self.classes = self.generate()
    
        def _get_class(self):
            classes_path = os.path.expanduser(self.classes_path)
            with open(classes_path) as f:
                class_names = f.readlines()
            class_names = [c.strip() for c in class_names]
            return class_names
    
        def _get_anchors(self):
            anchors_path = os.path.expanduser(self.anchors_path)
            with open(anchors_path) as f:
                anchors = f.readline()
            anchors = [float(x) for x in anchors.split(',')]
            return np.array(anchors).reshape(-1, 2)
    
        def generate(self):
            model_path = os.path.expanduser(self.model_path)
            assert model_path.endswith('.h5'), 'Keras model or weights must be a .h5 file.'
    
            # Load model, or construct model and load weights.
            num_anchors = len(self.anchors)
            num_classes = len(self.class_names)
            is_tiny_version = num_anchors == 6  # default setting
            try:
                self.yolo_model = load_model(model_path, compile=False)
            except:
                self.yolo_model = tiny_yolo_body(Input(shape=(None, None, 3)), num_anchors // 2, num_classes) \
                    if is_tiny_version else yolo_body(Input(shape=(None, None, 3)), num_anchors // 3, num_classes)
                self.yolo_model.load_weights(self.model_path)  # make sure model, anchors and classes match
            else:
                assert self.yolo_model.layers[-1].output_shape[-1] == \
                       num_anchors / len(self.yolo_model.output) * (num_classes + 5), \
                    'Mismatch between model and given anchor and class sizes'
    
            print('{} model, anchors, and classes loaded.'.format(model_path))
    
            # Generate colors for drawing bounding boxes.
            hsv_tuples = [(x / len(self.class_names), 1., 1.)
                          for x in range(len(self.class_names))]
            self.colors = list(map(lambda x: colorsys.hsv_to_rgb(*x), hsv_tuples))
            self.colors = list(
                map(lambda x: (int(x[0] * 255), int(x[1] * 255), int(x[2] * 255)),
                    self.colors))
            np.random.seed(10101)  # Fixed seed for consistent colors across runs.
            np.random.shuffle(self.colors)  # Shuffle colors to decorrelate adjacent classes.
            np.random.seed(None)  # Reset seed to default.
    
            # Generate output tensor targets for filtered bounding boxes.
            self.input_image_shape = K.placeholder(shape=(2,))
            if self.gpu_num >= 2:
                self.yolo_model = multi_gpu_model(self.yolo_model, gpus=self.gpu_num)
            boxes, scores, classes = yolo_eval(self.yolo_model.output, self.anchors,
                                               len(self.class_names), self.input_image_shape,
                                               score_threshold=self.score, iou_threshold=self.iou)
            return boxes, scores, classes
    
        def detect_image(self, image):
            start = timer()  # 开始计时
    
            if self.model_image_size != (None, None):
                assert self.model_image_size[0] % 32 == 0, 'Multiples of 32 required'
                assert self.model_image_size[1] % 32 == 0, 'Multiples of 32 required'
                boxed_image = letterbox_image(image, tuple(reversed(self.model_image_size)))
            else:
                new_image_size = (image.width - (image.width % 32),
                                  image.height - (image.height % 32))
                boxed_image = letterbox_image(image, new_image_size)
            image_data = np.array(boxed_image, dtype='float32')
    
            print(image_data.shape)  # 打印图片的尺寸
            image_data /= 255.
            image_data = np.expand_dims(image_data, 0)  # Add batch dimension.
    
            out_boxes, out_scores, out_classes = self.sess.run(
                [self.boxes, self.scores, self.classes],
                feed_dict={
                    self.yolo_model.input: image_data,
                    self.input_image_shape: [image.size[1], image.size[0]],
                    K.learning_phase(): 0
                })
    
            print('Found {} boxes for {}'.format(len(out_boxes), 'img'))  # 提示用于找到几个bbox
    
            font = ImageFont.truetype(font='font/FiraMono-Medium.otf',
                                      size=np.floor(2e-2 * image.size[1] + 0.2).astype('int32'))
            thickness = (image.size[0] + image.size[1]) // 500
    
            # 保存框检测出的框的个数
            file.write('find  ' + str(len(out_boxes)) + ' target(s) \n')
    
            for i, c in reversed(list(enumerate(out_classes))):
                predicted_class = self.class_names[c]
                box = out_boxes[i]
                score = out_scores[i]
    
                label = '{} {:.2f}'.format(predicted_class, score)
                draw = ImageDraw.Draw(image)
                label_size = draw.textsize(label, font)
    
                top, left, bottom, right = box
                top = max(0, np.floor(top + 0.5).astype('int32'))
                left = max(0, np.floor(left + 0.5).astype('int32'))
                bottom = min(image.size[1], np.floor(bottom + 0.5).astype('int32'))
                right = min(image.size[0], np.floor(right + 0.5).astype('int32'))
    
                # 写入检测位置            
                file.write(
                    predicted_class + '  score: ' + str(score) + ' \nlocation: top: ' + str(top) + '、 bottom: ' + str(
                        bottom) + '、 left: ' + str(left) + '、 right: ' + str(right) + '\n')
    
                print(label, (left, top), (right, bottom))
    
                if top - label_size[1] >= 0:
                    text_origin = np.array([left, top - label_size[1]])
                else:
                    text_origin = np.array([left, top + 1])
    
                # My kingdom for a good redistributable image drawing library.
                for i in range(thickness):
                    draw.rectangle(
                        [left + i, top + i, right - i, bottom - i],
                        outline=self.colors[c])
                draw.rectangle(
                    [tuple(text_origin), tuple(text_origin + label_size)],
                    fill=self.colors[c])
                draw.text(text_origin, label, fill=(0, 0, 0), font=font)
                del draw
    
            end = timer()
            print('time consume:%.3f s ' % (end - start))
            return image
    
        def close_session(self):
            self.sess.close()
    
    
    # 图片检测
    
    if __name__ == '__main__':
    
        t1 = time.time()
        yolo = YOLO()
        for filename in os.listdir(path):
            image_path = path + '/' + filename
            portion = os.path.split(image_path)
            file.write(portion[1] + ' detect_result:\n')
            image = Image.open(image_path)
            r_image = yolo.detect_image(image)
            file.write('\n')
            # r_image.show() 显示检测结果
            image_save_path = 'myData/TestResults/result_' + portion[1]
            print('detect result save to....:' + image_save_path)
            r_image.save(image_save_path)
    
        time_sum = time.time() - t1
        file.write('time sum: ' + str(time_sum) + 's')
        print('time sum:', time_sum)
        file.close()
        yolo.close_session()
    

    测试代码内部文件各个路径修改完毕后,运行python yolo_test.py就开始进行批量测试,测试速度根据每张图片中的目标物多少决定,总而言之还是挺快的。

    至此,darknet-yolov3训练自己的数据集,包括数据集制作过程,和转换keras模型进行批量测试,整个过程已完毕。欢迎各位留言讨论和有误的地方给予批评指正。

    展开全文
  • 1、 安装VS2015; 2、 下载opencv_3.4,安装到C盘根目录;...4、 进入 darknet-master -> build -> darknet 目录,用记事本打开 darknet_no_gpu.vcxproj 文件,将里面的opencv_3.0版本替换为所安装的...

    1、 安装VS2015;

    2、 下载opencv_3.4,安装到C盘根目录;

    3、 从 https://github.com/AlexeyAB/darknet 上下载darknet工程;

    4、 进入 darknet-master -> build -> darknet 目录,用记事本打开 darknet_no_gpu.vcxproj 文件,将里面的opencv_3.0版本替换为所安装的opencv_3.4版本,共有4处需要替换;

    5、 用VS2015打开darknet_no_gpu.sln工程,将当前解决方案改为 release x64;

    6、 为工程配置opencv_3.4;

    • 在vc++目录中
      添加包含目录 C:\opencv_3.4\build\include
      添加库目录C:\opencv_3.4\build\x64\vc14\lib
    • 在 链接器->输入 中添加 附加依赖项 opencv_world340.lib

    7、 生成解决方案,生成成功后将在 darknet-master/build/darknet/x64 中生成 darknet_no_gpu.exe 文件

    8、 复制opencv_3.4\build\x64\vc14\bin中的opencv_world340.dll和opencv_ffmpeg340_64.dll和opencv_world340d.dll、opencv_world340.dll这些文件放到darknet-master\build\darknet\x64文件夹中;

    9、 Yolo测试,下载 yolov3.weights 文件,放到darknet-master/build/darknet/x64 中

    10、 下载好yolov3.weights后放在 darknet-master\build\darknet\x64中;

    11、 在windows终端输入以下命令即可开始执行测试

    darknet_no_gpu.exe detector test data/coco.data yolov3.cfg yolov3.weights dog.jpg
    

    https://github.com/AlexeyAB/darknet#how-to-compile-on-windows
    https://www.cnblogs.com/peacepeacepeace/p/9060229.html

    展开全文
  • darknet yolov1 实验

    2019-04-06 23:00:49
    安装opencv 然后安装darknet git clone https://github.com/pjreddie/darknet.git cd darknet make 然后下载已经训练好的模型权重值 ...进入darknet路径,执行命令 ./darknet yolo test...
  • 在windows上运行darknet...很简单,先进入https://github.com/AlexeyAB/darknet 去下载代码,然后去build/darknet目录中双击点开darknet_no_gpu.sln即可。 注意两点,1)先安装visual studio community版本 2)项...
  • 前几篇文章介绍了系统的安装、CUDA以及CUDNN的安装,本篇介绍darknet的安装 系统的安装 显卡驱动、cuda及cudnn的安装...2、进入darknet路径 命令:cd darknet 3、修改配置文件 命令:sudo vim Makefile 将配置文件中...
  • 安装darknet+opencv+错误解决

    万次阅读 2017-08-18 11:08:00
    具体的安装过程可以详见官网,https://pjreddie.com/darknet/install/1、从 git 库上Clone下来...、进入darknet目录并编译cd darknetmake -j4如果没有错误,编译过程中会看到如下的log信息: 接下来直接 ./darknet
  • 进入darknet文件夹 cd darknet 修改Makefile,根据服务器的配置进行相应的设置 vim Mkaefile 按下i进入编辑模式 其中 GPU=0 CUDNN=0 OPENCV=0 OPENMP=0 DEBUG=0 0表示不开启,1表示开始 若开启对应的对象,则...
  • 在Azure上训练自定义YOLO v4暗网模型并在IoT Edge上与Azure Live Video Analytics一起运行 目录 训练定制的YOLO v4模型 先决条件 SSH客户端或命令行工具-对于... 通过运行以下命令测试Darknet可执行文件。 获得YO
  • 进入darknet目录会出现下面的目录结构  backup:主要存放训练的模型 ;cfg:网络模型的结构;data:一些数据其中label文件夹作用是在检测结构最后显示label的结果如Person等;example:存放了一些.c文件其中比较...
  • darknet源码解读-train_detector

    千次阅读 2018-07-29 22:54:39
    darknet框架上运行类似以下训练实例时必然会进入到train_detector函数,它是训练目标检测器的入口函数。  ./darknet detector train cfg/coco.data cfg/yolov2.cfg darknet19_448.conv.23  ./darknet detector...
  • ////本文只列出需要注意的点,其他过程链接其他总结更全面。 环境 win10+opencv3.4+cuda10.0+vs2017 本人安装的VS2017但是darket好像不支持V141的工具集,然后需要下载V140工具集.OPENCV不要...(1) 进入\darknet...
  • 准备文件 - 进入我上传的资源页面下载...1. 进入文件夹darknet-master\build\darknet选择darknet.vcxproj文件,选择用笔记本打开,到第55行和291的地方,将9.0修改为自己电脑的CUDA版本,比如我的电脑就是10.1,...
  • 从师兄那里导来了darknet(包含以前他训练的程序),导入了我的Ubuntu14.04中,我从YOLOV3官网上https://pjreddie.com/darknet/yolo/开始阅读学习,进入darknet文件夹,make编译成功,又按照步骤下载了权重,但是在...
  • darknet源码剖析(三)

    千次阅读 2018-10-30 17:38:38
    进入train_detector函数。 list *options = read_data_cfg(datacfg); list的定义位于darknet.h,为链表。read_data_cfg位于option_list.c中。 read_data_cfg的作用在于将数据集配置转化为链表。 char *train_...
  • 目录下载yolov4编译测试...进入darknet目录下 在编译darknet前首先需要修改Makefile cd darknet gedit Makefile 打开Makefile 注意 然后 make 测试 检测图片 输入下面的命令 ./darknet detector test cfg/coco.d
  • 环境ubuntu,darknet3,opencv3.4.7 目录 一、安装OPENCV3.4 1、安装配置相关工具及依赖库 2、从官网下载源码 3、安装过程 (1)将zip文件解压到当前目录 (2)进入解压后的文件夹 (3)创建一...
  • darknet 出现 video stream stopped 怎么解决卸载已安装OpenCV安装ffmpeg安装 opencv 参考了博文:CentOS8编译OpenCV4.3.0 with ffmpeg(YoloV4处理视频并保存). 卸载已安装OpenCV 请谨慎!我是源码安装的 opencv ...
  • 1.src/darknet.c/main() 通过解析train.sh中的批处理指令,遇到detector进入run_detector函数。 else if (0 == strcmp(argv[1], &amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;quot;detector&amp;amp...
  • YOLO目标检测 Darknet的好处是依赖少,执行效率高,如果不显示图片连...2、进入darknet文件夹下 3、make是编译,将里边的文件编译生成需要的文件 git clone https://github.com/pjreddie/darknet cd darknet m...
  • darknet在ROS环境下的运行

    千次阅读 热门讨论 2019-03-08 14:41:43
    网上有很多关于这方面的...进入/darknet_ros/config,打开ros.yaml修改为自己的摄像头话题: subscribers: camera_reading: topic: /usb_cam/image_raw queue_size: 1 其他的命令都差不多,按照网上的教程来...
  • 解读darknet-YOLO V2代码(一)

    千次阅读 2017-11-22 15:46:33
    解读darknet中的YOLO V2移植到vs2015后的代码,作者是AlexeyAB,github地址是https://github.com/AlexeyAB/darknet。 命令参数:detector demo data/voc.data yolo-voc.cfg yolo-voc...由382行的run_detector()进入de
  • 首先是下载了一个没带sln的darknet,要想办法生成吧,就找教程生成exe文件,发现配置起来实在麻烦(也可能是搞错了),最后找到开源的sln文件。见第二条链接。 进入sln后,无法生成exe文件。(这里以前已经配置过...
  • 按照前面的思路,这一节进入DarkNet的数据结构解析并且详细解释一下train_detector函数是如何加载数据并工作的。Darknet是一个C语言实现的神经网络框架,这就决定了其中大多数保存数据的数据结构都会使用链表这种...
  • darknet(YOLO)源码解析--测试(一)

    千次阅读 2017-12-29 15:11:03
    代码小白,第一次认真...测试命令示例:$./darknet detector test cfg/voc.data cfg/tiny-yolo-voc.cfg results/tiny-yolo-voc_6000.weights data/images.jpg一、main函数目前最新版本的darknet中,darknet.c和detecto
  • darknet源码剖析(六)

    2018-10-31 20:05:17
    继续分析load_data_detection,进入fill_truth_detection函数。fill_truth_detection的作用是读取图片对应的标注信息。 首先进入find_replace函数。 void find_replace(char *str, char *orig, char *rep, char *...
  • darknet-gpu版本的编译 一、准备相关软件安装,一下安装顺序执行 1、安装visual Studio2009,安装时勾选python开发环境、C++桌面开发 2、安装cuda10.1 + cudnn7.6.0 3、如果可能出问题可以考虑安装cmake、Cygwin64...
  • 前段时间做了华为云的垃圾检测分类比赛(垃圾分类检测),当时的方案是SSD+efficientdet+CiouLoss,很遗憾最终未能进入复赛(如果大家感兴趣,也可以去比赛官方页面下载来玩一玩)。这几天闲来无事玩了下darknet官方版的...
  • darknet源码剖析(二)

    2018-10-30 14:17:22
    进入run_detector函数: char *prefix = find_char_arg(argc, argv, "-prefix", 0); 其中find_char_arg位于src/utils.c文件中, char *find_char_arg(int argc, char **argv, char *arg, char *def) ...

空空如也

空空如也

1 2 3 4 5 ... 7
收藏数 127
精华内容 50
关键字:

darknet进入