这篇文章主要介绍了win10下YOLOV4训练自己的数据日志的讲解,通过具体代码实例进行16564 讲解,并且分析了win10下YOLOV4训练自己的数据日志的详细步骤与相关技巧,需要的朋友可以参考下https://www.b2bchain.cn/?p=16564
本文实例讲述了2、树莓派设置连接WiFi,开启VNC等等的讲解。分享给大家供大家参考文章查询地址https://www.b2bchain.cn/7039.html。具体如下:
小白日记
- 前言
- 一、使用vs2019生成darknet.exe
-
- 1.下载yolov4
- 2.复制opencv的dll文件
- 3.vs2019项目配置
- 4.拷贝CUDA文件
- 5.点击生成方案或者重新生成方案
- 二、权重文件
-
- 1.下载yolov4.weights以及yolov4.conv.137
- 三、制作自己的数据集
- 四、修改cfg,names,data文件
- 五、开始训练
前言
基于win10系统,环境配置在上一篇博客。使用的是darknet下的YOLOv4。
一、使用vs2019生成darknet.exe
1.下载yolov4
https://github.com/AlexeyAB/darknet
保存至D:opencv,并命名为darknet
2.复制opencv的dll文件
将D:opencvopencvbuildx64vc15bin下的opencv_ffmpeg340_64.dll和opencv_world340.dll复制到
D:opencvdarknetbuilddarknetx64
3.vs2019项目配置
修改darknet.vcxproj,打开x64下的文件,将10.0改为10.1,因为我自己用的CUDA版本是10.1.
打开vs2019,打开项目或解决方案,darknet.sln
1项目属性配置:
选择release和x64
2对darknet右键->属性 注意同样选release和x64,同时检查注意检查Windows SDK版本和平台工具
3修改vc++中的包含目录和库目录和链接器
包含目录添加:
D:opencvopencvbuildinclude D:opencvopencvbuildincludeopencv D:opencvopencvbuildincludeopencv2
库目录添加:
D:opencvopencvbuildx64vc15lib
链接器->输入->添加依赖项:
D:opencvopencvbuildx64vc15libopencv_world410.lib
4.拷贝CUDA文件
将第一个文件夹下的文件拷贝到第二个文件夹下:
D:CUDAVisualStudioIntegrationextrasvisual_studio_integrationMSBuildExtensions
C:Program Files (x86)Microsoft Visual Studio2019CommunityMSBuildMicrosoftVCv160BuildCustomizations
懒得放自己的,反正已经放了。
5.点击生成方案或者重新生成方案
生成darknet.exe则vs编译成功。
参考地址
二、权重文件
1.下载yolov4.weights以及yolov4.conv.137
下载地址
密码:0sti
放置于darknet的x64文件夹下
完成之后可测试图片:
darknet.exe detector test cfgcoco.data cfgyolov4.cfg yolov4.weights datadog.jpg
三、制作自己的数据集
1.下载数据集
visdrone2019数据集
2.整理数据集
将数据集配置为voc格式
其中annotations中放置的是voc格式的xml文件。(生成)
imagesets下有main文件,放置train.txt,test.txt,val.txt三个txt文件,内容为图片序号。(生成)
JPEGimages放置原jpg文件(需按序号排列)
labels放置yolo格式的txt文件(生成)
3.数据集格式转换
(1)JPEGImages和Annotations按顺序重命名
rename.py
import os class ImageRename(): def __init__(self): self.path = 'D:/opencv/darknet/build/darknet/x64/VOCdevkit/VOC2017/JEPGImages' #需要将图片命名的文件夹路径 def rename(self): filelist = os.listdir(self.path) totalnum = len(filelist) i = 1 for item in filelist: if item.endswith('.jpg'): src = os.path.join(os.path.abspath(self.path),item) dst = os.path.join(os.path.abspath( self.path),format(str(i),'0>5s') + '.jpg') #4为位数,如0001. os.rename(src,dst) i = i + 1 if __name__ == '__main__': newname = ImageRename() newname.rename()
(2)将visdrone的txt文件转为voc的xml文件
main.py
import os from PIL import Image root_dir = "D:/opencv/darknet/build/darknet/x64/VOCdevkit/VOC2017/" annotations_dir = root_dir+"Annotations_voc/" image_dir = root_dir + "JEPGImages/" xml_dir = root_dir+"labels/" class_name = ['ignored regions','pedestrian','people','bicycle','car','van','truck','tricycle','awning-tricycle','bus','motor','others'] #因为使用visdrone数据集,所以这里不改 for filename in os.listdir(annotations_dir): fin = open(annotations_dir+filename, 'r') image_name = filename.split('.')[0] img = Image.open(image_dir+image_name+".jpg") xml_name = xml_dir+image_name+'.xml' with open(xml_name, 'w') as fout: fout.write('<annotation>'+'n') fout.write('t'+'<folder>VOC2007</folder>'+'n') fout.write('t'+'<filename>'+image_name+'.jpg'+'</filename>'+'n') fout.write('t'+'<source>'+'n') fout.write('tt'+'<database>'+'VisDrone2019 Database'+'</database>'+'n') fout.write('tt'+'<annotation>'+'VisDrone2019'+'</annotation>'+'n') fout.write('tt'+'<image>'+'flickr'+'</image>'+'n') fout.write('tt'+'<flickrid>'+'Unspecified'+'</flickrid>'+'n') fout.write('t'+'</source>'+'n') fout.write('t'+'<owner>'+'n') fout.write('tt'+'<flickrid>'+'wang hx'+'</flickrid>'+'n') fout.write('tt'+'<name>'+'wang hx'+'</name>'+'n') fout.write('t'+'</owner>'+'n') fout.write('t'+'<size>'+'n') fout.write('tt'+'<width>'+str(img.size[0])+'</width>'+'n') fout.write('tt'+'<height>'+str(img.size[1])+'</height>'+'n') fout.write('tt'+'<depth>'+'3'+'</depth>'+'n') fout.write('t'+'</size>'+'n') fout.write('t'+'<segmented>'+'0'+'</segmented>'+'n') for line in fin.readlines(): line = line.split(',') fout.write('t'+'<object>'+'n') fout.write('tt'+'<name>'+class_name[int(line[5])]+'</name>'+'n') fout.write('tt'+'<pose>'+'Unspecified'+'</pose>'+'n') fout.write('tt'+'<truncated>'+line[6]+'</truncated>'+'n') fout.write('tt'+'<difficult>'+str(int(line[7]))+'</difficult>'+'n') fout.write('tt'+'<bndbox>'+'n') fout.write('ttt'+'<xmin>'+line[0]+'</xmin>'+'n') fout.write('ttt'+'<ymin>'+line[1]+'</ymin>'+'n') # pay attention to this point!(0-based) fout.write('ttt'+'<xmax>'+str(int(line[0])+int(line[2])-1)+'</xmax>'+'n') fout.write('ttt'+'<ymax>'+str(int(line[1])+int(line[3])-1)+'</ymax>'+'n') fout.write('tt'+'</bndbox>'+'n') fout.write('t'+'</object>'+'n') fin.close() fout.write('</annotation>')
(3)将xml文件转换为yolo的txt文件
voc_label.py,放置在x64文件下
import xml.etree.ElementTree as ET import pickle import os from os import listdir, getcwd from os.path import join sets=[ ('2017', 'train'), ('2017', 'val'), ('2017', 'test')] classes = ["car"] def convert(size, box): dw = 1./size[0] dh = 1./size[1] x = (box[0] + box[1])/2.0 y = (box[2] + box[3])/2.0 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.jpgn'%(wd, year, image_id)) convert_annotation(year, image_id) list_file.close()
(4)生成train.txt ,在x64下
make_train_val.py
import os from os import listdir, getcwd from os.path import join if __name__ == '__main__': source_folder='D:/opencv/darknet/build/darknet/x64/VOCdevkit/VOC2017/JEPGImages'#地址是所有图片的保存地点 dest='D:/opencv/darknet/build/darknet/x64//VOCdevkit/VOC2017/ImageSets/Main/train.txt' #保存train.txt的地址,对于train.txt(在ImageSets/Main/下)和2019_train.txt(在VOCdevkit下)是不同的路径 dest2='D:/opencv/darknet/build/darknet/x64//VOCdevkit/VOC2017/ImageSets/Main/val.txt' #保存val.txt的地址,对于val.txt(在ImageSets/Main/下)和2019_val.txt(在VOCdevkit下)是不同的路径 file_list=os.listdir(source_folder) #赋值图片所在文件夹的文件列表 train_file=open(dest,'a') #打开文件 val_file=open(dest2,'a') #打开文件 for file_obj in file_list: #访问文件列表中的每一个文件 file_path=os.path.join(source_folder,file_obj) #file_path保存每一个文件的完整路径 file_name,file_extend=os.path.splitext(file_obj) #file_name 保存文件的名字,file_extend保存文件扩展名 file_num=int(file_name) if(file_num<1289): #保留1288个文件用于训练 train_file.write(file_name+'n') #用于训练前1288个的图片路径保存在train.txt里面,结尾加回车换行/生成train.txt是file_name;生成2019_train.txt是file_path else : val_file.write(file_name+'n') #其余的文件保存在val.txt里面/生成val.txt是file_name;生成2019_val.txt是file_path train_file.close()#关闭文件 val_file.close()
(5)生成train_2017.txt文件
make_2017_train_val.py
import os from os import listdir, getcwd from os.path import join if __name__ == '__main__': source_folder = 'D:/opencv/darknet/build/darknet/x64/VOCdevkit/VOC2017/JEPGImages' # 地址是所有图片的保存地点 dest = 'D:/opencv/darknet/build/darknet/x64/2017_train.txt' # 保存train.txt的地址,对于train.txt(在ImageSets/Main/下)和2019_train.txt(在VOCdevkit下)是不同的路径 dest2 = 'D:/opencv/darknet/build/darknet/x64/2017_test.txt' #保存val.txt的地址,对于val.txt(在ImageSets/Main/下)和2019_val.txt(在VOCdevkit下)是不同的路径 file_list=os.listdir(source_folder) #赋值图片所在文件夹的文件列表 train_file=open(dest,'a') #打开文件 val_file=open(dest2,'a') #打开文件 for file_obj in file_list: #访问文件列表中的每一个文件 file_path=os.path.join(source_folder,file_obj) #file_path保存每一个文件的完整路径 file_name,file_extend=os.path.splitext(file_obj) #file_name 保存文件的名字,file_extend保存文件扩展名 file_num=int(file_name) if(file_num<1289): #保留1289个文件用于训练 train_file.write(file_path+'n') #用于训练前1289个的图片路径保存在train.txt里面,结尾加回车换行/生成train.txt是file_name;生成2019_train.txt是file_path else : val_file.write(file_path+'n') #其余的文件保存在val.txt里面/生成val.txt是file_name;生成2017_val.txt是file_path train_file.close()#关闭文件 val_file.close()
四、修改cfg,names,data文件
1.修改D:opencvdarknetbuilddarknetx64cfg下的yolov4-voc.cfg
[net] # Testing #batch=1 #subdivisions=1 # Training batch=16 #一批训练样本的样本数量 subdivisions=64 width=416 #增大会增加网络分辨率,有助于提高检测精度 height=416 channels=3 momentum=0.949 #动态参数 decay=0.0005 #权重衰减正则项 angle=0 #数据增强参数,通过调整旋转角度生成更多训练样本 saturation = 1.5 #数据增强参数,通过调整饱和度来生成更多训练样本 exposure = 1.5 #数据增强参数,通过调整曝光量来生成更多训练样本 hue=.1 #数据增强参数,通过调整色调来生成更多训练样本 learning_rate=0.001 #学习率,决定权值更新的速度 burn_in=1000 #在迭代次数大于burn_in时,采用policy的更新方式 max_batches = 4000 #最大迭代次数,一般为classes*2000,但最小为4000 policy=steps steps=3200,3600 #设置学习率的变化,steps=80%,90%max_batches scales=.1,.1 #表示迭代到3200次时,学习率衰减10倍,3600次时,再衰减10倍
ctrl +f 搜索yolo,修改三处的filters以及classes
显存不足时,batch调小,subdivisions调高(8.16.64)
2.修改D:opencvdarknetbuilddarknetx64data下的
voc.data和voc.names
classes= 1 train = 2017_train.txt valid = 2017_test.txt names = data/car.names backup = backup/ #保存权重地址
car
配置完成。
五、开始训练
训练命令:
darknet.exe detector train datavoc.data cfgyolov4-voc.cfg yolov4.conv.137 -map
未完待续。。。
darknet.exe detector train datavoc.data cfgyolov4-voc.cfg yolov4.conv.137 -show_imgs
mAP统计@iou=0.50
darknet.exe detector map datavoc.data cfgyolov4-test.cfg backupyolov4.weights
mAP统计@iou=0.75
darknet.exe detector map datavoc.data cfgyolov4-test.cfg backupyolov4.weights -iou_thresh 0.75
总结
本文转自互联网,侵权联系删除win10下YOLOV4训练自己的数据日志
最新评论