【问题标题】:To separate objects detected from an image using PixelLib使用 PixelLib 分离从图像中检测到的对象
【发布时间】:2021-03-02 11:40:58
【问题描述】:

考虑一个瓶子的图像。我打算从图像中分离或提取瓶子的像素。瓶子通过使用 PixelLib 的图像分割来识别。代码如下:

import pixellib
from pixellib.instance import instance_segmentation
import cv2

instance_seg = instance_segmentation()
instance_seg.load_model("mask_rcnn_coco.h5")
segmask, output = instance_seg.segmentImage("sample2.jpg", show_bboxes= True)
cv2.imwrite("img.jpg", output)

“instance_segmentation”是用于执行实例分割的类,被导入并创建该类的实例。 'mask_rcnn_coco.h5' 是执行实例分割的掩码 r-cnn 模型。 'show_bboxes = True' 显示带有边界框的分割掩码。

我阅读了官方文档,并没有提到如何分离 PixelLib 检测到的对象。

代码来自link

【问题讨论】:

  • “分离一个对象”是什么意思?
  • 分离是指提取位于特定分割掩码中的像素。

标签: opencv image-processing image-segmentation


【解决方案1】:

这是您可以使用 PixelLib 提取图像中每个对象的详细信息的方法。 使用此代码

segmask, output = segment_image.segmentImage("path_to_image", show_bboxes = True)

您将获得以下详细信息:

  1. 每个对象的分割掩码
  2. 每个对象的边界框坐标
  3. 每个对象对应的类 id

然后您可以在您的应用程序中使用这些结果。

我是 PixelLib 的创建者。

【讨论】:

  • 您好,感谢您的回答。次要注意,最好不要将您的电子邮件地址添加到答案中,因为它与答案没有直接关系。相反,您可以将其添加到您的个人资料页面,用户也可以在其中找到它。
  • @Ayoola...能收到创作者本人的回答是一种荣幸和荣幸。如果您可以将其合并到官方文档中,将对其他人有很大帮助。
  • 希望您提到获取详细信息的方法。当我尝试从 segmask 获取分段掩码时,遇到了这个错误:'TypeError: img is not a numpy array, not a scalar'。
【解决方案2】:

我已经升级了 PixelLib,使得提取分段对象非常方便。 使用升级到最新版本。

pip3 install pixellib --upgrade

在这个新版本的 PixelLib 中,我添加了一个功能,可以过滤未使用的检测并针对特定类的分割。

示例图片 .

在上图中,我们要提取位于桌子上的瓶子对象。 可以使用此代码:

 import pixellib
 from pixellib.instance import instance_segmentation
    
 seg = instance_segmentation()
 seg.load_model("mask_rcnn_coco.h5")
 target_classes = seg.select_target_classes(bottle = True)
 seg.segmentImage("sample_image.jpg", segment_target_classes= target_classes, extract_segmented_objects = True, save_segmented_objects = True, show_bboxes=True,output_image_name="output.jpg") 

这与执行对象实例分割的原始代码非常相似,除了以下区别:

  • 添加了选择目标类进行分割的功能,即bottle
  • 我们在 segmentImage 函数中添加了新参数来分割目标类,提取分割后的对象并将其保存为单独的图像。

输出图像

提取的分段对象

您可以这样做以访问 segmentImage 函数返回的各个值。

segmask, output = seg.segmentImage("sample_image.jpg", segment_target_classes= target_classes, extract_segmented_objects = True, save_segmented_objects = True, show_bboxes=True,output_image_name="output.jpg") 

使用 segmask['masks'] 访问掩码值,使用 segmask['rois'] 访问边界框坐标,使用 segmask['class_ids'] 访问类 ID,使用 segmask['extracted_objects'] 访问提取的分段对象

【讨论】:

    【解决方案3】:

    如果提取的对象不止一个,如下代码

    segmask, output = seg.segmentImage("sample_image.jpg", extract_segmented_objects = True, save_segmented_objects = True, show_bboxes=True, output_image_name="output.jpg") 
    

    仅将 LAST 分段对象提取到 segmask['extracted_objects'] 中,即 segmask['extracted_objects'] 将始终只包含一个对象,无论算法正确识别了多少对象。 我不确定这是否是预期的行为,但我不这么认为。

    但是,如果使用此语法,它确实有效:

    seg.segmentImage("sample_image.jpg", extract_segmented_objects = True, save_segmented_objects = True, show_bboxes=True, output_image_name="output.jpg") 
    

    在这种情况下,分段对象作为 JPG 文件直接写入磁盘,需要重新加载才能进行进一步处理。

    【讨论】:

      【解决方案4】:

      @M. Str它提取了图像中的所有对象,但是某处有一个错误,无法返回所有提取的对象。我已经修复了它,它现在可以返回从图像中提取的所有对象。 使用升级到最新版本的 PixelLib;

      pip3 install pixellib --upgrade
      

      import pixellib
      from pixellib.instance import instance_segmentation
      
      segment_image = instance_segmentation()
      segment_image.load_model("mask_rcnn_coco.h5")
      seg, output = segment_image.segmentImage("sample4.jpg", extract_segmented_objects=True, save_extracted_objects =True,
                                               show_bboxes=True, output_image_name= "a.jpg")
      res = seg["extracted_objects"]
      for a in res:
          print(a.shape)
      

      图像中提取对象的打印形状。

      (238, 92, 3)
      (174, 260, 3)
      (117, 235, 3)
      

      【讨论】:

        猜你喜欢
        • 2022-12-29
        • 2014-10-16
        • 2013-12-20
        • 2021-07-28
        • 2012-06-05
        • 2019-07-13
        相关资源
        最近更新 更多