使用 PixelLib 分离从图像中检测到的对象

问题描述 投票:0回答:5

考虑一个瓶子的图像。我打算从图像中分离或提取瓶子的像素。使用 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' 是用于执行实例分割的 mask r-cnn 模型。 'show_bboxes = True' 显示带有边界框的分段掩码。

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

代码参考自link

opencv image-processing image-segmentation
5个回答
3
投票

这就是如何利用 PixelLib 提取图像中每个对象的详细信息。 使用此代码

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

您将获得以下详细信息:

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

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

我是 PixelLib 的创建者。


1
投票

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

pip3 install pixellib --upgrade

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

示例图片 sample.

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

 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'] 访问提取的分段对象


0
投票

如果提取的对象不止一个,请使用以下代码

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

仅将最后一个分段对象提取到 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 文件直接写入磁盘,并且需要重新加载才能用于进一步处理。


0
投票

@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)

0
投票

您可以使用 github 上的answer计算如下所示的掩模,然后使用以下语句删除背景。

bg_removed = cv2.bitwise_and(inp_img, mask)
Object

© www.soinside.com 2019 - 2024. All rights reserved.