基于YOLOv8分割模型实现垃圾识别

基于YOLOv8分割模型实现垃圾识别

本文首发于公众号【DeepDriving】,欢迎关注。

0. 引言

YOLOv8Ultralytics开源的一个非常火的AI算法,目前支持目标检测、实例分割、姿态估计等任务。如果对YOLOv8的安装和使用还不了解的可以参考我之前写的这篇文章:

YOLOv8初体验:检测、跟踪、模型部署

本文将介绍如何使用YOLOv8的分割模型实现垃圾识别,其中所使用的训练数据来自TACO垃圾数据集。

1. 数据集介绍

TACO是一个包含在不同环境下(室内、树林、道路和海滩)拍摄的垃圾图像数据集,这些图像中的垃圾对象被精细地用方框和多边形进行了标注,标注信息采用与COCO数据集一样的格式,总共有60个类别,不过有的类别标注得很少甚至没有。下图是TACO数据集中的一些标注示例:

如果需要下载数据集,先执行下面的命令拉取官方的GitHub仓库:

git clone https://github.com/pedropro/TACO.git

然后用Python运行脚本即可下载数据集:

python3 download.py

如果下载过程中被中断了,只需重新执行download脚本即可继续下载。

2. 训练模型

2.1 转换标注格式

TACO数据集原始的标注信息被保存在一个名为annotations.json的文件中,在使用该数据集训练YOLOv8分割模型前,需要先把原始的标注信息转换为YOLOv8要求的格式。YOLOv8分割模型训练时需要的标注格式如下:

<id> <x_1> <y_1> ... <x_n> <y_n>

一个对象的标注信息放在一行,首先是该对象类别的id(从0开始算),接着将多边形各点像素坐标的xy值依次排列,其中xy的值需要分别除以图像的宽度和高度进行归一化,一幅图像的所有标注信息放在一个与图像同名的txt文件中。

进行格式转换后,txt文件中的内容类似于这样:

5 0.5183 0.4892 0.5480 0.4840 0.4840 0.5627 0.4840 0.5724 0.4853 0.5822 0.4879 0.5900
7 0.6227 0.5211 0.6232 0.5250 0.5074 0.6154 0.5081 0.6183 0.5107 0.5068 0.6120 0.6290

用于格式转换的关键Python代码如下:

img = cv2.imread(image_path)
height, width, _ = img.shapelabel_writer = open(label_path, "w")
for annotation in annotations:category_id = annotation["category_id"]seg_labels = []for segmentation in annotation["segmentation"]:points = np.array(segmentation).reshape((int(len(segmentation) / 2), 2))for point in points:x = point[0] / widthy = point[1] / heightseg_labels.append(x)seg_labels.append(y)label_writer.write(str(category_id) + " " + " ".join([str(a) for a in seg_labels]) + "\n")
label_writer.close()

2.2 创建配置文件

首先仿照ultralytics/cfg/datasets/coco128-seg.yaml创建一个TACO数据集的配置文件taco-seg.yaml,文件内容如下:

path: /home/test/TACO/data  #数据集所在的目录
train: train.txt  # 训练集路径,相对于path目录
val: val.txt  # 验证集路径,相对于path目录
test:  test.txt # 测试集路径,相对于path目录,可以不写# 类别id和名称
names:0: Aluminium foil1: Battery2: Aluminium blister pack3: Carded blister pack4: Other plastic bottle5: Clear plastic bottle6: Glass bottle7: Plastic bottle cap8: Metal bottle cap9: Broken glass10: Food Can...

数据集的设置的方式有几种形式,我的方式是建立imageslabels两个目录,分别用于存放图像和txt标注文件,然后把数据集按照8:1:1的比例划分训练集、验证集、测试集,再把三个数据集图片的绝对路径分别写入train.txtval.txttest.txt三个文件中。所以上面的taco-seg.yaml文件中设置的路径path就是train.txtval.txttest.txt这三个文件所在的目录,这三个文件中包含的是对应数据集中图片的绝对路径,类似于这样:

/home/test/TACO/data/images/batch_13/000077.jpg
/home/test/TACO/data/images/batch_11/000032.jpg
/home/test/TACO/data/images/batch_15/000073.jpg

配置好数据集后,还要设置模型参数。首先将ultralytics/cfg/models/v8/yolov8-seg.yaml文件拷贝一份,命名为yolov8-seg-taco.yaml,然后把文件中的类别数量nc80改为TACO数据集的60

...
# Parameters
nc: 60  # number of classes
scales: # model compound scaling constants, i.e. 'model=yolov8n-seg.yaml' will call yolov8-seg.yaml with scale 'n'# [depth, width, max_channels]n: [0.33, 0.25, 1024]s: [0.33, 0.50, 1024]m: [0.67, 0.75, 768]l: [1.00, 1.00, 512]x: [1.00, 1.25, 512]...

其他有关模型结构的参数如果没有必要就不需要修改了。

2.3 训练

训练YOLOv8可以使用命令行也可以编写Python代码实现,个人觉得还是使用命令行比较方便,所以本文采用命令行的方式进行训练,调用的命令如下:

yolo task=segment mode=train data=taco-seg.yaml model=yolov8n-seg-taco.yaml epochs=100 batch=16 imgsz=640 device=0 name=taco-seg

这里data参数用于指定数据集配置文件,model参数用于指定模型配置文件,如果不知道有哪些参数可以参考ultralytics/cfg/default.yaml文件,这个文件里面包含所有需要的参数。需要注意的是,我这里指定的模型配置文件名为yolov8n-seg-taco.yaml,但是前面我创建的文件名为yolov8-seg-taco.yaml,这是为什么呢?因为我这里想使用的模型是yolov8n。假如我想使用yolov8x模型,那么训练的时候设置参数model=yolov8x-seg-taco.yaml就可以了。

训练的结果保存在runs/segment/taco-seg目录下,其中权重保存在该目录下的weights文件夹中。

3. 结果

训练完成后,我们可以调用命令测试一下模型的效果:

yolo task=segment mode=predict model=runs/segment/taco-seg/weights/best.pt source=/home/test/TACO/data/images/batch_9/000096.jpg show=True

下面是我在测试集的两张图片上测试的结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/62363.shtml

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

相关文章

VUE环境下 CSS3+JS 实现发牌 翻牌

创建牌容器&#xff08;关键点&#xff1a;overflow&#xff1a;hidden&#xff09;&#xff1a; <div class"popup-box"></div> .popup-box {position: absolute;width: 100vw;height: 100vh;top: 0px;left: 0;overflow: hidden; } 创建每一张牌《固…

基于java swing和mysql实现的电影票购票管理系统(源码+数据库+运行指导视频)

一、项目简介 本项目是一套基于java swing和mysql实现的电影票购票管理系统&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。 包含&#xff1a;项目源码、项目文档、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都…

PHP小白搭建Kafka环境以及初步使用rdkafka

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、安装java&#xff08;Kafka必须安装java&#xff0c;因为kafka依赖java核心&#xff09;二、安装以及配置Kafka、zookeeper1.下载Kafka&#xff08;无需下载…

IBM安全发布《2023年数据泄露成本报告》,数据泄露成本创新高

近日&#xff0c;IBM安全发布了《2023年数据泄露成本报告》&#xff0c;该报告针对全球553个组织所经历的数据泄露事件进行深入分析研究&#xff0c;探讨数据泄露的根本原因&#xff0c;以及能够减少数据泄露的技术手段。 根据报告显示&#xff0c;2023年数据泄露的全球平均成…

产品经理,需要具备哪些能力和知识

作为产品经理&#xff0c;需要具备以下能力和知识&#xff1a; 产品管理能力&#xff1a;具备全面的产品管理能力&#xff0c;包括产品策划、需求分析、产品规划、产品设计、项目管理、市场调研和竞争分析等。 用户导向思维&#xff1a;能够理解用户需求和期望&#xff0c;以…

docker安装kafka单机详细步骤

1: 安装docker环境 略 &#xff08;转载&#xff09;centos7安装Docker详细步骤&#xff08;无坑版教程&#xff09;_屌丝的程序员的博客-CSDN博客 2.拉取zookeeper和kafka的镜像 2.1: 拉取zookeeper的镜像&#xff0c;并运行 docker pull wurstmeister/zookeeperdocker r…

17 Linux之大数据定制篇-Shell编程

17 Linux之大数据定制篇-Shell编程 文章目录 17 Linux之大数据定制篇-Shell编程17.1 Shell编程简介17.1.1 为什么要学习Shell编程17.1.2 Shell是什么17.1.3 执行Shell脚本 17.2 Shell的变量17.2.1 Shell变量介绍17.2.2 设置环境变量17.2.3 位置参数变量17.2.4 预定义变量 17.3 …

java接口(实例运用)

1.对象数组的排序 数组我们有一个现成的 sort 方法就是可以拿来对数组进行排序操作的&#xff0c;但是能不能对一个对象数组进行排序呢&#xff1f;答案是不可以的&#xff01;对象数组中的每个元素都是一个实例化的对象&#xff0c;对象中的成员属性复杂&#xff0c;你直接调用…

26 Linux高级篇-Linux面试题

26 Linux高级篇-Linux面试题 文章目录 26 Linux高级篇-Linux面试题1.分析日志t.txt(访问量)&#xff0c;将各个ip地址截取&#xff0c;并统计出现次数&#xff0c;并按从大到小排序(腾讯)2.统计连接到服务器的各个ip情况&#xff0c;并按连接数从大到小排序(腾讯)3.如忘记了mys…

【Kali Linux高级渗透测试】深入剖析Kali Linux:高级渗透测试技术与实践

&#x1f4d5;作者简介&#xff1a;热爱跑步的恒川&#xff0c;致力于C/C、Java、Python等多编程语言&#xff0c;热爱跑步&#xff0c;喜爱音乐的一位博主。 &#x1f4d7;本文收录于恒川的日常汇报系列&#xff0c;大家有兴趣的可以看一看 &#x1f4d8;相关专栏C语言初阶、C…

玩转Mysql系列 - 第8篇:详解排序和分页(order by limit),及存在的坑

这是Mysql系列第7篇。 环境&#xff1a;mysql5.7.25&#xff0c;cmd命令中进行演示。 代码中被[]包含的表示可选&#xff0c;|符号分开的表示可选其一。 本章内容 详解排序查询 详解limit limit存在的坑 分页查询中的坑 排序查询&#xff08;order by&#xff09; 电商…

基于java Swing 和 mysql实现的购物管理系统(源码+数据库+说明文档+运行指导视频)

一、项目简介 本项目是一套基于java Swing 和 mysql实现的购物管理系统&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。 包含&#xff1a;项目源码、项目文档、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过…

Effetive STL | 条款2 : 小心对“容器无关代码”的幻想

Effetive STL | 条款2 &#xff1a; 小心对“容器无关代码”的幻想 文章目录 Effetive STL | 条款2 &#xff1a; 小心对“容器无关代码”的幻想STL 容器特点推行自己的容器容器能力的交集 封装Method1: typedefMethod2: class>>>>> 欢迎关注公众号【三戒纪元】…

如何通过内网穿透实现外部网络对Spring Boot服务端接口的HTTP监听和调试?

文章目录 前言1. 本地环境搭建1.1 环境参数1.2 搭建springboot服务项目 2. 内网穿透2.1 安装配置cpolar内网穿透2.1.1 windows系统2.1.2 linux系统 2.2 创建隧道映射本地端口2.3 测试公网地址 3. 固定公网地址3.1 保留一个二级子域名3.2 配置二级子域名3.2 测试使用固定公网地址…

Python爬虫:打开盈利大门的利器

导言&#xff1a; 随着互联网的迅速发展&#xff0c;越来越多的企业和个人开始意识到数据的重要性。而Python爬虫作为一种自动化获取互联网信息的技术&#xff0c;为人们提供了更便捷、高效的数据获取方式。本文将介绍基于Python爬虫的五种盈利模式&#xff0c;并提供实际案例…

微信小程序 - 2023年最新版手机号快捷登录详细教程

前言 最近开发公司手机快捷登录的功能&#xff0c;花费了不少时间&#xff0c;这里附上详细教程。 这里以海底捞小程序的图片为例&#xff0c;如有侵权请联系小编删除。 代码如下 <button open-type"getPhoneNumber" getphonenumber"getPhoneNumber"…

oracle 基础运用2

首先在电脑上安装PLSQL developer&#xff0c;这个是oracle图形化连接工具&#xff0c;然后安装win64_11gR2_client&#xff0c;这个是orace客户端&#xff0c;安装完成后可以在cmd命令行输入sqlplus命令进行验证&#xff0c;如图表示安装成功。 作为sys的连接应该是SySDBA或Sy…

一些关于异构SOC IPC核间通信的知识

帮你了解一些关于异构SOC IPC核间通信的知识。 异构SOC是指在一个芯片上集成了不同类型的处理器核&#xff0c;例如ARM、DSP、GPU等&#xff0c;它们可以协同工作&#xff0c;提高性能、降低功耗、节省成本和空间。 IPC&#xff08;Inter-Processor Communication&#xff0…

vxe-table全选禁用并保留选中项

需求&#xff1a;1、新建时全选可用&#xff0c;提交后全选不可用&#xff1b;2、提交后新建时选中的记录还要保持选中状态 官网上写的是可以通过 strict 设置为严格模式&#xff0c;当表格中不存在有效数据时列头复选框为禁用状态。 通过设置strict可以实现第一个需求&#…

万物流动 万物永驻 ——C++ Core Guidelines的流动哲学

众所周知&#xff0c;C 是一门自由的语言&#xff0c;语言的设计哲学之一就是赋予程序员极大的自由度和灵活性&#xff0c;因此&#xff0c;使用C 完成一个任务时&#xff0c;不同的程序员往往会有不同的实现方法&#xff0c;这真正阐释了什么叫条条大路通罗马。不过&#xff0…