政安晨:【Keras机器学习示例演绎】(二)—— 使用 DeepLabV3+ 进行多类语义分割

目录

简介

下载数据

创建 TensorFlow 数据集

构建 DeepLabV3+ 模型

训练

利用色图叠加进行推理

对验证图像进行推理


政安晨的个人主页政安晨

欢迎 👍点赞✍评论⭐收藏

收录专栏: TensorFlow与Keras机器学习实战

希望政安晨的博客能够对您有所裨益,如有不足之处,欢迎在评论区提出指正!

本文目标:为多类语义分割实现 DeepLabV3+ 架构。

简介


语义分割的目标是为图像中的每个像素分配语义标签,这是计算机视觉的一项重要任务。在本示例中,我们实现了用于多类语义分割的 DeepLabV3+ 模型,这是一种全卷积架构,在语义分割基准测试中表现出色。

下载数据


我们将使用人群实例级人类解析数据集来训练我们的模型。人群实例级人类解析(CIHP)数据集包含 38,280 张不同的人类图像。CIHP 中的每张图像都标注了 20 个类别的像素注释以及实例级识别。该数据集可用于 "人体部位分割 "任务。

import keras
from keras import layers
from keras import opsimport 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 [00:22<00:00, 129MB/s]

创建 TensorFlow 数据集


整个 CIHP 数据集包含 38,280 张图片,对其进行训练需要耗费大量时间,因此在本示例中,我们将使用较小的 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 = 50train_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([None, None, 1])image = tf_image.resize(images=image, size=[IMAGE_SIZE, IMAGE_SIZE])else:image = tf_image.decode_png(image, channels=3)image.set_shape([None, None, 3])image = tf_image.resize(images=image, size=[IMAGE_SIZE, IMAGE_SIZE])return imagedef load_data(image_list, mask_list):image = read_image(image_list)mask = read_image(mask_list, mask=True)return image, maskdef 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 datasettrain_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))>

构建 DeepLabV3+ 模型

DeepLabv3+ 通过添加编码器-解码器结构扩展了 DeepLabv3。编码器模块通过在多个尺度上应用扩张卷积来处理多尺度上下文信息,而解码器模块则沿着对象边界完善分割结果。

扩张卷积通过扩张卷积,随着网络的深入,我们可以在不增加参数数量或计算量的情况下,保持步长不变,但视野更大。此外,它还能输出更大的特征图,这对语义分割非常有用。

使用 "稀释空间金字塔池化 "的原因是,有研究表明,随着采样率的增大,有效过滤权重(即应用于有效特征区域的权重,而不是填充的零)的数量会变少。

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.shapex = 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[1], dims[-2] // x.shape[2]),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)([out_pool, out_1, out_6, out_12, out_18])output = convolution_block(x, kernel_size=1)return output

首先对编码器特征进行 4 倍双线性上采样,然后与具有相同空间分辨率的骨干网络中的相应低级特征进行连接。在本例中,我们使用在 ImageNet 上经过预训练的 ResNet50 作为骨干模型,并使用骨干网络中 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").outputx = DilatedSpatialPyramidPooling(x)input_a = layers.UpSampling2D(size=(image_size // 4 // x.shape[1], image_size // 4 // x.shape[2]),interpolation="bilinear",)(x)input_b = resnet50.get_layer("conv2_block3_2_relu").outputinput_b = convolution_block(input_b, num_filters=48, kernel_size=1)x = layers.Concatenate(axis=-1)([input_a, input_b])x = convolution_block(x)x = convolution_block(x)x = layers.UpSampling2D(size=(image_size // x.shape[1], image_size // x.shape[2]),interpolation="bilinear",)(x)model_output = layers.Conv2D(num_classes, kernel_size=(1, 1), padding="same")(x)return keras.Model(inputs=model_input, outputs=model_output)model = DeeplabV3Plus(image_size=IMAGE_SIZE, num_classes=NUM_CLASSES)
model.summary()
Downloading data from https://storage.googleapis.com/tensorflow/keras-applications/resnet/resnet50_weights_tf_dim_ordering_tf_kernels_notop.h594765736/94765736 ━━━━━━━━━━━━━━━━━━━━ 1s 0us/step

演绎展示:

Model: "functional_1"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ Layer (type)               ┃ Output Shape           ┃   Param # ┃ Connected to                ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩
│ input_layer (InputLayer)   │ (None, 512, 512, 3)    │         0 │ -                           │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ get_item (GetItem)         │ (None, 512, 512)       │         0 │ input_layer[0][0]           │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ get_item_1 (GetItem)       │ (None, 512, 512)       │         0 │ input_layer[0][0]           │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ get_item_2 (GetItem)       │ (None, 512, 512)       │         0 │ input_layer[0][0]           │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ stack (Stack)              │ (None, 512, 512, 3)    │         0 │ get_item[0][0],             │
│                            │                        │           │ get_item_1[0][0],           │
│                            │                        │           │ get_item_2[0][0]            │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ add (Add)                  │ (None, 512, 512, 3)    │         0 │ stack[0][0]                 │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv1_pad (ZeroPadding2D)  │ (None, 518, 518, 3)    │         0 │ add[0][0]                   │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv1_conv (Conv2D)        │ (None, 256, 256, 64)   │     9,472 │ conv1_pad[0][0]             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv1_bn                   │ (None, 256, 256, 64)   │       256 │ conv1_conv[0][0]            │
│ (BatchNormalization)       │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv1_relu (Activation)    │ (None, 256, 256, 64)   │         0 │ conv1_bn[0][0]              │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ pool1_pad (ZeroPadding2D)  │ (None, 258, 258, 64)   │         0 │ conv1_relu[0][0]            │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ pool1_pool (MaxPooling2D)  │ (None, 128, 128, 64)   │         0 │ pool1_pad[0][0]             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv2_block1_1_conv        │ (None, 128, 128, 64)   │     4,160 │ pool1_pool[0][0]            │
│ (Conv2D)                   │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv2_block1_1_bn          │ (None, 128, 128, 64)   │       256 │ conv2_block1_1_conv[0][0]   │
│ (BatchNormalization)       │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv2_block1_1_relu        │ (None, 128, 128, 64)   │         0 │ conv2_block1_1_bn[0][0]     │
│ (Activation)               │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv2_block1_2_conv        │ (None, 128, 128, 64)   │    36,928 │ conv2_block1_1_relu[0][0]   │
│ (Conv2D)                   │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv2_block1_2_bn          │ (None, 128, 128, 64)   │       256 │ conv2_block1_2_conv[0][0]   │
│ (BatchNormalization)       │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv2_block1_2_relu        │ (None, 128, 128, 64)   │         0 │ conv2_block1_2_bn[0][0]     │
│ (Activation)               │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv2_block1_0_conv        │ (None, 128, 128, 256)  │    16,640 │ pool1_pool[0][0]            │
│ (Conv2D)                   │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv2_block1_3_conv        │ (None, 128, 128, 256)  │    16,640 │ conv2_block1_2_relu[0][0]   │
│ (Conv2D)                   │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv2_block1_0_bn          │ (None, 128, 128, 256)  │     1,024 │ conv2_block1_0_conv[0][0]   │
│ (BatchNormalization)       │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv2_block1_3_bn          │ (None, 128, 128, 256)  │     1,024 │ conv2_block1_3_conv[0][0]   │
│ (BatchNormalization)       │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv2_block1_add (Add)     │ (None, 128, 128, 256)  │         0 │ conv2_block1_0_bn[0][0],    │
│                            │                        │           │ conv2_block1_3_bn[0][0]     │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv2_block1_out           │ (None, 128, 128, 256)  │         0 │ conv2_block1_add[0][0]      │
│ (Activation)               │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv2_block2_1_conv        │ (None, 128, 128, 64)   │    16,448 │ conv2_block1_out[0][0]      │
│ (Conv2D)                   │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv2_block2_1_bn          │ (None, 128, 128, 64)   │       256 │ conv2_block2_1_conv[0][0]   │
│ (BatchNormalization)       │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv2_block2_1_relu        │ (None, 128, 128, 64)   │         0 │ conv2_block2_1_bn[0][0]     │
│ (Activation)               │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv2_block2_2_conv        │ (None, 128, 128, 64)   │    36,928 │ conv2_block2_1_relu[0][0]   │
│ (Conv2D)                   │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv2_block2_2_bn          │ (None, 128, 128, 64)   │       256 │ conv2_block2_2_conv[0][0]   │
│ (BatchNormalization)       │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv2_block2_2_relu        │ (None, 128, 128, 64)   │         0 │ conv2_block2_2_bn[0][0]     │
│ (Activation)               │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv2_block2_3_conv        │ (None, 128, 128, 256)  │    16,640 │ conv2_block2_2_relu[0][0]   │
│ (Conv2D)                   │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv2_block2_3_bn          │ (None, 128, 128, 256)  │     1,024 │ conv2_block2_3_conv[0][0]   │
│ (BatchNormalization)       │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv2_block2_add (Add)     │ (None, 128, 128, 256)  │         0 │ conv2_block1_out[0][0],     │
│                            │                        │           │ conv2_block2_3_bn[0][0]     │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv2_block2_out           │ (None, 128, 128, 256)  │         0 │ conv2_block2_add[0][0]      │
│ (Activation)               │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv2_block3_1_conv        │ (None, 128, 128, 64)   │    16,448 │ conv2_block2_out[0][0]      │
│ (Conv2D)                   │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv2_block3_1_bn          │ (None, 128, 128, 64)   │       256 │ conv2_block3_1_conv[0][0]   │
│ (BatchNormalization)       │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv2_block3_1_relu        │ (None, 128, 128, 64)   │         0 │ conv2_block3_1_bn[0][0]     │
│ (Activation)               │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv2_block3_2_conv        │ (None, 128, 128, 64)   │    36,928 │ conv2_block3_1_relu[0][0]   │
│ (Conv2D)                   │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv2_block3_2_bn          │ (None, 128, 128, 64)   │       256 │ conv2_block3_2_conv[0][0]   │
│ (BatchNormalization)       │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv2_block3_2_relu        │ (None, 128, 128, 64)   │         0 │ conv2_block3_2_bn[0][0]     │
│ (Activation)               │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv2_block3_3_conv        │ (None, 128, 128, 256)  │    16,640 │ conv2_block3_2_relu[0][0]   │
│ (Conv2D)                   │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv2_block3_3_bn          │ (None, 128, 128, 256)  │     1,024 │ conv2_block3_3_conv[0][0]   │
│ (BatchNormalization)       │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv2_block3_add (Add)     │ (None, 128, 128, 256)  │         0 │ conv2_block2_out[0][0],     │
│                            │                        │           │ conv2_block3_3_bn[0][0]     │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv2_block3_out           │ (None, 128, 128, 256)  │         0 │ conv2_block3_add[0][0]      │
│ (Activation)               │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv3_block1_1_conv        │ (None, 64, 64, 128)    │    32,896 │ conv2_block3_out[0][0]      │
│ (Conv2D)                   │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv3_block1_1_bn          │ (None, 64, 64, 128)    │       512 │ conv3_block1_1_conv[0][0]   │
│ (BatchNormalization)       │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv3_block1_1_relu        │ (None, 64, 64, 128)    │         0 │ conv3_block1_1_bn[0][0]     │
│ (Activation)               │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv3_block1_2_conv        │ (None, 64, 64, 128)    │   147,584 │ conv3_block1_1_relu[0][0]   │
│ (Conv2D)                   │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv3_block1_2_bn          │ (None, 64, 64, 128)    │       512 │ conv3_block1_2_conv[0][0]   │
│ (BatchNormalization)       │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv3_block1_2_relu        │ (None, 64, 64, 128)    │         0 │ conv3_block1_2_bn[0][0]     │
│ (Activation)               │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv3_block1_0_conv        │ (None, 64, 64, 512)    │   131,584 │ conv2_block3_out[0][0]      │
│ (Conv2D)                   │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv3_block1_3_conv        │ (None, 64, 64, 512)    │    66,048 │ conv3_block1_2_relu[0][0]   │
│ (Conv2D)                   │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv3_block1_0_bn          │ (None, 64, 64, 512)    │     2,048 │ conv3_block1_0_conv[0][0]   │
│ (BatchNormalization)       │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv3_block1_3_bn          │ (None, 64, 64, 512)    │     2,048 │ conv3_block1_3_conv[0][0]   │
│ (BatchNormalization)       │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv3_block1_add (Add)     │ (None, 64, 64, 512)    │         0 │ conv3_block1_0_bn[0][0],    │
│                            │                        │           │ conv3_block1_3_bn[0][0]     │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv3_block1_out           │ (None, 64, 64, 512)    │         0 │ conv3_block1_add[0][0]      │
│ (Activation)               │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv3_block2_1_conv        │ (None, 64, 64, 128)    │    65,664 │ conv3_block1_out[0][0]      │
│ (Conv2D)                   │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv3_block2_1_bn          │ (None, 64, 64, 128)    │       512 │ conv3_block2_1_conv[0][0]   │
│ (BatchNormalization)       │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv3_block2_1_relu        │ (None, 64, 64, 128)    │         0 │ conv3_block2_1_bn[0][0]     │
│ (Activation)               │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv3_block2_2_conv        │ (None, 64, 64, 128)    │   147,584 │ conv3_block2_1_relu[0][0]   │
│ (Conv2D)                   │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv3_block2_2_bn          │ (None, 64, 64, 128)    │       512 │ conv3_block2_2_conv[0][0]   │
│ (BatchNormalization)       │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv3_block2_2_relu        │ (None, 64, 64, 128)    │         0 │ conv3_block2_2_bn[0][0]     │
│ (Activation)               │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv3_block2_3_conv        │ (None, 64, 64, 512)    │    66,048 │ conv3_block2_2_relu[0][0]   │
│ (Conv2D)                   │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv3_block2_3_bn          │ (None, 64, 64, 512)    │     2,048 │ conv3_block2_3_conv[0][0]   │
│ (BatchNormalization)       │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv3_block2_add (Add)     │ (None, 64, 64, 512)    │         0 │ conv3_block1_out[0][0],     │
│                            │                        │           │ conv3_block2_3_bn[0][0]     │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv3_block2_out           │ (None, 64, 64, 512)    │         0 │ conv3_block2_add[0][0]      │
│ (Activation)               │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv3_block3_1_conv        │ (None, 64, 64, 128)    │    65,664 │ conv3_block2_out[0][0]      │
│ (Conv2D)                   │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv3_block3_1_bn          │ (None, 64, 64, 128)    │       512 │ conv3_block3_1_conv[0][0]   │
│ (BatchNormalization)       │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv3_block3_1_relu        │ (None, 64, 64, 128)    │         0 │ conv3_block3_1_bn[0][0]     │
│ (Activation)               │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv3_block3_2_conv        │ (None, 64, 64, 128)    │   147,584 │ conv3_block3_1_relu[0][0]   │
│ (Conv2D)                   │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv3_block3_2_bn          │ (None, 64, 64, 128)    │       512 │ conv3_block3_2_conv[0][0]   │
│ (BatchNormalization)       │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv3_block3_2_relu        │ (None, 64, 64, 128)    │         0 │ conv3_block3_2_bn[0][0]     │
│ (Activation)               │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv3_block3_3_conv        │ (None, 64, 64, 512)    │    66,048 │ conv3_block3_2_relu[0][0]   │
│ (Conv2D)                   │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv3_block3_3_bn          │ (None, 64, 64, 512)    │     2,048 │ conv3_block3_3_conv[0][0]   │
│ (BatchNormalization)       │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv3_block3_add (Add)     │ (None, 64, 64, 512)    │         0 │ conv3_block2_out[0][0],     │
│                            │                        │           │ conv3_block3_3_bn[0][0]     │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv3_block3_out           │ (None, 64, 64, 512)    │         0 │ conv3_block3_add[0][0]      │
│ (Activation)               │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv3_block4_1_conv        │ (None, 64, 64, 128)    │    65,664 │ conv3_block3_out[0][0]      │
│ (Conv2D)                   │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv3_block4_1_bn          │ (None, 64, 64, 128)    │       512 │ conv3_block4_1_conv[0][0]   │
│ (BatchNormalization)       │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv3_block4_1_relu        │ (None, 64, 64, 128)    │         0 │ conv3_block4_1_bn[0][0]     │
│ (Activation)               │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv3_block4_2_conv        │ (None, 64, 64, 128)    │   147,584 │ conv3_block4_1_relu[0][0]   │
│ (Conv2D)                   │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv3_block4_2_bn          │ (None, 64, 64, 128)    │       512 │ conv3_block4_2_conv[0][0]   │
│ (BatchNormalization)       │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv3_block4_2_relu        │ (None, 64, 64, 128)    │         0 │ conv3_block4_2_bn[0][0]     │
│ (Activation)               │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv3_block4_3_conv        │ (None, 64, 64, 512)    │    66,048 │ conv3_block4_2_relu[0][0]   │
│ (Conv2D)                   │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv3_block4_3_bn          │ (None, 64, 64, 512)    │     2,048 │ conv3_block4_3_conv[0][0]   │
│ (BatchNormalization)       │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv3_block4_add (Add)     │ (None, 64, 64, 512)    │         0 │ conv3_block3_out[0][0],     │
│                            │                        │           │ conv3_block4_3_bn[0][0]     │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv3_block4_out           │ (None, 64, 64, 512)    │         0 │ conv3_block4_add[0][0]      │
│ (Activation)               │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv4_block1_1_conv        │ (None, 32, 32, 256)    │   131,328 │ conv3_block4_out[0][0]      │
│ (Conv2D)                   │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv4_block1_1_bn          │ (None, 32, 32, 256)    │     1,024 │ conv4_block1_1_conv[0][0]   │
│ (BatchNormalization)       │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv4_block1_1_relu        │ (None, 32, 32, 256)    │         0 │ conv4_block1_1_bn[0][0]     │
│ (Activation)               │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv4_block1_2_conv        │ (None, 32, 32, 256)    │   590,080 │ conv4_block1_1_relu[0][0]   │
│ (Conv2D)                   │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv4_block1_2_bn          │ (None, 32, 32, 256)    │     1,024 │ conv4_block1_2_conv[0][0]   │
│ (BatchNormalization)       │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv4_block1_2_relu        │ (None, 32, 32, 256)    │         0 │ conv4_block1_2_bn[0][0]     │
│ (Activation)               │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv4_block1_0_conv        │ (None, 32, 32, 1024)   │   525,312 │ conv3_block4_out[0][0]      │
│ (Conv2D)                   │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv4_block1_3_conv        │ (None, 32, 32, 1024)   │   263,168 │ conv4_block1_2_relu[0][0]   │
│ (Conv2D)                   │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv4_block1_0_bn          │ (None, 32, 32, 1024)   │     4,096 │ conv4_block1_0_conv[0][0]   │
│ (BatchNormalization)       │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv4_block1_3_bn          │ (None, 32, 32, 1024)   │     4,096 │ conv4_block1_3_conv[0][0]   │
│ (BatchNormalization)       │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv4_block1_add (Add)     │ (None, 32, 32, 1024)   │         0 │ conv4_block1_0_bn[0][0],    │
│                            │                        │           │ conv4_block1_3_bn[0][0]     │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv4_block1_out           │ (None, 32, 32, 1024)   │         0 │ conv4_block1_add[0][0]      │
│ (Activation)               │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv4_block2_1_conv        │ (None, 32, 32, 256)    │   262,400 │ conv4_block1_out[0][0]      │
│ (Conv2D)                   │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv4_block2_1_bn          │ (None, 32, 32, 256)    │     1,024 │ conv4_block2_1_conv[0][0]   │
│ (BatchNormalization)       │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv4_block2_1_relu        │ (None, 32, 32, 256)    │         0 │ conv4_block2_1_bn[0][0]     │
│ (Activation)               │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv4_block2_2_conv        │ (None, 32, 32, 256)    │   590,080 │ conv4_block2_1_relu[0][0]   │
│ (Conv2D)                   │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv4_block2_2_bn          │ (None, 32, 32, 256)    │     1,024 │ conv4_block2_2_conv[0][0]   │
│ (BatchNormalization)       │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv4_block2_2_relu        │ (None, 32, 32, 256)    │         0 │ conv4_block2_2_bn[0][0]     │
│ (Activation)               │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv4_block2_3_conv        │ (None, 32, 32, 1024)   │   263,168 │ conv4_block2_2_relu[0][0]   │
│ (Conv2D)                   │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv4_block2_3_bn          │ (None, 32, 32, 1024)   │     4,096 │ conv4_block2_3_conv[0][0]   │
│ (BatchNormalization)       │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv4_block2_add (Add)     │ (None, 32, 32, 1024)   │         0 │ conv4_block1_out[0][0],     │
│                            │                        │           │ conv4_block2_3_bn[0][0]     │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv4_block2_out           │ (None, 32, 32, 1024)   │         0 │ conv4_block2_add[0][0]      │
│ (Activation)               │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv4_block3_1_conv        │ (None, 32, 32, 256)    │   262,400 │ conv4_block2_out[0][0]      │
│ (Conv2D)                   │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv4_block3_1_bn          │ (None, 32, 32, 256)    │     1,024 │ conv4_block3_1_conv[0][0]   │
│ (BatchNormalization)       │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv4_block3_1_relu        │ (None, 32, 32, 256)    │         0 │ conv4_block3_1_bn[0][0]     │
│ (Activation)               │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv4_block3_2_conv        │ (None, 32, 32, 256)    │   590,080 │ conv4_block3_1_relu[0][0]   │
│ (Conv2D)                   │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv4_block3_2_bn          │ (None, 32, 32, 256)    │     1,024 │ conv4_block3_2_conv[0][0]   │
│ (BatchNormalization)       │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv4_block3_2_relu        │ (None, 32, 32, 256)    │         0 │ conv4_block3_2_bn[0][0]     │
│ (Activation)               │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv4_block3_3_conv        │ (None, 32, 32, 1024)   │   263,168 │ conv4_block3_2_relu[0][0]   │
│ (Conv2D)                   │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv4_block3_3_bn          │ (None, 32, 32, 1024)   │     4,096 │ conv4_block3_3_conv[0][0]   │
│ (BatchNormalization)       │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv4_block3_add (Add)     │ (None, 32, 32, 1024)   │         0 │ conv4_block2_out[0][0],     │
│                            │                        │           │ conv4_block3_3_bn[0][0]     │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv4_block3_out           │ (None, 32, 32, 1024)   │         0 │ conv4_block3_add[0][0]      │
│ (Activation)               │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv4_block4_1_conv        │ (None, 32, 32, 256)    │   262,400 │ conv4_block3_out[0][0]      │
│ (Conv2D)                   │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv4_block4_1_bn          │ (None, 32, 32, 256)    │     1,024 │ conv4_block4_1_conv[0][0]   │
│ (BatchNormalization)       │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv4_block4_1_relu        │ (None, 32, 32, 256)    │         0 │ conv4_block4_1_bn[0][0]     │
│ (Activation)               │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv4_block4_2_conv        │ (None, 32, 32, 256)    │   590,080 │ conv4_block4_1_relu[0][0]   │
│ (Conv2D)                   │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv4_block4_2_bn          │ (None, 32, 32, 256)    │     1,024 │ conv4_block4_2_conv[0][0]   │
│ (BatchNormalization)       │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv4_block4_2_relu        │ (None, 32, 32, 256)    │         0 │ conv4_block4_2_bn[0][0]     │
│ (Activation)               │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv4_block4_3_conv        │ (None, 32, 32, 1024)   │   263,168 │ conv4_block4_2_relu[0][0]   │
│ (Conv2D)                   │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv4_block4_3_bn          │ (None, 32, 32, 1024)   │     4,096 │ conv4_block4_3_conv[0][0]   │
│ (BatchNormalization)       │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv4_block4_add (Add)     │ (None, 32, 32, 1024)   │         0 │ conv4_block3_out[0][0],     │
│                            │                        │           │ conv4_block4_3_bn[0][0]     │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv4_block4_out           │ (None, 32, 32, 1024)   │         0 │ conv4_block4_add[0][0]      │
│ (Activation)               │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv4_block5_1_conv        │ (None, 32, 32, 256)    │   262,400 │ conv4_block4_out[0][0]      │
│ (Conv2D)                   │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv4_block5_1_bn          │ (None, 32, 32, 256)    │     1,024 │ conv4_block5_1_conv[0][0]   │
│ (BatchNormalization)       │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv4_block5_1_relu        │ (None, 32, 32, 256)    │         0 │ conv4_block5_1_bn[0][0]     │
│ (Activation)               │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv4_block5_2_conv        │ (None, 32, 32, 256)    │   590,080 │ conv4_block5_1_relu[0][0]   │
│ (Conv2D)                   │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv4_block5_2_bn          │ (None, 32, 32, 256)    │     1,024 │ conv4_block5_2_conv[0][0]   │
│ (BatchNormalization)       │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv4_block5_2_relu        │ (None, 32, 32, 256)    │         0 │ conv4_block5_2_bn[0][0]     │
│ (Activation)               │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv4_block5_3_conv        │ (None, 32, 32, 1024)   │   263,168 │ conv4_block5_2_relu[0][0]   │
│ (Conv2D)                   │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv4_block5_3_bn          │ (None, 32, 32, 1024)   │     4,096 │ conv4_block5_3_conv[0][0]   │
│ (BatchNormalization)       │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv4_block5_add (Add)     │ (None, 32, 32, 1024)   │         0 │ conv4_block4_out[0][0],     │
│                            │                        │           │ conv4_block5_3_bn[0][0]     │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv4_block5_out           │ (None, 32, 32, 1024)   │         0 │ conv4_block5_add[0][0]      │
│ (Activation)               │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv4_block6_1_conv        │ (None, 32, 32, 256)    │   262,400 │ conv4_block5_out[0][0]      │
│ (Conv2D)                   │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv4_block6_1_bn          │ (None, 32, 32, 256)    │     1,024 │ conv4_block6_1_conv[0][0]   │
│ (BatchNormalization)       │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv4_block6_1_relu        │ (None, 32, 32, 256)    │         0 │ conv4_block6_1_bn[0][0]     │
│ (Activation)               │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv4_block6_2_conv        │ (None, 32, 32, 256)    │   590,080 │ conv4_block6_1_relu[0][0]   │
│ (Conv2D)                   │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv4_block6_2_bn          │ (None, 32, 32, 256)    │     1,024 │ conv4_block6_2_conv[0][0]   │
│ (BatchNormalization)       │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv4_block6_2_relu        │ (None, 32, 32, 256)    │         0 │ conv4_block6_2_bn[0][0]     │
│ (Activation)               │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ average_pooling2d          │ (None, 1, 1, 256)      │         0 │ conv4_block6_2_relu[0][0]   │
│ (AveragePooling2D)         │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv2d (Conv2D)            │ (None, 1, 1, 256)      │    65,792 │ average_pooling2d[0][0]     │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ batch_normalization        │ (None, 1, 1, 256)      │     1,024 │ conv2d[0][0]                │
│ (BatchNormalization)       │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv2d_1 (Conv2D)          │ (None, 32, 32, 256)    │    65,536 │ conv4_block6_2_relu[0][0]   │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv2d_2 (Conv2D)          │ (None, 32, 32, 256)    │   589,824 │ conv4_block6_2_relu[0][0]   │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv2d_3 (Conv2D)          │ (None, 32, 32, 256)    │   589,824 │ conv4_block6_2_relu[0][0]   │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv2d_4 (Conv2D)          │ (None, 32, 32, 256)    │   589,824 │ conv4_block6_2_relu[0][0]   │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ relu (Relu)                │ (None, 1, 1, 256)      │         0 │ batch_normalization[0][0]   │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ batch_normalization_1      │ (None, 32, 32, 256)    │     1,024 │ conv2d_1[0][0]              │
│ (BatchNormalization)       │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ batch_normalization_2      │ (None, 32, 32, 256)    │     1,024 │ conv2d_2[0][0]              │
│ (BatchNormalization)       │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ batch_normalization_3      │ (None, 32, 32, 256)    │     1,024 │ conv2d_3[0][0]              │
│ (BatchNormalization)       │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ batch_normalization_4      │ (None, 32, 32, 256)    │     1,024 │ conv2d_4[0][0]              │
│ (BatchNormalization)       │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ up_sampling2d              │ (None, 32, 32, 256)    │         0 │ relu[0][0]                  │
│ (UpSampling2D)             │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ relu_1 (Relu)              │ (None, 32, 32, 256)    │         0 │ batch_normalization_1[0][0] │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ relu_2 (Relu)              │ (None, 32, 32, 256)    │         0 │ batch_normalization_2[0][0] │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ relu_3 (Relu)              │ (None, 32, 32, 256)    │         0 │ batch_normalization_3[0][0] │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ relu_4 (Relu)              │ (None, 32, 32, 256)    │         0 │ batch_normalization_4[0][0] │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ concatenate (Concatenate)  │ (None, 32, 32, 1280)   │         0 │ up_sampling2d[0][0],        │
│                            │                        │           │ relu_1[0][0], relu_2[0][0], │
│                            │                        │           │ relu_3[0][0], relu_4[0][0]  │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv2d_5 (Conv2D)          │ (None, 32, 32, 256)    │   327,680 │ concatenate[0][0]           │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ batch_normalization_5      │ (None, 32, 32, 256)    │     1,024 │ conv2d_5[0][0]              │
│ (BatchNormalization)       │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv2d_6 (Conv2D)          │ (None, 128, 128, 48)   │     3,072 │ conv2_block3_2_relu[0][0]   │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ relu_5 (Relu)              │ (None, 32, 32, 256)    │         0 │ batch_normalization_5[0][0] │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ batch_normalization_6      │ (None, 128, 128, 48)   │       192 │ conv2d_6[0][0]              │
│ (BatchNormalization)       │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ up_sampling2d_1            │ (None, 128, 128, 256)  │         0 │ relu_5[0][0]                │
│ (UpSampling2D)             │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ relu_6 (Relu)              │ (None, 128, 128, 48)   │         0 │ batch_normalization_6[0][0] │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ concatenate_1              │ (None, 128, 128, 304)  │         0 │ up_sampling2d_1[0][0],      │
│ (Concatenate)              │                        │           │ relu_6[0][0]                │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv2d_7 (Conv2D)          │ (None, 128, 128, 256)  │   700,416 │ concatenate_1[0][0]         │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ batch_normalization_7      │ (None, 128, 128, 256)  │     1,024 │ conv2d_7[0][0]              │
│ (BatchNormalization)       │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ relu_7 (Relu)              │ (None, 128, 128, 256)  │         0 │ batch_normalization_7[0][0] │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv2d_8 (Conv2D)          │ (None, 128, 128, 256)  │   589,824 │ relu_7[0][0]                │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ batch_normalization_8      │ (None, 128, 128, 256)  │     1,024 │ conv2d_8[0][0]              │
│ (BatchNormalization)       │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ relu_8 (Relu)              │ (None, 128, 128, 256)  │         0 │ batch_normalization_8[0][0] │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ up_sampling2d_2            │ (None, 512, 512, 256)  │         0 │ relu_8[0][0]                │
│ (UpSampling2D)             │                        │           │                             │
├────────────────────────────┼────────────────────────┼───────────┼─────────────────────────────┤
│ conv2d_9 (Conv2D)          │ (None, 512, 512, 20)   │     5,140 │ up_sampling2d_2[0][0]       │
└────────────────────────────┴────────────────────────┴───────────┴─────────────────────────────┘
 Total params: 11,857,236 (45.23 MB)
 Trainable params: 11,824,500 (45.11 MB)
 Non-trainable params: 32,736 (127.88 KB)

训练


我们使用稀疏分类交叉熵作为损失函数,使用 Adam 作为优化器来训练模型。

oss = keras.losses.SparseCategoricalCrossentropy(from_logits=True)
model.compile(optimizer=keras.optimizers.Adam(learning_rate=0.001),loss=loss,metrics=["accuracy"],
)history = model.fit(train_dataset, validation_data=val_dataset, epochs=25)plt.plot(history.history["loss"])
plt.title("Training Loss")
plt.ylabel("loss")
plt.xlabel("epoch")
plt.show()plt.plot(history.history["accuracy"])
plt.title("Training Accuracy")
plt.ylabel("accuracy")
plt.xlabel("epoch")
plt.show()plt.plot(history.history["val_loss"])
plt.title("Validation Loss")
plt.ylabel("val_loss")
plt.xlabel("epoch")
plt.show()plt.plot(history.history["val_accuracy"])
plt.title("Validation Accuracy")
plt.ylabel("val_accuracy")
plt.xlabel("epoch")
plt.show()

演绎展示:

Epoch 1/25
250/250 [==============================] - 115s 359ms/step - loss: 1.1765 - accuracy: 0.6424 - val_loss: 2.3559 - val_accuracy: 0.5960
Epoch 2/25
250/250 [==============================] - 92s 366ms/step - loss: 0.9413 - accuracy: 0.6998 - val_loss: 1.7349 - val_accuracy: 0.5593
Epoch 3/25
250/250 [==============================] - 93s 371ms/step - loss: 0.8415 - accuracy: 0.7310 - val_loss: 1.3097 - val_accuracy: 0.6281
Epoch 4/25
250/250 [==============================] - 93s 372ms/step - loss: 0.7640 - accuracy: 0.7552 - val_loss: 1.0175 - val_accuracy: 0.6885
Epoch 5/25
250/250 [==============================] - 93s 372ms/step - loss: 0.7139 - accuracy: 0.7706 - val_loss: 1.2226 - val_accuracy: 0.6107
Epoch 6/25
250/250 [==============================] - 93s 373ms/step - loss: 0.6647 - accuracy: 0.7867 - val_loss: 0.8583 - val_accuracy: 0.7178
Epoch 7/25
250/250 [==============================] - 94s 375ms/step - loss: 0.5986 - accuracy: 0.8080 - val_loss: 0.9724 - val_accuracy: 0.7135
Epoch 8/25
250/250 [==============================] - 93s 372ms/step - loss: 0.5599 - accuracy: 0.8212 - val_loss: 0.9722 - val_accuracy: 0.7064
Epoch 9/25
250/250 [==============================] - 93s 372ms/step - loss: 0.5161 - accuracy: 0.8364 - val_loss: 0.9023 - val_accuracy: 0.7471
Epoch 10/25
250/250 [==============================] - 93s 373ms/step - loss: 0.4719 - accuracy: 0.8515 - val_loss: 0.8803 - val_accuracy: 0.7540
Epoch 11/25
250/250 [==============================] - 93s 372ms/step - loss: 0.4337 - accuracy: 0.8636 - val_loss: 0.9682 - val_accuracy: 0.7377
Epoch 12/25
250/250 [==============================] - 93s 373ms/step - loss: 0.4079 - accuracy: 0.8718 - val_loss: 0.9586 - val_accuracy: 0.7551
Epoch 13/25
250/250 [==============================] - 93s 373ms/step - loss: 0.3694 - accuracy: 0.8856 - val_loss: 0.9676 - val_accuracy: 0.7606
Epoch 14/25
250/250 [==============================] - 93s 373ms/step - loss: 0.3493 - accuracy: 0.8913 - val_loss: 0.8375 - val_accuracy: 0.7706
Epoch 15/25
250/250 [==============================] - 93s 373ms/step - loss: 0.3217 - accuracy: 0.9008 - val_loss: 0.9956 - val_accuracy: 0.7469
Epoch 16/25
250/250 [==============================] - 93s 372ms/step - loss: 0.3018 - accuracy: 0.9075 - val_loss: 0.9614 - val_accuracy: 0.7474
Epoch 17/25
250/250 [==============================] - 93s 372ms/step - loss: 0.2870 - accuracy: 0.9122 - val_loss: 0.9652 - val_accuracy: 0.7626
Epoch 18/25
250/250 [==============================] - 93s 373ms/step - loss: 0.2685 - accuracy: 0.9182 - val_loss: 0.8913 - val_accuracy: 0.7824
Epoch 19/25
250/250 [==============================] - 93s 373ms/step - loss: 0.2574 - accuracy: 0.9216 - val_loss: 1.0205 - val_accuracy: 0.7417
Epoch 20/25
250/250 [==============================] - 93s 372ms/step - loss: 0.2619 - accuracy: 0.9199 - val_loss: 0.9237 - val_accuracy: 0.7788
Epoch 21/25
250/250 [==============================] - 93s 372ms/step - loss: 0.2372 - accuracy: 0.9280 - val_loss: 0.9076 - val_accuracy: 0.7796
Epoch 22/25
250/250 [==============================] - 93s 372ms/step - loss: 0.2175 - accuracy: 0.9344 - val_loss: 0.9797 - val_accuracy: 0.7742
Epoch 23/25
250/250 [==============================] - 93s 372ms/step - loss: 0.2084 - accuracy: 0.9370 - val_loss: 0.9981 - val_accuracy: 0.7870
Epoch 24/25
250/250 [==============================] - 93s 373ms/step - loss: 0.2077 - accuracy: 0.9370 - val_loss: 1.0494 - val_accuracy: 0.7767
Epoch 25/25
250/250 [==============================] - 93s 372ms/step - loss: 0.2059 - accuracy: 0.9377 - val_loss: 0.9640 - val_accuracy: 0.7651

利用色图叠加进行推理


模型的原始预测结果代表了一个单击编码的张量形状(N, 512, 512, 20),其中 20 个通道中的每个通道都是二进制掩码,对应一个预测标签。为了使结果可视化,我们将它们绘制成 RGB 分割掩码,其中每个像素都用与预测的特定标签相对应的唯一颜色表示。

我们可以很容易地从作为数据集一部分提供的 human_colormap.mat 文件中找到每个标签对应的颜色。我们还将在输入图像上绘制 RGB 分割掩码的叠加图,因为这将进一步帮助我们更直观地识别图像中的不同类别。

# Loading the Colormap
colormap = loadmat("./instance-level_human_parsing/instance-level_human_parsing/human_colormap.mat"
)["colormap"]
colormap = colormap * 100
colormap = colormap.astype(np.uint8)def infer(model, image_tensor):predictions = model.predict(np.expand_dims((image_tensor), axis=0))predictions = np.squeeze(predictions)predictions = np.argmax(predictions, axis=2)return predictionsdef decode_segmentation_masks(mask, colormap, n_classes):r = np.zeros_like(mask).astype(np.uint8)g = np.zeros_like(mask).astype(np.uint8)b = np.zeros_like(mask).astype(np.uint8)for l in range(0, n_classes):idx = mask == lr[idx] = colormap[l, 0]g[idx] = colormap[l, 1]b[idx] = colormap[l, 2]rgb = np.stack([r, g, b], axis=2)return rgbdef get_overlay(image, colored_mask):image = keras.utils.array_to_img(image)image = np.array(image).astype(np.uint8)overlay = cv2.addWeighted(image, 0.35, colored_mask, 0.65, 0)return overlaydef plot_samples_matplotlib(display_list, figsize=(5, 3)):_, axes = plt.subplots(nrows=1, ncols=len(display_list), figsize=figsize)for i in range(len(display_list)):if display_list[i].shape[-1] == 3:axes[i].imshow(keras.utils.array_to_img(display_list[i]))else:axes[i].imshow(display_list[i])plt.show()def plot_predictions(images_list, colormap, model):for image_file in images_list:image_tensor = read_image(image_file)prediction_mask = infer(image_tensor=image_tensor, model=model)prediction_colormap = decode_segmentation_masks(prediction_mask, colormap, 20)overlay = get_overlay(image_tensor, prediction_colormap)plot_samples_matplotlib([image_tensor, overlay, prediction_colormap], figsize=(18, 14))

火车图像推理

plot_predictions(train_images[:4], colormap, model=model)

演绎展示:

 1/1 ━━━━━━━━━━━━━━━━━━━━ 7s 7s/step

 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step

 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step

 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step

对验证图像进行推理


您可以使用 "Hugging Face Hub "上托管的训练有素的模型,并在 "Hugging Face Spaces "上尝试演示。

plot_predictions(val_images[:4], colormap, model=model)
 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step

 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step

 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step

 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/332.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

手动给docusaurus添加一个搜索

新版博客用docusaurus重构已经有些日子了&#xff0c;根据docusaurus的文档上也申请了Algolia,想一劳永逸的解决博客的搜索问题。但是流水有意&#xff0c;落花无情。 algolia总是不给我回复&#xff0c;我只能对着algolia的申请页面仰天长叹。 正常情况的申请 按照docusaur…

Gitlab: Python项目CI/CD实践

目录 1. 说明 2. 准备工作 2.1 服务器 2.2 开发机hosts文件 2.3 项目 3. 步骤过程 3.1 建仓Fastapi T1 3.2 开发机测试构建与推送 ​编辑 3.3 在工作站添加gitlab-runner 3.4 提交代码&#xff0c;查看Pipelines结果 3.5 观察部署情况 4. 参考 1. 说明 分别以一个…

【2024 SCI一区】 基于DCS-BiLSTM-Attention的多元回归预测(Matlab实现)

【2024 SCI一区】 基于DCS-BiLSTM-Attention的多元回归预测&#xff08;Matlab实现&#xff09; 目录 【2024 SCI一区】 基于DCS-BiLSTM-Attention的多元回归预测&#xff08;Matlab实现&#xff09;效果一览基本介绍程序设计参考资料 效果一览 基本介绍 差异创意搜索算法&…

C++ 静态成员函数(二)

一、访问静态成员变量 静态成员函数可以通过作用域运算符::来访问类的静态成员变量和静态成员函数 静态成员函数不属于任何特定的对象&#xff0c;而是属于整个类&#xff0c;可以通过类名直接调用&#xff0c;无需创建类的实例。静态成员函数不能访问类的非静态成员变量和非…

在 Linux 终端中创建目录

目录 ⛳️推荐 前言 在 Linux 中创建一个新目录 创建多个新目录 创建多个嵌套的子目录 测试你的知识 ⛳️推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站 前言 在本系列的这一部…

Maven的dependencyManagement与dependencies区别

先说结论&#xff1a;Maven 使用dependencyManagement 元素来提供了一种管理依赖版本号的方式。 在maven多模块项目的pom文件中&#xff0c;有的小伙伴会发现最外层的pom文件和里面的pom文件有个地方不一样 如下图 父pom 子pom 一般来说是在maven的最外父工程pom文件里&…

npm内部机制与核心原理

npm 的核心目标&#xff1a; Bring the best of open source to you, your team and your company. npm 最重要的任务是安装和维护开源库。 npm 安装机制与背后思想 npm 的安装机制非常值得探究。Ruby 的 Gem&#xff0c;Python的pip都是全局安装机制&#xff0c;但是npm的安装…

界面组件Telerik UI for WPF 2024 Q1新版亮点 - 全新DateRangePicker组件

Telerik UI for WPF拥有超过100个控件来创建美观、高性能的桌面应用程序&#xff0c;同时还能快速构建企业级办公WPF应用程序。UI for WPF支持MVVM、触摸等&#xff0c;创建的应用程序可靠且结构良好&#xff0c;非常容易维护&#xff0c;其直观的API将无缝地集成Visual Studio…

如何正确查看容器的CPU使用率

进入容器中top&#xff0c;虽然看到的PID是容器的&#xff0c;但是%Cpu的统计信息却是宿主机的。 如图 原理 进程的cpu使用率是如何计算出来的&#xff1f; 每个进程的状态是放在文件里的&#xff0c;在/proc目录下&#xff0c;每个进程有自己pid命名的文件夹&#xff0c; …

.NET 爬虫从入门到入狱

目录 前言 1.&#x1f4a1;使用HttpClient爬取数据 2.&#x1f680;模拟User-Agent 3.&#x1f935;使用HTML解析库 3.&#x1f44c;前端Price显示 4.&#x1f331;运行实例 获取金价Au 5.&#x1f9fe;使用正则表达式解析 6.&#x1f4ab;获取BTC价格 7.✨获取CSDN热点…

4.15报错记录

打开文件时出错a bytes-like object is required,notNoneType 确保E:/data/stdata/st- images-1208-json|ST-WT-1.json是一个有效的标签文件。 今天用X-anylabling更改标签目录时出现这个报错 解决方案&#xff1a;图片文件夹中创建同名的一个文件夹把json文件放进去就可以打…

[Qt网络编程]之UDP通讯的简单编程实现

hello&#xff01;欢迎大家来到我的Qt学习系列之网络编程之UDP通讯的简单编程实现。希望这篇文章能对你有所帮助&#xff01;&#xff01;&#xff01; 本篇文章的相关知识请看我的上篇文章: http://t.csdnimg.cn/UKyeM 目录 UDP通讯 基于主窗口的实现 基于线程的实现 UDP通讯…

【YOLO系列PR、F1绘图】更改v5、v7、v8(附v8训练、验证方式),实现调用val.py或者test.py后生成pr.csv,然后再整合绘制到一张图上(使用matplotlib绘制)

目录 1. 前提 效果图2. 更改步骤2.1 得到PR_curve.csv和F1_curve.csv2.1.1 YOLOv7的更改2.1.1.1 得到PR_curve.csv2.2.1.2 得到F1_curve.csv 2.1.2 YOLOv5的更改&#xff08;v6.1版本&#xff09;2.1.3 YOLOv8的更改&#xff08;附训练、验证方式&#xff09; 2.2 绘制PR曲线 …

【创建型模式】抽象工厂模式

一、抽象工厂模式概述 抽象工厂模式定义&#xff1a;提供一个创建一系列相关或相互依赖对象的接口&#xff0c;而无须指定它们具体的类。 模式动机&#xff1a; 1.当系统提供的工厂生产的具体产品并不是一个简单的对象&#xff0c;而是多个位于不同产品等级结构、属于不同类型的…

41、二叉树-二叉树的层序遍历

思路&#xff1a; 层序遍历就是从左到右依次遍历。这个时候就可以使用队列的方式。例如先把头节点入队&#xff0c;然后遍历开始&#xff0c;首先计算队列长度&#xff0c;第一层&#xff0c;长度为了&#xff0c;遍历一次&#xff0c;依次出队&#xff0c;头结点出队&#xff…

Tomcat和Spring Boot配置https

生成测试证书 生成证书前&#xff0c;先验证本地是否正确配置jdk环境变量&#xff0c;如果jdk环境变量配置正确&#xff0c;在命令行程序输入生成证书的命令。 keytool -genkey -alias tomcat -keyalg RSA -keystore "F:\job\apache-tomcat-8.5.29\key\freeHttps.keysto…

微信小程序之图片上传并保存在服务器

先将图片上传到服务器&#xff0c;后端接口将保存好的图片地址返回给小程序&#xff0c;再将小程序中添加图像的图片的url替换为服务器中照片的存储地址&#xff08;使微信小程序中显示出上传的图片&#xff09;。 1、效果如下&#xff1a; 点击图像后选择图像&#xff1a; 结…

搜维尔科技:【工业仿真】煤矿机械安全事故VR警示教育系统

产品概述 搜维尔科技 煤矿机械安全事故VR警示教育系统 系统内容&#xff1a; 系统采用虚拟现实技术模拟矿井井下机械安全技术及事故&#xff0c;展现井下常见机械伤害事故&#xff0c;表现伤害事故的隐患点&#xff0c;能够模拟事故发生和发展过程&#xff1b;营造井下灾害发…

如何使用 Node.js 发送电子邮件全解和相关工具推荐

大多数Web应用程序都需要发送电子邮件。它可能用于注册、密码重置、状态报告&#xff0c;甚至是完整的市场营销活动&#xff0c;如新闻和促销。本教程解释了如何在Node.js中发送电子邮件&#xff0c;但其概念和挑战适用于您正在使用的任何系统。 你会在 npm 上找到大量与电子邮…

详细UI色彩搭配方案分享

UI 配色是设计一个成功的用户界面的关键之一。UI 配色需要考虑品牌标志、用户感受、应用程序的使用场景&#xff0c;这样可以帮助你创建一个有吸引力、易于使用的应用程序。本文将分享 UI 配色的相关知识&#xff0c;帮助设计师快速构建 UI 配色方案&#xff0c;以满足企业的需…