OpenCV与AI深度学习 | 如何使用YOLOv9分割图像中的对象

本文来源公众号“OpenCV与AI深度学习,仅用于学术分享,侵权删,干货满满。

原文链接:如何使用YOLOv9分割图像中的对象

1 介绍

    在我们之前的文章中,我们使用 YOLOv8 探索了令人兴奋的对象分割世界。分割使计算机视觉比简单的对象检测更进一步。检测可以识别图像中对象的存在和位置,而分割则更进一步,仔细勾勒出每个对象的确切边界。这使得人们能够更细致地了解视觉场景,其应用范围从自动驾驶汽车到医学图像分析。

    今天,我们将在此基础上研究 YOLOv9 在分割任务方面的潜力。YOLOv9 是 You Only Look Once (YOLO) 系列目标检测算法的最新迭代,有望在速度和准确性方面取得显著进步。让我们深入研究如何利用 YOLOv9 来实现更强大的对象分割。

2 为什么 YOLOv9 可以改变细分游戏规则

    基于YOLOv8 在分割方面的成功,YOLOv9 提供了几个潜在的优势,可以使其成为您下一个项目的首选:

    • 推测速度提升:YOLO 模型以其实时功能而闻名。由于 YOLOv9 预计比 YOLOv8 更快,因此它可能非常适合需要瞬间分割的应用,例如自动驾驶车辆或机器人对象操纵。

    • 潜在的准确性提升:YOLO 开发人员不断努力提高检测和分类的准确性。如果 YOLOv9 效仿,它可以转化为更精确的分割掩模,从而在医学成像或场景理解等任务中获得更好的性能。

    • 效率增强:YOLOv9 中的新架构改进可能会提高处理图像进行分割的效率。这可能有利于计算资源有限的用户或处理大量图像处理任务的用户。

    • 新分割技术的潜力:YOLOv9 核心架构的进步可能为全新的分割技术打开大门。我们可能会看到处理复杂对象形状、遮挡的创新,甚至探索超越像素标记的新分割形式。

3 如何使用 YOLOv9 处理图像

第 1 步:安装必要的库

pip install opencv-python ultralytics numpy

第 2 步:导入库

from ultralytics import YOLO
import random
import cv2
import numpy as np

第 3 步:选择模型

model = YOLO("yolov9e-seg.pt")

    在下面网站中,您可以比较不同的模型并权衡各自的优缺点。在本例中,我们选择了 yolov9e-seg.pt。

https://docs.ultralytics.com/models/yolov9/

第 4 步:使用 YOLOv9 分割图像中的对象

img = cv2.imread("YourImagePath")

# if you want all classes
yolo_classes = list(model.names.values())
classes_ids = [yolo_classes.index(clas) for clas in yolo_classes]

conf = 0.2

results = model.predict(img, conf=conf)
colors = [random.choices(range(256), k=3) for _ in classes_ids]
print(results)
for result in results:
    for mask, box in zip(result.masks.xy, result.boxes):
        points = np.int32([mask])
        # cv2.polylines(img, points, True, (255, 0, 0), 1)
        color_number = classes_ids.index(int(box.cls[0]))
        cv2.fillPoly(img, points, colors[color_number])

    1. 加载图片:

  • img = cv2.imread("YourImagePath")使用OpenCV的函数从指定路径读取图像cv2.imread()。

    2. 预测准备:

  • yolo_classes = list(model.names.values())创建 YOLOv9 模型识别的类名列表。
  • classes_ids = [yolo_classes.index(clas) for clas in yolo_classes]创建与这些名称相对应的类 ID 列表。
  • conf = 0.2设置对象检测的置信度阈值。仅考虑置信度分数高于此阈值的预测。

    3. 运行模型预测:

  • results = model.predict(img, conf=conf)调用predict()YOLOv9模型的方法对加载的图像进行预测。结果包括检测到的对象、其边界框、掩模(多边形轮廓)、置信度分数和类别预测。
  • colors = [random.choices(range(256), k=3) for _ in classes_ids]生成一个随机颜色列表,每个类别一个,用于视觉表示。

    4. 处理结果和可视化掩模:

    该for循环迭代结果中每个检测到的对象:

  • mask, box = zip(result.masks.xy, result.boxes)解包对象的掩模坐标和边界框信息。
  • points = np.int32([mask])将掩模坐标(可能采用浮点格式)转换为整数,以便使用 OpenCV 在图像上绘图。
  • color_number = classes_ids.index(int(box.cls[0]))根据对象的预测类别确定视觉表示的颜色索引。
  • cv2.fillPoly(img, points, colors[color_number])用原始图像上相应的颜色填充掩模坐标定义的多边形,有效地创建对象的视觉分割。

    笔记:

  • 如果未注释,注释掉的线# cv2.polylines(img, points, True, (255, 0, 0), 1)将在蒙版周围绘制轮廓,而不是填充它们。

第 5 步:保存并绘制结果图像

cv2.imshow("Image", img)
cv2.waitKey(0)

cv2.imwrite("YourSavePath", img)

完整代码:

from ultralytics import YOLO
import random
import cv2
import numpy as np

model = YOLO("yolov9e-seg.pt")

img = cv2.imread("YourImagePath")

# if you want all classes
yolo_classes = list(model.names.values())
classes_ids = [yolo_classes.index(clas) for clas in yolo_classes]

conf = 0.2

results = model.predict(img, conf=conf)
colors = [random.choices(range(256), k=3) for _ in classes_ids]
print(results)
for result in results:
    for mask, box in zip(result.masks.xy, result.boxes):
        points = np.int32([mask])
        # cv2.polylines(img, points, True, (255, 0, 0), 1)
        color_number = classes_ids.index(int(box.cls[0]))
        cv2.fillPoly(img, points, colors[color_number])

cv2.imshow("Image", img)
cv2.waitKey(0)

cv2.imwrite("YourSavePath", img)

结果图如下:

4 参考

YOLOv9论文:

https://arxiv.org/abs/2402.13616

YOLOv9 Github地址:

https://github.com/WongKinYiu/yolov9

THE END !

文章结束,感谢阅读。您的点赞,收藏,评论是我继续更新的动力。大家有推荐的公众号可以评论区留言,共同学习,一起进步。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux进程详解:进程优先级,调度算法,进程特性

文章目录 进程优先级Linux下的调度算法进程特性 进程优先级 进程要访问某种软硬件资源,此时进程需要通过一定的方式(排队),来确认享受某种资源的先后顺序。 优先级是确认先后问题,权限是确认能不能的问题。 资源有限…

5个常见的前端手写功能:浅拷贝与深拷贝、函数柯里化、数组扁平化、数组去重、手写类型判断函数

浅拷贝与深拷贝 浅拷贝 浅拷贝是创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型,拷贝的就是基本类型的值,如果属性是引用类型,拷贝的就是内存地址,所以如果其中一个对象改变了这个地…

数据库安全如何保障?YashanDB有妙招(上篇)

数据库作为信息系统的核心,不仅承载着海量的关键数据,还负责向各类用户提供高效、可靠的信息服务,数据库的安全性显得尤为关键,已成为信息安全体系的重中之重。 什么是数据库安全? 数据库安全是数据安全的一个子集&…

AI-数学-高中-45函数单调性与导数

原作者视频:【导数】【一数辞典】5函数单调性与导数(重要)_哔哩哔哩_bilibili 导数最重要作用:判断函数单调性。 示例:

基于SpringBoot和Leaflet的地震台网信息预警可视化

目录 前言 一、后台管理设计与实现 1、Model层 2、业务层 3、控制层 二、前端预警可视化设计与实现 1、网页结构 2、数据绑定 三、效果展示 总结 前言 在之前的几篇博客中,我们讲解了如何在Leaflet中进行预警信息提示效果,以及基于XxlCrawler进…

智能写作工具,一键改写文章不费力

改写是一种用来创作原创文章的方式,也是用来提升文章质量的方法。无论我们在创作中通过改写来提升文章的质量,还是用改写帮助我们达到原创文章的生成,文章改写都可以实现我们这些目的,然而,想要高效率轻松改写文章我们…

三分钟设计自己的工厂!基于昇腾AI处理器昇思MindSpore打造的智能化工大模型为化工研发效率带来10+倍提升

前言:华为与大连化物所深度合作,联合推出智能化工大模型,AI赋能化工领域,拥抱科学创新,提供了数据驱动化工研发的新范式。 2024年3月22日,在北京国家会议中心召开的昇思人工智能框架峰会上发布了由华为AI4…

VForm3的文件上传方式

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio 演示地址:RuoYi-Nbcio后台管理系统 http://122.227.135.243:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a…

智能条件单无需盯盘!

一般我们说到量化交易都觉得很困难,写策略难,看python难,不会使用程序难,电脑交易不方便难,今天我们来看看手机电脑都可以使用的量化基础条件单的操作。 迈入量化第一步,条件单的使用! 今天小编…

企业微信hook接口协议,标签变动回调

个人标签新增回调 {"labellist": [{"op": 3, "bDeleted": 0, //0代表新增"create_time": 1678114162, "label_groupid": 14073749131792038, "label_type": 2, "source_appid": 0, "business_typ…

Python 装饰器

Python 装饰器 1. 简单的装饰器 下面是一个简单的装饰器示例,它记录被装饰函数的调用信息: def my_decorator(func):""" 中层函数:接收被装饰的函数 """def wrapper():""" 内层函数&#xf…

嵌入式4-25

整理思维导图在课上练习的基础上&#xff0c;完成拷贝赋值函数完成下列类 #include <iostream> using namespace std;class person {string name;int age;char sex; public:int *p;person(){cout<<"person无参构造"<<endl;};person(const string n…

专业护眼灯什么牌子好?2024年专业护眼灯品牌排行分享

专业护眼灯什么牌子好&#xff1f;各位家长可能已经注意到一个令人关切的现象&#xff1a;戴眼镜的孩子人数在不断上升&#xff0c;许多孩子正在接受眼部治疗。眼睛健康的问题变得越来越普遍&#xff0c;这无疑令人担忧。在当今数字化时代&#xff0c;孩子们每日需长时间阅读和…

对腾讯文档AI助手技术架构的简单分析

腾讯文档全面接入了AI&#xff0c;今天腾讯技术大佬tensorchen作者发表了一篇文章《腾讯文档AI助手技术实践》&#xff0c; 里面讲解了从技术应用架构以及AI大模型赋能角度&#xff0c;介绍腾讯文档AI智能助手的探索和实践之路。作为一款集多功能为一体的AI产品&#xff0c;腾…

Web前端开发之HTML_3

标签之表格Form表单块元素与行内元素&#xff08;内联元素&#xff09;HTML5新增标签 1. 标签之表格 <table></table> 1.1 表格&#xff08;快速生成&#xff1a;table>tr*2>td*3{单元格}&#xff09; 表格由行、列、单元格组成。单元格有同行等高、同列等…

(八)Servlet教程——创建Web项目以及Servlet的实现

1. 打开Idea编辑器 2. 点击界面上的“新建项目”按钮 3. 设置好项目名称和位置 应用服务器选择之前设置好的Tomcat服务器 构建系统默认选择Maven 4. 点击“下一步”按钮 5. 点击“完成”按钮&#xff0c;Idea就创建好了项目&#xff0c;创建完成后的目录结构如下图所示 6. 此…

2024.4.25

#include <iostream> #include <iomanip> using namespace std; class Person{const string name;int age;char sex; public:Person(const string name):name(name){cout << "第一个Person构造函数" << endl;}Person():name("zhangsan&…

js网络请求---fetch和XMLHttpRequest的用法

fetch 语法规则 let promise fetch(url, [options]) //url —— 字符串&#xff1a;要访问的 URL。 //options —— 对象&#xff1a;可选参数&#xff1a;method&#xff0c;header 等。 fetch函数返回一个promise&#xff0c;若存在网络问题&#xff0c;或网址不存在&…

Java通过邮件发送验证码和通过手机号发送验证码

前提&#xff1a;我将验证码存入了map集合&#xff0c;进行验证。 private static HashMap<String, Integer> emailMap new HashMap<>();一、通过邮箱发送验证码&#xff1a; 1、准备条件&#xff1a;引入hutool依赖&#xff0c; <!--hutool--><depend…

【C语言】深入理解KMP算法及C语言实现

一、KMP算法简介 KMP算法&#xff08;Knuth-Morris-Pratt算法&#xff09;是一种高效的字符串匹配算法&#xff0c;由Donald Knuth、James H. Morris和 Vaughan Pratt共同发明。KMP算法的核心思想是当一次字符比较失败时&#xff0c;利用已经得到的部分匹配信息&#xff0c;将模…