头图

介绍

在计算机视觉领域,卷积神经网络 (CNN) 重新定义了图像分析和理解的格局。这些强大的网络在图像分类、目标检测和语义分割等任务方面取得了突破。它们为医疗保健、自动驾驶汽车等领域的广泛应用奠定了基础。
然而,随着对更多上下文感知和鲁棒模型的需求不断增长,CNN 中的传统卷积层在捕获大量上下文信息方面面临限制。这导致了对创新技术的需求,这些技术可以在不显著增加计算复杂性的情况下增强网络理解更广泛上下文的能力。
进入空洞卷积,这是一种突破性的方法,它打破了 CNN 中卷积层的传统规范。空洞卷积,也称为扩张卷积,通过使网络能够在不显著增加计算成本或参数的情况下捕获更广泛的上下文,为深度学习世界引入了一个新的维度。

学习目标

  • 了解卷积神经网络的基础知识,以及它们如何处理视觉数据来理解图像。
  • 了解空洞卷积 如何通过捕获图像中的更大背景来改进传统卷积方法。
  • 探索使用空洞卷积 的知名 CNN 架构,例如 DeepLab 和 WaveNet ,看看它如何提高其性能。
  • 通过实际示例和代码片段,亲身了解空洞卷积在 CNN 中的应用。

    了解 CNN:工作原理

    卷积神经网络(CNN)是一类深度神经网络,主要用于分析图像和视频等视觉数据。它们受到人类视觉系统的启发,在涉及视觉数据中模式识别的任务中非常有效。以下是细分:

  1. 卷积层:CNN 由多个层组成,卷积层是核心。这些层采用卷积操作,将可学习的滤波器应用于输入数据,从图像中提取各种特征。
  2. 池化层:卷积后,池化层通常用于减少空间维度,压缩卷积层学习的信息。常见的池化操作包括最大池化或平均池化,它们减小了表示形式的大小,同时保留了基本信息。
  3. 激活功能:非线性激活函数(如 ReLU – Rectified Linear Unit)在卷积层和池化层之后使用,以将非线性引入网络,使其能够学习数据中的复杂模式和关系。
  4. 全连接层:在 CNN 的末尾,通常使用全连接层。这些层合并了前几层提取的特征,并执行分类或回归任务。
  5. 逐点卷积:逐点卷积,也称为_ 1×1 卷积_,是 CNN 中用于执行降维和特征组合的一种技术。它涉及对输入数据应用 1×1 滤波器,从而有效地减少输入通道的数量,并允许跨通道组合功能。逐点卷积通常与其他卷积运算结合使用,以增强网络捕获数据中复杂模式和关系的能力。
  6. 可学习参数:CNN 依赖于在训练过程中更新的可学习参数(权重和偏差)。这种训练涉及前向传播,其中输入数据通过网络传递,以及反向传播,根据网络性能调整参数。

    从空洞卷积开始

    空洞卷积,也称为扩张卷积,是一种卷积运算,它引入了一个称为膨胀率的参数。与将滤波器应用相邻像素的常规卷积不同,无穷卷积通过在滤波器参数之间引入间隙来隔开滤波器参数,并由膨胀率控制。该过程在不增加参数数量情况下扩大了滤波器的感受野。简单来说,它允许网络从输入数据中捕获更广泛的上下文,而不会增加复杂性。
    膨胀率决定了卷积的每个步骤之间跳过多少像素。速率 1 表示常规卷积,而较高的速率会跳过更多像素。这种扩大的感受野能够在不增加计算成本的情况下捕获更大的上下文信息,使网络能够有效地捕获局部细节和全局上下文。
    从本质上讲,空洞卷积有助于将更广泛的上下文信息集成到卷积神经网络中,从而能够更好地对数据中的大规模模式进行建模。它通常用于不同规模的上文至关重要的应用,例如计算机视觉中的语义分割或自然语言处理任务中的处理序列。

    用于多尺度特征学习的扩张卷积

    扩张卷积,也称为空洞卷积,在神经网络中的多尺度特征学习中发挥着关键作用。以下是有关它们在实现多尺度特征学习中的作用的一些关键点:

  7. 上下文扩展:空洞卷积允许网络从更广泛的上下文中捕获信息,而不会显著增加参数数量。通过在滤波器中引入间隙,感受野在不增加计算负载的情况下扩大。
  8. 可变感受野:当膨胀率大于 1 时,这些卷积会产生“多尺度”效应。它们使络能够同时处理不同规模或粒度的输入,在同一层中捕获精细和粗略的细节。
  9. 分层特征提取:可以跨网络层调制膨胀率,以创建分层特征提取机制。具有较小膨胀率的较低层侧重于精细细节,而具有较大膨胀率的较高层则捕获更广泛的上下文。
  10. 高效的信息融合:空洞卷积有助于有效地融合来自不同尺度的信息。它们提供了一种机制来组合来自各种感受场的特征,从而增强网络对数据中复杂模式的理解。
  11. 在分割和识别中的应用: 在图像分割或语音识别等任务中,扩张卷积已被用于通过使网络能够学习多尺度表示来提高性能,从而实现更准确的预测。

空洞卷积和常规卷积的结构

Input Image (Rectangle)
    |
    |
Regular Convolution (Box)
    - Kernel Size: Fixed kernel
    - Sliding Strategy: Across input feature maps
    - Stride: Usually 1
    - Output Feature Map: Reduced size
    
Atrous (Dilated) Convolution (Box)
    - Kernel Size: Fixed kernel with gaps (controlled by dilation)
    - Sliding Strategy: Spaced elements, increased receptive field
    - Stride: Controlled by dilation rate
    - Output Feature Map: Preserves input size, expanded receptive field

常规卷积和空洞(扩张)卷积的比较

方面常规卷积空洞(扩张)卷积
过滤器应用将筛选器应用于输入数据的连续区域在滤芯(孔)之间引入间隙
内核大小固定内核大小固定的内核大小,但有间隙(通过膨胀控制)
滑动策略在输入特征图之间滑动间隔元件允许扩大感受野
通常,步幅为 1增加有效步幅,由扩张率控制
输出特征图大小由于卷积而减小尺寸保留输入大小,同时增加感受野
感受野有效感受野有限扩大有效感受野
上下文信息捕获有限的上下文捕获增强了捕获更广泛上下文的能力

空洞卷积的应用

  • 空洞卷积通过在不添加参数的情况下扩大感受野来提高速度。
  • 它们可以选择性地聚焦于特定的输入区域,从而提高特征提取效率。
  • 与具有较大内核的传统卷积相比,计算复杂性降低。
  • 非常适合实时视频处理和处理大规模图像数据集。

    探索著名建筑

    DeepLab

    DeepLab 是一系列为语义图像分割而创建的卷积神经网络架构。它以使用空洞卷积(也称为扩张卷积)和空洞卷积金字塔池化(ASPP) 来捕获图像中的多尺度上下文信息而得到认可,从而实现精确的像素级分割。
    DeepLab 是一系列为语义图像分割而创建的卷积神经网络架构。它以使用空洞卷积(也称为扩张卷积)和空洞卷积金字塔池化(ASPP) 来捕获图像中的多尺度上下文信息而得到认可,从而实现精确的像素级分割。
    以下是 DeepLab 的概述:

  • DeepLab 专注于通过为每个像素分配标签将图像分割成有意义的区域,从而帮助理解图像中的详细上下文。
  • DeepLab 使用的空洞卷积是扩张卷积,可在不牺牲分辨率的情况下扩展网络的感受野。这使得 DeepLab 能够在多个尺度上捕获上下文,从而在不显著增加计算成本的情况下实现全面的信息收集。
  • 空洞卷积金字塔池化(ASPP) 是 DeepLab 中用于有效收集多尺度信息的一项功能。它采用具有不同膨胀率的并行卷积来捕获多个尺度的上下文并有效地融合信息。
  • DeepLab 的架构专注于多尺度上下文和精确分割,在各种语义分割挑战中取得了最先进的性能,展示了分割任务的高精度。

法典:

import tensorflow as tf
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Conv2DTranspose

def create_DeepLab_model(input_shape, num_classes):
    model = Sequential([
        Conv2D(64, (3, 3), activation='relu', padding='same', input_shape=input_shape),
        Conv2D(64, (3, 3), activation='relu', padding='same'),
        MaxPooling2D(pool_size=(2, 2)),
        
        Conv2D(128, (3, 3), activation='relu', padding='same'),
        Conv2D(128, (3, 3), activation='relu', padding='same'),
        MaxPooling2D(pool_size=(2, 2)),
        
        # Add more convolutional layers as needed
        
        Conv2DTranspose(64, (3, 3), strides=(2, 2), padding='same', activation='relu'),
        Conv2D(num_classes, (1, 1), activation='softmax', padding='valid')
    ])
    return model

# Define input shape and number of classes
input_shape = (256, 256, 3)  # Example input shape
num_classes = 21  # Example number of classes

# Create the DeepLab model
deeplab_model = create_DeepLab_model(input_shape, num_classes)

# Compile the model (you might want to adjust the optimizer and loss function based on your task)
deeplab_model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])

# Print model summary
deeplab_model.summary()

全卷积网络(FCNS)

  • 全卷积网络(FCN) 和空间保留:FCN 用 1×1 卷积取代了全连接层,这对于维护空间信息至关重要,尤其是在分割等任务中。
  • 编码器结构:编码器通常基于 VGG,会经历一个转换,其中全连接层被转换为卷积层。这样可以保留空间细节和与图像的连通性。
  • 空洞卷积积分:空洞卷积在 FCN 中至关重要。它们使网络能够捕获多尺度信息,而不会显著增加参数或损失空间分辨率。
  • 语义分割:空洞卷积有助于在多个尺度上捕获更广泛的上下文信息,使网络能够理解同一图像中不同大小和比例的对象。
  • 解码器角色:解码器网络使用向后卷积层将特征映射上采样到原始图像大小。空洞卷积可确保上采样过程保留编码器的关键空间细节。
  • 提高准确性:通过集成空洞卷积,FCN 通过高效捕获上下文和保留多个尺度的空间信息,提高了语义分割任务的准确性。

法典:

import tensorflow as tf

# Define theatrous convolution layer function
def atrous_conv_layer(inputs, filters, kernel_size, rate):
    return tf.keras.layers.Conv2D(filters=filters, kernel_size=kernel_size, 
    dilation_rate=rate, padding='same', activation='relu')(inputs) 

# Example FCN architecture with atrous convolutions
def FCN_with_AtrousConv(input_shape, num_classes):
    inputs = tf.keras.layers.Input(shape=input_shape)

    # Encoder (VGG-style)
    conv1 = tf.keras.layers.Conv2D(64, (3, 3), activation='relu', padding='same')(inputs)
    conv2 = tf.keras.layers.Conv2D(64, (3, 3), activation='relu', padding='same')(conv1)

    #atrous convolution layers
    atrous_conv1 = atrous_conv_layer(conv2, 128, (3, 3), rate=2)
    atrous_conv2 = atrous_conv_layer(atrous_conv1, 128, (3, 3), rate=4)
    # Add more atrous convolution as needed...

    # Decoder (transposed convolution)
    upsample = tf.keras.layers.Conv2DTranspose(64, (3, 3), strides=(2, 2), padding='same')
    (atrous_conv2)
    output = tf.keras.layers.Conv2D(num_classes, (1, 1), activation='softmax')(upsample)

    model = tf.keras.models.Model(inputs=inputs, outputs=output)
    return model

# Define input shape and number of classes
input_shape = (256, 256, 3)  # Example input shape
num_classes = 10  # Example number of classes

# Create an instance of the FCN with AtrousConv model
model = FCN_with_AtrousConv(input_shape, num_classes)

# Compile the model
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])

# Display model summary
model.summary()

LinkNet

LinkNet 是一种先进的图像分割架构,它结合了其设计的效率和空洞卷积(也称为扩张卷积)的强大功能。它利用跳跃连接来增强信息流并准确分割图像。

  • 高效的图像分割:LinkNet 通过采用空洞卷积来有效地分割图像,这是一种在不过度增加参数的情况下扩展感受野的技术。
  • 空洞卷积积分:LinkNet 利用空洞卷积或扩张卷积,有效地捕获上下文信息,同时保持需求的可控性。
  • 跳过连接以改善流量:LinkNet 的跳过连接有助于在网络上更好地传输信息。这通过集成来自不同网络深度的特征来促进更精确的分割。
  • 优化设计:该架构经过优化,可在计算效率和准确的图像分割之间取得平衡。这使得它适用于各种分段任务。
  • 可扩展的架构:LinkNet 的设计具有可扩展性,使其能够高效、准确地处理各种复杂程度的分段任务。

法典:

import torch
import torch.nn as nn
import torch.nn.functional as F

class ConvBlock(nn.Module):
    def __init__(self, in_channels, out_channels, kernel_size=3, stride=1, padding=1):
        super(ConvBlock, self).__init__()
        self.conv = nn.Conv2d(in_channels, out_channels, kernel_size=kernel_size,
         stride=stride, padding=padding)
        self.bn = nn.BatchNorm2d(out_channels)
        self.relu = nn.ReLU(inplace=True)

    def forward(self, x):
        x = self.conv(x)
        x = self.bn(x)
        x = self.relu(x)
        return x

class DecoderBlock(nn.Module):
    def __init__(self, in_channels, out_channels):
        super(DecoderBlock, self).__init__()
        self.conv1 = ConvBlock(in_channels, in_channels // 4, kernel_size=1, stride=1, padding=0)
        self.deconv = nn.ConvTranspose2d(in_channels // 4, out_channels, kernel_size=4, 
        stride=2, padding=1)
        self.conv2 = ConvBlock(out_channels, out_channels)

    def forward(self, x, skip):
        x = F.interpolate(x, scale_factor=2, mode='nearest')
        x = self.conv1(x)
        x = self.deconv(x)
        x = self.conv2(x)
        if skip is not None:
            x += skip
        return x

class LinkNet(nn.Module):
    def __init__(self, num_classes=21):
        super(LinkNet, self).__init__()

        # Encoder
        self.encoder = nn.Sequential(
            ConvBlock(3, 64),
            nn.MaxPool2d(2),
            ConvBlock(64, 128),
            nn.MaxPool2d(2),
            ConvBlock(128, 256),
            nn.MaxPool2d(2),
            ConvBlock(256, 512),
            nn.MaxPool2d(2)
        )

        # Decoder
        self.decoder = nn.Sequential(
            DecoderBlock(512, 256),
            DecoderBlock(256, 128),
            DecoderBlock(128, 64),
            DecoderBlock(64, 32)
        )

        # Final prediction
        self.final_conv = nn.Conv2d(32, num_classes, kernel_size=1)

    def forward(self, x):
        skips = []
        for module in self.encoder:
            x = module(x)
            skips.append(x.clone())

        skips = skips[::-1]  # Reverse for decoder

        for i, module in enumerate(self.decoder):
            x = module(x, skips[i])

        x = self.final_conv(x)
        return x

# Example usage:
input_tensor = torch.randn(1, 3, 224, 224)  # Example input tensor shape
model = LinkNet(num_classes=10)  # Example number of classes
output = model(input_tensor)
print(output.shape)  # Example output shape

实例 FCN

该方法适用于全卷积网络(FCN),该网络对语义分割非常有效,适用于实例感知语义分割。与原始 FCN 不同,在原始 FCN 中,每个输出像素都是一个对象类别的分类器,而在 InstanceFCN 中,每个输出像素都是实例相对位置的分类器。例如,在评分图中,每个像素都是它是否属于实例的“右侧”的分类器。

InstanceFCN 的工作原理

在输入图像上应用 FCN 以生成 分数图,每个分数图对应于特定的相对位置。这些称为实例敏感分数映射。为了从这些分数映射生成对象实例,使用了大小为 m×m 的滑动窗口。m×m 窗口分为 k²、m ⁄ k × m ⁄ k 维度窗口,对应于每个 相对位置。输出的每个 m ⁄ k × m ⁄ k 子窗口直接复制相应分数图中同一子窗口中的值。 子窗口根据它们的相对位置组合在一起,以组装 m×m 分割输出。例如,上图中输出的 #1 子窗口直接取自 #1 实例敏感分数图中 m×m 窗口的左上角 m ⁄ k × m ⁄ k子窗口。这称为实例组装模块。

InstanceFCN 架构

该架构包括将 VGG-16 完全卷积应用于输入图像。在输出特征图上,有两个完全卷积分支。其中一个用于估计段实例(如上所述),另一个用于对实例进行评分。
空洞卷积会在滤波器中引入间隙,用于该架构的某些部分,以扩展网络的视野并捕获更多上下文信息。

对于第一个分支,使用 1×1 512 d 转换层,后跟 3×3 转换层来生成一组 k² 实例敏感分数映射。组装模块(如前所述)用于预测 m×m(= 21) 分割掩码。第二个分支由一个 3×3 512 d 转化层和一个 1×1 转化层组成。这个 1×1 转化层是每像素的逻辑回归,用于对以该像素为中心的 m×m 滑动窗口的实例/而不是实例进行分类。因此,分支的输出是一个客观性分数图,其中一个分数对应于一个生成一个实例的滑动窗口。因此,此方法对不同的对象类别是盲目的。

法典:

from tensorflow.keras.models import Model
from tensorflow.keras.layers import Input, Conv2D, concatenate

# Define your atrous convolution layer
def atrous_conv_layer(input_layer, filters, kernel_size, dilation_rate):
    return Conv2D(filters=filters, kernel_size=kernel_size,
     dilation_rate=dilation_rate, padding='same', activation='relu')(input_layer)

# Define your InstanceFCN model
def InstanceFCN(input_shape):
    inputs = Input(shape=input_shape)
    
    # Your VGG-16 like fully convolutional layers here
    conv1 = Conv2D(64, (3, 3), activation='relu', padding='same')(inputs)
    conv2 = Conv2D(64, (3, 3), activation='relu', padding='same')(conv1)
    
    #atrous convolution layer
    atrous_conv = atrous_conv_layer(conv2, filters=128, kernel_size=(3, 3),
     dilation_rate=(2, 2))

    # More convolutional layers and branches for scoring and instance estimation

    # Output layers for scoring and instance estimation
    score_output = Conv2D(num_classes, (1, 1), activation='softmax')(... )  
    # Your score output
    instance_output = Conv2D(num_instances, (1, 1), activation='sigmoid')(... )  
    # Your instance output

    return Model(inputs=inputs, outputs=[score_output, instance_output])

# Usage:
model = InstanceFCN(input_shape=(256, 256, 3))  # Example input shape
model.summary()  # View the model summary

全卷积实例感知语义分割 (FCIS)

完全卷积实例感知语义分割 (FCIS) 由 IntanceFCN 方法构建。InstanceFCN 只能预测固定的 m×m 维度掩码,无法将对象分类为不同的类别。FCIS通过预测不同的维度掩码,同时预测不同的对象类别,解决了所有这些问题。

关节掩模预测和分类


给定 RoI,像素分数图由组装操作生成,如上文 InstanceFCN 下所述。对于 ROI 中的每个像素,有两个任务(因此,会生成两个分数图):

  1. 检测:是否属于相对位置的对象边界框
  2. 分段:是否在对象实例的边界内

基于这些,出现了三种情况:

  1. 高内线得分和低外线得分:检测+、分段+
  2. 低内线得分和高外线得分:检测+、分割-
  3. 两个分数都很低:检测-、分割-

对于检测,max 运算用于区分情况 1 和 2 (detection+) 与情况 3 (detection-)。整个 ROI 的检测分数是通过对所有像素的似然进行平均池化,然后是所有类别的 softmax 算子来获得的。对于分割,softmax 用于区分案例 1 (segmentation+) 和其余案例 (segmentation-)。ROI 的前景掩码是每个类别的每像素分割分数的并集。

ResNet 用于完全卷积地从输入图像中提取特征。在 conv4 层之上添加一个 RPN 以生成 ROI。从 conv5 特征图中,使用 1×1 转化层生成 2k² × C+1 分数图(C 对象类别、一个背景类别、每个类别两组 k² 分数图)。RoI(非最大抑制后)被归类为分类分数最高的类别。为了获得前景掩码,将采用所有交叉并集得分高于 0.5 且 RoI 被考虑的 RoI。该类别的掩码是按像素取平均值的,并按其分类分数加权。然后对平均掩码进行二值化。


结论

空洞卷积通过解决在不牺牲计算效率的情况下捕获上下文信息的挑战,改变了语义分割。这些膨胀的卷积旨在扩大感受野,同时保持空间分辨率。它们已成为 DeepLab、LinkNet 等现代架构的重要组成部分。
空洞卷积捕获多尺度特征和提高上下文理解的能力使其在尖端分割模型中得到广泛采用。随着研究的进展,空洞卷积与其他技术的集成有望在跨不同领域实现精确、高效和上下文丰富的语义分割方面取得进一步进展。

关键要点

  • CNN 中的空洞卷积通过在不丢失细节的情况下观察不同的比例来帮助我们理解复杂的图像。
  • 它们使图像保持清晰和详细,从而更容易识别图像的每个部分。
  • 它们可以无缝集成到 DeepLab、LinkNet 等架构中,从而提高它们在不同领域准确分割对象的效率。

    常见问题解答

    问题1. 使用空洞卷积的主要优势是什么?
    答:空洞卷积允许在不影响图像细节的情况下探索图像中的不同比例,从而实现更全面的特征提取。
    问题2. 空洞卷积与常规卷积有何不同?
    答:与常规卷积不同,空洞卷积在滤芯中引入了间隙,从而有效地增加了感受野,而无需下采样。
    问题3. 空洞卷积通常用于哪些应用?
    答:空洞卷积在语义分割、图像分类和对象检测任务中很普遍,因为它们能够保留图像细节。
    问题4. 空洞卷积会影响计算效率吗?
    答:是的,空洞卷积通过保留特征图的分辨率来帮助保持计算效率,从而在不显著增加参数数量的情况下允许更大的感受野。
    问题5. 空洞卷积是否仅限于特定的神经网络架构?
    答:不可以,空洞卷积可以集成到各种架构中,如 DeepLab、LinkNet 等,展示它们在不同框架中的多功能性。

以上这些书籍资料也可通过关注微信公众号免费获取哦!
欢迎关注我们的微信公众号:MomodelAl
同时,欢迎使用「Mo AI编程」微信小程序
以及登录官网,了解更多信息:Mo 人工智能教育实训平台
Mo,发现意外,创造可能
注:部分资源来源于互联网,若有侵权,请直接联系作者删除。


Momodel
47 声望21 粉丝

发现意外,创造可能。