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

07-17 800阅读

本文来源公众号“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/

    OpenCV与AI深度学习 | 如何使用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)

              结果图如下:

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

              4 参考

              YOLOv9论文:

              https://arxiv.org/abs/2402.13616

              YOLOv9 Github地址:

              https://github.com/WongKinYiu/yolov9

              THE END !

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

VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]