图像处理:语义分割(sematic segmentation)

摘自《动手学习深度学习

图像分类会给每张图像分配一个标签或类别。但如果想知道物体在图像中的位置、物体的形状、以及哪个像素属于哪个物体等,就需要分割图像,给图像中的每个像素各分配一个标签。因此,图像分割的任务是训练一个神经网络来输出该图像对每一个像素的掩码。从更底层(像素层级)来理解图像。图像分割在例如医疗图像、自动驾驶车辆以及卫星图像等领域有很多应用。

语义分割(semantic segmentation)问题关注的是如何将图像分割成属于不同语义类别的区域。这些语义区域的标注和预测都是像素级的。

下图展示了语义分割中图像有关狗、猫和背景的标签。与目标检测相比,语义分割标注的像素级的边框更加精细

 

 

图像分割和实例分割

另两个相似问题。

  • 图像分割(image segmentation):常利用图像中像素之间的相关性,将图像分割成若干组成区域。在训练时不需要有关图像像素的标签信息,在预测时也无法保证分割出的区域具有我们希望得到的语义。只是将图像分割不分类
  • 实例分割(instance segmentation):不仅需要区分语义,还要区分不同的目标实例。分类还要识别具体身份

 

全卷积网络(fully convolutional network,FCN)

采用CNN实现了从图像像素到像素类别的变换。

通过转置卷积(transposed convolution)层将中间层特征图的高和宽变换回输入图像的尺寸,从而令预测结果与输入图像在空间维(高和宽)上一一对应:给定空间维上的位置,通道维的输出即该位置对应像素的类别预测。

转置卷积层得名于矩阵的转置操作;而卷积运算可以通过矩阵乘法来实现

 

卷积运算的矩阵描述

设输入向量为\boldsymbol{x},权重矩阵为\boldsymbol{W},卷积的前向计算可看作:\boldsymbol{y} = \boldsymbol{W}\boldsymbol{x}

反向传播需要依据链式法则。由于\nabla_{\boldsymbol{x}} \boldsymbol{y} = \boldsymbol{W}^\top,卷积的反向传播函数可看作乘以\boldsymbol{W}^\top

转置卷积层交换了卷积层的前向计算函数与反向传播函数:可看作将函数输入向量分别乘以\boldsymbol{W}^\top\boldsymbol{W}。所以转置卷积层可以用来交换卷积层输入和输出的形状。

设权重矩阵是4\times16的矩阵,对于长度为16的输入向量,卷积前向输出长度为4的向量。将此输出送至形状为16\times4的转置权重矩阵,输出长度为16的向量。

转置卷积层常用于将较小的特征图变换为更大的特征图。在全卷积网络中,当输入是高和宽较小的特征图时,转置卷积层可以用来将高和宽放大到输入图像的尺寸

 

全卷机网络模型

全卷积网络先使用卷积神经网络抽取图像特征,然后通过1\times 1卷积层将通道数变换为类别个数,最后通过转置卷积层将特征图的高和宽变换为输入图像的尺寸。模型输出与输入图像的高和宽相同,并在空间位置上一一对应:最终输出的通道包含了该空间位置像素的类别预测(猫、狗、背景)(可能是因为网络都是卷积层而得名吧)

 

 

 

 

 

 

 

 

 

 

### TensorFlow 图像语义分割概述 TensorFlow 是一种强大的开源框架,广泛应用于各种深度学习任务,其中包括图像语义分割语义分割是一种计算机视觉技术,旨在将图像中的每个像素分配到特定类别中[^1]。 以下是基于 TensorFlow 的图像语义分割方法及其示例代码: --- ### 安装依赖环境 为了运行 TensorFlow 中的语义分割模型,建议使用以下配置作为基础开发环境[^3]: - Ubuntu 16.04 - Anaconda3 (Python 3.5) - TensorFlow-GPU 版本 1.10.0 或更高版本 安装命令如下所示: ```bash # 创建并激活 conda 虚拟环境 conda create -n tf_env python=3.5 source activate tf_env # 安装 TensorFlow GPU 支持版 pip install tensorflow-gpu==1.10.0 ``` --- ### 使用 TensorFlow 实现语义分割 #### 数据集准备 语义分割通常需要标注数据集支持,例如 Pascal VOC、Cityscapes 等公开数据集。这些数据集中包含了带有逐像素标签的图片文件。 #### 示例代码:简单语义分割网络实现 下面是一个简单的卷积神经网络结构用于演示如何完成基本的语义分割任务。此代码片段展示了如何定义一个小型 U-Net 架构来处理输入图像并预测其对应的掩码。 ```python import tensorflow as tf from tensorflow.keras.layers import Input, Conv2D, MaxPooling2D, UpSampling2D, concatenate def unet_model(input_shape=(256, 256, 3), num_classes=2): inputs = Input(shape=input_shape) # 下采样路径 conv1 = Conv2D(64, 3, activation='relu', padding='same')(inputs) pool1 = MaxPooling2D(pool_size=(2, 2))(conv1) conv2 = Conv2D(128, 3, activation='relu', padding='same')(pool1) pool2 = MaxPooling2D(pool_size=(2, 2))(conv2) # 底层瓶颈部分 bottleneck = Conv2D(256, 3, activation='relu', padding='same')(pool2) # 上采样路径 upsample1 = UpSampling2D(size=(2, 2))(bottleneck) concat1 = concatenate([upsample1, conv2], axis=-1) conv_up1 = Conv2D(128, 3, activation='relu', padding='same')(concat1) upsample2 = UpSampling2D(size=(2, 2))(conv_up1) concat2 = concatenate([upsample2, conv1], axis=-1) conv_up2 = Conv2D(64, 3, activation='relu', padding='same')(concat2) outputs = Conv2D(num_classes, 1, activation='softmax')(conv_up2) model = tf.keras.Model(inputs=[inputs], outputs=[outputs]) return model model = unet_model() model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) print(model.summary()) ``` 上述代码实现了经典的 U-Net 结构,适用于二分类或多分类的语义分割任务。 --- ### 训练参数设置 在实际应用过程中,可以调整超参数以优化性能。通过 `argparse` 可以为脚本提供灵活的命令行选项控制训练过程[^2]。例如: ```python import argparse parser = argparse.ArgumentParser(description="Train a semantic segmentation model.") parser.add_argument('--batch_size', type=int, default=8, help="Batch size for training") parser.add_argument('--num_val_images', type=int, default=100, help="Number of validation images") args = parser.parse_args() BATCH_SIZE = args.batch_size NUM_VAL_IMAGES = args.num_val_images ``` --- ### 预训练模型的应用 除了自定义模型外,还可以利用 TensorFlow 提供的官方预训练模型库(如 TF-Hub)。这有助于快速启动项目而无需从头开始训练复杂的架构。 加载预训练权重的方式如下: ```python import tensorflow_hub as hub url = "https://tfhub.dev/google/tf2-preview/mobilenet_v2/feature_vector/4" pretrained_model = hub.KerasLayer(url, input_shape=(224, 224, 3)) pretrained_model.trainable = False ``` ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值