目录
计算机视觉应用中的图像分割
图像分割
批处理图像分割
视频分割
摄像机视频的分割
计算机视觉应用中的图像分割
计算机视觉是计算机看到和分析他们所看到的东西的能力。图像分割是计算机视觉的一个方面,它处理将计算机可视化对象的内容分割为不同的类别,以便更好地进行分析。
图像分割过程的一个很好的例子是图像中对象的前景-背景分离,这是一种将对象与其背景分离的技术,用于分析对象及其背景。图像分割实现前景-背景分离的能力使其成为解决医学图像分析、背景编辑、自动驾驶汽车视觉和卫星图像分析等许多计算机视觉问题的重要领域。
PixelLib库是一个库,它允许使用几行python代码轻松集成图像和视频中的对象分割。它支持许多惊人的功能,例如:
图像和视频中对象的语义和实例分割。
细分模型的定制训练。
图像和视频中的背景编辑。
提取图像和视频中的对象。
实时图像分割应用的需求
Pytorch PixelLib:计算机视觉中最大的挑战之一是保持实时应用程序的精度和速度性能之间的距离。在计算机视觉领域,计算机视觉解决方案要么更精确、速度慢,要么精度更低、速度更快,这是一个两难的问题。
以前版本的深度学习lib库使用tensorflow深度学习库作为后台,采用Mask R-CNN进行实例分割。Mask R-CNN是一种非常好的体系结构,但在实时应用中无法平衡精度和速度性能。
PixelLib现在支持pytorch后端,使用PointRend分割架构对图像和视频中的对象执行更快、更准确的分割和提取。
Alexander Kirillov等人的PointRend对象分割体系结构用于替代Mask R-CNN来执行对象的实例分割。PointRend是一种用于实现对象分割的先进神经网络。它生成精确的分割模板,并以高推理速度运行,以满足对精确和实时计算机视觉应用日益增长的需求。
多操作系统支持
PixelLib是一个为支持不同操作系统而构建的库。我通过Detectron2将PixelLib与PointRend的python实现集成在一起,后者只支持Linux操作系统。
我对最初的Detectron2 PointRend实现进行了修改,以支持Windows操作系统。我很高兴告诉大家一个好消息,用于PixelLib的PointRend实现同时支持Linux和Windows操作系统。
上面的示例图像是PointRend与Mask RCNN分割结果差异的示例。很明显,与左侧的Mask R-CNN结果相比,右侧的PointRend图像结果是更好的分割输出。
注意:本文基于使用pytorch和PointRend执行实例分割。如果你想了解如何使用tensorflow和Mask R-CNN执行实例分割,请阅读以下文章:
https://towardsdatascience.com/image-segmentation-with-six-lines-0f-code-acb870a462e8
下载Python
PixelLib pytorch版本支持python 3.7及以上版本。下载兼容的python版本。
https://www.python.org/
安装PixelLib及其依赖项
安装Pytorch
PixelLib Pytorch版本支持Pytorch的这些版本(1.6.0、1.7.1、1.8.0和1.9.0)。
注意:Pytorch 1.7.0不受支持,请勿使用任何低于1.6.0的Pytorch版本。安装兼容的Pytorch版本。
https://pytorch.org/
安装Pycocotools
pip3 install pycocotools
安装pixellib
pip3 install pixellib
如果已安装,请使用以下软件升级至最新版本:
pip3 install pixellib — upgrade
图像分割
PixelLib使用五行python代码在具有PointRend模型的图像和视频中执行对象分割。下载PointRend模型。这是图像分割的代码。
import pixellib
from pixellib.torchbackend.instance import instanceSegmentation
ins = instanceSegmentation()
ins.load_model("pointrend_resnet50.pkl")
ins.segmentImage("image.jpg", show_bboxes=True, output_image_name="output_image.jpg")
第1-4行:导入了PixelLib包,我们还从模块pixellib.torchbackend.instance导入了instanceSegmentation类(从pytorch支持导入实例分段类)。我们创建了该类的一个实例,并最终加载了下载的PointRend模型。
第5行:我们调用函数segmentImage来执行图像中对象的分割,并在函数中添加了以下参数:
image_path:这是要分割的图像的路径。
show_bbox:这是一个可选参数,用于显示带边框的分段结果。
output_image_name:这是保存的分段图像的名称。
用于分割的样本图像
ins.segmentImage("image.jpg",output_image_name="output.jpg")
分割后的图像
The checkpoint state_dict contains keys that are not used by the model: proposal_generator.anchor_generator.cell_anchors.{0, 1, 2, 3, 4}
如果你正在运行分段代码,上面的日志可能会出现!这不是一个错误,代码可以正常工作!
获得分割结果
results, output = ins.segmentImage("image.jpg", show_bboxes=True, output_image_name="result.jpg")
print(results)
分割结果返回一个字典,其中包含许多与图像中分割的对象相关的值。打印的结果将采用以下格式:
{'boxes': array([[ 579, 462, 1105, 704],
[ 1, 486, 321, 734],
[ 321, 371, 423, 742],
[ 436, 369, 565, 788],
[ 191, 397, 270, 532],
[1138, 357, 1197, 482],
[ 877, 382, 969, 477],),
'class_ids': array([ 2, 2, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 2, 24, 24,2, 2,2, 0, 0, 0, 0, 0, 0], dtype=int64),
'class_names': ['car', 'car', 'person', 'person', 'person', 'person', 'person', 'car', 'person', 'person', 'person', 'person', 'car', 'backpack', 'backpack', 'car', 'car', 'car', 'person', 'person', 'person', 'person', 'person', 'person'],
'object_counts': Counter({'person': 15, 'car': 7, 'backpack': 2}),
'scores': array([100., 100., 100., 100., 99., 99., 98., 98., 97., 96., 95.,95., 95., 95., 94., 94., 93., 91., 90., 88., 82., 72.,69., 66.], dtype=float32),
'masks': array([[[False, False, False, ..., False, False, False],
[False, False, False, ..., False, False, False],
'extracted_objects': []
上面打印的结果值包括:
{'boxes': array([[5.790e+02, 4.620e+02, 1.105e+03, 7.050e+02],[1.000e+00, 4.870e+02, 3.220e+02, 7.340e+02],[1.142e+03, 3.640e+02, 1.161e+03, 4.060e+02]], dtype=float32),
boxes:这些是分割对象的边界框坐标。我没有显示所有框的坐标,这是因为列表太长了。
'class_ids': array([ 2, 2, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 2, 24, 24,2, 2,2, 0, 0, 0, 0, 0, 0], dtype=int64),
class_ids:这些是分段对象的类ID。
'class_names': ['car', 'car', 'person', 'person', 'person', 'person', 'person', 'car', 'person', 'person', 'person', 'person', 'car', 'backpack', 'backpack', 'car', 'car', 'car', 'person', 'person', 'person', 'person', 'person', 'person'],
class_names:这些是分段对象的类名。
'object_c