热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

yolov5数据集_基于垃圾目标检测任务的YOLOv5初探

研究背景垃圾目标检测作为垃圾分类自动化的一个重要环节,本文将尝试实现该过程。所谓目标检测,简单来讲就是检测图像中的对象是什么以及在哪里的问题࿰

研究背景

垃圾目标检测作为垃圾分类自动化的一个重要环节,本文将尝试实现该过程。所谓目标检测,简单来讲就是检测图像中的对象是什么以及在哪里的问题,即"目标分类+定位"问题。

YOLO系列模型作为one-stage类目标检测任务的代表算法,凭借其快速、泛化性能好等特性深受研究者喜爱。在前不久,YOLOv5也在GitHub上正式发布,其立即在网上引发了广泛热议。本文将参见官方提供的使用教程,尝试简单利用YOLOv5网络模型在TACO数据集上实现垃圾目标检测任务。

数据集处理

TACO是一个数据正在不断增长的垃圾对象数据集,其以树林、道路和海滩为拍摄背景,目前包含60个类别的垃圾对象,共1500张图像,近5千份标注。该数据集项目参见:https://github.com/pedropro/TACO

一方面,考虑到该数据集文件存放格式和标签格式要符合YOLOv5模型的相关要求;另一方面,也考虑到该数据集中各垃圾类型对象的样本数量极其不均(如图1所示),因此,本文首先需要对数据集进行必要的操作。对于数据集的处理代码可参见Mo项目[1],项目中的_readme.ipynb文件详细给出了相关代码使用的具体操作。

c3205b35e51295d80d6c3f6f7a052a1d.png

图1 TACO各类别对象的样本数量

对于TACO数据集的处理主要可分为以下两个过程:

(1)由于TACO提供的标签为coco类型(所有信息存放在annotations.json文件中),项目首先需要将相关标签转换为yolo类型。与此同时,考虑到本文仅对相关网络模型进行初探和个人硬件设备的欠缺,该项目仅挑选出满足样本数量大于200的垃圾对象进行相关实验。上述操作的相关代码可以参考博客[1]提供的代码进行修改,该代码可以作为模板用于满足自定义化coco格式转yolo格式需求。

经初步统计,符合要求的垃圾类型(共8类)及其原编号如下所示:

'Clear plastic bottle': 5

'Plastic bottle cap': 7

'Drink can': 12

'Other plastic': 29

'Plastic film': 36

'Other plastic wrapper': 39

'Unlabeled litter': 58

'Cigarette': 59

对于coco格式转yolo格式需求,其主要需完成以下三项任务:

        ·存储生成的标签和图像分别至两个文件目录中,同时标签和图像的文件命名要求一致

        ·将目标对象原标签集合递增顺序映射至{0-7}空间

        ·由于原始标签中位置信息为{top_x, top_y, width, height},项目需要将其转换为{center_x, center_y, width, height}格式,并将其数值进行归一化操作

其核心代码部分如下所示(cocotoyolo.py):

# 将垃圾类型原编号映射至{0-7}空间

label_transfer = {5: 0, 7: 1, 12: 2, 29: 3,

                  36: 4, 39: 5, 58: 6, 59: 7}

class_num = {}  # 记录各类型样本数量

img_ids = data_source.getImgIds()

# 遍历每张图片,对标签进行转换

for index, img_id in tqdm.tqdm(enumerate(img_ids), desc='change .json file to .txt file'):

    img_info = data_source.loadImgs(img_id)[0]

    # 将含文件夹的路径修改为文件名

    save_name = img_info['file_name'].replace('/', '_')

    # 移去文件扩展名

    file_name = save_name.split('.')[0]

    # 获取单张图像的宽和高

    height = img_info['height']

    width = img_info['width']

    # 转换所得txt文件存储路径

    save_path = save_base_path + file_name +'.txt'

    is_exist =False  # 记录图片是否包含目标垃圾类型对象

    withopen(save_path, mode='w') as fp:

        # 根据图片编号找出垃圾对象的编号集合

        annotation_id = data_source.getAnnIds(img_id)

        boxes = np.zeros((0, 5))

        iflen(annotation_id) ==0:  # 集合大小为0

            fp.write('')

            continue

        # 获取coco格式的标签

        annotations = data_source.loadAnns(annotation_id)

        lines =''  # 记录转换后yolo格式的标签

        # 遍历对象标签集

        for annotation in annotations:

            # 获取垃圾对象的标签

            label = coco_labels_inverse[annotation['category_id']]

            if label in label_transfer.keys():

                # 垃圾类型属于目标垃圾类型则进行格式转换

                is_exist =True

                box = annotation['bbox']

                if box[2] <1or box[3] <1:

                    # 如果原标签中出现无长或宽数据的情况则跳过

                    continue

                # top_x,top_y,width,height&#61;&#61;>cen_x,cen_y,width,height

                box[0] &#61;round((box[0] &#43; box[2] /2) / width, 6)

                box[1] &#61;round((box[1] &#43; box[3] /2) / height, 6)

                box[2] &#61;round(box[2] / width, 6)

                box[3] &#61;round(box[3] / height, 6)

                label &#61; label_transfer[label]  # 标签映射

                if label notin class_num.keys():

                    class_num[label] &#61;0

                class_num[label] &#43;&#61;1

                lines &#61; lines &#43;str(label)  # 先存储标签

                for i in box:  # 再存储位置信息

                    lines &#43;&#61;&#39; &#39;&#43;str(i)

                lines &#43;&#61;&#39;\n&#39;  # 换行

        fp.writelines(lines)

    if is_exist:

        # 存在目标类型对象&#xff0c;则拷贝图像至指定目录

        shutil.copy(&#39;data/{}&#39;.format(img_info[&#39;file_name&#39;]), os.path.join(save_image_path, save_name))

    else:

        # 不存在则删除所生成的标签文件

        os.remove(save_path)

(2)完成标签集的生成后&#xff0c;项目需要对其进行样本划分。首先&#xff0c;项目需要将样本集按训练集使用全部样本&#xff0c;测试集样本占总样本0.1比例的要求(其样本图片的数量分别为1086和109&#xff0c;训练集使用全部样本是考虑到个人硬件设备较差的原因)进行划分。其次&#xff0c;考虑网络模型对样本存储目录的要求&#xff0c;项目需要将相应生成的图像和标签存储至相应的文件夹下&#xff0c;其文件目录格式如图2所示。其实现代码参见Mo项目中的sample.py文件。

9d4726816c0fe31453949aa0ede7aaae.png

图2 数据集存储文件目录

模型配置与训练

YOLOv5项目的下载地址&#xff1a;https://github.com/ultralytics

Mo平台上部署的项目参见同名项目[2]&#xff0c;以下的所有内容可以参考官方教程[2]。该Mo项目的具体操作流程请参见根目录下的_readme.ipynb文件

模型配置

该部分主要涉及相关依赖安装和配置文件设置这两方面内容&#xff0c;接下来&#xff0c;本文将对上述内容进行简要说明。

(1)依赖安装

YOLOv5是由PyTorch深度学习框架搭建而成&#xff0c;因此&#xff0c;我们首先需要在Python中安装PyTorch框架&#xff0c;安装教程可以参见官网的相关内容。此处给出PyTorch最新CPU版本的安装命令。

pip install torch&#61;&#61;1.5.1&#43;cpu torchvision&#61;&#61;0.6.1&#43;cpu -f https://download.pytorch.org/whl/torch_stable.html

除此之外&#xff0c;YOLOv5模型运行还需要安装额外的第三方依赖包。官方已经将其全部放置在requirements.txt文件中。为了安装依赖尽可能不出错&#xff0c;个人对该文件提出以下两点修改意见&#xff1a;

  1.本人fork该官方项目时&#xff0c;numpy的版本要求是1.17&#xff0c;但实际安装时会出现一些问题。因此&#xff0c;个人建议将其版本要求修改为1.17.3。

  2.该依赖文件所给出的cocoapi.git下载的地址&#xff0c;在实际运行时下载的速度是非常缓慢的&#xff0c;而且在Windows系统下还可能出现异常。因此建议将相应语句用下列语句进行代替&#xff1a;

git&#43;https://github.com/philferriere/cocoapi.git#subdirectory&#61;PythonAPI

(2)配置文件设置

YOLOv5项目主要需要配置如下两个配置文件&#xff1a;

  1.data路径下的taco.yaml配置文件(自己创建)。该文件主要配置训练集和测试集存储图片的路径以及对象类型信息。对于标签存储路径的配置&#xff0c;项目会自动根据图片存储路径来确定&#xff0c;这也是为什么我们的数据集文件目录需要符合图2所示要求的原因。该配置文件的内容如下所示。

# train and val datasets (image directory or *.txt file with image paths)

train: taco/images/train/

val: taco/images/test/

# number of classes

nc: 8

# class names

names: [&#39;Clear plastic bottle&#39;, &#39;Plastic bottle cap&#39;,

        &#39;Drink can&#39;,

        &#39;Other plastic&#39;,

        &#39;Plastic film&#39;, &#39;Other plastic wrapper&#39;,

        &#39;Unlabeled litter&#39;, &#39;Cigarette&#39;]

  2.models路径下与模型配置相关的配置文件编写。根据官方教程[2]&#xff0c;研究者可以直接修改models目录下已存在的 yolov5_.yaml系列文件来进行相关配置。这里&#xff0c;本人修改的是yolov5s.yaml文件(因为该实验使用yolov5s.pt作为模型预训练权重)。个人只要将该文件中nc属性的值修改为与上述taco.yaml的nc属性值一致即可。

模型训练

一方面&#xff0c;由于个人电脑内存相对较小&#xff0c;直接使用官方提供的训练参数设置将会导致内存爆炸而无法工作。因此&#xff0c;该实验不得不通过减少输入图像规模和batch_size值来促使模型进行训练。另一方面&#xff0c;由于个人电脑GPU性能较差&#xff0c;该实验选择直接使用CPU来训练相关模型&#xff0c;因此模型训练速度相对较慢。考虑到上述两方面的限制&#xff0c;本实验模型训练时所涉及的相关参数配置如表1所示&#xff1a;

表1 模型训练相关的参数配置

命令行参数

参数含义

设置值

--img

统一输入图像规模

320

--batch

每次网络训练输入图像的数量

4

--epochs

整个数据集参与训练的次数

100

--data

数据集配置文件路径

./data/taco.yaml

--cfg

模型配置文件路径

./models/yolov5s.yaml

--device

训练的设备(CPU or GPU)

cpu

--weights

预训练模型的权重文件

yolov5s.pt

模型训练的调用命令如下所示&#xff1a;

python train.py --img320--batch4--epochs100--data ./data/taco.yaml --cfg ./models/yolov5s.yaml --device cpu --weights yolov5s.pt

关于预训练权重的下载&#xff0c;这里就不进行详细介绍&#xff0c;百度一下应该可以找到许多国内下载的资源。在这里&#xff0c;本人在项目根目录下放置了yolov5s的权重文件(yolov5s.pt)以方便研究者训练模型。当然&#xff0c;我们完全可以不使用预训练权重来直接进行模型训练&#xff0c;只要移去上述命令的--weights yolov5s.pt部分即可。

效果展示

根据官方提供的教程&#xff0c;模型训练所生成的各类结果将被自动放置在根目录的runs文件夹下。其中&#xff0c;weights文件夹下将会存放模型训练所生成的效果最好和时间最近的权重文件&#xff0c;我们可以用这些文件完成模型的调用任务&#xff1b;results.txt文件存放着模型训练过程中的各项指标输出&#xff0c;YOLO项目还自动对该输出结果进行了可视化操作&#xff0c;生成了对应的图表图像。本实验各项指标的输出可视化图像如图3所示&#xff0c;上方五张为训练集对应结果&#xff0c;下方五张为测试集对应结果。

7d7e6f1474678c598e860134152da29d.png

图3 模型训练过程各项输出指标的可视化图像

 利用detect.py文件我们可以利用生成的模型来检测目标图像中是否存在需要检测   的对象。为了方便起见&#xff0c;我们将生成的模型权重best.pt放置在项目根目录下&#xff0c;将   需要检 测的图像inference/images文件夹下。参考官方文档&#xff0c;我们只需运行如下

 代码即可展 示模型目标检测的效果&#xff1a;

 python detect.py --weights best.pt --img320--conf0.4

 目标图像检测的效果如图4所示&#xff0c;检测生成的图像位于inference/output文件夹   中。其中&#xff0c;batch_1_000048图像中错误检测出了Drink can对象(此处主要与   conf设置值的大小有关&#xff0c;个人可以对其进行适当的调整)。

b126c4169f61405e33e7da42547eea61.png

图4 batch_1_000029(左)和batch_1_000048(右)的检测效果

实验小结

本文主要依托垃圾对象目标检测任务&#xff0c;利用新颖的YOLOv5模型对TACO垃圾对象数据集进行了实验。由于个人硬件设备的不足和时间的限制&#xff0c;参考官方给出的一些输出指标效果图和自行实验所得的图像检测结果&#xff0c;可以看到本文最终所得到的模型的性能其实相对来说不算好(YOLO系列模型本身就是需要跑非常久的时间)。感兴趣地朋友可以尝试增大统一的图像规模、增大batch_size和epoch等方式来提高该模型的目标检测性能。

参考文献

项目地址

[1]TACO&#xff1a;https://momodel.cn/workspace/5f0e734c95faedbb53ab3b26?type&#61;app

[2]yolov5&#xff1a;https://momodel.cn/workspace/5f0e7c929fda75fe7f4b01e9?type&#61;app

主要文献

[1]将COCO中的.json文件转成.txt文件&#xff1a;https://www.jianshu.com/p/8ddd8f3fdf73

[2]Train Custom Data&#xff1a;https://github.com/ultralytics/yolov5/wiki/Train-Custom-Data

6d418acc9e0c88ef4be11d97c487f587.png




推荐阅读
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 阿里Treebased Deep Match(TDM) 学习笔记及技术发展回顾
    本文介绍了阿里Treebased Deep Match(TDM)的学习笔记,同时回顾了工业界技术发展的几代演进。从基于统计的启发式规则方法到基于内积模型的向量检索方法,再到引入复杂深度学习模型的下一代匹配技术。文章详细解释了基于统计的启发式规则方法和基于内积模型的向量检索方法的原理和应用,并介绍了TDM的背景和优势。最后,文章提到了向量距离和基于向量聚类的索引结构对于加速匹配效率的作用。本文对于理解TDM的学习过程和了解匹配技术的发展具有重要意义。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
  • 深度学习中的Vision Transformer (ViT)详解
    本文详细介绍了深度学习中的Vision Transformer (ViT)方法。首先介绍了相关工作和ViT的基本原理,包括图像块嵌入、可学习的嵌入、位置嵌入和Transformer编码器等。接着讨论了ViT的张量维度变化、归纳偏置与混合架构、微调及更高分辨率等方面。最后给出了实验结果和相关代码的链接。本文的研究表明,对于CV任务,直接应用纯Transformer架构于图像块序列是可行的,无需依赖于卷积网络。 ... [详细]
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
  • Android日历提醒软件开源项目分享及使用教程
    本文介绍了一款名为Android日历提醒软件的开源项目,作者分享了该项目的代码和使用教程,并提供了GitHub项目地址。文章详细介绍了该软件的主界面风格、日程信息的分类查看功能,以及添加日程提醒和查看详情的界面。同时,作者还提醒了读者在使用过程中可能遇到的Android6.0权限问题,并提供了解决方法。 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • Vagrant虚拟化工具的安装和使用教程
    本文介绍了Vagrant虚拟化工具的安装和使用教程。首先介绍了安装virtualBox和Vagrant的步骤。然后详细说明了Vagrant的安装和使用方法,包括如何检查安装是否成功。最后介绍了下载虚拟机镜像的步骤,以及Vagrant镜像网站的相关信息。 ... [详细]
author-avatar
PHP大傻子
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有