【用YOLOv5模型实现旅客行李5类异物检测——训练过程】

2023-12-22 04:10

本文主要是介绍【用YOLOv5模型实现旅客行李5类异物检测——训练过程】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

-------Start

在开始以下操作之前需要安装Anaconda,并在Anaconda中配置pytorch深度学习环境. 完成以上配置之后再进行接下来的操作。

---------官方YOLOV5代码

---------地铁异物检测数据集

1. 下载代码,数据集,预训练权重

1.1 代码下载

在这里插入图片描述

文件解压

在这里插入图片描述

1.2 数据集下载

在这里插入图片描述

下载以下2个文件,并解压。在这里插入图片描述
xml为数据的标签文件,共8929个文件,至于xml文件中的内容大家可以百度学习下,这里不做讲解。

在这里插入图片描述

jpg文件为检测的X光图像,共8929张图像,一张图像对应一个xml文件。

在这里插入图片描述

1.3 预训练权重下载

在这里插入图片描述

2. 数据集整理

2.1 首先新建SIXray文件,里面包含如下内容:Annotations文件夹里为所有的xml文件,Images文件夹里为所有的jpg文件,ImageSets文件夹里再新建一个main文件夹,labels为空文件夹。

在这里插入图片描述

在这里插入图片描述

2.2 先修改以下代码的convert_annotation函数中in_file ,out_file 文件路径为你自己数据集所对应的路径。
import xml.etree.ElementTree as ET
import os
from os import getcwd
sets = ['train', 'val', 'test']
classes = ["Gun", "Knife","Wrench","Pliers", "Scissors"]
def convert(size, box):dw = 1. / (size[0])dh = 1. / (size[1])x = (box[0] + box[1]) / 2.0 - 1y = (box[2] + box[3]) / 2.0 - 1w = box[1] - box[0]h = box[3] - box[2]x = x * dww = w * dwy = y * dhh = h * dhreturn x, y, w, hdef convert_annotation(image_id):in_file = open('E:/chongda/SIXray/Annotations/%s.xml' % (image_id), encoding='UTF-8')out_file = open('E:/chongda/SIXray/labels/%s.txt' % (image_id), 'w')tree = ET.parse(in_file)root = tree.getroot()w = int(root.find('size').find('width').text)h = int(root.find('size').find('height').text)for obj in root.iter('object'):try:cls = obj.find('name').textexcept:continueif cls not in classes == 1:continuecls_id = classes.index(cls)xmlbox = obj.find('bndbox')b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text),float(xmlbox.find('ymax').text))b1, b2, b3, b4 = b# 标注越界修正if b2 > w:b2 = wif b4 > h:b4 = hb = (b1, b2, b3, b4)bb = convert((w, h), b)out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')#划分训练集,测试集,验证集
def test():import osimport randomimport argparseparser = argparse.ArgumentParser()# xml文件的地址,根据自己的数据进行修改 xml一般存放在Annotations下parser.add_argument('--xml_path', default=r'E:\chongda\SIXray\labels', type=str, help='input xml label path')# 数据集的划分,地址选择自己数据下的ImageSets/Mainparser.add_argument('--txt_path', default=r'E:\chongda\SIXray\ImageSets\Main', type=str, help='output txt label path')opt = parser.parse_args()#训练集:验证集的比例trainval_percent = 0.9#训练集+验证集:测试集的比例train_percent = 0.9xmlfilepath = opt.xml_pathtxtsavepath = opt.txt_pathtotal_xml = os.listdir(xmlfilepath)if not os.path.exists(txtsavepath):os.makedirs(txtsavepath)random.seed(2022)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')for i in list_index:name = total_xml[i][:-4] + '\n'if i in trainval:file_trainval.write(name)if i in train:file_train.write(name)else:file_val.write(name)else:file_test.write(name)file_trainval.close()file_train.close()file_val.close()file_test.close()
#根据划分的数据集生成对应的文件路径
def test2():for image_set in sets:image_ids = open(r'E:\chongda\SIXray\ImageSets\Main\%s.txt' % (image_set)).read().strip().split()list_file = open(r'E:\chongda\SIXray\%s.txt' % (image_set), 'w')for image_id in image_ids:list_file.write('E:\chongda\SIXray\images\%s.jpg\n' % (image_id))list_file.close()
#将原数据标签转化成我们需要的标签
def test3():path = r'E:\chongda\SIXray\Annotations'for image_id in os.listdir(path):convert_annotation(image_id[:-4])
然后执行test3函数,执行完后会在labels文件夹里生成8929个txt文件,如下图所示。这一步操作是将xml标签文件转化成我们所需格式的文件。

在这里插入图片描述

2.3 修改以上代码的test函数中的两个路径值为你自己数据集相对应的位置。

在这里插入图片描述

修改完毕后,执行test函数,将产生以下文件,这一步操作是划分数据集为训练集,测试集,验证集。在这里插入图片描述
2.4 修改test2函数中的三处路径为你自己数据集所对应的路径。

在这里插入图片描述

修改完成后会在SIXray文件夹下生成如下文件。

在这里插入图片描述

检查其中文件的内容是否是图像的完整路径。

在这里插入图片描述

3. 代码整理

3.1 用pycharm导入解压后的代码文件

在这里插入图片描述

在data目录下新建my.yaml文件,文件内容如下所示,此处需要修改train,val,test的路径,值为你的数据集下txt文件的路径。

在这里插入图片描述

3.2 修改models下yolov5s.yaml文件中的nc值为5,代表要检测的5个类别。

在这里插入图片描述

3.3 将下载好的YOLOv5s模型预训练权重,并放在项目根目录下。

在这里插入图片描述

3.4 修改train.py文件中的相应参数,batchsize的值根据显卡的算力进行调整,通常取值为偶数。值越大,要求显卡的算力越高。

在这里插入图片描述

3.5 至此,修改完毕,执行train.py进行网络的训练。

在这里插入图片描述

3.6 控制台出现以下训练输出日志,表示训练完毕。程序会自动保存最后一次训练完毕的模型权重和最优模型权重。

在这里插入图片描述

运行完毕后,会在runs/train/的文件夹下保存每次训练的相关文件,weights存放的是模型的权重。best.pt是最优模型权重,last.pt是训练完毕的权重,其他文件可自行打开查看。

在这里插入图片描述

PR图像

在这里插入图片描述

训练过程指标变化

在这里插入图片描述

混淆矩阵

在这里插入图片描述

模型的测试过程请参考下一篇博文。

-------End

这篇关于【用YOLOv5模型实现旅客行李5类异物检测——训练过程】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/522548

相关文章

SpringBoot集成redisson实现延时队列教程

《SpringBoot集成redisson实现延时队列教程》文章介绍了使用Redisson实现延迟队列的完整步骤,包括依赖导入、Redis配置、工具类封装、业务枚举定义、执行器实现、Bean创建、消费... 目录1、先给项目导入Redisson依赖2、配置redis3、创建 RedissonConfig 配

Python的Darts库实现时间序列预测

《Python的Darts库实现时间序列预测》Darts一个集统计、机器学习与深度学习模型于一体的Python时间序列预测库,本文主要介绍了Python的Darts库实现时间序列预测,感兴趣的可以了解... 目录目录一、什么是 Darts?二、安装与基本配置安装 Darts导入基础模块三、时间序列数据结构与

Python使用FastAPI实现大文件分片上传与断点续传功能

《Python使用FastAPI实现大文件分片上传与断点续传功能》大文件直传常遇到超时、网络抖动失败、失败后只能重传的问题,分片上传+断点续传可以把大文件拆成若干小块逐个上传,并在中断后从已完成分片继... 目录一、接口设计二、服务端实现(FastAPI)2.1 运行环境2.2 目录结构建议2.3 serv

C#实现千万数据秒级导入的代码

《C#实现千万数据秒级导入的代码》在实际开发中excel导入很常见,现代社会中很容易遇到大数据处理业务,所以本文我就给大家分享一下千万数据秒级导入怎么实现,文中有详细的代码示例供大家参考,需要的朋友可... 目录前言一、数据存储二、处理逻辑优化前代码处理逻辑优化后的代码总结前言在实际开发中excel导入很

SpringBoot+RustFS 实现文件切片极速上传的实例代码

《SpringBoot+RustFS实现文件切片极速上传的实例代码》本文介绍利用SpringBoot和RustFS构建高性能文件切片上传系统,实现大文件秒传、断点续传和分片上传等功能,具有一定的参考... 目录一、为什么选择 RustFS + SpringBoot?二、环境准备与部署2.1 安装 RustF

Nginx部署HTTP/3的实现步骤

《Nginx部署HTTP/3的实现步骤》本文介绍了在Nginx中部署HTTP/3的详细步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录前提条件第一步:安装必要的依赖库第二步:获取并构建 BoringSSL第三步:获取 Nginx

MyBatis Plus实现时间字段自动填充的完整方案

《MyBatisPlus实现时间字段自动填充的完整方案》在日常开发中,我们经常需要记录数据的创建时间和更新时间,传统的做法是在每次插入或更新操作时手动设置这些时间字段,这种方式不仅繁琐,还容易遗漏,... 目录前言解决目标技术栈实现步骤1. 实体类注解配置2. 创建元数据处理器3. 服务层代码优化填充机制详

Python实现Excel批量样式修改器(附完整代码)

《Python实现Excel批量样式修改器(附完整代码)》这篇文章主要为大家详细介绍了如何使用Python实现一个Excel批量样式修改器,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录前言功能特性核心功能界面特性系统要求安装说明使用指南基本操作流程高级功能技术实现核心技术栈关键函

Java实现字节字符转bcd编码

《Java实现字节字符转bcd编码》BCD是一种将十进制数字编码为二进制的表示方式,常用于数字显示和存储,本文将介绍如何在Java中实现字节字符转BCD码的过程,需要的小伙伴可以了解下... 目录前言BCD码是什么Java实现字节转bcd编码方法补充总结前言BCD码(Binary-Coded Decima

oracle 11g导入\导出(expdp impdp)之导入过程

《oracle11g导入导出(expdpimpdp)之导入过程》导出需使用SEC.DMP格式,无分号;建立expdir目录(E:/exp)并确保存在;导入在cmd下执行,需sys用户权限;若需修... 目录准备文件导入(impdp)1、建立directory2、导入语句 3、更改密码总结上一个环节,我们讲了