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.rhkb.cn/news/375801.html

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

相关文章

鼠标怎么挑选

我们平时工作中经常要用到鼠标&#xff0c;那么哪种鼠标比较好。我们今天就来研究下。 手感要好 鼠标最重要的就是手感。这个看参数看不出来。最好能到实体店里面去体验一下&#xff0c;自己上手试一下。 如果现在都是在网上买了&#xff0c;去实体店过于麻烦&#xff0c;并且…

【系统架构设计】计算机组成与体系结构(三)

计算机组成与体系结构&#xff08;三&#xff09; 计算机系统组成存储器系统主存储器辅助存储器Cache存储器Cache 基本原理映射机制直接映射全相联映射组相联映射 替换算法写操作 流水线&#xff08;计算&#xff09;流水线周期流水线执行时间流水线的吞吐率流水线的加速比 计算…

暑期备考美国数学竞赛AMC8和AMC10:吃透1850道真题和知识点

距离接下来的AMC8、AMC10美国数学竞赛还有几个月的时间&#xff0c;实践证明&#xff0c;做真题&#xff0c;吃透真题和背后的知识点是备考AMC8、AMC10有效的方法之一。 通过做真题&#xff0c;可以帮助孩子找到真实竞赛的感觉&#xff0c;而且更加贴近比赛的内容&#xff0c;…

python自动化之用flask库写一个登陆接口(代码示例)

用到的库&#xff1a; 1、flask&#xff08;写接口&#xff09; 2、cerberus&#xff08;校验数据&#xff09; 实现效果&#xff1a;输入账号和密码&#xff0c;校验数据类型是否是字符串&#xff0c;如果是&#xff0c;返回登陆成功&#xff1b;如果不是&#xff0c;返回数…

apache:the requested operation has failed使用httpd -t

Apache24\bin cmd 回车 httpd -t 因为我重新压缩了&#xff0c;记住&#xff0c;重新压缩要使用原路径&#xff0c; 因为你安装的 时候使用的是原路径 还是不行就改个端口&#xff0c;切记修改配置文件httpd.conf先把Tomcat停了 Define SRVROOT "F:\Apache\Apache24&q…

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

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

【活动预告】Apache IoTDB TsFile 智慧能源应用“上会”啦!

2024 年&#xff0c;站在中国数字经济产业升级和数据要素市场化建设的时代交汇点上&#xff0c;为进一步推动全球数据库产业进步&#xff0c;由中国通信标准化协会、大数据技术标准推进委员会主办的“2024 可信数据库发展大会”将于 2024 年 7 月 16-17 日&#xff0c;在北京朝…

【运维】项目运维方案(word原件)

1. 文档介绍 2. 人员与责任 3. 运维过程内容 4. 运维资源 5. 运维服务规划保障 6. 事件处置 7. 质量改进 8. 运维边界及内容 获取方式&#xff1a; 本文末个人名片直接获取。

安装jenkins最新版本初始化配置及使用JDK1.8构建项目详细讲解

导读 1.安装1.1.相关网址1.2.准备环境1.3.下载安装 2. 配置jenkins2.1.安装插件2.2.配置全局工具2.3.系统配置 3. 使用3.1.配置job3.2.构建 提示&#xff1a;如果只想看如何使用jdk1.8构建项目&#xff0c;直接看3.1即可。 1.安装 1.1.相关网址 Jenkins官网&#xff1a;https…

了解并缓解 IP 欺骗攻击

欺骗是黑客用来未经授权访问计算机或网络的一种网络攻击&#xff0c;IP 欺骗是其他欺骗方法中最常见的欺骗类型。通过 IP 欺骗&#xff0c;攻击者可以隐藏 IP 数据包的真实来源&#xff0c;使攻击来源难以知晓。一旦访问网络或设备/主机&#xff0c;网络犯罪分子通常会挖掘其中…

Mac M1安装配置Hadoop+Flink SQL环境

Flink 1.18.1 Hadoop 3.4.0 一、准备工作 系统&#xff1a;Mac M1 (MacOS Sonoma 14.3.1) JDK&#xff1a;jdk1.8.0_381 &#xff08;注意&#xff1a;尽量一定要用JDK8&#xff0c;少用高版本&#xff09; Scala&#xff1a;2.12 JDK安装在本机的/opt/jdk1.8.0_381.jdk/C…

uniapp微信小程序 TypeError: $refs[ref].push is not a function

我的写法 this.$refs.addPopup.open();报错 打印出来是这样的 解决 参考未整理 原因 在当前页面使用的v-for循环 并且循环体内也有组件使用了ref&#xff08;而我没有把每个ref做区别命名&#xff09; 这样就导致了我有很多同名的ref&#xff0c;然后就报错了 解决办法&a…

值得关注的数据资产入表

不错的讲解视频&#xff0c;来自&#xff1a;第122期-杜海博士-《数据资源入表及数据资产化》-大数据百家讲坛-厦门大学数据库实验室主办第122期-杜海博士-《数据资源入表及数据资产化》-大数据百家讲坛-厦门大学数据库实验室主办-20240708_哔哩哔哩_bilibili

C语言 | Leetcode C语言题解之第231题2的幂

题目&#xff1a; 题解&#xff1a; const int BIG 1 << 30;bool isPowerOfTwo(int n) {return n > 0 && BIG % n 0; }

MacOS 通过Docker安装宝塔面板搭建PHP开发环境

1、docker拉取ubuntu系统 docker pull ubuntu2、运行容器 docker run -i -t -d --name bt -p 20:20 -p 21:21 -p 80:80 -p 443:443 -p 888:888 -p 8888:8888 -p 3306:3306 -p 6379:6379 --privilegedtrue -v /Users/oi/Sites:/www/wwwroot ubuntu-v 后的 /Users/oi/Sites 代表…

OpenAI终止对中国提供API服务,对国内AI市场产生重大冲击?

6月25日&#xff0c;OpenAI突然宣布终止向包括中国在内的国家地区提供API服务&#xff0c;本月9日这一政策已经正式生效了&#xff01; 有人说&#xff0c;这个事件给中国AI行业带来很大冲击&#xff01;是这样吗&#xff1f;在展开讨论前&#xff0c;我们先来看看什么是API服务…

基础小波降噪方法(Python)

主要内容包括&#xff1a; Stationary wavelet Transform (translation invariant) Haar wavelet Hard thresholding of detail coefficients Universal threshold High-pass filtering by zero-ing approximation coefficients from a 5-level decomposition of a 16Khz …

《昇思25天学习打卡营第14天|SSD目标检测》

SSD&#xff08;Single Shot MultiBox Detector&#xff09;是一种用于目标检测的深度学习算法。它的设计旨在同时检测多个对象&#xff0c;并确定它们在图像中的位置和类别。与其他目标检测算法相比&#xff0c;SSD具有速度快和精度高的特点&#xff0c;在实时检测应用中非常受…

[Spring] Spring Web MVC基础理论

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…

介绍一款数据准实时复制(CDC)中间件 `Debezium`

简介 文章开头先介绍一下什么是CDC。数据准实时复制(CDC)是目前行内实时数据需求大量使用的技术。常用的中间件有Canal、Debezium、Flink CDC等 下面我们做一下对比 各有优缺点吧,本主要介绍一下Debezium中间件。 Debezium是什么 Debezium是一个为变更数据捕获(CDC)提供…