【计算机视觉】FCN、Seg-Net、U-Net模型进行图像分割实战(附源码和数据集 超详细必看)

需要源码和数据集请点赞关注收藏后评论区留言私信~~~

一、图像分割的概念

图像分割(image segmentation)技术是计算机视觉领域的重要研究方向,是图像识别、图像语义理解的重要一环。图像分割是指将图像分成若干具有相似性质的区域的过程,从数学角度来看,图像分割是将图像划分成互不相交的区域的过程。如下图所示,图像中的每个像素被分到不同的类别。与目标检测算法相比较,图像分割算法更适合精细的图像识别任务,更适合目标的精确定位、复杂形状物体的识别、图像的语义理解任务。

图像分割可以进一步地分为语义分割与实例分割,语义分割是指需要进一步判断图像中哪些像素属于哪类目标,但是语义分割不区分属于相同类别的不同实例,与此不同的是,实例分割可以区分出属于不同实例的那些像素

二、图像分割评价标准

对分割结果的评价其实就是对像素级分类的评价,基于像素点分类的MaxF1评价分割效果是比较常用的一种方式,F-Measure是一种统计量,F-Measure又称为F-Score,是准确率Precision和召回率Recall的加权调和平均,是信息检索领域常用的一个评价标准,常用于评价分类模型的好坏,在F-Measure函数中,当参数B=1时就是常见的F1,它综合了Precision和Recall的结果,当F1较高时则能说明试验方法比较有效,对于输出的置信度图,通过设置不同的像素级分类阈值可以选择出最大的F-Measure

下图为三种分割算法在VOC2012测试机上性能表示,其中DeepLab的分割准确率最高,FCN的分割速度最高,SegNet则在分割的准确率和速度中都是最低

三、图像分割项目实战

需要全部源码请点赞关注收藏后评论区留言私信~~~

数据集简介

 Cityscapes数据库拥有5000张在城市环境中驾驶场景的图像(2975train,500 val,1525test),如下图所示。可以利用下面的代码测试分割的图像中车辆、行人、自行车及街景。 

 代码如下

FCN32的模型构建代码如下

from keras.applications import vgg16
from keras.models import Model,Sequential
from keras.layers import Conv2D, Conv2DTranspose, Input, Cropping2D, add, Dropout, Reshape, Activation
from keras.utils import plot_model


def FCN32(nClasses, input_height, input_width):

    assert input_height % 32 == 0
    assert input_width % 32 == 0

    img_input = Input(shape=( input_height, input_width,3))

    model = vgg16.VGG16(
        include_top=False,
        weights='imagenet',input_tensor=img_input,
        pooling=None,
        classes=1000)
    assert isinstance(model,Model)

    o=Conv2D(filters=4096,kernel_size=(7,7),padding="same",activation="relu",name="fc6")(model.output)
    o=Dropout(rate=0.5)(o)
    o = Conv2D(filters=4096, kernel_size=(1, 1), padding="same", activation="relu", name="fc7")(o)
    o=Dropout(rate=0.5)(o)

    o = Conv2D(filters=nClasses, kernel_size=(1,1), padding="same",activation="relu",kernel_initializer="he_normal",
               name="score_fr")(o)

    o=Conv2DTranspose(filters=nClasses,kernel_size=(32,32),strides=(32,32),padding="valid",activation=None,
                      name="score2")(o)

    o=Reshape((-1,nClasses))(o)
    o=Activation("softmax")(o)

    fcn8=Model(inputs=img_input,outputs=o)
    # mymodel.summary()
    return fcn8

if __name__ == '__main__':
    m = FCN32(15,320, 320)
    m.summary()
    plot_model(m, show_shapes=True, to_file='model_fcn32.png')
    print(len(m.layers))

模型图如下 

 

 FCN8模型构建代码如下

from keras.applications import vgg16
from keras.models import Model,Sequential
from keras.layers import Conv2D, Conv2DTranspose, Input, Cropping2D, add, Dropout, Reshape, Activation


def FCN8_helper(nClasses,  input_height, input_width):

    assert input_height % 32 == 0
    assert input_width % 32 == 0

    img_input = Input(shape=(input_height, input_width, 3))

    model = vgg16.VGG16(
        include_top=False,
        weights='imagenet',input_tensor=img_input,
        pooling=None,
        classes=1000)
    assert isinstance(model,Model)

    o = Conv2D(filters=4096, kernel_size=(7, 7), padding="same", activation="relu", name="fc6")(model.output)
    o = Dropout(rate=0.5)(o)
    o = Conv2D(filters=4096, kernel_size=(1, 1), padding="same", activation="relu", name="fc7")(o)
    o = Dropout(rate=0.5)(o)

    o = Conv2D(filters=nClasses, kernel_size=(1, 1), padding="same", activation="relu", kernel_initializer="he_normal",
               name="score_fr")(o)

    o = Conv2DTranspose(filters=nClasses, kernel_size=(2, 2), strides=(2, 2), padding="valid", activation=None,
                        name="score2")(o)

    fcn8 = Model(inputs=img_input, outputs=o)
    # mymodel.summary()
    return fcn8

def FCN8(nClasses, input_height, input_width):

    fcn8=FCN8_helper(nClasses, input_height, input_width)

    # Conv to be applied on Pool4
    skip_con1 = Conv2D(nClasses, kernel_size=(1, 1), padding="same", activation=None,kernel_initializer="he_normal",
                       name="score_pool4")( fcn8.get_layer("block4_pool").output)
    Summed = add(inputs=[skip_con1, fcn8.output])

    x = Conv2DTranspose(nClasses, kernel_size=(2, 2), strides=(2, 2), padding="valid", activation=None,
                        name="score4")(Summed)

    ###
    skip_con2 = Conv2D(nClasses, kernel_size=(1, 1), padding="same", activation=None,kernel_initializer="he_normal",
                       name="score_pool3")( fcn8.get_layer("block3_pool").output)
    Summed2 = add(inputs=[skip_con2, x])

    #####
    Up = Conv2DTranspose(nClasses, kernel_size=(8, 8), strides=(8, 8),
                         padding="valid", activation=None, name="upsample")(Summed2)

    Up = Reshape((-1, nClasses))(Up)
    Up = Activation("softmax")(Up)

    mymodel=Model(inputs=fcn8.input,outputs=Up)

    return mymodel

if __name__ == '__main__':
    m = FCN8(15,320, 320)
    from keras.utils import plot_model
    plot_model(m, show_shapes=True, to_file='model_fcn8.png')
    print(len(m.layers))

 创作不易 觉得有帮助请点赞关注收藏~~~

  • 37
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 35
    评论
本文首先研究使用Python语言和OpenCV对数字高程图DEM,运用高斯核、阈值化、以及形态学中的开运算、闭运算、对图像进行分割、边缘提取、提取建筑物轮廓,并将其组织成顶点和线段的矢量格式,输出成为矢量化数字地图。然后输出XML格式文件保存矢量化数据[2]。 关键词:图像矢量化;数字高程图;python;OpenCV;轮廓处理 1 前言 1.1图像与图像处理简介 在社会生活中,图像处理有着广泛的应用,人们可以通过图像获取很多日常生活中的一些重要信息,而由于社会的科技迅速发展,图像信息处理的技术也发展得越来越快,并且涉及到了日常生活中的方方面面,如科研、工业、农业现代化、军事国防、医疗卫生、公安机关、制造业等等多个领域,并且图像处理也涉及到了很多学科、如计算机科学、数学、物理、模式识别、人工智能深度学习等,所以图像处理是一门具有交叉性很强的学科、并且能够与很多学科的融合并促进相关学科的发展。 2 相关工作 1. 工欲善其事必先利其器,由于需要使用Python OpenCV进行图像的操作,所以一开始需要先了解python的相关的使用语法以及编译器方面的使用,还有OpenCV的安装,然后才能更加顺利的开始进行接下来的步骤。 2. 需要对模式识别与图像处理的项目内的具体要求的方法进行初步了解,然后再进行深入的学习和掌握,所以需要对《OpenCV-Python-Tutorial-中文版》本书的相关知识进行学习并自己实践一番。如图像的基本操作、平滑、阈值化、形态学转换中的开运算、闭运算,以及轮廓处理的相关知识。 3. 对相关要求使用Python进行实现,并调试运行,查看相应的效果,最后输出XML文件存矢量化数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 35
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

showswoller

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值