0


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 !

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


本文转载自: https://blog.csdn.net/csdn_xmj/article/details/138137880
版权归原作者 双木的木 所有, 如有侵权,请联系我们删除。

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

还没有评论