Deeplab系列算法

1.图像分割中的传统做法

        为了增大感受野,通常都会选择pooling操作,但是也会丢失一部分信息

         

2. DeepLab系列方法

        

传统卷积
空洞卷积
通过设置dilated参数可以得到不同感受野的特征(3*3,7*7,15*15)

 空洞卷积的优势:

        图像分割任务中(其他场景也适用)需要较大感受野来更好完成任务

        通过设置dilation rate参数来完成空洞卷积,并没有额外计算

        可以按照参数扩大任意倍数的感受野,而且没有引入额外的参数

        应用简单,就是卷积层中多设置一个参数就可以了

4.感受野 

         

 

        如果堆叠3个3*3的卷积层,并且保持滑动窗口步长为1,其感受野就是7*7的了, 这跟一个使用7*7卷积核的结果是一样的,那为什么非要堆叠3个小卷积呢?
        假设输入大小都是h*w*c,并且都使用c个卷积核(得到c个特征图),可以来计算一下其各自所需参数:
        

        

        很明显,堆叠小的卷积核所需的参数更少一些,并且卷积过程越多,特征提取也会越细致,加入的非线性变换也随着增多,还不会增大权重参数个数,这就是VGG网络的基本出发点,用小的卷积核来完成体特征提取操作。

5.SPP-Layer

         SPP的具体实现方法如图所示,在最后一个卷积层之后插入一个SPP层(或替换原卷积层之后的池化层),在最后一个卷积层之后的特征图上,划分粗细尺度不同的几级均匀网格(特征图的各通道切片上,网格划分的方式一致)。各级网格对特征图进行了不同尺度的划分,构成了特征图的金字塔结构。对每级网格中的每个单元,使用最大值池化或平均值池化,池化之后的结果融合在一起,构成长度固定的特征向量。在SPP的过程中,对于不同大小的图像,同一层级网格单元格的数量是相同的,每个单元格的尺寸和整个图像的尺寸成正比,这样就保证了无论输入图像的尺寸如何,经过SPP层之后,都能变成同样维度的特征向量。向量的总维数为kxM,其中k表示SPP输入特征图的通道数(即最后一个卷积层卷积核的个数),M表示在每个切片上,各级网格单元格数量之和。图8-5中使用了3个均匀网格,网格的尺寸分别是4×4、2×2和1×1,图中特征图的通道数为256,经过SPP层之后,图像的特征向量变换成(4×4+2×2+1×1)×256维,维度和输入图像的分辨率及宽高比都无关。
        

5.常用的多尺度特征提取方法 

         

6.ASPP(atrous convolution SPP)

        其实就是跟SPP差不多,只不过引入了不同倍率的空洞卷积

 

7.deepLabV3+ 

整体网络架构: 

         

  • 效果提升不算多
  • Backbone可以改进
  • 创新不多所以不是4版 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
DeepLab是一种基于深度学习的语义分割算法,可以用来图像进行像素级别的分割,实现图像中物体或场景的分割和识别。 以下是使用DeepLab算法进行图像分割的基本步骤: 1. 数据预处理:将原始图像转换为算法输入所需的格式,例如将图像缩放到固定大小、进行归一化等。 2. 加载模型:使用DeepLab的预训练模型或自己训练的模型,加载模型参数和结构。 3. 输入图像:将预处理后的图像输入到模型中,进行前向计算。 4. 获取分割结果:从模型的输出中获取分割结果,通常是一个与输入图像大小相同的分割图像,其中每个像素都表示该像素所属的类别。 5. 后处理:根据需要对分割结果进行后处理,例如去除噪声、合并相邻的像素等。 下面是一个示例代码,使用DeepLabv3+模型进行图像分割: ``` import tensorflow as tf import numpy as np import cv2 # 数据预处理 def preprocess(image): image = cv2.resize(image, (513, 513)) image = image.astype(np.float32) / 255.0 image = image[np.newaxis, ...] return image # 加载模型 model = tf.keras.models.load_model('deeplabv3plus.h5') # 加载图像 image = cv2.imread('input_image.jpg') # 数据预处理 image = preprocess(image) # 输入图像 output = model.predict(image) # 获取分割结果 output = np.squeeze(output) output = np.argmax(output, axis=-1) output = output.astype(np.uint8) # 后处理 output = cv2.resize(output, (image.shape[2], image.shape[1]), interpolation=cv2.INTER_NEAREST) # 显示分割结果 cv2.imshow('Segmentation Result', output) cv2.waitKey(0) cv2.destroyAllWindows() ``` 在上面的代码中,我们首先定义了一个preprocess函数,用于对输入的图像进行预处理。然后,我们通过tf.keras.models.load_model函数加载了DeepLabv3+模型,并使用预处理后的图像作为模型的输入,进行前向计算。最后,我们获取了分割结果,并进行了后处理,最终显示了分割后的图像。 需要注意的是,在使用DeepLab算法进行图像分割时,需要使用较高的计算资源和较长的计算时间,因此建议在GPU环境下运行代码。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

樱花的浪漫

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

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

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

打赏作者

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

抵扣说明:

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

余额充值