精华内容
下载资源
问答
  • 金磊 发自 凹非寺量子位 报道 | 公众号 QbitAI图像分割,作为计算机视觉的基础,是图像理解的重要组成部分,也是图像处理的难点之一。那么,如何优雅且体面的图像分割?5行代码、分分钟实现的库——PixelLib,了解...

    7393f9330c7b1f9db88300ce3b96c897.png
    金磊 发自 凹非寺
    量子位 报道 | 公众号 QbitAI

    图像分割,作为计算机视觉的基础,是图像理解的重要组成部分,也是图像处理的难点之一。

    那么,如何优雅且体面的图像分割?

    5行代码、分分钟实现的库——PixelLib,了解一下。

    6ad745f6f85741ad80b5493f8e704d73.png

    当然,如此好用的项目,开源是必须的。

    为什么要用到图像分割?

    虽然计算机视觉研究工作者,会经常接触图像分割的问题,但是我们还是需要对其做下“赘述”(方便初学者)。

    我们都知道每个图像都是有一组像素值组成。简单来说,图像分割就是在像素级上,对图像进行分类的任务。

    图像分割中使用的一些“独门秘技”,使它可以处理一些关键的计算机视觉任务。主要分为2类:

    • 语义分割:就是把图像中每个像素赋予一个类别标签,用不同的颜色来表示。
    • 实例分割:它不需要对每个像素进行标记,它只需要找到感兴趣物体的边缘轮廓就行。

    它的身影也经常会出现在比较重要的场景中:

    • 无人驾驶汽车视觉系统,可以有效的理解道路场景。
    • 医疗图像分割,可以帮助医生进行诊断测试。
    • 卫星图像分析,等等。

    所以,图像分割技术的应用还是非常重要的。

    接下来,我们就直奔主题,开始了解一下PixelLib,这个神奇又好用的库。

    快速安装PixelLib

    PixelLib这个库可以非常简单的实现图像分割——5行代码就可以实现语义分割和实例分割。

    老规矩,先介绍一下安装环境

    安装最新版本的TensorFlow、Pillow、OpenCV-Python、scikit-image和PixelLib:

    pip3 install tensorflow
    pip3 install pillow
    pip3 install opencv-python
    pip3 install scikit-image
    pip3 install pixellib

    PixelLib实现语义分割

    PixelLib在执行语义分割任务时,采用的是Deeplabv3+框架,以及在pascalvoc上预训练的Xception模型。

    用在pascalvoc上预训练的Xception模型执行语义分割:

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

    让我们看一下每行代码:

    import pixellib
    from pixellib.semantic import semantic_segmentation
    
    #created an instance of semantic segmentation class
    segment_image = semantic_segmentation()

    用于执行语义分割的类,是从pixellib导入的,创建了一个类的实例。

    segment_image.load_pascalvoc_model(“deeplabv3_xception_tf_dim_ordering_tf_kernels.h5”)

    调用函数来加载在pascal voc上训练的xception模型(xception模型可以从文末传送门链接处下载)。

    segment_image.segmentAsPascalvoc(“path_to_image”, output_image_name = “path_to_output_image”)

    这是对图像进行分割的代码行,这个函数包含了两个参数:

    • path_to_image:图像被分割的路径。
    • path_to_output_image:保存输出图像的路径,图像将被保存在你当前的工作目录中。

    接下来,上图,实战

    图像文件命名为:sample1.jpg,如下图所示。

    f6baf17116e9ee894dd191cc83d1a802.png

    执行代码如下:

    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(“sample1.jpg”, output_image_name = “image_new.jpg”)

    d6bcca6b3c404cf3dde651fba92eeec3.png

    可以看到,在执行代码后,保存的图像中,所有对象都被分割了。

    也可以对代码稍作修改,获取一张带有目标对象分段重叠(segmentation overlay)的图像。

    segment_image.segmentAsPascalvoc(“sample1.jpg”, output_image_name = “image_new.jpg”, overlay = True)

    添加了一个额外的参数,并设置为True,就生成了带有分段叠加的图像。

    5977c9e2ed1fcbe45a89e34a535d1d70.png

    可以通过修改下面的代码,来检查执行分割所需的推理时间。

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

    输出如下:

    Inference Time: 8.19seconds

    可以看到,在图像上执行语义分割,只用了8.19秒。

    这个xception模型是用pascalvoc数据集训练的,有20个常用对象类别。

    对象及其相应的color map如下所示:

    26b9b7e6f2e1445e86d5c3fd83861d90.png

    PixelLib实现实例分割

    虽然语义分割的结果看起来还不错,但在图像分割的某些特定任务上,可能就不太理想。

    在语义分割中,相同类别的对象被赋予相同的colormap,因此语义分割可能无法提供特别充分的图像信息。

    于是,便诞生了实例分割——同一类别的对象被赋予不同的colormap。

    PixelLib在执行实例分割时,基于的框架是Mask RCNN,代码如下:

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

    同样,我们先来拆解一下每行代码。

    import pixellib
    from pixellib.instance import instance_segmentation
    segment_image = instance_segmentation()

    导入了用于执行实例分割的类,创建了该类的一个实例。

    segment_image.load_model(“mask_rcnn_coco.h5”)

    这是加载 Mask RCNN 模型来执行实例分割的代码(Mask RCNN模型可以从文末传送门链接处下载)。

    segment_image.segmentImage(“path_to_image”, output_image_name = “output_image_path”)

    这是对图像进行实例分割的代码,它需要两个参数:

    • path_to_image:模型所要预测图像的路径。
    • output_image_name:保存分割结果的路径,将被保存在当前的工作目录中。

    上图,实战第二弹!

    图像文件命名为:sample2.jpg,如下图所示。

    6404a77d89939ac4395c98b3fcc04c15.png

    执行代码如下:

    import pixellib
    from pixellib.instance import instance_segmentation
    segment_image = instance_segmentation()
    segment_image.load_model(“mask_rcnn_coco.h5”)
    segment_image.segmentImage(“sample2.jpg”, output_image_name = “image_new.jpg”)

    cfb8fa362bff67524d1a5d21874acb6b.png

    上图便是保存到目录的图片,现在可以看到语义分割和实例分割之间的明显区别——在实例分割中,同一类别的所有对象,都被赋予了不同的colormap。

    若是想用边界框(bounding box)来实现分割,可以对代码稍作修改:

    segment_image.segmentImage(“sample2.jpg”, output_image_name = “image_new.jpg”, show_bboxes = True)

    这样,就可以得到一个包含分割蒙版和边界框的保存图像。

    017ad8572fc45c3f8ac78f5b8095233c.png

    同样的,也可以通过代码查询实例分割的推理时间:

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

    输出结果如下:

    Inference Time: 12.55 seconds

    可以看到,在图像上执行实例分割,需要12.55秒的时间。

    最后,奉上项目、模型下载地址,快去试试吧~

    传送门

    PixelLib项目地址:https://github.com/ayoolaolafenwa/PixelLib

    xception模型下载地址:https://github.com/bonlime/keras-deeplab-v3-plus/releases/download/1.1/deeplabv3_xception_tf_dim_ordering_tf_kernels.h5

    Mask RCNN模型下载地址:https://github.com/matterport/Mask_RCNN/releases/download/v2.0/mask_rcnn_coco.h5

    —完—

    @量子位 · 追踪AI技术和产品新动态

    深有感触的朋友,欢迎赞同、关注、分享三连վ'ᴗ' ի ❤

    展开全文
  • 本文来自量子位图像分割,作为计算机视觉的基础,是图像理解的重要组成部分,也是图像处理的难点之一。那么,如何优雅且体面的图像分割?5行代码、分分钟实现的库——PixelLib,了解一下。当然,如此好用的项目,...

    176b39bc01e2906de7dcdcad7452959a.png

    本文来自量子位

    图像分割,作为计算机视觉的基础,是图像理解的重要组成部分,也是图像处理的难点之一。

    那么,如何优雅且体面的图像分割?

    5行代码、分分钟实现的库——PixelLib,了解一下。

    655c2e6064e26108e2b734494812d97f.png

    当然,如此好用的项目,开源是必须的。

    为什么要用到图像分割?

    虽然计算机视觉研究工作者,会经常接触图像分割的问题,但是我们还是需要对其做下“赘述”(方便初学者)

    我们都知道每个图像都是有一组像素值组成。简单来说,图像分割就是在像素级上,对图像进行分类的任务。

    图像分割中使用的一些“独门秘技”,使它可以处理一些关键的计算机视觉任务。主要分为2类:

    • 语义分割:就是把图像中每个像素赋予一个类别标签,用不同的颜色来表示。

    • 实例分割:它不需要对每个像素进行标记,它只需要找到感兴趣物体的边缘轮廓就行。

    它的身影也经常会出现在比较重要的场景中:

    • 无人驾驶汽车视觉系统,可以有效的理解道路场景。

    • 医疗图像分割,可以帮助医生进行诊断测试。

    • 卫星图像分析,等等。

    所以,图像分割技术的应用还是非常重要的。

    接下来,我们就直奔主题,开始了解一下PixelLib,这个神奇又好用的库。

    快速安装PixelLib

    PixelLib这个库可以非常简单的实现图像分割——5行代码就可以实现语义分割和实例分割。

    老规矩,先介绍一下安装环境

    安装最新版本的TensorFlow、Pillow、OpenCV-Python、scikit-image和PixelLib:

    pip3 install tensorflow
    pip3 install pillow
    pip3 install opencv-python
    pip3 install scikit-image
    pip3 install pixellib

    PixelLib实现语义分割

    PixelLib在执行语义分割任务时,采用的是Deeplabv3+框架,以及在pascalvoc上预训练的Xception模型。

    用在pascalvoc上预训练的Xception模型执行语义分割:

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

    让我们看一下每行代码:

    import pixellib
    from pixellib.semantic import semantic_segmentation

    #created an instance of semantic segmentation class
    segment_image = semantic_segmentation()

    用于执行语义分割的类,是从pixellib导入的,创建了一个类的实例。

    segment_image.load_pascalvoc_model(“deeplabv3_xception_tf_dim_ordering_tf_kernels.h5”)

    调用函数来加载在pascal voc上训练的xception模型(xception模型可以从文末传送门链接处下载)

    segment_image.segmentAsPascalvoc(“path_to_image”, output_image_name = “path_to_output_image”)

    这是对图像进行分割的代码行,这个函数包含了两个参数:

    • path_to_image:图像被分割的路径。

    • path_to_output_image:保存输出图像的路径,图像将被保存在你当前的工作目录中。

    接下来,上图,实战

    图像文件命名为:sample1.jpg,如下图所示。

    514a2136f79b5acbfa60c1843837acd7.png

    执行代码如下:

    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(“sample1.jpg”, output_image_name = “image_new.jpg”)

    0f638da64028c04d776aec5673644095.png

    可以看到,在执行代码后,保存的图像中,所有对象都被分割了。

    也可以对代码稍作修改,获取一张带有目标对象分割重叠(segmentation overlay)的图像。

    segment_image.segmentAsPascalvoc(“sample1.jpg”, output_image_name = “image_new.jpg”, overlay = True)

    添加了一个额外的参数,并设置为True,就生成了带有分隔叠加的图像。

    786a0af1646dff85d8e3d078e6925a64.png

    可以通过修改下面的代码,来检查执行分割所需的推理时间。

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

    输出如下:

    Inference Time: 8.19seconds

    可以看到,在图像上执行语义分割,只用了8.19秒。

    这个xception模型是用pascalvoc数据集训练的,有20个常用对象类别。

    对象及其相应的color map如下所示:

    f6c2cc7925c39159036a46b1d090148a.png

    PixelLib实现实例分割

    虽然语义分割的结果看起来还不错,但在图像分割的某些特定任务上,可能就不太理想。

    在语义分割中,相同类别的对象被赋予相同的colormap,因此语义分割可能无法提供特别充分的图像信息。

    于是,便诞生了实例分割——同一类别的对象被赋予不同的colormap。

    PixelLib在执行实例分割时,基于的框架是Mask RCNN,代码如下:

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

    同样,我们先来拆解一下每行代码。

    import pixellib
    from pixellib.instance import instance_segmentation
    segment_image = instance_segmentation()

    导入了用于执行实例分割的类,创建了该类的一个实例。

    segment_image.load_model(“mask_rcnn_coco.h5”)

    这是加载 Mask RCNN 模型来执行实例分割的代码(Mask RCNN模型可以从文末传送门链接处下载)

    segment_image.segmentImage(“path_to_image”, output_image_name = “output_image_path”)

    这是对图像进行实例分割的代码,它需要两个参数:

    • path_to_image:模型所要预测图像的路径。

    • output_image_name:保存分割结果的路径,将被保存在当前的工作目录中。

    上图,实战第二弹!

    图像文件命名为:sample2.jpg,如下图所示。

    9cfe83b4e57e366d652446ea33f10182.png

    执行代码如下:

    import pixellib
    from pixellib.instance import instance_segmentation
    segment_image = instance_segmentation()
    segment_image.load_model(“mask_rcnn_coco.h5”)
    segment_image.segmentImage(“sample2.jpg”, output_image_name = “image_new.jpg”)

    db074b1ae3f49992449b443ae83bd81b.png

    上图便是保存到目录的图片,现在可以看到语义分割和实例分割之间的明显区别——在实例分割中,同一类别的所有对象,都被赋予了不同的colormap。

    若是想用边界框(bounding box)来实现分割,可以对代码稍作修改:

    segment_image.segmentImage(“sample2.jpg”, output_image_name = “image_new.jpg”, show_bboxes = True)

    这样,就可以得到一个包含分割蒙版和边界框的保存图像。

    f602d72be9881d1f3b2900fa744bad28.png

    同样的,也可以通过代码查询实例分割的推理时间:

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

    输出结果如下:

    Inference Time: 12.55 seconds

    可以看到,在图像上执行实例分割,需要12.55秒的时间。

    最后,奉上项目、模型下载地址,快去试试吧~

    传送门

    PixelLib项目地址:
    https://github.com/ayoolaolafenwa/PixelLib

    xception模型下载地址:
    https://github.com/bonlime/keras-deeplab-v3-plus/releases/download/1.1/deeplabv3_xception_tf_dim_ordering_tf_kernels.h5

    Mask RCNN模型下载地址:
    https://github.com/matterport/Mask_RCNN/releases/download/v2.0/mask_rcnn_coco.h5

    176b39bc01e2906de7dcdcad7452959a.png

    展开全文
  • 注:本篇文章由【开源骚客:OpenSoc】公众号首发,现转载...一旦开始使用 FPGA 开始进行图像处理,就会越发爱上 FPGA 对图像处理的实时性,从此一发不可收拾!因为最近在学习一本图像处理算法书籍中关于图像增强的算...

    注:本篇文章由【开源骚客:OpenSoc】公众号首发,现转载至知乎专栏。

    开源骚客公众号专注于分享FPGA项目开发经验,希望帮助到更多学习FPGA的朋友,欢迎大家投稿。如果大家有其他需求,添加Kevin微信:opensoc888,注明:FPGA

    一旦开始使用 FPGA 开始进行图像处理,就会越发爱上 FPGA 对图像处理的实时性,从此一发不可收拾!

    f0e0347eb66d16c3b6a99300cc5c98bc.png

    因为最近在学习一本图像处理算法书籍中关于图像增强的算法,大家可以先看看这个图像增强算法的效果。下面给一张书中原图和Matlab 仿真的结果图。

    2d0d7618ba6671ae518bb77247db9cfd.png

    图1 书中原图

    7dfd961b89ab0cac780fb7a6f43aef8a.png

    图二 Matlab 仿真结果

    大家有没有觉得这个图像增强算法实在是太让人震撼了,能把一幅对比度极低的图片增强到能把之前比较黑的地方看得很清晰,比起什么直方图均衡这种 low B 算法,那可是强太多了!

    当时看到这个算法的第一反应就是,FPGA这么一个牛 X 的玩意儿,能不能实现这个算法呢?

    大家看到这,是不是很迫切的想知道介绍这个算法到底是一本什么样的书呢?

    b3c47229f2f44f683e3c22140e3d6bc7.png

    书呢就是这样的一本书,大家感兴趣的可以在网上自行购买。

    这本书里面涉及的算法种类还是非常多的,咱们再稍微看下目录吧,满足一下大家的好奇心。

    这本书,我这里没有 PDF 电子版,大家就不用找我要了,我也是买的纸质书看的。

    关于这本书的内容到底是好还是坏呢?站在客观的角度来讲,其内容的丰富度极高,涉及的算法非常多。当然也有一个美中不足的地方,每一种算法就大致介绍一下其原理。

    书中并未给出具体的用某种语言实现的代码。如果是刚刚接触图像处理的朋友,很大程度是看不太懂的。关于书籍本身,就先介绍这么多,咱们这篇文章还是回到高斯滤波上来。

    对于高斯滤波这个算法本身来讲,网上是有非常多的文章,也有很多关于如何用 FPGA 实现高斯滤波的文章。

    那些文章用的高斯卷积核一般是3 * 3的矩阵大小,其权重矩阵也是会由那些文章直接给出。

    问题的关键是,现在这个图像增强算法,会用到高斯滤波,但其卷积核并不是 3*3 大小的,是更大的卷积核。

    如果有做过 sobel 图像边缘检测算法的朋友,应该会了解高斯滤波会有一个权重矩阵,类似 sobel 算子的系数矩阵。(插播一条小广告,如果大家有想学习FPGA实现sobel算法的同学,可以购买Kevin录制的入门级图像处理课程:【开源骚客 FPGA图像处理 Sobel 边缘检测 人脸检测 FPGA视频教程】https://m.tb.cn/h.espeCqz?sm=207720 嚸↑↓擊鏈バ接,再选择瀏覽嘂..咑№亓;或復ず■淛这句话₴TmRXYtnSLCD₴后咑閞淘灬寳

    很多文章会直接给出3*3高斯卷积核的权重矩阵,但对于更大的权重矩阵,并不知晓如何获取,如7*7的权重矩阵,11*11的权重矩阵,甚至是81*81的权重矩阵。这个时候就需要回到高斯滤波算法的公式本身了。

    88a76ce48bebc7b8a40300c397a66fea.png

    在高斯函数曲线中,σ描述正态分布资料数据分布的离散程度,σ越大,数据分布越分散,σ越小,数据分布越集中。σ也称为是正态分布的形状参数,σ越大,曲线越扁平,反之,σ越小,曲线越瘦高。

    如果需要获取更大尺寸的高斯权重矩阵值,只需要将公式中的 x 和 y 两个变量设置成相应大小的向量就 OK 了!

    举个栗子:如果想获取 5*5 的权重矩阵系数,可以将 x = 1, 2 , 3 , 4 , 5 和 y = 1, 2 , 3 , 4 , 5。或者将x = -2, -1, 0, 1, 2 和 y = -2, -1, 0, 1, 2 带入公式求取其权重系数,σ 可以自己取值,之后再进行归一化处理。

    获取其他尺寸的权重矩阵,也是使用同样的方式进行计算。

    如果自己手动去算,肯定是比较麻烦的,咱们可以借助 Matlab 直接算出来。

    计算 5*5 权重矩阵的 Matlab 代码如下:

     fspecial('gaussian',[5,5],1)

    8c572fb6121bee19a5e6932520eeb2f0.png

    [5 , 5] 表示权重矩阵的尺寸大小,1为 σ 的值。

    敲重点:这些值怎么在FPGA内部进行使用呢?

    可以将这些系数都统一乘上 1000,将小数转成整数,待运算之后再将结果同意除以1000。

    今天的笔记就先分享到这,主要是分享:当需要自定义高斯滤波的权重矩阵尺寸时,可以通过 Matlab 获取其权重矩阵的参数。


    重要提醒想学习FPGA的朋友福利来了,为了方便广大想入门FPGA的小白们,Kevin 录制了一套零基础入门的课程,课程结合线下班学员的常见入门疑惑,并加入由易到难的上手练习,不对着PPT念,从0开始带着设计时序敲代码。目前课程已录制10多讲,1080P高清无码播放。

    08efe8360c72e6fb7c0b3baa29be66cf.png

    如果有观看 Kevin 之前录制的视频,是相信视频的口碑和和质量的。

    目前Kevin 已多套视频,SDRAM 第一季和SDRAM第二季为高质量的免费课程,大家可前往 B 站 搜索“开源骚客”即可进行观看。

    或直接点击https://www.bilibili.com/video/av40741823?from=search&seid=16300625873082762661

    视频何时公开,免费还是收费,就要看大家在下方评论区有多热情了!!!

    展开全文
  • 金磊 发自 凹非寺量子位 报道 | 公众号 QbitAI图像分割,作为计算机视觉的基础,是图像理解的重要组成部分,也是图像处理的难点之一。那么,如何优雅且体面的图像分割?5行代码、分分钟实现的库——PixelLib,了解...

    金磊 发自 凹非寺
    量子位 报道 | 公众号 QbitAI

    图像分割,作为计算机视觉的基础,是图像理解的重要组成部分,也是图像处理的难点之一。

    那么,如何优雅且体面的图像分割?

    5行代码、分分钟实现的库——PixelLib,了解一下。

    5b6000ae7041809376147df86f64c5c8.png

    当然,如此好用的项目,开源是必须的。

    为什么要用到图像分割?

    虽然计算机视觉研究工作者,会经常接触图像分割的问题,但是我们还是需要对其做下“赘述”(方便初学者)。

    我们都知道每个图像都是有一组像素值组成。简单来说,图像分割就是在像素级上,对图像进行分类的任务。

    图像分割中使用的一些“独门秘技”,使它可以处理一些关键的计算机视觉任务。主要分为2类:

    • 语义分割:就是把图像中每个像素赋予一个类别标签,用不同的颜色来表示。
    • 实例分割:它不需要对每个像素进行标记,它只需要找到感兴趣物体的边缘轮廓就行。

    它的身影也经常会出现在比较重要的场景中:

    • 无人驾驶汽车视觉系统,可以有效的理解道路场景。
    • 医疗图像分割,可以帮助医生进行诊断测试。
    • 卫星图像分析,等等。

    所以,图像分割技术的应用还是非常重要的。

    接下来,我们就直奔主题,开始了解一下PixelLib,这个神奇又好用的库。

    快速安装PixelLib

    PixelLib这个库可以非常简单的实现图像分割——5行代码就可以实现语义分割和实例分割。

    老规矩,先介绍一下安装环境

    安装最新版本的TensorFlow、Pillow、OpenCV-Python、scikit-image和PixelLib:

    pip3 install tensorflowpip3 install pillowpip3 install opencv-pythonpip3 install scikit-imagepip3 install pixellib

    PixelLib实现语义分割

    PixelLib在执行语义分割任务时,采用的是Deeplabv3+框架,以及在pascalvoc上预训练的Xception模型。

    用在pascalvoc上预训练的Xception模型执行语义分割:

    import pixellibfrom pixellib.semantic import semantic_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”)

    让我们看一下每行代码:

    import pixellibfrom pixellib.semantic import semantic_segmentation#created an instance of semantic segmentation classsegment_image = semantic_segmentation()

    用于执行语义分割的类,是从pixellib导入的,创建了一个类的实例。

    segment_image.load_pascalvoc_model(“deeplabv3_xception_tf_dim_ordering_tf_kernels.h5”)

    调用函数来加载在pascal voc上训练的xception模型(xception模型可以从文末传送门链接处下载)。

    segment_image.segmentAsPascalvoc(“path_to_image”, output_image_name = “path_to_output_image”)

    这是对图像进行分割的代码行,这个函数包含了两个参数:

    • path_to_image:图像被分割的路径。
    • path_to_output_image:保存输出图像的路径,图像将被保存在你当前的工作目录中。

    接下来,上图,实战

    图像文件命名为:sample1.jpg,如下图所示。

    d0f3b87b13280d758fe9f7a2030ee136.png

    执行代码如下:

    import pixellibfrom pixellib.semantic import semantic_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”)
    6ccfec6435cc346da6878384bc020199.png

    可以看到,在执行代码后,保存的图像中,所有对象都被分割了。

    也可以对代码稍作修改,获取一张带有目标对象分段重叠(segmentation overlay)的图像。

    segment_image.segmentAsPascalvoc(“sample1.jpg”, output_image_name = “image_new.jpg”, overlay = True)

    添加了一个额外的参数,并设置为True,就生成了带有分段叠加的图像。

    f5e8ebebd4a8b47887b8879092e6fe40.png

    可以通过修改下面的代码,来检查执行分割所需的推理时间。

    import pixellibfrom pixellib.semantic import semantic_segmentationimport timesegment_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”)

    输出如下:

    Inference Time: 8.19seconds

    可以看到,在图像上执行语义分割,只用了8.19秒。

    这个xception模型是用pascalvoc数据集训练的,有20个常用对象类别。

    对象及其相应的color map如下所示:

    cc096b25b90d3989800e49f63e55806e.png

    PixelLib实现实例分割

    虽然语义分割的结果看起来还不错,但在图像分割的某些特定任务上,可能就不太理想。

    在语义分割中,相同类别的对象被赋予相同的colormap,因此语义分割可能无法提供特别充分的图像信息。

    于是,便诞生了实例分割——同一类别的对象被赋予不同的colormap。

    PixelLib在执行实例分割时,基于的框架是Mask RCNN,代码如下:

    import pixellibfrom pixellib.instance import instance_segmentationsegment_image = instance_segmentation()segment_image.load_model(“mask_rcnn_coco.h5”)segment_image.segmentImage(“path_to_image”, output_image_name = “output_image_path”)

    同样,我们先来拆解一下每行代码。

    import pixellibfrom pixellib.instance import instance_segmentationsegment_image = instance_segmentation()

    导入了用于执行实例分割的类,创建了该类的一个实例。

    segment_image.load_model(“mask_rcnn_coco.h5”)

    这是加载 Mask RCNN 模型来执行实例分割的代码(Mask RCNN模型可以从文末传送门链接处下载)。

    segment_image.segmentImage(“path_to_image”, output_image_name = “output_image_path”)

    这是对图像进行实例分割的代码,它需要两个参数:

    • path_to_image:模型所要预测图像的路径。
    • output_image_name:保存分割结果的路径,将被保存在当前的工作目录中。

    上图,实战第二弹!

    图像文件命名为:sample2.jpg,如下图所示。

    7702ba573862c4366d61b74f7675c9f6.png

    执行代码如下:

    import pixellibfrom pixellib.instance import instance_segmentationsegment_image = instance_segmentation()segment_image.load_model(“mask_rcnn_coco.h5”)segment_image.segmentImage(“sample2.jpg”, output_image_name = “image_new.jpg”)
    578213962b5f1e0aab7f1dabeba2e018.png

    上图便是保存到目录的图片,现在可以看到语义分割和实例分割之间的明显区别——在实例分割中,同一类别的所有对象,都被赋予了不同的colormap。

    若是想用边界框(bounding box)来实现分割,可以对代码稍作修改:

    segment_image.segmentImage(“sample2.jpg”, output_image_name = “image_new.jpg”, show_bboxes = True)

    这样,就可以得到一个包含分割蒙版和边界框的保存图像。

    5416bcf8db31bfe4baf5fd044cb3a9f2.png

    同样的,也可以通过代码查询实例分割的推理时间:

    import pixellibfrom pixellib.instance import instance_segmentationimport timesegment_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”)

    输出结果如下:

    Inference Time: 12.55 seconds

    可以看到,在图像上执行实例分割,需要12.55秒的时间。

    最后,奉上项目、模型下载地址,快去试试吧~

    传送门

    PixelLib项目地址:
    https://github.com/ayoolaolafenwa/PixelLib

    xception模型下载地址:
    https://github.com/bonlime/keras-deeplab-v3-plus/releases/download/1.1/deeplabv3_xception_tf_dim_ordering_tf_kernels.h5

    Mask RCNN模型下载地址:
    https://github.com/matterport/Mask_RCNN/releases/download/v2.0/mask_rcnn_coco.h5

    — 完 —

    量子位 QbitAI · 头条号签约

    关注我们,第一时间获知前沿科技动态

    展开全文
  • 本文来自量子位图像分割,作为计算机视觉的基础,是图像理解的重要组成部分,也是图像处理的难点之一。那么,如何优雅且体面的图像分割?5行代码、分分钟实现的库——PixelLib,了解一下。当然,如此好用的项目,...
  • sourceforge开源项目

    2010-08-09 16:47:00
    将早前开发的一些小软件在sourceforge开源项目应用matlab7.0开发,所有文件均为源文件尚未编译为可执行文件。 主要项目包括: 数字水印模拟系统:数字水印常用算法实现,模拟等。 数字图像分析系统:数字图像...
  • opencv+python基本的图像处理 1、 运行环境、语言及计算机视觉库的介绍: 1.1 Python Python是一种跨平台的计算机程序设计语言。是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的...
  • 开源车牌识别项目,OpenALPR

    万次阅读 2017-07-30 13:47:12
    今天在github上看到了一个开源的车牌识别项目,OpenALPR。...博文链接:数字图像处理:基于MATLAB的车牌识别项目 简介 OpenALPR是一种使用C ++编写的开源自动车牌识别库,还能支持: C#,Java,Node.js,Go和Pyt
  • 点击上方“小白学视觉”,选择“星标”公众号重磅干货,第一时间送达本文来自量子位图像分割,作为计算机视觉的基础,是图像理解的重要组成部分,也是图像处理的难点之一。那么,如何优雅且体面的图像分割?5行代码...
  • 目标:开发基于图像处理的目标跟踪与回避系统 该项目由汉西大学的ACUS LAB(航空航天控制与无人系统)于2014年执行。 项目使用的开源。 预计不会发布进一步的版本。 上传用于录制目的。 内容 -图像处理流程图 -PD...
  •   目前接触过的python图像处理代码涉及到多种的...  OpenCV是一个开源的计算机视觉库,该项目由Intel发起,采用C/C++语言编写,可以运行在Linux/Windows/Mac等操作系统上,还提供了Python、Ruby、MATLAB以及其他语
  • VLFeat MexOpenCV facedetect Machine Vision Toolbox Piotrs Image Video Matlab Toolbox MATLAB Functions for Multiple View Geometry ...著名的计算机视觉/图像处理开源项目,知名度应该不必...
  • AForge.net c#下实现Matlab

    2011-12-24 21:51:00
    AForge.NET Framework 是 .net 方向的机械学习开源项目 包含图像处理,神经网络,图片的比较,等等。这个 framework 包含的主要类库如下 AForge.Imaging - library with image processing routines and filters;...
  • 为什么要做这个小项目,因为最近正在在学习FPGA开源工作室中的FPGA图像处理的文章。发现这个小例子非常容易实现。就把这个小算法给复现了。这个基本上不能称之为一个项目,因为太简单了。但是,这里面涉及了真彩图...
  • Opencv基本了解、图像读取和绘图学习教程思考题练习题 学习教程 思考题 Opencv库与Matlab、...MatlabMatlab一般用于快速实现算法和测试,用于研究理论,OpenCV适合开发实际的图像处理或视觉的应用。 为什么是impo
  • python 常用项目列表

    2020-09-10 14:54:46
    项目名称 作用 numpy NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对...opencv是一个强大的图像处理和计算机视觉库,实现了很多实用算法,值得学习和深究...
  • 基于opencv的小游戏开发 使用c++库opencv开发小...它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。 OpenCV用C+
  • 金磊 发自 凹非寺量子位 报道 | 公众号 QbitAI图像分割,作为计算机视觉的基础,是图像理解的重要组成部分,也是图像处理的难点之一。那么,如何优雅且体面的图像分割?5行代码、分分钟实现的库——PixelLib,了解...
  • 它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成 ,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。自 2000 年第一个开源版本发布以来,受到了很多计算机视觉...
  • 它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成 ,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。自 2000 年第一个开源版本发布以来,受到了很多计算机视觉...
  • 它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Java、Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法(百度百科)。 opencv采用C语言进行优化,而且,在多核...
  • 它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。 OpenCV用C++语言编写,它的主要接口也是C++语言,但是依然...
  • 本文来自量子位图像分割,作为计算机视觉的基础,是图像理解的重要组成部分,也是图像处理的难点之一。那么,如何优雅且体面的图像分割?5行代码、分分钟实现的库——PixelLib,了解一下。当然,如此好用的项目,...

空空如也

空空如也

1 2 3
收藏数 44
精华内容 17
关键字:

matlab图像处理开源项目

matlab 订阅