通过Python机器学习的训练不带电芯充电宝和带电芯充电宝的测试分析

2023-11-07 09:10

本文主要是介绍通过Python机器学习的训练不带电芯充电宝和带电芯充电宝的测试分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

资源下载地址:https://download.csdn.net/download/sheziqiong/85706431
资源下载地址:https://download.csdn.net/download/sheziqiong/85706431

机器学习训练充电宝项目

问题描述

数据集中各个危险品类别的数据量是不均衡的,如何解决样本不均衡条件下模型训练的类别偏好问题是一个热点。训练集中的危险品包括带电芯充电宝和不带电芯充电宝两个类别。比例为 1:10(带电芯充电宝:不带电芯充电宝,500:5000)。划分训练集训练模型,划分测试集计算测试集在模型上的 mAP。

解决方案

样本不均衡问题的解决方案该问题中,带电芯充电宝和不带电芯充电宝的比例为 1:10(500 : 5000),两类样本类别分布严重不均衡。若不对样本进行处理,样本少的一类由于样本特征少,使得不容易发现特征规律,很容易出现过拟合问题,导致模型的准确性会很差。解决样本不均衡问题的方法有很多,如过抽样、欠抽样以及改变两类样本的权重等。在该问题中,我们选择了过抽样方法:增加分类中少数类样本的数量来实现样本均衡,即增加带电芯充电宝的样本数量。由于在实际情况中,两类样本比例达到 1:3左右即可认为样本达到均衡,故在实验中,我们选择的方法是:对带电芯充电宝进行左右、上下翻转,将原来 500 个样本扩充到 2000 个。扩充后,带电芯充电宝和不带电芯充电宝的比例变为 1:2.5, 大大减小了两者的比例,使得样本几近达到均衡。

使用模型简介

用于目标检测的算法有很多,如:RCNN、YOLO、SSD 等,通过对比,由于 SSD 模型运行速度较快,检测精度较高,最终我们选择了使用 SSD 模型。

SSD 模型原理简介

SSD 模型将图像切分成 N 个区域,对每个区域进行单目标检测,并汇总所有的单目标检测结果。SSD 采用多尺度特征图用于检测,其中,小的特征图负责检测大目标,大的特征图用来检测小目标;除此之外,SSD 在每个单元设置了不同尺度和长宽比的先验框,对于每个单元的每个先验框,都会输出一套独立的检测值,对应一个边界框。在预测过程中,置信度最高的那个类别就是边界框所属的类别。SSD 采用 VGG16 作为基础模型,然后在 VGG16 的基础上新增了卷积层来获得更多的特征图以用于检测。

训练过程

先验框匹配

首先确定图片中的 ground truth(真实目标)与哪个先验框匹配,与之匹配的先验框所对应的边界框将负责预测该真实目标。其中,匹配原则有两点:首先,对于图片中每个 ground truth,找到与其 IOU(IOU = 预测边框与真实边框交集/预测边框与真实边框并集)最大的先验框进行匹配;其次,对于剩余的未匹配的先验框,若与某个 ground truth 的 IOU 大于某个阈值(一般为 0.5),那么该先验框也与这个 ground truth 进行匹配,若有多个 ground truth 与某个先验框 IOU 都大于阈值,则先验框只与最大的先验框进行匹配,若某个先验框没有与之匹配的 ground truth,则该先验框与背景匹配。将与 ground truth 匹配的先验框称为正样本,与背景匹配的先验框称为负样本。

损失函数

SSD 的损失函数定义为位置误差( locatization loss, loc) 与置信度误差

(confidence loss, conf)的加权和:

其中,N 是先验框的数量,i 为先验框序号,j 为真实框序号,p 为类别序号。

是一个指示参数,取 1 时表示第 i 个先验框与第 j 个 ground truth 匹配,且该 ground truth 的类别为 p;l 为先验框对应边界框的位置预测值,g 为 ground truth 的位置参数,其中,位置误差采用

表示第 i 个先验框对应类别 p 的预测概率;权重系数 α 通过交叉验证设置为 1。

预测过程

对于每个预测框,首先根据类别置信度确定其类别与置信度值,并过滤掉属于背景的预测框。然后根据置信度阈值(如 0.5)过滤掉阈值较低的预测框。将留下的预测框进行解码,根据先验框得到其真实的位置参数,解码之后,根据置信度进行降序排列,仅保留 top-k 个预测框。之后进行 NMS 算法,过滤掉重叠度较大的预测框,最后剩余的预测框即为检测结果。

样本的预处理

在所给样本中,类别不止“带电芯充电宝”和“不带电芯充电宝”两种,还有很多其他种类,所以我们需要对所给样本进行处理,即删除其他种类的标注信息。

除此之外,由于网络上关于 ssd 模型的训练代码几乎都是用的 VOC 数据集,所以我们需要将数据集的格式转换为 VOC 的标准格式,以便于模型的训练。VOC 数据集文件夹结构分为:Annotations、ImageSets、JPEGImages、SegmentationClass 和SementationObject,其中,我们要用到的文件夹是 Annotations、ImageSets 和JPEGImages。Annotations 文件夹存放的是 XML 文件,用以标注对应图片的基本信息;ImageSets 文件夹的 Main 目录下存放的是 4 个 txt 文件,分别说明了训练集的图片文件名、验证集的图片文件名、训练和验证的图片文件名以及测试集的图片文件名。

图 1 VOC 文件格式

样本的预处理过程如下:首先,对小比例样本进行扩充,即对不带电芯充电宝分别进行左右翻转和上下翻转,由原来的 500 个样本扩充至 2000 个,翻转时,对说明文件中标注的坐标也进行相应的转换;其次,删除说明文件中其他类别的标注,只剩下“带电芯充电宝”和“不带电芯充电宝”两个类别;最后,将数据集转化为 VOC 格式的数据集,将训练集和测试集比例设置为 8:2,即训练集样本 5600 张,测试集 1400 张。至此,已完成样本的预处理过程。

实现结果及其分析

数据训练过程中 loss 变化如下:

图 2 数据训练过程中 loss 的变化

在这里插入图片描述

图 3 数据训练过程 loss 的变化

在图 2 的训练过程中,学习率的大小为 8 5 ,迭代次数为 21000。通过图片可以看出,随着迭代次数增加,loss 值几乎达到收敛,值的大小稳定在 2-3 之间。在此组参数设置下,mAP 可以达到 0.7730。

在此之前,我们尝试过多种学习率和迭代次数的组合。学习率过小,下降的速度缓慢;学习率过大,会出现震荡,学习率的选择需要我们不断地进行尝试,才能获得相对较好的效果。通过图 3 loss 下降曲线可以看出,在学习率一定的情况下,迭代 4000 次左右也趋于稳定,但是 loss 值却较大,在 6-7 之间,最终的测试结果也不太理想。这说明,虽然迭代次数到达一定数值时,loss 的变化很缓慢,但是,随着迭代次数的增加,loss 仍然往小的方向变化,迭代次数越多,最终测试效果就越好。由于电脑配置以及时间的关系,我们所尝试的迭代次数最多为图 2 中的 21000,其所得到的结果是目前为止最好的结果。

测试结果

图 5.1 不带电芯充电宝类别对带电芯充电宝识别结果部分输出

图 5.2 不带电芯充电宝类别对不带电芯充电宝识别结果部分输出

图 5.3 带电芯充电宝类别对带电芯充电宝识别结果部分输出

图 5.4 带电芯充电宝类别对不带电芯充电宝识别结果部分输出

如图 4,可以看到,在学习率为

,迭代次数为 21000,loss 值在 2-3 之间时,

mAP 为 0.7730,其中,带电芯充电宝(少数样本)的 AP 为 0.7313,不带电芯充电宝(多数样本)的 AP 为 0.8146。

很显然,不带电芯充电宝比带电芯充电宝的测试结果要好很多,说明样本个数越多效果越好,如果能够将样本比例扩充到 1:1,将会有更好的结果。但由于时间关系,我们没有继续对不带电芯充电宝的样本数量进行扩充。

遇到的问题及解决方案

第一次训练的模型测试得到的 mAP 仅为 0.0165,最主要的原因是当时样本中已经将其他类别的标注删掉了,只剩下“带电芯充电宝”和“不带电芯充电宝”两类,但是 ssd.py 文件的代码中的类别数目没改,还是之前的 21,改掉之后,mAP 直接提高到 0.69。

代码运行过程中遇到的问题

在改完基本的代码后,第一次运行时,遇到了很多问题,比如发现了所给样本中除了“带电芯充电宝”和“不带电芯充电宝”两类外,还有其他类别、如何使用visdom 可视化 loss 下降过程以及其他各种大大小小的问题,我们通过查阅资料、讨论等方式,逐步解决这些问题,最终代码成功开始运行。
给样本中除了“带电芯充电宝”和“不带电芯充电宝”两类外,还有其他类别、如何使用visdom 可视化 loss 下降过程以及其他各种大大小小的问题,我们通过查阅资料、讨论等方式,逐步解决这些问题,最终代码成功开始运行。

资源下载地址:https://download.csdn.net/download/sheziqiong/85706431
资源下载地址:https://download.csdn.net/download/sheziqiong/85706431

这篇关于通过Python机器学习的训练不带电芯充电宝和带电芯充电宝的测试分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Python判断for循环最后一次的6种方法

《Python判断for循环最后一次的6种方法》在Python中,通常我们不会直接判断for循环是否正在执行最后一次迭代,因为Python的for循环是基于可迭代对象的,它不知道也不关心迭代的内部状态... 目录1.使用enuhttp://www.chinasem.cnmerate()和len()来判断for

使用Python实现高效的端口扫描器

《使用Python实现高效的端口扫描器》在网络安全领域,端口扫描是一项基本而重要的技能,通过端口扫描,可以发现目标主机上开放的服务和端口,这对于安全评估、渗透测试等有着不可忽视的作用,本文将介绍如何使... 目录1. 端口扫描的基本原理2. 使用python实现端口扫描2.1 安装必要的库2.2 编写端口扫

使用Python实现操作mongodb详解

《使用Python实现操作mongodb详解》这篇文章主要为大家详细介绍了使用Python实现操作mongodb的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、示例二、常用指令三、遇到的问题一、示例from pymongo import MongoClientf

使用Python合并 Excel单元格指定行列或单元格范围

《使用Python合并Excel单元格指定行列或单元格范围》合并Excel单元格是Excel数据处理和表格设计中的一项常用操作,本文将介绍如何通过Python合并Excel中的指定行列或单... 目录python Excel库安装Python合并Excel 中的指定行Python合并Excel 中的指定列P

一文详解Python中数据清洗与处理的常用方法

《一文详解Python中数据清洗与处理的常用方法》在数据处理与分析过程中,缺失值、重复值、异常值等问题是常见的挑战,本文总结了多种数据清洗与处理方法,文中的示例代码简洁易懂,有需要的小伙伴可以参考下... 目录缺失值处理重复值处理异常值处理数据类型转换文本清洗数据分组统计数据分箱数据标准化在数据处理与分析过

Python调用另一个py文件并传递参数常见的方法及其应用场景

《Python调用另一个py文件并传递参数常见的方法及其应用场景》:本文主要介绍在Python中调用另一个py文件并传递参数的几种常见方法,包括使用import语句、exec函数、subproce... 目录前言1. 使用import语句1.1 基本用法1.2 导入特定函数1.3 处理文件路径2. 使用ex

Python脚本实现自动删除C盘临时文件夹

《Python脚本实现自动删除C盘临时文件夹》在日常使用电脑的过程中,临时文件夹往往会积累大量的无用数据,占用宝贵的磁盘空间,下面我们就来看看Python如何通过脚本实现自动删除C盘临时文件夹吧... 目录一、准备工作二、python脚本编写三、脚本解析四、运行脚本五、案例演示六、注意事项七、总结在日常使用

Python将大量遥感数据的值缩放指定倍数的方法(推荐)

《Python将大量遥感数据的值缩放指定倍数的方法(推荐)》本文介绍基于Python中的gdal模块,批量读取大量多波段遥感影像文件,分别对各波段数据加以数值处理,并将所得处理后数据保存为新的遥感影像... 本文介绍基于python中的gdal模块,批量读取大量多波段遥感影像文件,分别对各波段数据加以数值处

python管理工具之conda安装部署及使用详解

《python管理工具之conda安装部署及使用详解》这篇文章详细介绍了如何安装和使用conda来管理Python环境,它涵盖了从安装部署、镜像源配置到具体的conda使用方法,包括创建、激活、安装包... 目录pytpshheraerUhon管理工具:conda部署+使用一、安装部署1、 下载2、 安装3

Python进阶之Excel基本操作介绍

《Python进阶之Excel基本操作介绍》在现实中,很多工作都需要与数据打交道,Excel作为常用的数据处理工具,一直备受人们的青睐,本文主要为大家介绍了一些Python中Excel的基本操作,希望... 目录概述写入使用 xlwt使用 XlsxWriter读取修改概述在现实中,很多工作都需要与数据打交