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

目录

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 rewith 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').textcls_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/widthy = (ymin+ymax)/2/heightw = (xmax-xmin)/widthh = (ymax-ymin)/heightone_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 osa = 0
train_txt = open('train.txt','w')
val_txt = open('val.txt','w')
for i in os.listdir('JPEGImages'):a = a + 1if a < 15712: #trainprint('/home/nvidia/darknet/custom_training/JPEGImages/' + i,file=train_txt,flush=True)else: #testprint('/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.mzph.cn/web/44547.shtml

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

相关文章

python制作甘特图的基本知识(附Demo)

目录 前言1. matplotlib2. plotly 前言 甘特图是一种常见的项目管理工具&#xff0c;用于表示项目任务的时间进度 直观地看到项目的各个任务在时间上的分布和进度 常用的绘制甘特图的工具是 matplotlib 和 plotly 主要以Demo的形式展示 1. matplotlib 功能强大的绘图库&a…

内网对抗-基石框架篇单域架构域内应用控制成员组成用户策略信息收集环境搭建

知识点&#xff1a; 1、基石框架篇-单域架构-权限控制-用户和网络 2、基石框架篇-单域架构-环境搭建-准备和加入 3、基石框架篇-单域架构-信息收集-手工和工具1、工作组(局域网) 将不同的计算机按照功能分别列入不同的工作组。想要访问某个部门的资源&#xff0c;只要在“网络…

Electron运行报错:Error Cannot find module ‘node_moduleselectroncli.js‘

Electron运行报错&#xff1a;Error: Cannot find module ‘node_modules\electron\cli.js’ 顾名思义&#xff0c;命令行执行Electron .时候&#xff0c;会优先从项目目录查找对应依赖&#xff0c;如果是报错显示是找不到项目目录下的依赖&#xff0c;我们可以从安装在全局的…

DAMA学习笔记(五)-数据存储和操作

1.引言 数据存储与操作包括对存储数据的设计、实施和支持&#xff0c;最大化实现数据资源的价值&#xff0c;贯穿于数据创建/获取到处置的整个生命周期。 数据存储与操作包含两个子活动&#xff08;图6-1&#xff09;。 图6-1 语境关系图&#xff1a;数据存储与操作 (1) 数据库…

记录vite项目中Cornerstone的兼容问题(持续更新)

&#x1f50e; 在vite项目中打包提示错误 ESM integration proposal for Wasm" is not supported currently. ⛳️ 问题描述 Error: Could not load /home/xxx/xxx/node_modules/icr/polyseg-wasm/dist/ICRPolySeg.wasm (imported by node_modules/icr/polyseg-wasm/di…

js ES6 part3

Number 是内置构造函数&#xff0c;用来创建数值 const price 12.345console.log(price.toFixed(2))//保留两位小数 12.35 综合案例购物车 <body><div class"list"><!-- <div class"item"><img src"https://yanxuan-item…

【代码随想录】【算法训练营】【第66天】 [卡码95]城市间货物运输II [卡码96]城市间货物运输III

前言 思路及算法思维&#xff0c;指路 代码随想录。 题目来自 卡码网。 day 66&#xff0c;周五&#xff0c;ding ding~ [卡码95] 城市间货物运输II 题目描述 卡码95 城市间货物运输II 解题思路 前提&#xff1a; 思路&#xff1a; 重点&#xff1a; 代码实现 C语言 …

数据结构(Java):队列Queue集合力扣面试OJ题

1、队列 1.1 队列的概念 队列是一个特殊的线性表&#xff0c;只允许在一端&#xff08;队尾&#xff09;进行插入数据操作&#xff0c;在另一端&#xff08;对头&#xff09;进行删除数据。队列具有先进先出FIFO(First In First Out)的特性。 入队&#xff1a;数据只能从队尾…

有奖竞猜!斗牛士军团与法兰西骑士的终极之战,谁将笑傲欧洲之巅?

痛快看球&#xff0c;畅玩游戏&#xff0c;AGON爱攻带你进入酣畅淋漓的足球世界&#xff01; 7月15日&#xff0c;绿茵赛场硝烟再起&#xff0c;两支身披荣光的王者之师&#xff0c;一路过关斩将&#xff0c;最终会师决赛。一场万众瞩目的巅峰对决即将拉开帷幕&#xff0c;究竟…

linux UDP通讯:接口函数示例

一、主要用的接口&#xff1a; //服务器端 1. socket() 创建套接字 2. bind() 绑定套接字 与TCP区别开来&#xff0c;没有listen()、accept()建立连接的过程 3. 通信 recvfrom() sendto() 4. close //客户端 1. socket() 创建套接字 与TCP区别开来&#xff0c;没有connect()建立…

数据结构——排序算法(冒泡、快速、选择、插入)

文章目录 1. 概念 2. 十大排序算法 3. 冒泡排序 4. 冒泡代码实现 5. 快速排序 6. 快速代码实现 7. 选择排序 8. 选择代码实现 9. 插入排序 10. 插入代码实现 1. 概念 排序&#xff08;Sort&#xff09;是将无序的记录序列&#xff08;或称文件&#xff09;调整成有序…

LabVIEW前面板占满整个屏幕(转)

希望在运行一个LabVIEW程序时&#xff0c;它的前面板能够占据整个屏幕&#xff0c;且不显示Windows的任务栏或其他任何的LabVIEW菜单选项。怎样才能实现这一功能&#xff1f; 您可以通过手动配置或编程的方式实现该功能。 手动配置VI属性 您可以通过以下操作&#xff0c;将…

导入项目,JAVA文件是咖啡杯图标

问题 从图中可以看到&#xff0c;JAVA文件是咖啡杯图标 原因 项目没有识别为MAVEN项目 解决办法 进入pom.xml文件&#xff0c;右键点击Add as Maven Project即可

在Ubuntu 16.04上安装和保护MongoDB的方法

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 简介 MongoDB 是一个免费且开源的面向文档的数据库。它被归类为 NoSQL 数据库&#xff0c;因为它不依赖于传统的基于表的关系型数据库结…

Spring MVC入门3

看完这篇博客你能学到什么 理解JSON的使用理解注解PathVariable理解解注解RequestPart理解cookie和Session的基本概念理解cookie和Session的区别 如果想真正掌握&#xff0c;还需要自己勤加练习。 正文 JSON JSON概念 JSON&#xff1a;JavaScript Object Notation 【JavaS…

【YOLOv8】 用YOLOv8实现数字式工业仪表智能读数(一)

上一篇圆形表盘指针式仪表的项目受到很多人的关注&#xff0c;咱们一鼓作气&#xff0c;把数字式工业仪表的智能读数也研究一下。本篇主要讲如何用YOLOV8实现数字式工业仪表的自动读数&#xff0c;并将读数结果进行输出&#xff0c;若需要完整数据集和源代码可以私信。 目录 &…

gin源码分析

一、高性能 使用sync.pool解决频繁创建的context对象&#xff0c;在百万并发的场景下能大大提供访问性能和减少GC // ServeHTTP conforms to the http.Handler interface. // 每次的http请求都会从sync.pool中获取context&#xff0c;用完之后归还到pool中 func (engine *Engin…

在C++中怎样使用C库

在C中使用C库是一个相对直接的过程&#xff0c;因为C是从C发展而来的&#xff0c;并且与C高度兼容。这意味着你可以直接在C代码中使用C库函数、头文件和变量&#xff0c;而无需进行特殊转换。以下是一些基本的步骤和注意事项&#xff0c;用于在C中使用C库&#xff1a; 1. 包含…

c语言位操作符相关题目之交换两个数的值

文章目录 一、题目二、方法11&#xff0c;思路2&#xff0c;代码实现 三、方法21&#xff0c;思路2&#xff0c;代码实现 四、方法31&#xff0c;思路2&#xff0c;代码实现 总结 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、题目 实现两个变量的…

浅谈PostCSS

1. 背景 css的预处理器语言&#xff08;比如 sass&#xff0c; less&#xff0c; stylus&#xff09;的扩展性不好&#xff0c;你可以使用它们已有的功能&#xff0c;但如果想做扩展就没那么容易。 sass是很常用的css预处理器语言&#xff0c;在webpack中要使用它&#xff0c;…