当前位置: 首页 > 科技观察

5行代码,快速实现图像分割,逐行详细代码讲解,教你如何处理图像

时间:2023-03-12 08:14:23 科技观察

加工。那么,如何优雅得体地进行图像分割呢?了解PixelLib,这是一个只需5行代码即可在几分钟内实现的库。当然,这么好用的项目,开源是必须的。为什么要使用图像分割?虽然计算机视觉研究人员经常会接触到图像分割的问题,但我们还是需要对其进行“细化”(对于初学者)。我们都知道每幅图像都是由一组像素值组成的。简单地说,图像分割就是在像素级别对图像进行分类的任务。图像分割中使用的一些“独特秘密”使其能够处理一些关键的计算机视觉任务。主要分为两大类:语义分割:就是给图像中的每个像素点分配一个类别标签,用不同的颜色表示。实例分割:不需要标记每个像素,只需要找到感兴趣对象的边缘轮廓即可。它还经常出现在更重要的场景中:无人驾驶汽车视觉系统可以有效地理解道路场景。医学图像分割,可以帮助医生进行诊断测试。卫星图像分析等。因此,图像分割技术的应用仍然非常重要。接下来,让我们直奔主题,开始了解PixelLib这个神奇又好用的库。快速安装PixelLibPixelLib是一个可以非常简单的实现图像分割的库——5行代码就可以实现语义分割和实例分割。老规矩,先介绍一下安装环境。安装最新版本的TensorFlow、Pillow、OpenCV-Python、scikit-image和PixelLib:用在pascalvoc上预训练的Xception模型执行语义分割:importpixellibfrompixellib.semanticimportsemantic_segmentationsegment_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”)让我们看一下每行代码:importpixellibfrompixellib.semanticimportsemantic_segmentation#createdaninstanceofsemanticsegmentationclasssegment_image=semantic_segmentation()从pixellib导入用于进行语义分割的类,并创建该类的一个实例。segment_image.load_pascalvoc_model("deeplabv3_xception_tf_dim_ordering_tf_kernels.h5")调用函数加载在pascalvoc上训练的xception模型(xception模型可在文末传送门链接下载)。segment_image.segmentAsPascalvoc("path_to_image",output_image_name="path_to_output_image")这是分割图像的代码行。该函数包含两个参数:path_to_image:图像分割的路径。path_to_output_image:保存输出图像的路径,图像将保存在您当前的工作目录中。接下来上图,实战!图片文件命名为:sample1.jpg,如下图所示。执行代码如下:importpixellibfrompixellib.semanticimportsemantic_segmentationsegment_image=semantic_segmentation()segment_image.load_pascalvoc_model(“deeplabv3_xception_tf_dim_ordering_tf_kernels.h5”)segment_image.segmentAsPascalvoc(“sample1.jpg”,output_image_name=“image_new.jpg”)可以看到,在执行代码后,保存的在图像中,所有对象都被分割。也可以稍微修改代码以获得具有目标对象的分割叠加的图像。segment_image.segmentAsPascalvoc("sample1.jpg",output_image_name="image_new.jpg",overlay=True)添加一个附加参数并将其设置为True以生成具有分段叠加的图像。可以通过修改下面的代码来检查执行分段所需的推理时间。importpixellibfrompixellib.semanticimportsemantic_segmentationimporttimesegment_image=semantic_segmentation()segment_image.load_pascalvoc_model(“pascal.h5”)start=time.time()segment_image.segmentAsPascalvoc(“sample1.jpg”,output_image_name=“image_time.jpg(print))end=(f”推理时间:{end-start:.2f}seconds")输出如下:InferenceTime:8.19seconds可以看到,对图像进行语义分割只用了8.19秒。该xception模型使用具有20个常见对象类别的pascalvoc数据集进行训练。对象及其对应的颜色图如下:PixelLib实现实例分割虽然语义分割的结果看起来不错,但对于图像分割的某些特定任务可能并不理想。在语义分割中,同一类别的对象被赋予相同的颜色图,因此语义分割可能无法提供特别充足的图像信息。因此,实例分割诞生了——同一类别的对象被赋予不同的颜色图。PixelLib在进行实例分割时,基于MaskRCNN的框架如下:先上代码。importpixellibfrompixellib.instanceimportinstance_segmentationsegment_image=instance_segmentation()导入用于执行实例分割的类并创建此类的实例。segment_image.load_model("mask_rcnn_coco.h5")这是加载MaskRCNN模型进行实例分割的代码(MaskRCNN模型可在文末传送门链接下载)。segment_image.segmentImage("path_to_image",output_image_name="output_image_path")这是图像分割实例的代码,需要两个参数:path_to_image:模型要预测的图像的路径。output_image_name:分割结果保存路径,会保存在当前工作目录下。上图,实战中的第二弹!图片文件命名为:sample2.jpg,如下图所示。执行代码如下:importpixellibfrompixellib.instanceimportinstance_segmentationsegment_image=instance_segmentation()segment_image.load_model("mask_rcnn_coco.h5")segment_image.segmentImage("sample2.jpg",output_image_name="image_new.jpg")上图是保存到的图片该目录,现在你可以看到语义分割和实例分割之间的明显区别——在实例分割中,同一类别的所有对象都被赋予不同的颜色图。如果想使用boundingbox实现分割,可以稍微修改一下代码:segment_image.segmentImage("sample2.jpg",output_image_name="image_new.jpg",show_bboxes=True)这样就可以得到一个分割包含带有蒙版和边界框的已保存图像。同样,实例分割的推理时间也可以通过代码查询:importpixellibfrompixellib.instanceimportinstance_segmentationimporttimesegment_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"InferenceTime:{end-start:.2f}seconds")输出结果如下:InferenceTime:12.55seconds可以看到,执行实例对图像进行分割,需要12.55秒的时间。最后放上工程和模型下载地址,快去试试吧~传送门PixelLib工程地址:https://github.com/ayoololafenwa/PixelLibxception模型下载地址:https://github.com/bonlime/keras-deeplab-v3-plus/releases/download/1.1/deeplabv3_xception_tf_dim_ordering_tf_kernels.h5MaskRCNN模型下载地址:https://github.com/matterport/Mask_RCNN/releases/download/v2.0/mask_rcnn_coco.h5