Windows7+GPU+VS2015配置YOLO V3+训练自己的数据集

一开始我电脑只安装了CUDA8.0,按照网上博主的方法更改配置文件出错了,如下:
CUDA已经装好了,如下图版本是8.0
opencv也在VS2015中配置好了,在我的电脑里的系统变量里已经配置好Debugx64。
可以运行一个简单的示例代码。没有问题。
Windows7+GPU+VS2015配置YOLO V3+训练自己的数据集_第1张图片
下载好的darknet-master,下载地址是:https://github.com/AlexeyAB/darknet
我解压后放到了E盘目录下。
更改E:\darknet-master\build\darknet\目录下的darknet.vcxproj
将其中的CUDA 10.0 更改为CUDA 8.0,一共有两处,如图所示
Windows7+GPU+VS2015配置YOLO V3+训练自己的数据集_第2张图片
Windows7+GPU+VS2015配置YOLO V3+训练自己的数据集_第3张图片
然后用VS2015打开darknet.sln
哇塞!出错了耶! 而且还不告诉我错在哪里。。。
Windows7+GPU+VS2015配置YOLO V3+训练自己的数据集_第4张图片
Windows7+GPU+VS2015配置YOLO V3+训练自己的数据集_第5张图片

真心求救!!这该怎么办!!

—2020.1.11更新–

最终的解决方案还是把CUDA升级成了10.1 打开就没问题鸟。好的正文现在开始。

环境配置

CUDA10.1安装

这一部分可以看我的另一篇文章
https://blog.csdn.net/bozki1995/article/details/103833062

opencv3.4安装

下载链接:
https://opencv.org/opencv-3-4/
下载好了以后配置好环境变量就好了。
然后新建一个空的C++项目,打开Reales x64的属性表配置VC++ 包含目录、库目录,以及打开链接器,编辑附加依赖项。

YOLO V3源码配置

下载地址:https://github.com/AlexeyAB/darknet#how-to-use

…\darknet-master\build\darknet下打开darknet.vcxproj,把里面CUDA的字段10.0改成10.1
然后就可以正常用VS2015打开darknet.sln了(注意改成release x64)打开属性管理器,视图->其他窗口->属性管理器
Windows7+GPU+VS2015配置YOLO V3+训练自己的数据集_第6张图片
右击releasex64打开属性进行相关的配置,保证opencv配置正确
包含目录、库目录
Windows7+GPU+VS2015配置YOLO V3+训练自己的数据集_第7张图片
附加依赖项
Windows7+GPU+VS2015配置YOLO V3+训练自己的数据集_第8张图片
然后就启动生成darknet
生成成功后会生成darknet.exe文件

之后我们就可以用它进行数据的训练和测试啦。
Windows7+GPU+VS2015配置YOLO V3+训练自己的数据集_第9张图片
注意把上面三个dll复制到\darknet-master\build\darknet\x64下

下载一个权重文件,测试一下搭建的环境是否成功
在github上下载作者训练好的模型,网址:https://github.com/AlexeyAB/darknet/blob/master/README.md
懒的话直接点这里下载https://pjreddie.com/media/files/yolov3.weights
下载后放在darknet-master\build\darknet\x64下,打开该目录,双击darknet_yolo_v3.cmd会出现以下结果,表明成功编译。
Windows7+GPU+VS2015配置YOLO V3+训练自己的数据集_第10张图片

训练自己的数据集

这里默认我们的数据集已经是建立好了的VOC格式的数据集
1.划分训练集、验证集、测试集

import os
import random

trainval_percent = 0.8  # trainval数据集占所有数据的比例
train_percent = 0.8  # train数据集占trainval数据的比例
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:
            ftrain.write(name)
        else:
            fval.write(name)
    else:
        ftest.write(name)

ftrainval.close()
ftrain.close()
fval.close()
ftest .close()

2.将xml文件转化为txt文件

# -*- coding: utf-8 -*-
"""
Created on Tue Oct  2 11:42:13 2018
将本文件放到VOC2007目录下,然后就可以直接运行
需要修改的地方:
1. sets中替换为自己的数据集
2. classes中替换为自己的类别
3. 将本文件放到VOC2007目录下
4. 直接开始运行
"""
import xml.etree.ElementTree as ET
import pickle
import os
import shutil
from os import listdir, getcwd
from os.path import join
# sets = [('2007', 'train'), ('2007', 'val'), ('2007', 'test'),('2007', 'trainval')]  # 替换为自己的数据集
sets = [('2007', 'test')]
classes = ["xxx"]  # 修改为自己的类别
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('E:/dongyb/yolov3-master/yolov3-master/data/VOCdevkit2007/VOC2007/Annotations/%s.xml' % (image_id))  # 将数据集放于当前目录下
    out_file = open('.../yolov3-master/data/labels/test2014/%s.txt' % (image_id), 'w')
    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'):
        print(image_id)
        A=obj.find('Difficult')
        if A==None:
            xml_name = image_id + '.xml'
            shutil.copy(os.path.join('VOC2007', 'Annotations', xml_name),
                        os.path.join('VOC2007', 'Annotations_gai', xml_name))
            #shutil.copy(in_file,'VOC2007/Annotations_gai/')
            break
        else:
            difficult = A.text
        # 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('VOC%s/labels/' % (year)):
       # os.makedirs('labels/train2014' % (year))
        os.makedirs('VOC%s/labels/' % (year))

    image_ids = open('VOC%s/ImageSets/Main/%s.txt' % (year, image_set)).read().strip().split()
    list_file = open('%s_%s.txt' % (year, image_set), 'w')

    for image_id in image_ids:
        list_file.write('.../yolov3-master/data/images/test2014/%s.jpg\n' % (image_id))
        convert_annotation(year, image_id)
    list_file.close()

# os.system("cat 2007_train.txt 2007_val.txt > train.txt")     #修改为自己的数据集用作训练

最后的样子是每个txt里面对应了bbox的信息
在这里插入图片描述
3. 新建train.txt
把训练图片的路径写在文件里面,每行一个路径,我比较喜欢把绝对路径写在里面
刚刚上面的代码也已经包含了自动写入train.txt(执行前先在myRoot\ImageSets\Main\下新建一个train.txt)

在这里插入图片描述
4.下载预训练权重
将darknet的预训练权重放入darknet-master\build\darknet\x64
链接:https://pan.baidu.com/s/1Gdo2gj1bggjUtW9CyYkIpQ 密码:x5ht
5.新建自己的cfg文件

建立自己的.cfg \ .names\ .data 文件
6.修改网络配置文件makefile
7.Win+R打开终端,cd进入darknet-master\build\darknet\x64路径,下面命令开始训练:

darknet.exe detector train data/obj.data yolo-obj.cfg darknet53.conv.74

训练时,每训练100轮,都会生成一个权重文件在build\darknet\x64\backup\ 下,文件名例如:yolo-obj_100.weights(后面的100是训练100轮是的权重)。

如果训练的时候IOU出现全是-nan(ind),这应该是你的数据集有问题了,仔细检查下图片或txt文件的路径有没有写对或放对。可以在labels下放置图片标签txt文件

你可能感兴趣的:(Windows7+GPU+VS2015配置YOLO V3+训练自己的数据集)