当前位置:网站首页>darknet训练yolov4模型
darknet训练yolov4模型
2022-08-02 11:37:00 【凉_白开】
darknet训练yolov4模型
安装darknet环境安装部署
这里以windows环境为例,其他环境看官网说明
- 下载源码
git clone https://github.com/AlexeyAB/darknet.git
- 下载完成后用cmake 打开
Configure >> Generate >> Open Project
然后在vs 上编译出 darknet.exe
在输出文件夹中得到daeknet.exe
准备数据集打标签(以识别篮球为例)
这里用labelImg工具打标签
pip install labelImg
- 新建一个文件夹
- 进入文件夹下在新建两个文件夹cfg和data
用于存放配置文件已经训练数据集 - 进入data文件夹下新建如下如下文件夹和文件
用于存放图片 、图片索引文件 以及标签文件
打开config.data,输入以下内容
这里只识别篮球一个种类 所以classes=1,有多少种类classes就设为多少
打开config.names,输入种类名称 - 将图片移到前面新建的那个images文件夹中用labelImg工具打开文件夹
选择高级模式Advancedmode 和 自动保存 auto save mode
格式选择yolo格式 ,保存位置选择图片文件夹
然后对所有的图片开始打标签
删除图片文件夹里面的classes.txt ,然后将标签文件全部拷贝到labels文件夹里面(注意这里是拷贝过去,images文件夹下存放图片和标签,labels文件夹下存放标签)
将darknet文件夹下的cfg文件夹下面的yolov4_custom.cfg文件拷贝到前面新建的cfg文件夹下并修改以下几个地方
#batch和sub是结合使用的,例如这儿的batch=64,sub=16表示训练的过程中将一次性加载64张图片进内存,然后分16次完成前向传播,
#意思是每次4张,前向传播的循环过程中累加loss求平均,待64张图片都完成前向传播后,再一次性后传更新参数
#调参经验:sub一般设置16,不能太大或太小,且为8的倍数;
#batch的值可以根据显存占用情况动态调整,一次性加减sub大小即可,通常情况下batch越大越好,
#还需注意一点,在测试的时候batch和sub都设置为1,避免发生神秘错误!
batch=64
subdivisions=16
width=416 #将网络的size改为416*416 (需要是32的倍数)
height=416
max_batches = 2000 #训练次数(由于我这里图片比较少,所以先设为2000次,一般设置为classes*2000 ,不要小于训练图片数,也不要小于classes * 2000)
steps=1600,1800 (一般设置为max_batches的80%,90%)
修改所有的yolo层上面的filters=3*(classes + 5),以及yolo层的classes种类数
分离数据集与测试集
- 写个脚本Process.py将数据集和测试集分离出来并将索引记录子txt文件中(这里在网上随便找了一个,也可以自己写一个)
import os
import random
import xml.etree.ElementTree as ET
import pickle
import os
from os import listdir, getcwd
from os.path import join
import math
trainval_percent = 0.2 #测试集比例
train_percent = 0.8 #训练集比例
picSuffix='.jpg' #图片格式
sets = ['train', 'test','val']
labelfilepath = 'data/labels'
txtsavepath = 'data/ImageSets'
total_label = os.listdir(labelfilepath)
def StepOne():
num = len(total_label)
list = range(num)
tv = int(num * trainval_percent)
tr = int(tv * train_percent)
#tv = int(num * trainval_percent)
#tr = int(tv * train_percent)
trainval = random.sample(list, tv)
train = random.sample(trainval, tr)
ftrainval = open('data/ImageSets/trainval.txt', 'w')
ftest = open('data/ImageSets/test.txt', 'w')
ftrain = open('data/ImageSets/train.txt', 'w')
fval = open('data/ImageSets/val.txt', 'w')
for i in list:
name = total_label[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()
def StepTow():
for image_set in sets:
if not os.path.exists('data/labels/'):
os.makedirs('data/labels/')
image_ids = open('data/ImageSets/%s.txt' % (image_set)).read().strip().split()
list_file = open('data/%s.txt' % (image_set), 'w')
for image_id in image_ids:
list_file.write('data/images/%s%s\n' % (image_id,picSuffix))
list_file.close()
if __name__ == "__main__":
StepOne()
StepTow()
- 运行脚本,在data文件夹下以及data/Imagesets文件夹下生成下面这些文件
python Process.py
下载预训练模型
data同级目录下新建weights文件夹,并下载预训练模型存放其中
下载预训练模型
重定anchors
anchors其实就是在训练之前人为设定的先验框,网络输出结果的框就是在anchors的基础上进行调整的。所以说先验框设定的好坏对于模型的输出效果影响还是挺大的。在yolo中一般设定一个物体的先验框的个数一般是9个
- 从darknet的编译目录下找darknet.exe这个可执行文件,我们这里是在Release下,将其拷贝到我们这个工程路径下(data同级路径下)
- 从darknet目录下拷贝pthreadVC2.dll文件到这里
- 运行命令算出anchors
darknet.exe detector calc_anchors data/config.data -num_of_clusters 9 -width 416 -height 416
未完待续
边栏推荐
- Oracle 单实例19.11升级到19.12
- Create a devops CI/CD process using the kubesphere GUI
- Learning Experience Sharing Seven: YOLOv5 Code Chinese Comments
- FinClip | 来了, 2022 年 7 月更新大盘点
- 【MySQL】多表联合查询、连接查询、子查询「建议收藏」
- 【kali-信息收集】(1.9)Metasploit+搜索引擎工具Shodan
- idea常用插件
- 使用kubesphere图形界面创建一个应用操作流程
- OSI 七层模型和TCP/IP模型及对应协议(详解)
- MapStruct
猜你喜欢
随机推荐
C#/VB.NET 添加多行多列图片水印到Word文档
爆款视频怎么做?这里或许有答案!
21天学习挑战赛--第一天打卡(屏幕密度)
Create a devops CI/CD process using the kubesphere GUI
yolo格式(txt)数据集转VOC(xml)
When not to use () instead of Void in Swift
[kali-information collection] (1.8) ARP reconnaissance tool _Netdiscover
C#为listview选中的项添加右键菜单
使用kubesphere图形界面创建一个devops的CI/CD流程
The sitcom "Re-Walking the Long March" was staged
npm run serve启动报错npm ERR Missing script “serve“
华为eNSP(基础实验通信)
What is the future of smartwatches?
Swift中什么时候不能用 () 代替 Void 来使用
细学常用类,集合类,IO流
Excel动态图制作
Mysql transaction isolation level and MVCC (multi-version concurrency control)
小程序插件的生态丰富,加速开发建设效率
有奖征集|TaoCloud&宝德联合举办全闪POC!
SQL函数 $TRANSLATE