考虑一个瓶子的图像。我打算从图像中分离或提取瓶子的像素。使用 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
这就是如何利用 PixelLib 提取图像中每个对象的详细信息。 使用此代码
segmask, output = segment_image.segmentImage("path_to_image", show_bboxes = True)
您将获得以下详细信息:
然后您可以在您的应用程序中使用这些结果。
我是 PixelLib 的创建者。
我升级了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")
这与执行对象实例分割的原始代码非常相似,除了以下差异:
提取的分段对象
您可以执行此操作来访问 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'] 访问提取的分段对象
如果提取的对象不止一个,请使用以下代码
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 文件直接写入磁盘,并且需要重新加载才能用于进一步处理。
@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)