nx上darknet的使用-目标检测-自定义训练与制作预训练模型

news2024/9/22 13:37:25

目录

1  训练yolov4-tiny

1.1  文件准备

1.1.1  Annotations

1.1.2  JPEGImages

1.1.3  labels

1.1.4  trained_models

1.1.5  classes.name

1.1.6  create_labels_txt.py

1.1.7  custom_training.data

1.1.8  get_labels.py

1.1.9  get_train_val.py

1.1.10  train.txt

1.1.11  val.txt

1.1.12  yolov4-tiny.cfg

1.1.13  yolov4-tiny.conv.29

1.1.14  yolov4-tiny-test.cfg

1.2  训练过程

1.3  训练结果

2  制作预训练模型


1  训练yolov4-tiny

首先在darknet创建一个文件夹custom_training

文件夹中包含这些文件

我们从左往右来讲,在文章的最后有识别效果,如果想先看效果的可以拉下去,看完再拉上来

1.1  文件准备

1.1.1  Annotations

获取方式:标注软件标注图像后获得

这里面放的都是标注好的xml文件,使用不同的标注软件标注结果可能略有不同,但xml的文件格式都是一样的,我们打开一个看一下

下面这个xml是一个图中只有一个框子的

下面这个是一个图中有多个框子的

1.1.2  JPEGImages

获取方式:把标注的图像放进去

这里面放的都是被标注的图片,注意要与标注文件对应(比如0.jpg与0.xml)

1.1.3  labels

获取方式:由create_labels_txt.py转换xml文件获得

这个文件夹中都是放的xml转换过来的项目专用的txt文件(我们后面有一个文件专门转换它),由于是转换过来的,所以自然也是与图像一一对应的

我们打开一个看一下

下面这个是一个框的情况,发现里面有5个数,这5个数的含义依次是

  1. 标签号,从0开始
  2. 标注框的中心点x坐标 除 图像宽度 的比值
  3. 标注框的中心点y坐标 除 图像高度 的比值
  4. 标注框的宽度 除 图像宽度 的比值
  5. 标注框的高度 除 图像高度 的比值

我们下面再看一个多个框的情况

有几个框就有几行,最后不要有换行符

1.1.4  trained_models

创建一个空的文件夹就行了,这个文件夹是专门放训练好的模型文件的,没训练之前文件夹中是空的

在训练之后每1000个batch会自动保存一次,我训练了4000个batch,现在里面是这样的

后面要用的话用 yolov4-tiny_final.weights就可以了

1.1.5  classes.name

获取方式:用记事本写一个文件,后缀为.name就可以了

这里面写的是所有标注的标签,有几个就写几个,标签用换行符隔开,最后一行末尾没有换行符

我再举个例子

这里的顺序要与后续create_labels_txt.py的顺序一致

如果你不知道有多少标签,后面可以通过get_labels.py来查询

1.1.6  create_labels_txt.py

获取方式:一个py文件

文件中的内容是这样的

import xml.etree.ElementTree as ET
import os
import re
 
with open('classes.names','r') as f:
    classes = f.read().splitlines()
 
p = re.compile(r'(.*)\.')
for i in os.listdir('Annotations'):
    i = p.findall(i)[0]
    xml_file = '/home/nvidia/darknet/custom_training/Annotations/{}.xml'.format(i)
    tree = ET.parse(xml_file)
    root = tree.getroot()
 
    for size in root.iter('size'):
        width = int(size.find('width').text)
        height = int(size.find('height').text)
 
    all_content = ''
    for obj in root.iter('object'):
        cls = obj.find('name').text
        cls_id = classes.index(cls)
 
        xmlbox = obj.find('bndbox')
        xmin = int(xmlbox.find('xmin').text)
        ymin = int(xmlbox.find('ymin').text)
        xmax = int(xmlbox.find('xmax').text)
        ymax = int(xmlbox.find('ymax').text)
 
        x = (xmin+xmax)/2/width
        y = (ymin+ymax)/2/height
        w = (xmax-xmin)/width
        h = (ymax-ymin)/height
 
        one_content = '{} {:.4f} {:.4f} {:.4f} {:.4f}'.format(cls_id,x,y,w,h)
        all_content = all_content + one_content + '\n'
 
    all_content = all_content.strip('\n')
    file = open('./labels/{}.txt'.format(i),'w')
    print(all_content,file=file,flush=True)

有几个参数需要随着数据集变动

  • classes 这个是训练的标签,需要与classes.name的内容一致,注意顺序也要一致
  • xml_file 放的是Annotations中xml的文件,我这里放的绝对路径,也可以放相对路径
  • xmin,ymin,ymin,ymax 我不确定所有的标注文件是否都是这四个点(有的可能是直接给宽度),如果你的xml文件中写的是别的,那么你就对应改一下

  • cls_id 这个是labels中产生txt的第一个内容
  • x,y,w,h 这四个就是labels中产生的txt的后四个内容

如果按照我写的结构放置文件的话,直接运行就可以了

1.1.7  custom_training.data

获取方式:用记事本写,后缀改为data,最后一行末尾没有换行符

这里的信息的含义如下,注意所有路径都是绝对路径

字段含义
classes类别总数
traintrain.txt的绝对路径,train.txt我们后面会提到
validval.txt的绝对路径,val.txt我们后面会提到
namesclasses.name的绝对路径
backuptrained_models的绝对路径,注意后面要再加一个斜杠

1.1.8  get_labels.py

原理是用python的set()变量,set()变量中的元素不重复,访问xml中的name,将所有的内容添加的set中

1.1.9  get_train_val.py

这个是用来辅助创建train.txt与val.txt的

import os
 
a = 0
train_txt = open('train.txt','w')
val_txt = open('val.txt','w')
for i in os.listdir('JPEGImages'):
    a = a + 1
    if a < 15712: #train
        print('/home/nvidia/darknet/custom_training/JPEGImages/' + i,file=train_txt,flush=True)
    else: #test
        print('/home/nvidia/darknet/custom_training/JPEGImages/' + i,file=val_txt,flush=True)

6065是我当前有7581张图片,我想选择其中的80%(6065张)作为训练图片,其余的作为测试图片

1.1.10  train.txt

获取方式:笔记本搞

这里放的是训练图像的绝对路径

1.1.11  val.txt

获取方式:笔记本搞

这里放的是所有测试图像的绝对路径,方法与train.txt相同,让其余图像作为测试图像

1.1.12  yolov4-tiny.cfg

获取方式:在darkent的cfg中有,复制过来

yolov4-tiny.cfg与其余的yolo模型修改起来差不多,我比较常用yolov4-tiny.cfg与yolov4-custom.cfg,这两个cfg文件在这个文件夹中都有,tiny速度快但精度差,custom精度高但速度慢,下面说几个经常改的参数

  • batch与subdivisions

训练模型时可能会出现CUDA爆掉的情况,这个时候我们需要修改batch与subdivisions,batch是会影响训练结果的,太小是不行的,subdivisions的意思是把batch分成多少份,我下面这种图就是batch为64,然后把batch再分成64份一点一点儿给,这样就不会出现CUDA爆掉的问题了

  • width与height

这个并不是图像的宽与高,这个实际上是模型的输入大小,宽和高必须为32的倍数

你的模型宽高越大,训练时间越长,模型越精准,预测的更慢

你的模型宽高越小,训练时间越短,模型越不精准,预测的更快

  • learning_rate

learning_reate是学习速率,我们在训练的过程中可能会出现loss为NaN的情况,这个时候就不用再训练了,这个情况叫梯度爆炸或梯度消失,这个时候可以尝试改一下学习率

  • max_batches与steps

在帮助文档中建议 max_batches的值设置为(种类数)*2000

step有两个值,第一个值是max_batches的80%,第二个值是max_batches的90%

  • classes与filters

classes是训练的类别数量,比如你要识别5种不同的东西classes就给5,识别7种类别不同的东西就给7

filters计算公式为(种类数+5)*3,我下面图片种类数为2,所以这里的filters是21

在yolov4-custom.cfg中一共有三处,在yolv4-tiny.cfg有两处,都要改

1.1.13  yolov4-tiny.conv.29

获取方式:从我上面的网盘链接中搞,或者用这个github链接 https://github.com/AlexeyAB/darknet/releases/download/darknet_yolo_v4_pre/yolov4-tiny.conv.29

这个链接是在项目 GitHub - AlexeyAB/darknet: YOLOv4 / Scaled-YOLOv4 / YOLO - Neural Networks for Object Detection (Windows and Linux version of Darknet ) 中的这里

1.1.14  yolov4-tiny-test.cfg

获取方式:把yolov4-tiny.cfg复制过来,然后改一些东西

只改batch,把下面的batch注释掉

这个其实你改不改都行,在测试的时候直接使用yolv4-tiny.cfg进行使用就行

1.2  训练过程

在darkent路径下打开终端,之后输入

./darknet detector train custom_training/custom_training.data custom_training/yolov4-tiny.cfg custom_training/yolov4-tiny.conv.29

输入之后终端的情况是这样的

而且会出现一个图,这里会记录我们每一个batch的loss情况

训练接触后会显示模型已保存,我大致训练了两个小时左右

我的loss情况是这样的

最终loss是0.1498左右

1.3  训练结果

在darknet下打开终端后输入

./darknet detector test custom_training/custom_training.data custom_training/yolov4-tiny-test.cfg custom_training/trained_models/yolov4-tiny_final.weights custom_training/JPEGImages/000001.jpg

最后的图片路径你可以自定义,输入之后终端是这样的

之后会出现一个小图像

把它放大后的效果是这样的

2  制作预训练模型

我们先说层这个概念,在训练的开始你可以看到你选用的模型一共有多少层。

你可以将训练好的模型作为预训练模型,比如

./darknet partial ./custom_training/yolov3-tiny.cfg ./custom_training/yolov3-tiny_final.weights ./yolov3-tiny.conv.15 15
  • ./darknet partial[训练模型用到的cfg位置] [训练好的模型文件位置] [要生成的预训练模型文件位置] [保留网络层数权重]

之后就在执行代码的位置就会得到 yolov3-tiny.conv.15 这个预训练模型文件 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1922888.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PG大会周五于杭州举办;Pika发布4.0;阿里云MySQL上线Zero-ETL集成能力

重要更新 1. PostgreSQL中国技术大会举行12日&#xff08;周五&#xff09;于杭州举办&#xff0c;是PostgreSQL社区年度的大会&#xff0c;举办地点&#xff1a;杭州君尚云郦酒店&#xff08;杭州市上城区临丁路1188号&#xff09;&#xff0c;感兴趣的可以考虑现场参加 ( [1]…

C++入门基础知识2

1.引用 1.1引用的使用 1.引用在实践中主要是引用传参和引用做返回值中减少拷贝提高效率和改变引用对象时同时改变被引用对象 2.引用传参跟指针传参功能是类似的&#xff0c;引用传参相对更方便一些 3.引用和指针在实践中相辅相成&#xff0c;功能有重叠性&#xff0c;各有特…

[论文笔记]构建基于RAG聊天机器人的要素

引言 今天带来一篇构建RAG的论文笔记&#xff1a;FACTS About Building Retrieval Augmented Generation-based Chatbots。 基于生成式人工智能构建企业聊天机器人迅速成为行业中最受关注的应用之一&#xff0c;旨在提高员工生产力。 然而&#xff0c;构建成功的企业聊天机器…

【LeetCode】2187. 完成旅途的最少时间

1. 题意 2. 分析 二分法有一个关键特征&#xff1a;如果答案answer满足题意&#xff0c;那么对于任何整数i&#xff0c;如果有i>answer&#xff0c;那么i也会是一个存在的解&#xff0c;只不过不是最优解。 本题想要找出一个达到 totalTrips 趟需要的最少时间成本t&#x…

如何入门单片机嵌入式?

入门单片机嵌入式系统开发可以按照以下步骤进行。我收集归类了一份嵌入式学习包&#xff0c;对于新手而言简直不要太棒&#xff0c;里面包括了新手各个时期的学习方向编程教学、问题视频讲解、毕设800套和语言类教学&#xff0c;敲个22就可以免费获得。 选择单片机开发板&…

FakeNewsGPT4:通过知识增强的大规模视觉语言模型推进多模态假新闻检测

FakeNewsGPT4: Advancing Multimodal Fake News Detection through Knowledge-Augmented LVLMs 论文地址:https://arxiv.org/abs/2403.01988https://arxiv.org/abs/2403.01988 1.概述 当前,多模态假新闻的大量涌现导致了显著的分布差异,这一现状亟需我们开发具备广泛适用性…

input 输入框,带清空图标

https://andi.cn/page/621495.html

虚幻引擎ue5游戏运行界面白茫茫一片,怎么处理

根剧下图顺序即可调节游戏运行界面光照问题&#xff1a; 在大纲里找到post&#xff0c;然后选中它&#xff0c;找到Exposure 把最低亮度和最高亮度的0改为1即可

【算法】代码随想录之链表(更新中)

文章目录 前言 一、移除链表元素&#xff08;LeetCode--203&#xff09; 前言 跟随代码随想录&#xff0c;学习链表相关的算法题目&#xff0c;记录学习过程中的tips。 一、移除链表元素&#xff08;LeetCode--203&#xff09; 【1】题目描述&#xff1a; 【2】解决思想&am…

JS登录页源码 —— 可一键复制抱走

前期回顾 https://blog.csdn.net/m0_57904695/article/details/139838176?spm1001.2014.3001.5501https://blog.csdn.net/m0_57904695/article/details/139838176?spm1001.2014.3001.5501 登录页预览效果 <!DOCTYPE html> <html lang"en"><head…

el-table 动态添加删除 -- 鼠标移入移出显隐删除图标

<el-table class"list-box" :data"replaceDataList" border><el-table-column label"原始值" prop"original" align"center" ><template slot-scope"scope"><div mouseenter"showClick…

电脑如何重新分盘——保姆级教程

方法一&#xff1a; 通过此电脑&#xff0c;鼠标右键点击此电脑&#xff0c;点击管理 点击磁盘管理进入 二&#xff0c;磁盘分区 我这里选择的是“磁盘0”的C盘进行操作&#xff0c;一般新电脑拿到手的时候都处于这么一个状态&#xff0c;只有一个磁盘分区。现在我要把C盘拆分…

翻译语音识别在线的软件,分享4款实用的软件!

在全球化日益加速的今天&#xff0c;语言沟通已成为人们生活中不可或缺的一部分。无论是商务洽谈、学术交流还是日常交流&#xff0c;翻译语音识别技术都扮演着举足轻重的角色。今天&#xff0c;我们就来揭秘一下&#xff0c;那些能让你在语言沟通中如虎添翼的翻译语音识别软件…

LCM通讯的使用

本文主要介绍LCM通讯的基本使用&#xff0c;内容主要整理自官网 https://lcm-proj.github.io/lcm/index.html LCM&#xff0c;即Library for Communication and Marshalling&#xff0c;是一组用于消息传递与数据封装的库和工具&#xff0c;它主要的面向对象是要求高带宽、低延…

[Elasticsearch]ES近似实时搜索的原因|ES非实时搜索的原因|ES Near real-time search

Elasticsearch-专栏&#x1f448;️ 往期回顾&#xff1a; ES单一查询定义&#x1f448;️ ES深分页问题&#x1f448;️ ES商城搜索实战&#x1f448;️ ES环境搭建:单节点模式/集群模式&#x1f448;️ ES开启认证&#x1f448;️ 近似实时搜索&#xff08;Near real-t…

稀疏辅助信号平滑方法在一维信号降噪和旋转机械故障诊断中的应用(MATLAB)

基于形态成分分析理论&#xff08;MCA&#xff09;的稀疏辅助信号分解方法是由信号的形态多样性来分解信号中添加性的混合信号成分&#xff0c;它最早被应用在图像处理领域&#xff0c;后来被引入到一维信号的处理中。在基于MCA稀疏辅助的信号分析模型中&#xff0c;总变差方法…

自定义“请求头”

请求头是HTTP请求的重要部分&#xff0c;可以用“头部字典”按需定制请求头。 (笔记模板由python脚本于2024年07月12日 19:28:44创建&#xff0c;本篇笔记适合喜欢钻研web知识点的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free…

JavaDS —— 栈 Stack 和 队列 Queue

栈的概念 栈是一种先进后出的线性表&#xff0c;只允许在固定的一端进行插入和删除操作。 进行插入和删除操作的一端被称为栈顶&#xff0c;另一端被称为栈底 栈的插入操作叫做进栈/压栈/入栈 栈的删除操作叫做出栈 现实生活中栈的例子&#xff1a; 栈的模拟实现 下面是Jav…

mysql和oracle数据库的备份和迁移

本文主要讲述了mysql数据库的备份和迁移&#xff1b;oracle的肯定是备份和数据迁移&#xff0c;同时介绍了linux的定时任务。 一、mysql Docker容器下mysql备份方法 1、数据库备份 # 进入容器docker exec -it 《containerId容器id》 /bin/bash# mysqldump命令备份并生成数据…

02MFC画笔/画刷/画椭圆/圆/(延时)文字

文章目录 画实心矩形自定义画布设计及使用连续画线及自定义定义变量扇形画椭圆/圆输出颜色文本定时器与定时事件 画实心矩形 自定义画布设计及使用 连续画线及自定义定义变量 扇形 画椭圆/圆 输出颜色文本 定时器与定时事件