本文来源公众号“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 !
文章结束,感谢阅读。您的点赞,收藏,评论是我继续更新的动力。大家有推荐的公众号可以评论区留言,共同学习,一起进步。