当前位置:   article > 正文

SAM + YOLO 智能抠图_yolov8 sam

yolov8 sam

计算机视觉领域,对象检测和实例分割是使机器能够理解视觉数据并与之交互的关键任务。 准确识别和隔离图像中的物体的能力具有许多实际应用,从自动驾驶车辆到医学成像。

在这篇博文中,我们将探索如何在 Roboflow 和 Ultralytics YOLOv8 的帮助下使用 Jupyter 笔记本将边界框转换为分割掩模并删除图像的背景。

你可以在 Google Colab 上找到本教程的完整notebook

在线工具推荐:  -  - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器

1、分割掩模代替边界框的好处

想象一下,你有一个包含感兴趣对象的图像数据集,每个图像都用边界框标注。 虽然边界框提供了有关对象的位置信息,但它们缺乏更高级的计算机视觉任务(例如实例分割或背景去除)所需的精细细节。

将边界框转换为分割掩模使我们能够提取准确的对象边界并将其与背景分开,从而为分析和操作开辟了新的机会。

2、用YOLOv8 和 SAM 创建实例分割数据集

为了解决将边界框转换为分割掩模的挑战,我们将在 Jupyter 笔记本环境中使用 Roboflow 和 Ultralytics 库。 Roboflow 简化了数据准备和标注,而 Ultralytics 提供了最先进的对象检测模型和实用程序。

2.1 搭建notebook环境

pip install roboflow ultralytics 'git+https://github.com/facebookresearch/segment-anything.git'

我们首先导入必要的包并设置笔记本环境。 下面的代码片段演示了初始设置:

  1. import ultralytics
  2. from IPython.display import display, Image
  3. from roboflow import Roboflow
  4. import cv2
  5. import sys
  6. import numpy as np
  7. import matplotlib.pyplot as plt
  8. # Set the device for GPU acceleration
  9. device = "cuda"
  10. # Check Ultralytics version and setup completion
  11. ultralytics.checks()
  12. # Set the first_run flag to False after the initial run
  13. first_run = False
  14. if first_run:
  15. !{sys.executable} -m pip install 'git+https://github.com/facebookresearch/segment-anything.git'
  16. !wget https://dl.fbaipublicfiles.com/segment_anything/sam_vit_h_4b8939.pth

2.2 加载数据集

接下来,使用 Roboflow API 加载数据集以访问和管理数据集。 以下代码片段演示了如何从特定项目加载数据集版本:

  1. from roboflow import Roboflow
  2. rf = Roboflow(api_key="YOUR_API_KEY")
  3. project = rf.workspace("vkr-v2").project("vkrrr")
  4. dataset = project.version(5).download("yolov8")

2.3 运行 YOLOv8 推理

为了使用 YOLOv8 执行目标检测,我们运行以下代码:

  1. from ultralytics import YOLO
  2. # Load the YOLOv8 model
  3. model = YOLO('yolov8n.pt')
  4. # Perform object detection on the image
  5. results = model.predict(source='PATH_TO_IMAGE', conf=0.25)

2.4 提取边界框

一旦我们得到 YOLOv8 的结果,就可以提取检测到的对象的边界框坐标:

  1. for result in results:
  2. boxes = result.boxes
  3. bbox = boxes.xyxy.tolist()[0]
  4. print(bbox)

结果如下:

[746.568603515625, 40.80133056640625, 1142.08056640625, 712.3660888671875]

2.5 将边界框转换为分割掩模

让我们加载 SAM 模型并将其设置为推理:

  1. from segment_anything import sam_model_registry,
  2. image = cv2.cvtColor(cv2.imread('PATH_TO_IMAGE'), cv2.COLOR_BGR2RGB)
  3. SamAutomaticMaskGenerator, SamPredictor
  4. sam_checkpoint = "sam_vit_h_4b8939.pth"
  5. model_type = "vit_h"
  6. sam = sam_model_registry[model_type](checkpoint=sam_checkpoint)
  7. sam.to(device=device)
  8. predictor = SamPredictor(sam)
  9. predictor.set_image(image)

接下来定义几个用于显示的辅助函数:

  1. def show_mask(mask, ax, random_color=False):
  2. if random_color:
  3. color = np.concatenate([np.random.random(3), np.array([0.6])], axis=0)
  4. else:
  5. color = np.array([30/255, 144/255, 255/255, 0.6])
  6. h, w = mask.shape[-2:]
  7. mask_image = mask.reshape(h, w, 1) * color.reshape(1, 1, -1)
  8. ax.imshow(mask_image)
  9. def show_points(coords, labels, ax, marker_size=375):
  10. pos_points = coords[labels==1]
  11. neg_points = coords[labels==0]
  12. ax.scatter(pos_points[:, 0], pos_points[:, 1], color='green', marker='*', s=marker_size, edgecolor='white', linewidth=1.25)
  13. ax.scatter(neg_points[:, 0], neg_points[:, 1], color='red', marker='*', s=marker_size, edgecolor='white', linewidth=1.25)
  14. def show_box(box, ax):
  15. x0, y0 = box[0], box[1]
  16. w, h = box[2] - box[0], box[3] - box[1]
  17. ax.add_patch(plt.Rectangle((x0, y0), w, h, edgecolor='green', facecolor=(0,0,0,0), lw=2))

接下来,我们使用 SAM 模型将边界框坐标转换为分割掩模:

  1. input_box = np.array(bbox)
  2. masks, _, _ = predictor.predict(
  3. point_coords=None,
  4. point_labels=None,
  5. box=bbox[None, :],
  6. multimask_output=False,
  7. )

然后绘制出来:

  1. plt.figure(figsize=(10, 10))
  2. plt.imshow(image)
  3. show_mask(masks[0], plt.gca())
  4. show_box(input_box, plt.gca())
  5. plt.axis('off')
  6. plt.show()

2.6 背景去除

最后,我们可以使用分割掩模从图像中去除背景。 以下代码片段演示了该过程:

  1. segmentation_mask = masks[0]
  2. # Convert the segmentation mask to a binary mask
  3. binary_mask = np.where(segmentation_mask > 0.5, 1, 0)
  4. white_background = np.ones_like(image) * 255
  5. # Apply the binary mask
  6. new_image = white_background * (1 - binary_mask[..., np.newaxis]) + image * binary_mask[..., np.newaxis]
  7. plt.imshow(new_image.astype(np.uint8))
  8. plt.axis('off')
  9. plt.show()

然后显示生成的图像,结果如下,背景已经剔除干净:

3、结束语

在这篇博文中,我们探索了如何使用 Jupyter Notebook 将边界框转换为分割蒙版并删除背景。

通过利用 Roboflow 和 Ultralytics 库的功能,我们可以轻松执行对象检测、生成分割掩模并操作图像。 这为高级计算机视觉任务(例如实例分割和背景去除)开辟了可能性,并使我们能够从视觉数据中提取有价值的见解。


原文链接:SAM+YOLO=自动抠图 - BimAnt

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/73144
推荐阅读
  

闽ICP备14008679号