一开始我电脑只安装了CUDA8.0,按照网上博主的方法更改配置文件出错了,如下:
CUDA已经装好了,如下图版本是8.0
opencv也在VS2015中配置好了,在我的电脑里的系统变量里已经配置好Debugx64。
可以运行一个简单的示例代码。没有问题。
下载好的darknet-master,下载地址是:https://github.com/AlexeyAB/darknet
我解压后放到了E盘目录下。
更改E:\darknet-master\build\darknet\目录下的darknet.vcxproj
将其中的CUDA 10.0 更改为CUDA 8.0,一共有两处,如图所示
然后用VS2015打开darknet.sln
哇塞!出错了耶! 而且还不告诉我错在哪里。。。
真心求救!!这该怎么办!!
—2020.1.11更新–
最终的解决方案还是把CUDA升级成了10.1 打开就没问题鸟。好的正文现在开始。
这一部分可以看我的另一篇文章
https://blog.csdn.net/bozki1995/article/details/103833062
下载链接:
https://opencv.org/opencv-3-4/
下载好了以后配置好环境变量就好了。
然后新建一个空的C++项目,打开Reales x64的属性表配置VC++ 包含目录、库目录,以及打开链接器,编辑附加依赖项。
下载地址:https://github.com/AlexeyAB/darknet#how-to-use
…\darknet-master\build\darknet下打开darknet.vcxproj,把里面CUDA的字段10.0改成10.1
然后就可以正常用VS2015打开darknet.sln了(注意改成release x64)打开属性管理器,视图->其他窗口->属性管理器
右击releasex64打开属性进行相关的配置,保证opencv配置正确
包含目录、库目录
附加依赖项
然后就启动生成darknet
生成成功后会生成darknet.exe文件
之后我们就可以用它进行数据的训练和测试啦。
注意把上面三个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会出现以下结果,表明成功编译。
这里默认我们的数据集已经是建立好了的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文件