如何训练yolov3的权重文件
首先根据yolo官网的教程下载darknet,并且将yolov3.weights拖到darknet的文件中去,然后,可以尝试初次调用yolov3.weights来识别data里的文件,但是鉴于看这篇文章的基本可能是小白,所以呀,我就用记流水线的方法手把手教,下面,系好安全带,开启奇妙的yolov3之旅吧
1.初次使用yolov3
打开终端,我一般是习惯把终端的位置切到桌面,这样下载的图片文件呀啥的都会在桌面。
然后在终端输入代码
git clone https://github.com/pjreddie/darknet #这个下载在外网下。肯定是比较慢的,就等着呗。
cd darknet
make
wget https://pjreddie.com/media/files/yolov3.weights
#这一步呢是下载权重文件也就是yolov3.weights的权重文件,但除非你用vpn翻墙了,否则必定是下载失败
的哈哈,我给个百度云的链接吧,你自己去下。[点这里](https://pan.baidu.com/s/1HTJ1rT_-yW6jgNnHaRZ2hQ)密码
是1234。
下完之后把这个文件拖到darknet的文件里就行了。
然后输入
./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg
正常的话就会出现
反正我当时看到这张图片还觉得挺有成就感的哈哈,不过不得不告诉你,这真的就是皮毛。
2.权重文件训练
就拿我这次的浙江省机器人大赛的视觉部分来举例子吧
我如果要准确识别这几张图片的话应该要怎么办呢?
第一步
下载lamblmg
这是个啥呢,这是个标标签的软件,他是能够在windows和llinux里运行的,但是我个人就比较喜欢在linux中标标签,我下面也讲一讲怎么安装这个软件吧。先git clone https://blog.csdn.net/qq_38153833/article/details/88706913
首先还是那句话,最好先把终端切到labelImg文件夹打开然后再进行后续操作
sudo apt-get install pyqt5-dev-tools
sudo pip3 install -r requirements/requirements-linux-python3.txt
make qt5py3 #前面三步是安装这个软件
python3 labelImg.py #这一步就是打开labelImg这个软件的操作,也就是说你以后每次要打开这个软件就要先把终端
切到桌面,然后输入这一行代码。
还有不清楚的就看下官网链接点这里
具体他是咋使用官网也有教程,或者可以看看这个博主写的,点这里
第二步
把做好的jpg图片和xml标签文件分别放在名叫JPEGImages和Annotations然后,在darknet里面新建一个VOCdevkit文件,这个文件里再新建一个VOC2008,然后再在这个VOC2008里面新建ImageSets和labels文件然后把JPEGImages和Annotations都拖到这个VOC2008里面,然后再在ImageSets里面新建一个Main文件夹,然后再在VOC2008里新建一个voc_2008.py的文件,文件的内容是
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()
然后在终端运行python3 voc_2008.py
这时会在在ImageSets 下的main文件夹产生随机分割后的训练集测试集路径文件。
随后在darknet主目录下建立voc_label.py文件并运行python3 voc_label.py
,voc_label.py的作用是将所有标注的xml文件转化成txt文件,因为YOLO支持读取的数据只是txt格式,代码如下:
import xml.etree.ElementTree as ET
import pickle
import os
from os import listdir, getcwd
from os.path import join
sets=[('2008', 'train'), ('2008', 'val'), ('2008', 'test')]
classes = ["knife"]
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('VOCdevkit/VOC%s/Annotations/%s.xml'%(year, image_id))
out_file = open('VOCdevkit/VOC%s/labels/%s.txt'%(year, 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'):
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('VOCdevkit/VOC%s/labels/'%(year)):
os.makedirs('VOCdevkit/VOC%s/labels/'%(year))
image_ids = open('VOCdevkit/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('%s/VOCdevkit/VOC%s/JPEGImages/%s.jpg\n'%(wd, year, image_id))
convert_annotation(year, image_id)
list_file.close()
然后在darknet主目录下新建voc.data和voc.names两个文件,然后voc.data的内容是:
classes= 8 #几种东西就写几,比如我上面机器人有8种,这里就写8
train = 2008_train.txt
valid = 2008_val.txt
names = voc.names
backup = backup
voc.names内容:
#就是这八种东西的标签名字,你标签定的是哪八个,就在这里写那八个的名字,就是一行一个一行一个那种
RB
S
AD
T
C
M
RS
BS
最后一个要修改的就是yolov3.cfg文件,这个文件呢是在darknet的cfg文件里面的,直接用文本编辑器打开,然后修改内部文件里面的参数。
# Testing
# batch=1
# subdivisions=1
# Training
batch=64 #注意训练的时候把这一行和下一行的#符号删去,然后把这个文件第二行和第三行开头分别加上#符号。
subdivisions=16
width=416 #原本为608,看情况具体调节
height=416
...........#省略中间
...........
...........
...........
...........
[convolutional]
size=1
stride=1
pad=1
filters=18 #计算公式为3*(classes+5),比如我只有8类,那filters算出来为39
activation=linear
[yolo]
mask = 6,7,8
anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326
classes=8 #数据集的类别数量,我这是八类
num=9
jitter=.3
ignore_thresh = .5
truth_thresh = 1
random=1 #随机使用不同尺寸的图片进行训练,具体看自己设备配置调节,显存不够就关闭多尺度,把1改成0
..............#省略一段
..............
[convolutional]
size=1
stride=1
pad=1
filters=18 #计算公式为3*(classes+5),比如我只有8类,那filters算出来为39
activation=linear
[yolo]
mask = 6,7,8
anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326
classes=1 #数据集的类别数量
num=9
jitter=.3
ignore_thresh = .5
truth_thresh = 1
random=1 #随机使用不同尺寸的图片进行训练,具体看自己设备配置调节,显存不够就关闭多尺度,把1改成0
..............#省略一段
..............
[convolutional]
size=1
stride=1
pad=1
filters=18 #计算公式为3*(classes+5),比如我只有一类,那filters算出来为39
activation=linear
[yolo]
mask = 6,7,8
anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326
classes=1 #数据集的类别数量
num=9
jitter=.3
ignore_thresh = .5
truth_thresh = 1
random=1 #随机使用不同尺寸的图片进行训练,具体看自己设备配置调节,显存不够就关闭多尺度,把1改成0
然后再下载一个darknet53.conv.74文件放到darkent文件里面,这个文件给个百度云链接点这里密码:1234。
终端运行命令然后就开始训练了。
./darknet detector train voc.data cfg/yolov3.cfg darknet53.conv.74
注意奥,一般的gpu不好的电脑真的就很拉跨,训练的很慢,然后,这个训练是不会停的,也就是说,你是要到你想要的轮次的时候再按ctrl+c停止。然后把yolov3.cfg里面第2,3行#去掉,5,6行#加上。
然后右键打开终端./darknet detector test voc.data cfg/yolov3.cfg backup/yolov3.backup data/xxx.jpg
然后你再通过看照片上框的对不对,准确率高不高就可以大致对你训练出来的模型效果有个大致的判断啦。
参考链接:https://blog.csdn.net/weixin_42747301/article/details/96636614
`等我之后有空的话再写一个yolov3-tiny的权重文件训练,大致差不多,然后再铺设个树莓派的darknet-nnpack的环境,调用训练好的yolov3-tiny的权重文件,速度挺快,1秒左右。