区块链技术博客
www.b2bchain.cn

win10下YOLOV4训练自己的数据日志

这篇文章主要介绍了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.dllopencv_world340.dll复制到
D:opencvdarknetbuilddarknetx64

3.vs2019项目配置

修改darknet.vcxproj,打开x64下的文件,将10.0改为10.1,因为我自己用的CUDA版本是10.1.
打开vs2019,打开项目或解决方案,darknet.sln
win10下YOLOV4训练自己的数据日志
1项目属性配置:
选择release和x64
win10下YOLOV4训练自己的数据日志
2对darknet右键->属性 注意同样选release和x64,同时检查注意检查Windows SDK版本和平台工具
win10下YOLOV4训练自己的数据日志3修改vc++中的包含目录和库目录和链接器
包含目录添加:

D:opencvopencvbuildinclude D:opencvopencvbuildincludeopencv  D:opencvopencvbuildincludeopencv2 

库目录添加:

D:opencvopencvbuildx64vc15lib 

链接器->输入->添加依赖项:

D:opencvopencvbuildx64vc15libopencv_world410.lib 

win10下YOLOV4训练自己的数据日志
win10下YOLOV4训练自己的数据日志

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格式
win10下YOLOV4训练自己的数据日志
其中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训练自己的数据日志

赞(0) 打赏
部分文章转自网络,侵权联系删除b2bchain区块链学习技术社区 » win10下YOLOV4训练自己的数据日志
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

b2b链

联系我们联系我们