前序内容参考这个博主:很好
https://www.cnblogs.com/peacepeacepeace/p/9060229.html
Windows10+YOLOV3+VisualStudio2017最新版本超详细过程
https://blog.csdn.net/KID_yuan/article/details/88380269
参考内容:
https://zhuanlan.zhihu.com/p/45852709
在这里用的是知乎上一博主自己的照片集,主要识别两个任务:库里和杜兰特.
https://github.com/JustTryItNow/YOLO_images_script
我的下载地址为:E:\yolo训练数据集\YOLO_images_script-master
其中train是用来训练的, val是用来测试的
推荐labelImg
[LabelImg使用的步骤可以参考]**(https://cloud.tencent.com/developer/news/325876)**博主写的很详细。
打开labelimg
在开始菜单中找到anaconda prompt,打开
使用cd 命令进入刚刚下载解压的labelimg文件夹,例如:
cd E:\火狐文件下载\labelImg-master(1)\labelImg-master
然后安装pyqt,安装命令:
conda install pyqt=5
安装完成后,执行命令:
pyrcc5 -o resources.py resources.qrc
这个执行完成是没有任何返回结果的
最后,输入命令:
python labelImg.py
在运行python labelImg.py 时可能会遇到报错 No module named ‘libs.resources’
解决方法 把labelImg-master文件夹下的resources.py复制到\labelImg\libs文件夹下面即可解决
标记好的图片是xml形式。
把xml文件转化为txt的代码:
转换文件 test.py
import os
import xml.etree.ElementTree as ET
dirpath = r'D:\\darknet-master\\darknet-master\\build\\darknet\\x64\\data\\1123\\' # 原来存放xml文件的目录
newdir =r'D:\\darknet-master\\darknet-master\\build\\darknet\\x64\\data\\1124\\' # 修改label后形成的txt目录
if not os.path.exists(newdir):
os.makedirs(newdir)
dict_info = {
'smoke': 0,'cup':1} # 有几个 属性 填写几个
#有两个的话就这样写
for fp in os.listdir(dirpath):
if fp.endswith('.xml'):
root = ET.parse(os.path.join(dirpath, fp)).getroot()
xmin, ymin, xmax, ymax = 0, 0, 0, 0
sz = root.find('size')
width = float(sz[0].text)
height = float(sz[1].text)
filename = root.find('filename').text
for child in root.findall('object'): # 找到图片中的所有框
sub = child.find('bndbox') # 找到框的标注值并进行读取
label = child.find('name').text
label_ = dict_info.get(label)
if label_:
label_ = label_
else:
label_ = 0
xmin = float(sub[0].text)
ymin = float(sub[1].text)
xmax = float(sub[2].text)
ymax = float(sub[3].text)
try: # 转换成yolov3的标签格式,需要归一化到(0-1)的范围内
x_center = (xmin + xmax) / (2 * width)
x_center = '%.6f' % x_center
y_center = (ymin + ymax) / (2 * height)
y_center = '%.6f' % y_center
w = (xmax - xmin) / width
w = '%.6f' % w
h = (ymax - ymin) / height
h = '%.6f' % h
except ZeroDivisionError:
print(filename, '的 width有问题')
with open(os.path.join(newdir, fp.split('.xml')[0] + '.txt'), 'a+') as f:
f.write(' '.join([str(label_), str(x_center), str(y_center), str(w), str(h) + '\n']))
print('ok')
这里要注意修改:
dirpath # 原来存放xml文件的目录
和newpath # 修改label后形成的txt目录
我形成的txt目录和转换文件test.py都在data目录下,所以打开Anacond Prompt。如下操作:会发现在形成的txt目录1124中有了相应的txt文件
将原图.jpg文件和刚生成的.txt文件都放在 data\obj目录里,一张图对应一个txt
在darknet-master\build\darknet\x64\data\下 新建train.txt 把训练图片的路径写在文件里面,每行一个路径,如图
在darknet-master\build\darknet\x64 新建yolo-obj.cfg文件(可以直接复制yolov3.cfg,然后重命名为yolo-obj.cfg)
修改这个文件内容:
batch 改成64 :batch=64
subdivisions 改成8 :subdivisions=8
训练的时候如果出现内存溢出错误(Out of memory),可以,将batch改小些(64,32,16,8),将random改成0关闭多尺度训练。
查找每个yolo下(共有3处)的classes改成你自己的类的数量 :classes = N
查找每个yolo上面第一个convolutional下的filters(如图)改成你自己的大小,计算方法是: filters=(classes + 5)x3 ,由于我的是2类,所以我的filters=21. (这个也是只有3处)
在darknet-master\build\darknet\x64\data\下新建obj.names文件,里面写入你的要检测的分类的类名,每个类名占一行。
在darknet-master\build\darknet\x64\data\下新建obj.data文件,像这样
classes代表类别,我检测的两类,所以是2
参考这篇:
https://blog.csdn.net/dz4543/article/details/85302075
下载darknet53.conv.74文件放到build\darknet\x64文件夹里
下载地址:https://pjreddie.com/media/files/darknet53.conv.74
然后cd打开目录: D:\darknet-master\darknet-master\build\darknet\x64
命令输入:darknet.exe detector train data/obj.data yolo-obj.cfg darknet53.conv.74
开始训练,训练过程很长。
训练的时候如果出现内存溢出错误(Out of memory),可以打开darknet-master\build\darknet\x64 目录下的yolo-obj.cfg文件将batch改小些(64,32,16,8),将random改成0关闭多尺度训练。
之后会在目录:D:\darknet-master\darknet-master\build\darknet\x64\backup下生成.weights文件。如图所示:
复制yolo-obj_final.weights到x64目录下。
然后cd打开目录: D:\darknet-master\darknet-master\build\darknet\x64
命令输入:darknet.exe detector test data/obj.data yolo-obj.cfg yolo-obj_final.weights
之后输入检测图片地址。
因为测试集是高考试卷,验证集是模拟考试卷,训练集大概包括很多东西,例如作业题、练习题。
所以用测试集检测。检测结果如下: