语义分割(Semantic Segmentation)与实例分割(Instance Segmentation)
PixelLib:是一个用于在现实生活中轻松实现图像分割的库。 PixelLib是一个灵活的库,可以集成到需要应用图像分割的软件解决方案中。
五行代码实现语义分割
- 安装PixelLib以及相关依赖
- pip3 install tensorflow
- pip3 install opencv-python
- pip3 install scikit-image
- pip3 install pillow
- pip3 install pixellib
- PixelLib 实现语义分割(在pascal voc数据集上训练了使用deeplabv3 +模型实现语义分割的代码)
import pixellib
from pixellib.semantic import semantic_segmentation
segment_image = semantic_segmentation()
segment_image.load_pascalvoc_model("deeplabv3_xception_tf_dim_ordering_tf_kernels.h5")
segment_image.segmentAsPascalvoc("path_to_image", output_image_name = "path_to_output_image")
代码解释
segment_image.load_pascalvoc_model(“deeplabv3_xception_tf_dim_ordering_tf_kernels.h5”)
在上面的代码中,我们加载了在pascal voc上训练的xception模型来分割对象。 可以从这里下载模型。
segment_image.segmentAsPascalvoc(“path_to_image”, output_image_name = “path_to_output_image)
对图像进行分割,其中
path_to_image :要分割的图像的路径
output_image_name:保存分割图像的路径
比如:
segment_image.segmentAsPascalvoc("sample1.jpg", output_image_name = "image_new.jpg")
将上面的图像应用segmentation overlay
segment_image.segmentAsPascalvoc("sample1.jpg", output_image_name = "image_new.jpg", overlay = True)
可以使用如下的代码来获得执行的时间
import pixellib
from pixellib.semantic import semantic_segmentation
import time
segment_image = semantic_segmentation()
segment_image.load_pascalvoc_model("pascal.h5")
start = time.time()
segment_image.segmentAsPascalvoc("sample1.jpg", output_image_name= "image_new.jpg")
end = time.time()
print(f"Inference Time: {end-start:.2f}seconds")
xception在pascal voc数据集上进行训练,该数据集包含20个类别,类别机器对应的元素图如下:
使用如下的代码获得分割输出的数组
output, segmap = segment_image.segmentAsPascalvoc()
可以通过修改下面的语义分割代码来测试用于获取数组的代码并打印输出的形状。
import pixellib
from pixellib.semantic import semantic_segmentation
import cv2
segment_image = semantic_segmentation()
segment_image.load_pascalvoc_model("pascal.h5")
output, segmap = segment_image.segmentAsPascalvoc("sample1.jpg")
cv2.imwrite("img.jpg", output)
print(output.shape)
使用此代码获取输出和segmentation overlay的数组
segmap, segoverlay = segment_image.segmentAsPascalvoc(overlay = True)
import pixellib
from pixellib.semantic import semantic_segmentation
import cv2
segment_image = semantic_segmentation()
segment_image.load_pascalvoc_model("pascal.h5")
segmap, segoverlay = segment_image.segmentAsPascalvoc("sample1.jpg", overlay= True)
cv2.imwrite("img.jpg", segoverlay)
print(segoverlay.shape)
使用pixellib进行实例分割(mask R-CNN 模型)
import pixellib
from pixellib.instance import instance_segmentation
segment_image = instance_segmentation()
segment_image.load_model("mask_rcnn_coco.h5")
segment_image.segmentImage("path_to_image", output_image_name = "output_image_path")
在此处下载mask_rcnn的模型
显示bounding_box
segment_image.segmentImage("path_to_image", output_image_name = "output_image_path", show_bboxes = True)
如下代码显示运行时间
import pixellib
from pixellib.instance import instance_segmentation
import time
segment_image = instance_segmentation()
segment_image.load_model("mask_rcnn_coco.h5")
start = time.time()
segment_image.segmentImage("former.jpg", output_image_name= "image_new.jpg")
end = time.time()
print(f"Inference Time: {end-start:.2f}seconds")
通过修改下面的实例细分代码来测试用于获取数组的代码并打印输出的形状。
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")
cv2.imwrite("img.jpg", output)
print(output.shape)
通过包含参数show_bboxes获得带有边界框的分割数组。
segmask, output = segment_image.segmentImage(show_bboxes = True)
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)
print(output.shape)
Install PixelLib and test it with as many images you desire.
Visit the official github repository of PixelLib.
Visit the official documentation of PixelLib