通过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实现Word转PDF全攻略(从入门到实战)

《Python实现Word转PDF全攻略(从入门到实战)》在数字化办公场景中,Word文档的跨平台兼容性始终是个难题,而PDF格式凭借所见即所得的特性,已成为文档分发和归档的标准格式,下面小编就来和大... 目录一、为什么需要python处理Word转PDF?二、主流转换方案对比三、五套实战方案详解方案1:

基于Python Playwright进行前端性能测试的脚本实现

《基于PythonPlaywright进行前端性能测试的脚本实现》在当今Web应用开发中,性能优化是提升用户体验的关键因素之一,本文将介绍如何使用Playwright构建一个自动化性能测试工具,希望... 目录引言工具概述整体架构核心实现解析1. 浏览器初始化2. 性能数据收集3. 资源分析4. 关键性能指

使用Python的requests库调用API接口的详细步骤

《使用Python的requests库调用API接口的详细步骤》使用Python的requests库调用API接口是开发中最常用的方式之一,它简化了HTTP请求的处理流程,以下是详细步骤和实战示例,涵... 目录一、准备工作:安装 requests 库二、基本调用流程(以 RESTful API 为例)1.

Python清空Word段落样式的三种方法

《Python清空Word段落样式的三种方法》:本文主要介绍如何用python-docx库清空Word段落样式,提供三种方法:设置为Normal样式、清除直接格式、创建新Normal样式,注意需重... 目录方法一:直接设置段落样式为"Normal"方法二:清除所有直接格式设置方法三:创建新的Normal样

Python调用LibreOffice处理自动化文档的完整指南

《Python调用LibreOffice处理自动化文档的完整指南》在数字化转型的浪潮中,文档处理自动化已成为提升效率的关键,LibreOffice作为开源办公软件的佼佼者,其命令行功能结合Python... 目录引言一、环境搭建:三步构建自动化基石1. 安装LibreOffice与python2. 验证安装

把Python列表中的元素移动到开头的三种方法

《把Python列表中的元素移动到开头的三种方法》在Python编程中,我们经常需要对列表(list)进行操作,有时,我们希望将列表中的某个元素移动到最前面,使其成为第一项,本文给大家介绍了把Pyth... 目录一、查找删除插入法1. 找到元素的索引2. 移除元素3. 插入到列表开头二、使用列表切片(Lis

Python按照24个实用大方向精选的上千种工具库汇总整理

《Python按照24个实用大方向精选的上千种工具库汇总整理》本文整理了Python生态中近千个库,涵盖数据处理、图像处理、网络开发、Web框架、人工智能、科学计算、GUI工具、测试框架、环境管理等多... 目录1、数据处理文本处理特殊文本处理html/XML 解析文件处理配置文件处理文档相关日志管理日期和

Python标准库datetime模块日期和时间数据类型解读

《Python标准库datetime模块日期和时间数据类型解读》文章介绍Python中datetime模块的date、time、datetime类,用于处理日期、时间及日期时间结合体,通过属性获取时间... 目录Datetime常用类日期date类型使用时间 time 类型使用日期和时间的结合体–日期时间(

使用Python开发一个Ditto剪贴板数据导出工具

《使用Python开发一个Ditto剪贴板数据导出工具》在日常工作中,我们经常需要处理大量的剪贴板数据,下面将介绍如何使用Python的wxPython库开发一个图形化工具,实现从Ditto数据库中读... 目录前言运行结果项目需求分析技术选型核心功能实现1. Ditto数据库结构分析2. 数据库自动定位3

Python yield与yield from的简单使用方式

《Pythonyield与yieldfrom的简单使用方式》生成器通过yield定义,可在处理I/O时暂停执行并返回部分结果,待其他任务完成后继续,yieldfrom用于将一个生成器的值传递给另一... 目录python yield与yield from的使用代码结构总结Python yield与yield