【论文阅读】Deeplabv3+模型

 一、背景

        语义分割主要面临两个问题,第一是物体的多尺度问题,第二是DCNN的多次下采样会造成特征图分辨率变小,导致预测精度降低,边界信息丢失。DeepLab V3设计的ASPP模块较好的解决了第一个问题,而这里要介绍的DeepLabv3+则主要是为了解决第2个问题的。

        对于DeepLabV3,如果Backbone为ResNet101,Stride=16将造成后面9层的特征图变大,后面9层的计算量变为原来的4倍大。而如果采用Stride=8,则后面78层的计算量都会变得很大。这就造成了DeepLabV3如果应用在大分辨率图像时非常耗时。所以为了改善这个缺点,deeplabv3+出现了。

二、网络架构

        上图是deeplabv3+的网络架构。我们可以看到主要结构为encoder-decoder架构。

        对于编码器部分,实际上就是DeepLabV3网络。图像进入主干网络后,获得两个特征层,浅层的特征层直接进入decoder中进行1*1卷积进行通道压缩,目的是减少低层级的比重。深层特征则在encoder编码器中进入aspp模块,论文认为编码器得到的feature具有更丰富的信息,所以编码器的feature应该有更高的比重。 

        在aspp模块中,包括了1个 1*1 卷积、3个 3*3 的Atrous convolution分别比率为6、12、18,以及一个图像全局的Pooling操作,这些操作过后是1个 1*1 卷积。

         对于解码器部分,直接将编码器的输出上采样4倍,使其分辨率和低层级的feature一致。将两个特征层连接后,再进行一次3×3的卷积(细化作用),然后再次上采样就得到了像素级的预测。 

         1*1卷积的作用是升维或降维,使其与要结合的特征层保持一致。

三、创新 

deeplabv3+创新主要在两个方面。

1、引入encoder-decoder结构

为了解决上面提到的DeepLabV3在分辨率图像的耗时过多的问题,DeepLabV3+在DeepLabV3的基础上加入了编码器。其中,(a)代表SPP结构,其中的8x是直接双线性插值操作,直接上采样得到预测结果。(b)是编解码器,融集合了高层和低层信息。(c)是DeepLabv3+采取的结构。

2、改进主干网络,使用xception作为主干网络

具体的改进工作如下:

  • 更深的Xception结构,不同的地方在于不修改entry flow network的结构,为了快速计算和有效的使用内存
  • 所有的最大池化操作替换成带下采样的深度分离卷积,这能够应用扩张分离卷积扩展feature的分辨率
  • 在每个3 × 3 3×33×3的深度卷积后增加BN层和ReLU

最后将改进后的Xception作为encodet主干网络,替换原本DeepLabv3的ResNet101。

使用分离卷积改进Xception:

        深度可分离卷积做的工作是:把标准卷积分解成深度卷积(depthwise convolution)逐点卷积(pointwise convolution)。深度卷积对每个通道独立使用空间卷积,逐点卷积用于结合深度卷积的输出。深度分离卷积可以大幅度降低参数量和计算量。

        将扩张卷积和深度分离卷积结合在一起,能够显著减少模型计算的复杂度并维持相似的表现。

四、实验

ResNet-101 as Network Backbone: 

 

Xception as Network Backbone:

这里可以看到使用深度分离卷积可以显著降低计算消耗,同时使用Xception作为主干网络时误差也更小。

与其他先进模型在VOC12的测试集上对比:

 Improvement along Object Boundaries

使用trimap实验测量模型在分割边界的准确度。计算边界周围扩展频带(称为trimap)内的mIoU。结果如图a所示:

 图b所示为图像经过双线上采样和加了decoder之后的结果对比,可以看出,加了decoder之后结果有明显的提升。

五、总结

        论文提出的DeepLabv3+是encoder-decoder架构,其中encoder架构采用DeepLabv3,decoder采用一个简单却有效的模块用于恢复目标边界细节。并可使用扩张卷积在指定计算资源下控制feature的分辨率。论文探索了Xception和深度分离卷积在模型上的使用,进一步提高模型的速度和性能。模型在VOC2012上获得了新的state-of-the-art表现。

论文链接原文链接

代码:deeplab-pytorch

### 如何在 OpenCvSharp 中使用 DeepLab 模型进行图像分割 为了实现在 OpenCvSharp 中加载并应用 DeepLab 模型来进行图像分割,可以遵循如下方法: #### 准备工作 确保安装了必要的库和工具包。对于 C# 开发环境而言,需通过 NuGet 安装 `OpenCvSharp4` 及其依赖项。 #### 加载预训练模型 DeepLab 是一种用于语义分割的强大神经网络架构,在实际操作前应先下载官方提供的预训练权重文件(通常是 `.pb` 或者其他格式),这些可以在 TensorFlow 的官方资源页面找到[^1]。 ```csharp using Cv = OpenCvSharp; // ... other usings ... string modelPath = "path/to/deeplab_model.pb"; var net = Cv.Dnn.ReadNetFromTensorflow(modelPath); ``` #### 预处理输入图片 为了让输入符合 DeepLab 所期望的形式,通常要调整大小到固定尺寸,并转换成适合 DNN 处理的数据结构。 ```csharp Mat img = Cv2.ImRead("input_image.jpg"); Size inputSize = new Size(513, 513); // Example size expected by some versions of DeeplabV3+ img.Resize(inputSize); Blob blobImg = Cv.Dnn.BlobFromImage(img, 1.0 / 255, inputSize, Scalar.All(0), true, false); net.SetInput(blobImg); ``` #### 获取预测结果 执行推理得到输出特征图之后,还需要进一步解码才能获得最终的分类标签映射。 ```csharp Mat output = net.Forward(); int width = (int)output.Size.Width; int height = (int)output.Size.Height; float[] data = output.Reshape(1).ToArray<float>(); int classIdOffset = Array.IndexOf(data, data.Max()); // Find the index with max value which represents predicted class id. ``` 注意这里简化了从原始输出提取类别ID的过程;实际上这一步骤取决于具体版本的 DeepLab 输出层设计以及所使用的框架细节[^2]。 #### 后处理与可视化 最后一步是对上述获取的结果做适当变换以便直观展示出来,比如绘制颜色编码后的掩膜覆盖原图之上形成叠加效果。 ```csharp Mat mask = new Mat(new Size(width, height), MatType.CV_8UC3); for(int y=0; y<height; ++y){ for(int x=0; x<width; ++x){ int idx = y * width + x; Vec3b color = GetColorForClass(classIds[idx]); // Define this function based on your dataset&#39;s classes and colors scheme. mask.At<Vec3b>(new Point(x,y)) = color; } } Cv2.AddWeighted(img, 0.7f, mask, 0.3f, 0d, img); Cv2.ImShow("Segmentation Result", img); Cv.WaitKey(); ``` 以上代码片段展示了基本流程,但在实践中可能需要针对特定应用场景做出相应修改优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值