首先学会科学上网 cmake opencv github cuda cudnn都需要一些上网能力
否则会浪费很多时间(能花20块钱解决的事为什么要浪费自己20个小时)
硬件环境:intel 酷睿处理器 + nvidia 显卡 (rtx20系以上 + gtx 1060 以上)
软件环境: VS2019/2022 ---> CUDA + CUDNN --->OPENCV --> CMAKE --> 项目生成
项目路径:
GitHub - pjreddie/darknet: Convolutional Neural Networks
配环境教程:Win10搭建GPU版Darknet——VS2019+CUDA+CUDNN篇_cuda darknet-CSDN博客
(随便找的,类似的都可以看,安装顺序一定要对)
一. yolo-darknet数据集文件介绍及准备
首先我们要了解Darknet工程需要什么去训练数据
其有三个重要文件
① 图像和标签共同放在同一个大文件夹【obj】
② obj.data 设定类别数/测试集路径和训练集路径
③obj.names 所有标签名(请一一对应classes的顺序)
还有一个助手脚本文件,用Python语言编写,用于划分生成指向数据的 test.txt 和 trainval.txt 的脚本
这里是我用的 yolo_split_train_val.py 脚本
# coding:utf-8
import os
import random
import argparse
parser = argparse.ArgumentParser()
# xml文件的地址,根据自己的数据进行修改 xml一般存放在Annotations下
parser.add_argument('--xml_path', default='E:/AAA___Dataset/fan/obj', type=str, help='input xml label path')
# 数据集的划分,地址选择自己数据下的ImageSets/Main
parser.add_argument('--txt_path', default='E:/AAA___Dataset/fan', type=str, help='output txt label path')
opt = parser.parse_args()
trainval_percent = 1.0
train_percent = 0.9
xmlfilepath = opt.xml_path
txtsavepath = opt.txt_path
total_xml = os.listdir(xmlfilepath)
if not os.path.exists(txtsavepath):
os.makedirs(txtsavepath)
num = len(total_xml)
list_index = range(num)
tv = int(num * trainval_percent)
tr = int(tv * train_percent)
trainval = random.sample(list_index, tv)
train = random.sample(trainval, tr)
file_trainval = open(txtsavepath + '/trainval.txt', 'w')
file_test = open(txtsavepath + '/test.txt', 'w')
file_train = open(txtsavepath + '/train.txt', 'w')
file_val = open(txtsavepath + '/val.txt', 'w')
# 这里的 name 要根据个人需要修改,主要目的是让txt的路径定位到每一张图片中
for i in list_index:
name0 = total_xml[i][:-4] + '.png' + '\n'
if i in trainval:
name1 = 'E:/AAA___Dataset/fan/obj/' + name0
file_trainval.write(name1)
if i in train:
name2 = 'E:/AAA___Dataset/fan/obj/' + name0
file_train.write(name2)
else:
name3 = 'E:/AAA___Dataset/fan/obj/' + name0
file_val.write(name3)
file_test.write(name3)
file_trainval.close()
file_train.close()
file_val.close()
file_test.close()
使用该脚本即可将数据划分成训练集 trainval.txt 和测试集test.txt,其中内容的每一行指向大文件夹【obj】中的数据绝对路径,从而在训练中读取
【 如果数据集是VOC(文件后缀为. xml) 则要用脚本将xml数据转成 txt 再和图片一起放入obj 文件夹中】
二. 划分数据并放入yolov4-darknet 工程中
D:\darknet-master【darknet工程】\build\darknet\x64【生成项目的路径,也就是darknet.exe程序所在的地方】\【DataSet【数据集总目录】\【自己数据集的目录】
创建obj文件夹,将所有Imange和annotations全部复制进去
(要一一对应,不然就手动排查)
回到数据集的路径,根据自己数据集的图片格式&darknet数据的路径修改yolo_split_trainval.py 的部分代码,随后在地址处点击,清空后输入cmd+回车调出终端,使用该脚本
将得到的划分文件复制进darknet工程的的对应路径下
三. 修改文档及代码
(1)修改 obj.names 将原数据集中class.txt的类别复制进names中
(2)修改 obj .data
(3)修改 cfg filter= (class + 5 )*3
(4)修改traval.txt test.txt val.txt下所有相对路径为绝对路径(如果已经是了就不用修改)
四. 开始训练
到darknet.exe所在文件夹\build\darknet\x64下面 点击路径清空后输出cmd调出终端窗口
输入 darknet.exe detector train DataSet/Armor/obj.data【改为自己的路径】 DataSet/Armor/yolov4-ar.cfg【改为自己对应文件的路径】 yolov4-tiny.conv.29 29 【这是预训练模型的路径,在github项目工程中可以找到,或者善用检索工具在网上寻找】
回车,即可开始训练