罪恶克星 发表于 2025-10-30 04:37:40

《Keras 3 :使用 DeepLabV3+ 的多类语义分割》:此文为AI主动翻译

《Keras 3 :使用 DeepLabV3+ 的多类语义分割》

作者:Soumik Rakshit
创建日期:2021/08/31
末了修改时间:2024/01/05
形貌:实现 DeepLabV3+ 架构以举行多类语义分割。
   (i) 此示例使用 Keras 3 在 Colab 中查察
GitHub 源
<hr> 先容

语义分割,目标是为图像中的每个像素分配语义标签, 是一项必不可少的盘算机视觉任务。在此示例中,我们实现 用于多类语义分割的 DeepLabV3+ 模子,一个全卷积模子 在语义分割基准测试中表现良好的架构。
引用:



[*]具有 Atrous 可分离卷积的编码器-解码器,用于语义图像分割
[*]重新思考语义图像分割的 Atrous 卷积
[*]DeepLab:使用深度卷积网络、Atrous 卷积和全毗连 CRF 举行语义图像分割
<hr> 下载数据

我们将使用 Crowd Instance 级 Human Parsing Dataset 来练习我们的模子。Crowd 实例级人类剖析 (CIHP) 数据集有 38280 张差异的人类图像。 CIHP 中的每张图像都标有 20 个种别的像素级表明,以及实例级标识。 此数据集可用于 “人体部位分割” 任务。
   import keras
from keras import layers
from keras import ops

import os
import numpy as np
from glob import glob
import cv2
from scipy.io import loadmat
import matplotlib.pyplot as plt

# For data preprocessing
from tensorflow import image as tf_image
from tensorflow import data as tf_data
from tensorflow import io as tf_io
    !gdown "1B9A9UCJYMwTL4oBEo4RZfbMZMaZhKJaz&confirm=t"
!unzip -q instance-level-human-parsing.zip
       Downloading... From: https://drive.google.com/uc?id=1B9A9UCJYMwTL4oBEo4RZfbMZMaZhKJaz&confirm=t To: /content/keras-io/scripts/tmp_7009966/instance-level-human-parsing.zip 100% 2.91G/2.91G     <hr> 创建 TensorFlow 数据集

在包罗 38,280 张图像的整个 CIHP 数据集上举行练习须要大量时间,因此我们将使用 在此示例中,用于练习模子的 200 张图像的较小子集。
   IMAGE_SIZE = 512
BATCH_SIZE = 4
NUM_CLASSES = 20
DATA_DIR = "./instance-level_human_parsing/instance-level_human_parsing/Training"
NUM_TRAIN_IMAGES = 1000
NUM_VAL_IMAGES = 50

train_images = sorted(glob(os.path.join(DATA_DIR, "Images/*")))[:NUM_TRAIN_IMAGES]
train_masks = sorted(glob(os.path.join(DATA_DIR, "Category_ids/*")))[:NUM_TRAIN_IMAGES]
val_images = sorted(glob(os.path.join(DATA_DIR, "Images/*")))[
    NUM_TRAIN_IMAGES : NUM_VAL_IMAGES + NUM_TRAIN_IMAGES
]
val_masks = sorted(glob(os.path.join(DATA_DIR, "Category_ids/*")))[
    NUM_TRAIN_IMAGES : NUM_VAL_IMAGES + NUM_TRAIN_IMAGES
]


def read_image(image_path, mask=False):
    image = tf_io.read_file(image_path)
    if mask:
      image = tf_image.decode_png(image, channels=1)
      image.set_shape()
      image = tf_image.resize(images=image, size=)
    else:
      image = tf_image.decode_png(image, channels=3)
      image.set_shape()
      image = tf_image.resize(images=image, size=)
    return image


def load_data(image_list, mask_list):
    image = read_image(image_list)
    mask = read_image(mask_list, mask=True)
    return image, mask


def data_generator(image_list, mask_list):
    dataset = tf_data.Dataset.from_tensor_slices((image_list, mask_list))
    dataset = dataset.map(load_data, num_parallel_calls=tf_data.AUTOTUNE)
    dataset = dataset.batch(BATCH_SIZE, drop_remainder=True)
    return dataset


train_dataset = data_generator(train_images, train_masks)
val_dataset = data_generator(val_images, val_masks)

print("Train Dataset:", train_dataset)
print("Val Dataset:", val_dataset)
       Train Dataset: <_BatchDataset element_spec=(TensorSpec(shape=(4, 512, 512, 3), dtype=tf.float32, name=None), TensorSpec(shape=(4, 512, 512, 1), dtype=tf.float32, name=None))> Val Dataset: <_BatchDataset element_spec=(TensorSpec(shape=(4, 512, 512, 3), dtype=tf.float32, name=None), TensorSpec(shape=(4, 512, 512, 1), dtype=tf.float32, name=None))>     <hr> 构建 DeepLabV3+ 模子

DeepLabv3+ 通过添加编码器-解码器结构来扩展 DeepLabv3。编码器模块 通过在多个 缩放,而 Decoder 模块则沿对象界限优化分割效果。

https://i-blog.csdnimg.cn/img_convert/4f21f618e419ceb5e4f2e463cf76ffcf.png
Dilated convolution:通过扩张卷积,随着我们在网络中深入,我们可以保持 步幅常数,但视野更大,且不增长参数数目 或盘算量。别的,它还支持更大的输出特性图,即 用于语义分割。
使用扩张空间金字塔池化的缘故起因是,当 采样率变大,有效滤波器权重(即 应用于有效特性地区,而不是添补的零)会变小。
   def convolution_block(
    block_input,
    num_filters=256,
    kernel_size=3,
    dilation_rate=1,
    use_bias=False,
):
    x = layers.Conv2D(
      num_filters,
      kernel_size=kernel_size,
      dilation_rate=dilation_rate,
      padding="same",
      use_bias=use_bias,
      kernel_initializer=keras.initializers.HeNormal(),
    )(block_input)
    x = layers.BatchNormalization()(x)
    return ops.nn.relu(x)


def DilatedSpatialPyramidPooling(dspp_input):
    dims = dspp_input.shape
    x = layers.AveragePooling2D(pool_size=(dims[-3], dims[-2]))(dspp_input)
    x = convolution_block(x, kernel_size=1, use_bias=True)
    out_pool = layers.UpSampling2D(
      size=(dims[-3] // x.shape, dims[-2] // x.shape),
      interpolation="bilinear",
    )(x)

    out_1 = convolution_block(dspp_input, kernel_size=1, dilation_rate=1)
    out_6 = convolution_block(dspp_input, kernel_size=3, dilation_rate=6)
    out_12 = convolution_block(dspp_input, kernel_size=3, dilation_rate=12)
    out_18 = convolution_block(dspp_input, kernel_size=3, dilation_rate=18)

    x = layers.Concatenate(axis=-1)()
    output = convolution_block(x, kernel_size=1)
    return output
编码器功能起首按因子 4 举行双倍上采样,然后 与来自网络主干的相应低级特性毗连,该 具有雷同的空间分辨率。在此示例中,我们 使用在 ImageNet 上预先练习的 ResNet50 作为主干模子,我们使用 来自 backbone 块的低级特性。conv4_block6_2_relu
   def DeeplabV3Plus(image_size, num_classes):
    model_input = keras.Input(shape=(image_size, image_size, 3))
    preprocessed = keras.applications.resnet50.preprocess_input(model_input)
    resnet50 = keras.applications.ResNet50(
      weights="imagenet", include_top=False, input_tensor=preprocessed
    )
    x = resnet50.get_layer("conv4_block6_2_relu").output
    x = DilatedSpatialPyramidPooling(x)

    input_a = layers.UpSampling2D(
      size=(image_size // 4 // x.shape, image_size // 4 // x.shape),
      interpolation="bilinear",
    )(x)
    input_b = resnet50.
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 《Keras 3 :使用 DeepLabV3+ 的多类语义分割》:此文为AI主动翻译