代码示例 / 计算机视觉 / 使用 BASNet 的高精度边界分割

使用 BASNet 的高精度边界分割

作者: Hamid Ali
创建日期 2023/05/30
最后修改日期 2025/01/24
描述: 在 DUTS 数据集上训练的边界感知分割模型。

ⓘ 此示例使用 Keras 2

在 Colab 中查看 GitHub 源代码


简介

深度语义分割算法最近取得了很大进步,但仍然无法正确预测对象边界周围的像素。在此示例中,我们实现了边界感知分割网络 (BASNet),使用两阶段预测和细化架构以及混合损失,它可以预测用于图像分割的高精度边界和精细结构。

参考文献


下载数据

我们将使用 DUTS-TE 数据集进行训练。它有 5,019 张图像,但我们将使用 140 张进行训练和验证,以节省笔记本运行时间。DUTS 是一个相对较大的显著对象分割数据集,其中包含前景和背景中真实世界图像常见的各种纹理和结构。

import os

# Because of the use of tf.image.ssim in the loss,
# this example requires TensorFlow. The rest of the code
# is backend-agnostic.
os.environ["KERAS_BACKEND"] = "tensorflow"

import numpy as np
from glob import glob
import matplotlib.pyplot as plt

import keras_hub
import tensorflow as tf
import keras
from keras import layers, ops

keras.config.disable_traceback_filtering()

定义超参数

IMAGE_SIZE = 288
BATCH_SIZE = 4
OUT_CLASSES = 1
TRAIN_SPLIT_RATIO = 0.90

创建 PyDataset

我们将使用 load_paths() 加载并将 140 个路径拆分为训练集和验证集,并将路径转换为 PyDataset 对象。

data_dir = keras.utils.get_file(
    origin="http://saliencydetection.net/duts/download/DUTS-TE.zip",
    extract=True,
)
data_dir = os.path.join(data_dir, "DUTS-TE")


def load_paths(path, split_ratio):
    images = sorted(glob(os.path.join(path, "DUTS-TE-Image/*")))[:140]
    masks = sorted(glob(os.path.join(path, "DUTS-TE-Mask/*")))[:140]
    len_ = int(len(images) * split_ratio)
    return (images[:len_], masks[:len_]), (images[len_:], masks[len_:])


class Dataset(keras.utils.PyDataset):
    def __init__(
        self,
        image_paths,
        mask_paths,
        img_size,
        out_classes,
        batch,
        shuffle=True,
        **kwargs,
    ):
        if shuffle:
            perm = np.random.permutation(len(image_paths))
            image_paths = [image_paths[i] for i in perm]
            mask_paths = [mask_paths[i] for i in perm]
        self.image_paths = image_paths
        self.mask_paths = mask_paths
        self.img_size = img_size
        self.out_classes = out_classes
        self.batch_size = batch
        super().__init__(*kwargs)

    def __len__(self):
        return len(self.image_paths) // self.batch_size

    def __getitem__(self, idx):
        batch_x, batch_y = [], []
        for i in range(idx * self.batch_size, (idx + 1) * self.batch_size):
            x, y = self.preprocess(
                self.image_paths[i],
                self.mask_paths[i],
                self.img_size,
            )
            batch_x.append(x)
            batch_y.append(y)
        batch_x = np.stack(batch_x, axis=0)
        batch_y = np.stack(batch_y, axis=0)
        return batch_x, batch_y

    def read_image(self, path, size, mode):
        x = keras.utils.load_img(path, target_size=size, color_mode=mode)
        x = keras.utils.img_to_array(x)
        x = (x / 255.0).astype(np.float32)
        return x

    def preprocess(self, x_batch, y_batch, img_size):
        images = self.read_image(x_batch, (img_size, img_size), mode="rgb")  # image
        masks = self.read_image(y_batch, (img_size, img_size), mode="grayscale")  # mask
        return images, masks


train_paths, val_paths = load_paths(data_dir, TRAIN_SPLIT_RATIO)

train_dataset = Dataset(
    train_paths[0], train_paths[1], IMAGE_SIZE, OUT_CLASSES, BATCH_SIZE, shuffle=True
)
val_dataset = Dataset(
    val_paths[0], val_paths[1], IMAGE_SIZE, OUT_CLASSES, BATCH_SIZE, shuffle=False
)

可视化数据

def display(display_list):
    title = ["Input Image", "True Mask", "Predicted Mask"]

    for i in range(len(display_list)):
        plt.subplot(1, len(display_list), i + 1)
        plt.title(title[i])
        plt.imshow(keras.utils.array_to_img(display_list[i]), cmap="gray")
        plt.axis("off")
    plt.show()


for image, mask in val_dataset:
    display([image[0], mask[0]])
    break

png


分析掩码

让我们打印上面显示的掩码的唯一值。您可以看到,尽管它属于一个类,但它的强度在低 (0) 到高 (255) 之间变化。强度的这种变化使得网络难以生成用于显著或伪装对象分割的良好分割图。由于其残差细化模块 (RM),BASNet 擅长生成高精度的边界和精细结构。

print(f"Unique values count: {len(np.unique((mask[0] * 255)))}")
print("Unique values:")
print(np.unique((mask[0] * 255)).astype(int))
Unique values count: 245
Unique values:
[  0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17
  18  19  20  21  22  23  24  25  26  27  28  29  30  31  32  33  34  35
  36  37  38  39  40  41  42  43  44  45  46  47  48  49  50  51  52  53
  54  55  56  57  58  59  61  62  63  65  66  67  68  69  70  71  73  74
  75  76  77  78  79  80  81  82  83  84  85  86  87  88  89  90  91  92
  93  94  95  96  97  98  99 100 101 102 103 104 105 108 109 110 111 112
 113 114 115 116 117 118 119 120 122 123 124 125 128 129 130 131 132 133
 134 135 136 137 138 139 140 141 142 144 145 146 147 148 149 150 151 152
 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 170 171
 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189
 190 191 192 193 194 195 196 197 198 199 201 202 203 204 205 206 207 208
 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226
 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244
 245 246 247 248 249 250 251 252 253 254 255]

构建 BASNet 模型

BASNet 包括预测-细化架构和混合损失。预测-细化架构由密集监督的编码器-解码器网络和残差细化模块组成,它们分别用于预测和细化分割概率图。

def basic_block(x_input, filters, stride=1, down_sample=None, activation=None):
    """Creates a residual(identity) block with two 3*3 convolutions."""
    residual = x_input

    x = layers.Conv2D(filters, (3, 3), strides=stride, padding="same", use_bias=False)(
        x_input
    )
    x = layers.BatchNormalization()(x)
    x = layers.Activation("relu")(x)

    x = layers.Conv2D(filters, (3, 3), strides=(1, 1), padding="same", use_bias=False)(
        x
    )
    x = layers.BatchNormalization()(x)

    if down_sample is not None:
        residual = down_sample

    x = layers.Add()([x, residual])

    if activation is not None:
        x = layers.Activation(activation)(x)

    return x


def convolution_block(x_input, filters, dilation=1):
    """Apply convolution + batch normalization + relu layer."""
    x = layers.Conv2D(filters, (3, 3), padding="same", dilation_rate=dilation)(x_input)
    x = layers.BatchNormalization()(x)
    return layers.Activation("relu")(x)


def segmentation_head(x_input, out_classes, final_size):
    """Map each decoder stage output to model output classes."""
    x = layers.Conv2D(out_classes, kernel_size=(3, 3), padding="same")(x_input)

    if final_size is not None:
        x = layers.Resizing(final_size[0], final_size[1])(x)

    return x


def get_resnet_block(resnet, block_num):
    """Extract and return a ResNet-34 block."""
    extractor_levels = ["P2", "P3", "P4", "P5"]
    num_blocks = resnet.stackwise_num_blocks
    if block_num == 0:
        x = resnet.get_layer("pool1_pool").output
    else:
        x = resnet.pyramid_outputs[extractor_levels[block_num - 1]]
    y = resnet.get_layer(f"stack{block_num}_block{num_blocks[block_num]-1}_add").output
    return keras.models.Model(
        inputs=x,
        outputs=y,
        name=f"resnet_block{block_num + 1}",
    )

预测模块

预测模块是像 U-Net 一样的重型编码器-解码器结构。编码器包括一个输入卷积层和六个阶段。前四个阶段采用自 ResNet-34,其余为基本 res-block。由于跳过了 ResNet-34 的第一个卷积和池化层,因此我们将使用 get_resnet_block() 提取前四个块。桥接和解码器都使用三个带有侧面输出的卷积层。该模块在训练期间生成七个分割概率图,其中最后一个被认为是最终输出。

def basnet_predict(input_shape, out_classes):
    """BASNet Prediction Module, it outputs coarse label map."""
    filters = 64
    num_stages = 6

    x_input = layers.Input(input_shape)

    # -------------Encoder--------------
    x = layers.Conv2D(filters, kernel_size=(3, 3), padding="same")(x_input)

    resnet = keras_hub.models.ResNetBackbone(
        input_conv_filters=[64],
        input_conv_kernel_sizes=[7],
        stackwise_num_filters=[64, 128, 256, 512],
        stackwise_num_blocks=[3, 4, 6, 3],
        stackwise_num_strides=[1, 2, 2, 2],
        block_type="basic_block",
    )

    encoder_blocks = []
    for i in range(num_stages):
        if i < 4:  # First four stages are adopted from ResNet-34 blocks.
            x = get_resnet_block(resnet, i)(x)
            encoder_blocks.append(x)
            x = layers.Activation("relu")(x)
        else:  # Last 2 stages consist of three basic resnet blocks.
            x = layers.MaxPool2D(pool_size=(2, 2), strides=(2, 2))(x)
            x = basic_block(x, filters=filters * 8, activation="relu")
            x = basic_block(x, filters=filters * 8, activation="relu")
            x = basic_block(x, filters=filters * 8, activation="relu")
            encoder_blocks.append(x)

    # -------------Bridge-------------
    x = convolution_block(x, filters=filters * 8, dilation=2)
    x = convolution_block(x, filters=filters * 8, dilation=2)
    x = convolution_block(x, filters=filters * 8, dilation=2)
    encoder_blocks.append(x)

    # -------------Decoder-------------
    decoder_blocks = []
    for i in reversed(range(num_stages)):
        if i != (num_stages - 1):  # Except first, scale other decoder stages.
            shape = x.shape
            x = layers.Resizing(shape[1] * 2, shape[2] * 2)(x)

        x = layers.concatenate([encoder_blocks[i], x], axis=-1)
        x = convolution_block(x, filters=filters * 8)
        x = convolution_block(x, filters=filters * 8)
        x = convolution_block(x, filters=filters * 8)
        decoder_blocks.append(x)

    decoder_blocks.reverse()  # Change order from last to first decoder stage.
    decoder_blocks.append(encoder_blocks[-1])  # Copy bridge to decoder.

    # -------------Side Outputs--------------
    decoder_blocks = [
        segmentation_head(decoder_block, out_classes, input_shape[:2])
        for decoder_block in decoder_blocks
    ]

    return keras.models.Model(inputs=x_input, outputs=decoder_blocks)

残差细化模块

细化模块 (RM) 被设计为残差块,旨在细化由预测模块生成的粗糙(模糊和噪声边界)分割图。与预测模块类似,它也是一个编码器-解码器结构,但具有轻量级的 4 个阶段,每个阶段都包含一个 convolutional block() 初始化。最后,它将粗糙输出和残差输出相加,以生成细化输出。

def basnet_rrm(base_model, out_classes):
    """BASNet Residual Refinement Module(RRM) module, output fine label map."""
    num_stages = 4
    filters = 64

    x_input = base_model.output[0]

    # -------------Encoder--------------
    x = layers.Conv2D(filters, kernel_size=(3, 3), padding="same")(x_input)

    encoder_blocks = []
    for _ in range(num_stages):
        x = convolution_block(x, filters=filters)
        encoder_blocks.append(x)
        x = layers.MaxPool2D(pool_size=(2, 2), strides=(2, 2))(x)

    # -------------Bridge--------------
    x = convolution_block(x, filters=filters)

    # -------------Decoder--------------
    for i in reversed(range(num_stages)):
        shape = x.shape
        x = layers.Resizing(shape[1] * 2, shape[2] * 2)(x)
        x = layers.concatenate([encoder_blocks[i], x], axis=-1)
        x = convolution_block(x, filters=filters)

    x = segmentation_head(x, out_classes, None)  # Segmentation head.

    # ------------- refined = coarse + residual
    x = layers.Add()([x_input, x])  # Add prediction + refinement output

    return keras.models.Model(inputs=[base_model.input], outputs=[x])

组合预测和细化模块

class BASNet(keras.Model):
    def __init__(self, input_shape, out_classes):
        """BASNet, it's a combination of two modules
        Prediction Module and Residual Refinement Module(RRM)."""

        # Prediction model.
        predict_model = basnet_predict(input_shape, out_classes)
        # Refinement model.
        refine_model = basnet_rrm(predict_model, out_classes)

        output = refine_model.outputs  # Combine outputs.
        output.extend(predict_model.output)

        # Activations.
        output = [layers.Activation("sigmoid")(x) for x in output]
        super().__init__(inputs=predict_model.input, outputs=output)

        self.smooth = 1.0e-9
        # Binary Cross Entropy loss.
        self.cross_entropy_loss = keras.losses.BinaryCrossentropy()
        # Structural Similarity Index value.
        self.ssim_value = tf.image.ssim
        # Jaccard / IoU loss.
        self.iou_value = self.calculate_iou

    def calculate_iou(
        self,
        y_true,
        y_pred,
    ):
        """Calculate intersection over union (IoU) between images."""
        intersection = ops.sum(ops.abs(y_true * y_pred), axis=[1, 2, 3])
        union = ops.sum(y_true, [1, 2, 3]) + ops.sum(y_pred, [1, 2, 3])
        union = union - intersection
        return ops.mean((intersection + self.smooth) / (union + self.smooth), axis=0)

    def compute_loss(self, x, y_true, y_pred, sample_weight=None, training=False):
        total = 0.0
        for y_pred_i in y_pred:  # y_pred = refine_model.outputs + predict_model.output
            cross_entropy_loss = self.cross_entropy_loss(y_true, y_pred_i)

            ssim_value = self.ssim_value(y_true, y_pred, max_val=1)
            ssim_loss = ops.mean(1 - ssim_value + self.smooth, axis=0)

            iou_value = self.iou_value(y_true, y_pred)
            iou_loss = 1 - iou_value

            # Add all three losses.
            total += cross_entropy_loss + ssim_loss + iou_loss
        return total

混合损失

BASNet 的另一个重要特征是其混合损失函数,它是二元交叉熵、结构相似性和交并比损失的组合,它引导网络学习三个级别(即像素、补丁和地图级别)的层次表示。

basnet_model = BASNet(
    input_shape=[IMAGE_SIZE, IMAGE_SIZE, 3], out_classes=OUT_CLASSES
)  # Create model.
basnet_model.summary()  # Show model summary.

optimizer = keras.optimizers.Adam(learning_rate=1e-4, epsilon=1e-8)
# Compile model.
basnet_model.compile(
    optimizer=optimizer,
    metrics=[keras.metrics.MeanAbsoluteError(name="mae") for _ in basnet_model.outputs],
)
Model: "bas_net"
┏━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━┓
┃ Layer (type)         Output Shape          Param #  Connected to      ┃
┡━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━┩
│ input_layer         │ (None, 288, 288,  │          0 │ -                 │
│ (InputLayer)        │ 3)                │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ conv2d (Conv2D)     │ (None, 288, 288,  │      1,792 │ input_layer[0][0] │
│                     │ 64)               │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ resnet_block1       │ (None, 288, 288,  │    222,720 │ conv2d[0][0]      │
│ (Functional)        │ 64)               │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ activation          │ (None, 288, 288,  │          0 │ resnet_block1[0]… │
│ (Activation)        │ 64)               │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ resnet_block2       │ (None, 144, 144,  │  1,118,720 │ activation[0][0]  │
│ (Functional)        │ 128)              │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ activation_1        │ (None, 144, 144,  │          0 │ resnet_block2[0]… │
│ (Activation)        │ 128)              │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ resnet_block3       │ (None, 72, 72,    │  6,829,056 │ activation_1[0][ │
│ (Functional)        │ 256)              │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ activation_2        │ (None, 72, 72,    │          0 │ resnet_block3[0]… │
│ (Activation)        │ 256)              │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ resnet_block4       │ (None, 36, 36,    │ 13,121,536 │ activation_2[0][ │
│ (Functional)        │ 512)              │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ activation_3        │ (None, 36, 36,    │          0 │ resnet_block4[0]… │
│ (Activation)        │ 512)              │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ max_pooling2d       │ (None, 18, 18,    │          0 │ activation_3[0][ │
│ (MaxPooling2D)      │ 512)              │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ conv2d_1 (Conv2D)   │ (None, 18, 18,    │  2,359,296 │ max_pooling2d[0]… │
│                     │ 512)              │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ batch_normalization │ (None, 18, 18,    │      2,048 │ conv2d_1[0][0]    │
│ (BatchNormalizatio…512)              │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ activation_4        │ (None, 18, 18,    │          0 │ batch_normalizat… │
│ (Activation)        │ 512)              │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ conv2d_2 (Conv2D)   │ (None, 18, 18,    │  2,359,296 │ activation_4[0][ │
│                     │ 512)              │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ batch_normalizatio… │ (None, 18, 18,    │      2,048 │ conv2d_2[0][0]    │
│ (BatchNormalizatio…512)              │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ add (Add)           │ (None, 18, 18,    │          0 │ batch_normalizat… │
│                     │ 512)              │            │ max_pooling2d[0]… │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ activation_5        │ (None, 18, 18,    │          0 │ add[0][0]         │
│ (Activation)        │ 512)              │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ conv2d_3 (Conv2D)   │ (None, 18, 18,    │  2,359,296 │ activation_5[0][ │
│                     │ 512)              │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ batch_normalizatio… │ (None, 18, 18,    │      2,048 │ conv2d_3[0][0]    │
│ (BatchNormalizatio…512)              │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ activation_6        │ (None, 18, 18,    │          0 │ batch_normalizat… │
│ (Activation)        │ 512)              │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ conv2d_4 (Conv2D)   │ (None, 18, 18,    │  2,359,296 │ activation_6[0][ │
│                     │ 512)              │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ batch_normalizatio… │ (None, 18, 18,    │      2,048 │ conv2d_4[0][0]    │
│ (BatchNormalizatio…512)              │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ add_1 (Add)         │ (None, 18, 18,    │          0 │ batch_normalizat… │
│                     │ 512)              │            │ activation_5[0][ │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ activation_7        │ (None, 18, 18,    │          0 │ add_1[0][0]       │
│ (Activation)        │ 512)              │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ conv2d_5 (Conv2D)   │ (None, 18, 18,    │  2,359,296 │ activation_7[0][ │
│                     │ 512)              │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ batch_normalizatio… │ (None, 18, 18,    │      2,048 │ conv2d_5[0][0]    │
│ (BatchNormalizatio…512)              │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ activation_8        │ (None, 18, 18,    │          0 │ batch_normalizat… │
│ (Activation)        │ 512)              │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ conv2d_6 (Conv2D)   │ (None, 18, 18,    │  2,359,296 │ activation_8[0][ │
│                     │ 512)              │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ batch_normalizatio… │ (None, 18, 18,    │      2,048 │ conv2d_6[0][0]    │
│ (BatchNormalizatio…512)              │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ add_2 (Add)         │ (None, 18, 18,    │          0 │ batch_normalizat… │
│                     │ 512)              │            │ activation_7[0][ │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ activation_9        │ (None, 18, 18,    │          0 │ add_2[0][0]       │
│ (Activation)        │ 512)              │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ max_pooling2d_1     │ (None, 9, 9, 512) │          0 │ activation_9[0][ │
│ (MaxPooling2D)      │                   │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ conv2d_7 (Conv2D)   │ (None, 9, 9, 512) │  2,359,296 │ max_pooling2d_1[ │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ batch_normalizatio… │ (None, 9, 9, 512) │      2,048 │ conv2d_7[0][0]    │
│ (BatchNormalizatio… │                   │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ activation_10       │ (None, 9, 9, 512) │          0 │ batch_normalizat… │
│ (Activation)        │                   │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ conv2d_8 (Conv2D)   │ (None, 9, 9, 512) │  2,359,296 │ activation_10[0]… │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ batch_normalizatio… │ (None, 9, 9, 512) │      2,048 │ conv2d_8[0][0]    │
│ (BatchNormalizatio… │                   │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ add_3 (Add)         │ (None, 9, 9, 512) │          0 │ batch_normalizat… │
│                     │                   │            │ max_pooling2d_1[ │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ activation_11       │ (None, 9, 9, 512) │          0 │ add_3[0][0]       │
│ (Activation)        │                   │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ conv2d_9 (Conv2D)   │ (None, 9, 9, 512) │  2,359,296 │ activation_11[0]… │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ batch_normalizatio… │ (None, 9, 9, 512) │      2,048 │ conv2d_9[0][0]    │
│ (BatchNormalizatio… │                   │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ activation_12       │ (None, 9, 9, 512) │          0 │ batch_normalizat… │
│ (Activation)        │                   │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ conv2d_10 (Conv2D)  │ (None, 9, 9, 512) │  2,359,296 │ activation_12[0]… │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ batch_normalizatio… │ (None, 9, 9, 512) │      2,048 │ conv2d_10[0][0]   │
│ (BatchNormalizatio… │                   │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ add_4 (Add)         │ (None, 9, 9, 512) │          0 │ batch_normalizat… │
│                     │                   │            │ activation_11[0]… │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ activation_13       │ (None, 9, 9, 512) │          0 │ add_4[0][0]       │
│ (Activation)        │                   │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ conv2d_11 (Conv2D)  │ (None, 9, 9, 512) │  2,359,296 │ activation_13[0]… │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ batch_normalizatio… │ (None, 9, 9, 512) │      2,048 │ conv2d_11[0][0]   │
│ (BatchNormalizatio… │                   │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ activation_14       │ (None, 9, 9, 512) │          0 │ batch_normalizat… │
│ (Activation)        │                   │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ conv2d_12 (Conv2D)  │ (None, 9, 9, 512) │  2,359,296 │ activation_14[0]… │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ batch_normalizatio… │ (None, 9, 9, 512) │      2,048 │ conv2d_12[0][0]   │
│ (BatchNormalizatio… │                   │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ add_5 (Add)         │ (None, 9, 9, 512) │          0 │ batch_normalizat… │
│                     │                   │            │ activation_13[0]… │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ activation_15       │ (None, 9, 9, 512) │          0 │ add_5[0][0]       │
│ (Activation)        │                   │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ conv2d_13 (Conv2D)  │ (None, 9, 9, 512) │  2,359,808 │ activation_15[0]… │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ batch_normalizatio… │ (None, 9, 9, 512) │      2,048 │ conv2d_13[0][0]   │
│ (BatchNormalizatio… │                   │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ activation_16       │ (None, 9, 9, 512) │          0 │ batch_normalizat… │
│ (Activation)        │                   │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ conv2d_14 (Conv2D)  │ (None, 9, 9, 512) │  2,359,808 │ activation_16[0]… │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ batch_normalizatio… │ (None, 9, 9, 512) │      2,048 │ conv2d_14[0][0]   │
│ (BatchNormalizatio… │                   │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ activation_17       │ (None, 9, 9, 512) │          0 │ batch_normalizat… │
│ (Activation)        │                   │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ conv2d_15 (Conv2D)  │ (None, 9, 9, 512) │  2,359,808 │ activation_17[0]… │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ batch_normalizatio… │ (None, 9, 9, 512) │      2,048 │ conv2d_15[0][0]   │
│ (BatchNormalizatio… │                   │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ activation_18       │ (None, 9, 9, 512) │          0 │ batch_normalizat… │
│ (Activation)        │                   │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ concatenate         │ (None, 9, 9,      │          0 │ activation_15[0]… │
│ (Concatenate)       │ 1024)             │            │ activation_18[0]… │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ conv2d_16 (Conv2D)  │ (None, 9, 9, 512) │  4,719,104 │ concatenate[0][0] │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ batch_normalizatio… │ (None, 9, 9, 512) │      2,048 │ conv2d_16[0][0]   │
│ (BatchNormalizatio… │                   │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ activation_19       │ (None, 9, 9, 512) │          0 │ batch_normalizat… │
│ (Activation)        │                   │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ conv2d_17 (Conv2D)  │ (None, 9, 9, 512) │  2,359,808 │ activation_19[0]… │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ batch_normalizatio… │ (None, 9, 9, 512) │      2,048 │ conv2d_17[0][0]   │
│ (BatchNormalizatio… │                   │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ activation_20       │ (None, 9, 9, 512) │          0 │ batch_normalizat… │
│ (Activation)        │                   │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ conv2d_18 (Conv2D)  │ (None, 9, 9, 512) │  2,359,808 │ activation_20[0]… │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ batch_normalizatio… │ (None, 9, 9, 512) │      2,048 │ conv2d_18[0][0]   │
│ (BatchNormalizatio… │                   │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ activation_21       │ (None, 9, 9, 512) │          0 │ batch_normalizat… │
│ (Activation)        │                   │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ resizing (Resizing) │ (None, 18, 18,    │          0 │ activation_21[0]… │
│                     │ 512)              │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ concatenate_1       │ (None, 18, 18,    │          0 │ activation_9[0][ │
│ (Concatenate)       │ 1024)             │            │ resizing[0][0]    │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ conv2d_19 (Conv2D)  │ (None, 18, 18,    │  4,719,104 │ concatenate_1[0]… │
│                     │ 512)              │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ batch_normalizatio… │ (None, 18, 18,    │      2,048 │ conv2d_19[0][0]   │
│ (BatchNormalizatio…512)              │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ activation_22       │ (None, 18, 18,    │          0 │ batch_normalizat… │
│ (Activation)        │ 512)              │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ conv2d_20 (Conv2D)  │ (None, 18, 18,    │  2,359,808 │ activation_22[0]… │
│                     │ 512)              │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ batch_normalizatio… │ (None, 18, 18,    │      2,048 │ conv2d_20[0][0]   │
│ (BatchNormalizatio…512)              │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ activation_23       │ (None, 18, 18,    │          0 │ batch_normalizat… │
│ (Activation)        │ 512)              │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ conv2d_21 (Conv2D)  │ (None, 18, 18,    │  2,359,808 │ activation_23[0]… │
│                     │ 512)              │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ batch_normalizatio… │ (None, 18, 18,    │      2,048 │ conv2d_21[0][0]   │
│ (BatchNormalizatio…512)              │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ activation_24       │ (None, 18, 18,    │          0 │ batch_normalizat… │
│ (Activation)        │ 512)              │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ resizing_1          │ (None, 36, 36,    │          0 │ activation_24[0]… │
│ (Resizing)          │ 512)              │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ concatenate_2       │ (None, 36, 36,    │          0 │ resnet_block4[0]… │
│ (Concatenate)       │ 1024)             │            │ resizing_1[0][0]  │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ conv2d_22 (Conv2D)  │ (None, 36, 36,    │  4,719,104 │ concatenate_2[0]… │
│                     │ 512)              │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ batch_normalizatio… │ (None, 36, 36,    │      2,048 │ conv2d_22[0][0]   │
│ (BatchNormalizatio…512)              │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ activation_25       │ (None, 36, 36,    │          0 │ batch_normalizat… │
│ (Activation)        │ 512)              │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ conv2d_23 (Conv2D)  │ (None, 36, 36,    │  2,359,808 │ activation_25[0]… │
│                     │ 512)              │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ batch_normalizatio… │ (None, 36, 36,    │      2,048 │ conv2d_23[0][0]   │
│ (BatchNormalizatio…512)              │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ activation_26       │ (None, 36, 36,    │          0 │ batch_normalizat… │
│ (Activation)        │ 512)              │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ conv2d_24 (Conv2D)  │ (None, 36, 36,    │  2,359,808 │ activation_26[0]… │
│                     │ 512)              │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ batch_normalizatio… │ (None, 36, 36,    │      2,048 │ conv2d_24[0][0]   │
│ (BatchNormalizatio…512)              │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ activation_27       │ (None, 36, 36,    │          0 │ batch_normalizat… │
│ (Activation)        │ 512)              │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ resizing_2          │ (None, 72, 72,    │          0 │ activation_27[0]… │
│ (Resizing)          │ 512)              │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ concatenate_3       │ (None, 72, 72,    │          0 │ resnet_block3[0]… │
│ (Concatenate)       │ 768)              │            │ resizing_2[0][0]  │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ conv2d_25 (Conv2D)  │ (None, 72, 72,    │  3,539,456 │ concatenate_3[0]… │
│                     │ 512)              │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ batch_normalizatio… │ (None, 72, 72,    │      2,048 │ conv2d_25[0][0]   │
│ (BatchNormalizatio…512)              │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ activation_28       │ (None, 72, 72,    │          0 │ batch_normalizat… │
│ (Activation)        │ 512)              │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ conv2d_26 (Conv2D)  │ (None, 72, 72,    │  2,359,808 │ activation_28[0]… │
│                     │ 512)              │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ batch_normalizatio… │ (None, 72, 72,    │      2,048 │ conv2d_26[0][0]   │
│ (BatchNormalizatio…512)              │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ activation_29       │ (None, 72, 72,    │          0 │ batch_normalizat… │
│ (Activation)        │ 512)              │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ conv2d_27 (Conv2D)  │ (None, 72, 72,    │  2,359,808 │ activation_29[0]… │
│                     │ 512)              │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ batch_normalizatio… │ (None, 72, 72,    │      2,048 │ conv2d_27[0][0]   │
│ (BatchNormalizatio…512)              │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ activation_30       │ (None, 72, 72,    │          0 │ batch_normalizat… │
│ (Activation)        │ 512)              │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ resizing_3          │ (None, 144, 144,  │          0 │ activation_30[0]… │
│ (Resizing)          │ 512)              │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ concatenate_4       │ (None, 144, 144,  │          0 │ resnet_block2[0]… │
│ (Concatenate)       │ 640)              │            │ resizing_3[0][0]  │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ conv2d_28 (Conv2D)  │ (None, 144, 144,  │  2,949,632 │ concatenate_4[0]… │
│                     │ 512)              │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ batch_normalizatio… │ (None, 144, 144,  │      2,048 │ conv2d_28[0][0]   │
│ (BatchNormalizatio…512)              │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ activation_31       │ (None, 144, 144,  │          0 │ batch_normalizat… │
│ (Activation)        │ 512)              │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ conv2d_29 (Conv2D)  │ (None, 144, 144,  │  2,359,808 │ activation_31[0]… │
│                     │ 512)              │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ batch_normalizatio… │ (None, 144, 144,  │      2,048 │ conv2d_29[0][0]   │
│ (BatchNormalizatio…512)              │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ activation_32       │ (None, 144, 144,  │          0 │ batch_normalizat… │
│ (Activation)        │ 512)              │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ conv2d_30 (Conv2D)  │ (None, 144, 144,  │  2,359,808 │ activation_32[0]… │
│                     │ 512)              │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ batch_normalizatio… │ (None, 144, 144,  │      2,048 │ conv2d_30[0][0]   │
│ (BatchNormalizatio…512)              │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ activation_33       │ (None, 144, 144,  │          0 │ batch_normalizat… │
│ (Activation)        │ 512)              │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ resizing_4          │ (None, 288, 288,  │          0 │ activation_33[0]… │
│ (Resizing)          │ 512)              │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ concatenate_5       │ (None, 288, 288,  │          0 │ resnet_block1[0]… │
│ (Concatenate)       │ 576)              │            │ resizing_4[0][0]  │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ conv2d_31 (Conv2D)  │ (None, 288, 288,  │  2,654,720 │ concatenate_5[0]… │
│                     │ 512)              │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ batch_normalizatio… │ (None, 288, 288,  │      2,048 │ conv2d_31[0][0]   │
│ (BatchNormalizatio…512)              │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ activation_34       │ (None, 288, 288,  │          0 │ batch_normalizat… │
│ (Activation)        │ 512)              │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ conv2d_32 (Conv2D)  │ (None, 288, 288,  │  2,359,808 │ activation_34[0]… │
│                     │ 512)              │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ batch_normalizatio… │ (None, 288, 288,  │      2,048 │ conv2d_32[0][0]   │
│ (BatchNormalizatio…512)              │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ activation_35       │ (None, 288, 288,  │          0 │ batch_normalizat… │
│ (Activation)        │ 512)              │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ conv2d_33 (Conv2D)  │ (None, 288, 288,  │  2,359,808 │ activation_35[0]… │
│                     │ 512)              │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ batch_normalizatio… │ (None, 288, 288,  │      2,048 │ conv2d_33[0][0]   │
│ (BatchNormalizatio…512)              │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ activation_36       │ (None, 288, 288,  │          0 │ batch_normalizat… │
│ (Activation)        │ 512)              │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ conv2d_34 (Conv2D)  │ (None, 288, 288,  │      4,609 │ activation_36[0]… │
│                     │ 1)                │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ resizing_5          │ (None, 288, 288,  │          0 │ conv2d_34[0][0]   │
│ (Resizing)          │ 1)                │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ conv2d_41 (Conv2D)  │ (None, 288, 288,  │        640 │ resizing_5[0][0]  │
│                     │ 64)               │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ conv2d_42 (Conv2D)  │ (None, 288, 288,  │     36,928 │ conv2d_41[0][0]   │
│                     │ 64)               │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ batch_normalizatio… │ (None, 288, 288,  │        256 │ conv2d_42[0][0]   │
│ (BatchNormalizatio…64)               │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ activation_37       │ (None, 288, 288,  │          0 │ batch_normalizat… │
│ (Activation)        │ 64)               │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ max_pooling2d_2     │ (None, 144, 144,  │          0 │ activation_37[0]… │
│ (MaxPooling2D)      │ 64)               │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ conv2d_43 (Conv2D)  │ (None, 144, 144,  │     36,928 │ max_pooling2d_2[ │
│                     │ 64)               │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ batch_normalizatio… │ (None, 144, 144,  │        256 │ conv2d_43[0][0]   │
│ (BatchNormalizatio…64)               │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ activation_38       │ (None, 144, 144,  │          0 │ batch_normalizat… │
│ (Activation)        │ 64)               │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ max_pooling2d_3     │ (None, 72, 72,    │          0 │ activation_38[0]… │
│ (MaxPooling2D)      │ 64)               │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ conv2d_44 (Conv2D)  │ (None, 72, 72,    │     36,928 │ max_pooling2d_3[ │
│                     │ 64)               │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ batch_normalizatio… │ (None, 72, 72,    │        256 │ conv2d_44[0][0]   │
│ (BatchNormalizatio…64)               │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ activation_39       │ (None, 72, 72,    │          0 │ batch_normalizat… │
│ (Activation)        │ 64)               │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ max_pooling2d_4     │ (None, 36, 36,    │          0 │ activation_39[0]… │
│ (MaxPooling2D)      │ 64)               │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ conv2d_45 (Conv2D)  │ (None, 36, 36,    │     36,928 │ max_pooling2d_4[ │
│                     │ 64)               │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ batch_normalizatio… │ (None, 36, 36,    │        256 │ conv2d_45[0][0]   │
│ (BatchNormalizatio…64)               │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ activation_40       │ (None, 36, 36,    │          0 │ batch_normalizat… │
│ (Activation)        │ 64)               │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ max_pooling2d_5     │ (None, 18, 18,    │          0 │ activation_40[0]… │
│ (MaxPooling2D)      │ 64)               │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ conv2d_46 (Conv2D)  │ (None, 18, 18,    │     36,928 │ max_pooling2d_5[ │
│                     │ 64)               │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ batch_normalizatio… │ (None, 18, 18,    │        256 │ conv2d_46[0][0]   │
│ (BatchNormalizatio…64)               │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ activation_41       │ (None, 18, 18,    │          0 │ batch_normalizat… │
│ (Activation)        │ 64)               │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ resizing_12         │ (None, 36, 36,    │          0 │ activation_41[0]… │
│ (Resizing)          │ 64)               │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ concatenate_6       │ (None, 36, 36,    │          0 │ activation_40[0]… │
│ (Concatenate)       │ 128)              │            │ resizing_12[0][0] │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ conv2d_47 (Conv2D)  │ (None, 36, 36,    │     73,792 │ concatenate_6[0]… │
│                     │ 64)               │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ batch_normalizatio… │ (None, 36, 36,    │        256 │ conv2d_47[0][0]   │
│ (BatchNormalizatio…64)               │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ activation_42       │ (None, 36, 36,    │          0 │ batch_normalizat… │
│ (Activation)        │ 64)               │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ resizing_13         │ (None, 72, 72,    │          0 │ activation_42[0]… │
│ (Resizing)          │ 64)               │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ concatenate_7       │ (None, 72, 72,    │          0 │ activation_39[0]… │
│ (Concatenate)       │ 128)              │            │ resizing_13[0][0] │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ conv2d_48 (Conv2D)  │ (None, 72, 72,    │     73,792 │ concatenate_7[0]… │
│                     │ 64)               │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ batch_normalizatio… │ (None, 72, 72,    │        256 │ conv2d_48[0][0]   │
│ (BatchNormalizatio…64)               │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ activation_43       │ (None, 72, 72,    │          0 │ batch_normalizat… │
│ (Activation)        │ 64)               │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ resizing_14         │ (None, 144, 144,  │          0 │ activation_43[0]… │
│ (Resizing)          │ 64)               │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ concatenate_8       │ (None, 144, 144,  │          0 │ activation_38[0]… │
│ (Concatenate)       │ 128)              │            │ resizing_14[0][0] │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ conv2d_49 (Conv2D)  │ (None, 144, 144,  │     73,792 │ concatenate_8[0]… │
│                     │ 64)               │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ batch_normalizatio… │ (None, 144, 144,  │        256 │ conv2d_49[0][0]   │
│ (BatchNormalizatio…64)               │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ activation_44       │ (None, 144, 144,  │          0 │ batch_normalizat… │
│ (Activation)        │ 64)               │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ resizing_15         │ (None, 288, 288,  │          0 │ activation_44[0]… │
│ (Resizing)          │ 64)               │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ concatenate_9       │ (None, 288, 288,  │          0 │ activation_37[0]… │
│ (Concatenate)       │ 128)              │            │ resizing_15[0][0] │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ conv2d_50 (Conv2D)  │ (None, 288, 288,  │     73,792 │ concatenate_9[0]… │
│                     │ 64)               │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ batch_normalizatio… │ (None, 288, 288,  │        256 │ conv2d_50[0][0]   │
│ (BatchNormalizatio…64)               │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ activation_45       │ (None, 288, 288,  │          0 │ batch_normalizat… │
│ (Activation)        │ 64)               │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ conv2d_51 (Conv2D)  │ (None, 288, 288,  │        577 │ activation_45[0]… │
│                     │ 1)                │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ conv2d_35 (Conv2D)  │ (None, 144, 144,  │      4,609 │ activation_33[0]… │
│                     │ 1)                │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ conv2d_36 (Conv2D)  │ (None, 72, 72, 1) │      4,609 │ activation_30[0]… │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ conv2d_37 (Conv2D)  │ (None, 36, 36, 1) │      4,609 │ activation_27[0]… │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ conv2d_38 (Conv2D)  │ (None, 18, 18, 1) │      4,609 │ activation_24[0]… │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ conv2d_39 (Conv2D)  │ (None, 9, 9, 1)   │      4,609 │ activation_21[0]… │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ conv2d_40 (Conv2D)  │ (None, 9, 9, 1)   │      4,609 │ activation_18[0]… │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ add_6 (Add)         │ (None, 288, 288,  │          0 │ resizing_5[0][0], │
│                     │ 1)                │            │ conv2d_51[0][0]   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ resizing_6          │ (None, 288, 288,  │          0 │ conv2d_35[0][0]   │
│ (Resizing)          │ 1)                │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ resizing_7          │ (None, 288, 288,  │          0 │ conv2d_36[0][0]   │
│ (Resizing)          │ 1)                │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ resizing_8          │ (None, 288, 288,  │          0 │ conv2d_37[0][0]   │
│ (Resizing)          │ 1)                │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ resizing_9          │ (None, 288, 288,  │          0 │ conv2d_38[0][0]   │
│ (Resizing)          │ 1)                │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ resizing_10         │ (None, 288, 288,  │          0 │ conv2d_39[0][0]   │
│ (Resizing)          │ 1)                │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ resizing_11         │ (None, 288, 288,  │          0 │ conv2d_40[0][0]   │
│ (Resizing)          │ 1)                │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ activation_46       │ (None, 288, 288,  │          0 │ add_6[0][0]       │
│ (Activation)        │ 1)                │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ activation_47       │ (None, 288, 288,  │          0 │ resizing_5[0][0]  │
│ (Activation)        │ 1)                │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ activation_48       │ (None, 288, 288,  │          0 │ resizing_6[0][0]  │
│ (Activation)        │ 1)                │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ activation_49       │ (None, 288, 288,  │          0 │ resizing_7[0][0]  │
│ (Activation)        │ 1)                │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ activation_50       │ (None, 288, 288,  │          0 │ resizing_8[0][0]  │
│ (Activation)        │ 1)                │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ activation_51       │ (None, 288, 288,  │          0 │ resizing_9[0][0]  │
│ (Activation)        │ 1)                │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ activation_52       │ (None, 288, 288,  │          0 │ resizing_10[0][0] │
│ (Activation)        │ 1)                │            │                   │
├─────────────────────┼───────────────────┼────────────┼───────────────────┤
│ activation_53       │ (None, 288, 288,  │          0 │ resizing_11[0][0] │
│ (Activation)        │ 1)                │            │                   │
└─────────────────────┴───────────────────┴────────────┴───────────────────┘
 Total params: 108,886,792 (415.37 MB)
 Trainable params: 108,834,952 (415.17 MB)
 Non-trainable params: 51,840 (202.50 KB)

训练模型

basnet_model.fit(train_dataset, validation_data=val_dataset, epochs=1)
 31/31 ━━━━━━━━━━━━━━━━━━━━ 38319s 1245s/step - activation_46_mae: 0.2864 - loss: 17.4035 - val_activation_46_mae: 0.8427 - val_loss: 238.6499

<keras.src.callbacks.history.History at 0x1312ff970>

可视化预测

在论文中,BASNet 在 DUTS-TR 数据集上进行了训练,该数据集包含 10553 张图像。模型以 8 的批量大小和没有验证数据集的情况下训练了 40 万次迭代。训练后,在 DUTS-TE 数据集上评估了模型,并实现了 0.042 的平均绝对误差。

由于 BASNet 是一个深度模型,无法在短时间内训练,而这是 keras 示例笔记本的要求,因此我们将从此处加载预训练权重以显示模型预测。由于计算机算力限制,此模型训练了 12 万次迭代,但它仍然展示了其能力。有关训练参数的更多详细信息,请查看给定的链接。

import gdown

gdown.download(id="1OWKouuAQ7XpXZbWA3mmxDPrFGW71Axrg", output="basnet_weights.h5")


def normalize_output(prediction):
    max_value = np.max(prediction)
    min_value = np.min(prediction)
    return (prediction - min_value) / (max_value - min_value)


# Load weights.
basnet_model.load_weights("./basnet_weights.h5")
Downloading...
From (original): https://drive.google.com/uc?id=1OWKouuAQ7XpXZbWA3mmxDPrFGW71Axrg
From (redirected): https://drive.google.com/uc?id=1OWKouuAQ7XpXZbWA3mmxDPrFGW71Axrg&confirm=t&uuid=57f729b1-764a-4fbb-a569-c6eb5dd414ef
To: /Users/laxmareddyp/Desktop/Keras-IO/keras-io/scripts/tmp_4610020/basnet_weights.h5

Python(47905) MallocStackLogging: can't turn off malloc stack logging because it was not enabled.

0%| | 0.00/436M [00:00<?, ?B/s]

0%|▎ | 1.05M/436M [00:00<00:42, 10.2MB/s]

0%|▌ | 2.10M/436M [00:00<00:42, 10.1MB/s]

1%|▉ | 3.67M/436M [00:00<00:40, 10.7MB/s]

1%|█▎ | 5.24M/436M [00:00<00:37, 11.5MB/s]

2%|█▋ | 6.82M/436M [00:00<00:36, 11.8MB/s]

2%|██ | 8.39M/436M [00:00<00:33, 12.8MB/s]

2%|██▍ | 9.96M/436M [00:00<00:31, 13.5MB/s]

3%|███ | 12.1M/436M [00:00<00:28, 14.9MB/s]

3%|███▋ | 14.7M/436M [00:01<00:24, 17.0MB/s]

4%|████▎ | 17.3M/436M [00:01<00:22, 18.2MB/s]

5%|████▉ | 19.9M/436M [00:01<00:21, 19.6MB/s]

5%|█████▋ | 22.5M/436M [00:01<00:20, 20.3MB/s]

6%|██████▎ | 25.2M/436M [00:01<00:19, 20.7MB/s]

6%|██████▊ | 27.3M/436M [00:01<00:20, 20.3MB/s]

7%|███████▍ | 29.9M/436M [00:01<00:19, 20.7MB/s]

7%|███████▉ | 32.0M/436M [00:01<00:19, 20.5MB/s]

8%|████████▋ | 34.6M/436M [00:01<00:19, 20.7MB/s]

8%|█████████▏ | 36.7M/436M [00:02<00:19, 20.7MB/s]

9%|█████████▋ | 38.8M/436M [00:02<00:19, 20.1MB/s]

9%|██████████▎ | 41.4M/436M [00:02<00:18, 21.4MB/s]

10%|███████████ | 44.0M/436M [00:02<00:18, 21.5MB/s]

11%|███████████▋ | 46.7M/436M [00:02<00:18, 21.0MB/s]

11%|████████████▎ | 49.3M/436M [00:02<00:19, 20.1MB/s]

12%|████████████▉ | 51.9M/436M [00:02<00:18, 21.2MB/s]

13%|█████████████▋ | 54.5M/436M [00:02<00:18, 21.0MB/s]

13%|██████████████▎ | 57.1M/436M [00:03<00:18, 20.8MB/s]

14%|██████████████▊ | 59.2M/436M [00:03<00:18, 20.6MB/s]

14%|███████████████▎ | 61.3M/436M [00:03<00:18, 19.8MB/s]

15%|███████████████▊ | 63.4M/436M [00:03<00:19, 19.5MB/s]

15%|████████████████▍ | 65.5M/436M [00:03<00:18, 19.7MB/s]

16%|█████████████████ | 68.2M/436M [00:03<00:18, 20.2MB/s]

16%|█████████████████▌ | 70.3M/436M [00:03<00:17, 20.4MB/s]

17%|██████████████████ | 72.4M/436M [00:03<00:18, 20.1MB/s]

17%|██████████████████▋ | 75.0M/436M [00:03<00:18, 20.0MB/s]

18%|███████████████████▍ | 77.6M/436M [00:04<00:17, 20.1MB/s]

18%|████████████████████ | 80.2M/436M [00:04<00:16, 21.1MB/s]

19%|████████████████████▋ | 82.8M/436M [00:04<00:16, 21.1MB/s]

20%|█████████████████████▎ | 85.5M/436M [00:04<00:16, 21.4MB/s]

20%|██████████████████████ | 88.1M/436M [00:04<00:16, 21.0MB/s]

21%|██████████████████████▋ | 90.7M/436M [00:04<00:16, 21.1MB/s]

21%|███████████████████████▎ | 93.3M/436M [00:04<00:16, 21.4MB/s]

22%|███████████████████████▉ | 95.9M/436M [00:04<00:15, 21.5MB/s]

23%|████████████████████████▋ | 98.6M/436M [00:05<00:15, 21.6MB/s]

23%|█████████████████████████▌ | 101M/436M [00:05<00:16, 20.1MB/s]

24%|██████████████████████████ | 103M/436M [00:05<00:16, 19.8MB/s]

24%|██████████████████████████▋ | 106M/436M [00:05<00:16, 20.2MB/s]

25%|███████████████████████████▏ | 108M/436M [00:05<00:22, 14.3MB/s]

25%|███████████████████████████▊ | 110M/436M [00:05<00:21, 15.3MB/s]

26%|████████████████████████████▎ | 112M/436M [00:05<00:19, 16.2MB/s]

26%|████████████████████████████▉ | 115M/436M [00:06<00:17, 18.2MB/s]

27%|█████████████████████████████▌ | 117M/436M [00:06<00:16, 19.2MB/s]

28%|██████████████████████████████▎ | 120M/436M [00:06<00:15, 20.0MB/s]

28%|██████████████████████████████▉ | 123M/436M [00:06<00:15, 20.5MB/s]

29%|███████████████████████████████▌ | 125M/436M [00:06<00:15, 20.7MB/s]

29%|████████████████████████████████▎ | 128M/436M [00:06<00:14, 21.1MB/s]

30%|████████████████████████████████▉ | 131M/436M [00:06<00:14, 20.7MB/s]

31%|█████████████████████████████████▌ | 133M/436M [00:06<00:14, 21.1MB/s]

31%|██████████████████████████████████▎ | 136M/436M [00:07<00:14, 21.2MB/s]

32%|██████████████████████████████████▉ | 138M/436M [00:07<00:13, 21.4MB/s]

32%|███████████████████████████████████▌ | 141M/436M [00:07<00:13, 21.5MB/s]

33%|████████████████████████████████████▏ | 144M/436M [00:07<00:13, 21.6MB/s]

34%|████████████████████████████████████▉ | 146M/436M [00:07<00:13, 21.6MB/s]

34%|█████████████████████████████████████▌ | 149M/436M [00:07<00:13, 21.7MB/s]

35%|██████████████████████████████████████▏ | 152M/436M [00:07<00:13, 21.2MB/s]

35%|██████████████████████████████████████▉ | 154M/436M [00:07<00:13, 20.8MB/s]

36%|███████████████████████████████████████▌ | 157M/436M [00:08<00:13, 20.9MB/s]

36%|████████████████████████████████████████ | 159M/436M [00:08<00:14, 19.0MB/s]

37%|████████████████████████████████████████▌ | 161M/436M [00:08<00:14, 19.5MB/s]

37%|█████████████████████████████████████████▏ | 163M/436M [00:08<00:14, 19.5MB/s]

38%|█████████████████████████████████████████▋ | 165M/436M [00:08<00:13, 19.6MB/s]

38%|██████████████████████████████████████████▏ | 167M/436M [00:08<00:13, 19.6MB/s]

39%|██████████████████████████████████████████▊ | 170M/436M [00:08<00:13, 20.2MB/s]

39%|███████████████████████████████████████████▍ | 172M/436M [00:08<00:13, 19.2MB/s]

40%|███████████████████████████████████████████▉ | 174M/436M [00:08<00:13, 19.3MB/s]

40%|████████████████████████████████████████████▍ | 176M/436M [00:09<00:13, 19.4MB/s]

41%|████████████████████████████████████████████▉ | 178M/436M [00:09<00:13, 19.6MB/s]

41%|█████████████████████████████████████████████▍ | 180M/436M [00:09<00:13, 19.2MB/s]

42%|██████████████████████████████████████████████ | 182M/436M [00:09<00:13, 19.1MB/s]

42%|██████████████████████████████████████████████▋ | 185M/436M [00:09<00:13, 18.7MB/s]

43%|███████████████████████████████████████████████▏ | 187M/436M [00:09<00:12, 19.2MB/s]

43%|███████████████████████████████████████████████▋ | 189M/436M [00:09<00:12, 19.0MB/s]

44%|████████████████████████████████████████████████▎ | 191M/436M [00:09<00:12, 18.9MB/s]

44%|████████████████████████████████████████████████▊ | 193M/436M [00:09<00:13, 18.6MB/s]

45%|█████████████████████████████████████████████████▎ | 196M/436M [00:10<00:12, 18.6MB/s]

45%|█████████████████████████████████████████████████▊ | 198M/436M [00:10<00:12, 18.4MB/s]

46%|██████████████████████████████████████████████████▌ | 200M/436M [00:10<00:12, 19.5MB/s]

46%|███████████████████████████████████████████████████ | 202M/436M [00:10<00:11, 19.8MB/s]

47%|███████████████████████████████████████████████████▋ | 205M/436M [00:10<00:11, 20.4MB/s]

48%|████████████████████████████████████████████████████▎ | 208M/436M [00:10<00:10, 20.8MB/s]

48%|████████████████████████████████████████████████████▉ | 210M/436M [00:10<00:11, 19.2MB/s]

49%|█████████████████████████████████████████████████████▋ | 213M/436M [00:10<00:10, 21.9MB/s]

49%|██████████████████████████████████████████████████████▎ | 215M/436M [00:11<00:10, 21.8MB/s]

50%|███████████████████████████████████████████████████████ | 218M/436M [00:11<00:10, 21.8MB/s]

51%|███████████████████████████████████████████████████████▋ | 221M/436M [00:11<00:10, 21.4MB/s]

51%|████████████████████████████████████████████████████████▎ | 223M/436M [00:11<00:10, 20.7MB/s]

52%|████████████████████████████████████████████████████████▉ | 226M/436M [00:11<00:10, 20.9MB/s]

52%|█████████████████████████████████████████████████████████▋ | 229M/436M [00:11<00:09, 21.2MB/s]

53%|██████████████████████████████████████████████████████████▎ | 231M/436M [00:11<00:09, 21.0MB/s]

54%|██████████████████████████████████████████████████████████▉ | 234M/436M [00:11<00:09, 20.6MB/s]

54%|███████████████████████████████████████████████████████████▌ | 236M/436M [00:12<00:09, 20.1MB/s]

55%|████████████████████████████████████████████████████████████ | 238M/436M [00:12<00:09, 19.8MB/s]

55%|████████████████████████████████████████████████████████████▌ | 240M/436M [00:12<00:10, 19.6MB/s]

56%|█████████████████████████████████████████████████████████████ | 242M/436M [00:12<00:09, 19.4MB/s]

56%|█████████████████████████████████████████████████████████████▋ | 244M/436M [00:12<00:09, 19.2MB/s]

57%|██████████████████████████████████████████████████████████████▏ | 246M/436M [00:12<00:09, 19.4MB/s]

57%|██████████████████████████████████████████████████████████████▋ | 249M/436M [00:12<00:09, 19.5MB/s]

57%|███████████████████████████████████████████████████████████████▏ | 251M/436M [00:12<00:09, 19.4MB/s]

58%|███████████████████████████████████████████████████████████████▋ | 253M/436M [00:12<00:09, 18.5MB/s]

58%|████████████████████████████████████████████████████████████████▎ | 255M/436M [00:13<00:10, 18.1MB/s]

59%|████████████████████████████████████████████████████████████████▊ | 257M/436M [00:13<00:09, 18.4MB/s]

60%|█████████████████████████████████████████████████████████████████▍ | 260M/436M [00:13<00:09, 19.4MB/s]

60%|██████████████████████████████████████████████████████████████████ | 262M/436M [00:13<00:08, 20.1MB/s]

61%|██████████████████████████████████████████████████████████████████▊ | 265M/436M [00:13<00:08, 20.6MB/s]

61%|███████████████████████████████████████████████████████████████████▍ | 267M/436M [00:13<00:08, 20.5MB/s]

62%|████████████████████████████████████████████████████████████████████ | 270M/436M [00:13<00:07, 20.9MB/s]

63%|████████████████████████████████████████████████████████████████████▊ | 273M/436M [00:13<00:07, 21.1MB/s]

63%|█████████████████████████████████████████████████████████████████████▍ | 275M/436M [00:13<00:07, 21.4MB/s]

64%|██████████████████████████████████████████████████████████████████████ | 278M/436M [00:14<00:07, 20.6MB/s]

64%|██████████████████████████████████████████████████████████████████████▌ | 280M/436M [00:14<00:07, 20.4MB/s]

65%|███████████████████████████████████████████████████████████████████████▏ | 282M/436M [00:14<00:08, 18.9MB/s]

65%|███████████████████████████████████████████████████████████████████████▋ | 284M/436M [00:14<00:08, 18.7MB/s]

66%|████████████████████████████████████████████████████████████████████████▏ | 286M/436M [00:14<00:07, 18.7MB/s]

66%|████████████████████████████████████████████████████████████████████████▋ | 288M/436M [00:14<00:08, 18.0MB/s]

67%|█████████████████████████████████████████████████████████████████████████▍ | 291M/436M [00:14<00:07, 18.8MB/s]

67%|█████████████████████████████████████████████████████████████████████████▉ | 293M/436M [00:14<00:07, 18.6MB/s]

68%|██████████████████████████████████████████████████████████████████████████▍ | 295M/436M [00:15<00:07, 19.2MB/s]

68%|██████████████████████████████████████████████████████████████████████████▉ | 297M/436M [00:15<00:07, 19.0MB/s]

69%|███████████████████████████████████████████████████████████████████████████▌ | 299M/436M [00:15<00:07, 18.7MB/s]

69%|████████████████████████████████████████████████████████████████████████████ | 301M/436M [00:15<00:09, 14.1MB/s]

70%|████████████████████████████████████████████████████████████████████████████▋ | 304M/436M [00:15<00:08, 16.0MB/s]

70%|█████████████████████████████████████████████████████████████████████████████▎ | 307M/436M [00:15<00:07, 17.5MB/s]

71%|██████████████████████████████████████████████████████████████████████████████ | 309M/436M [00:15<00:06, 18.7MB/s]

72%|██████████████████████████████████████████████████████████████████████████████▋ | 312M/436M [00:16<00:06, 19.6MB/s]

72%|███████████████████████████████████████████████████████████████████████████████▎ | 315M/436M [00:16<00:06, 20.2MB/s]

73%|████████████████████████████████████████████████████████████████████████████████ | 317M/436M [00:16<00:05, 20.3MB/s]

73%|████████████████████████████████████████████████████████████████████████████████▌ | 319M/436M [00:16<00:05, 19.9MB/s]

74%|█████████████████████████████████████████████████████████████████████████████████ | 321M/436M [00:16<00:05, 19.7MB/s]

74%|█████████████████████████████████████████████████████████████████████████████████▌ | 323M/436M [00:16<00:05, 19.5MB/s]

75%|██████████████████████████████████████████████████████████████████████████████████ | 326M/436M [00:16<00:05, 19.1MB/s]

75%|██████████████████████████████████████████████████████████████████████████████████▋ | 328M/436M [00:16<00:05, 19.1MB/s]

76%|███████████████████████████████████████████████████████████████████████████████████▏ | 330M/436M [00:16<00:05, 19.0MB/s]

76%|███████████████████████████████████████████████████████████████████████████████████▊ | 332M/436M [00:17<00:05, 19.8MB/s]

77%|████████████████████████████████████████████████████████████████████████████████████▌ | 335M/436M [00:17<00:04, 20.5MB/s]

77%|█████████████████████████████████████████████████████████████████████████████████████ | 337M/436M [00:17<00:04, 20.1MB/s]

78%|█████████████████████████████████████████████████████████████████████████████████████▋ | 340M/436M [00:17<00:04, 20.5MB/s]

79%|██████████████████████████████████████████████████████████████████████████████████████▎ | 342M/436M [00:17<00:04, 20.8MB/s]

79%|███████████████████████████████████████████████████████████████████████████████████████ | 345M/436M [00:17<00:04, 21.2MB/s]

80%|███████████████████████████████████████████████████████████████████████████████████████▋ | 348M/436M [00:17<00:04, 21.4MB/s]

80%|████████████████████████████████████████████████████████████████████████████████████████▎ | 350M/436M [00:17<00:04, 21.3MB/s]

81%|█████████████████████████████████████████████████████████████████████████████████████████ | 353M/436M [00:17<00:03, 21.6MB/s]

82%|█████████████████████████████████████████████████████████████████████████████████████████▋ | 355M/436M [00:18<00:03, 21.2MB/s]

82%|██████████████████████████████████████████████████████████████████████████████████████████▎ | 358M/436M [00:18<00:03, 21.9MB/s]

83%|██████████████████████████████████████████████████████████████████████████████████████████▉ | 361M/436M [00:18<00:03, 21.8MB/s]

83%|███████████████████████████████████████████████████████████████████████████████████████████▋ | 363M/436M [00:18<00:03, 21.6MB/s]

84%|████████████████████████████████████████████████████████████████████████████████████████████▎ | 366M/436M [00:18<00:03, 21.0MB/s]

85%|████████████████████████████████████████████████████████████████████████████████████████████▉ | 369M/436M [00:18<00:03, 19.9MB/s]

85%|█████████████████████████████████████████████████████████████████████████████████████████████▍ | 371M/436M [00:18<00:03, 19.4MB/s]

85%|██████████████████████████████████████████████████████████████████████████████████████████████ | 373M/436M [00:18<00:03, 18.8MB/s]

86%|██████████████████████████████████████████████████████████████████████████████████████████████▌ | 375M/436M [00:19<00:03, 18.9MB/s]

86%|███████████████████████████████████████████████████████████████████████████████████████████████ | 377M/436M [00:19<00:03, 18.6MB/s]

87%|███████████████████████████████████████████████████████████████████████████████████████████████▌ | 379M/436M [00:19<00:03, 18.3MB/s]

87%|████████████████████████████████████████████████████████████████████████████████████████████████▏ | 381M/436M [00:19<00:02, 18.6MB/s]

88%|████████████████████████████████████████████████████████████████████████████████████████████████▋ | 383M/436M [00:19<00:02, 18.8MB/s]

88%|█████████████████████████████████████████████████████████████████████████████████████████████████▏ | 385M/436M [00:19<00:02, 18.9MB/s]

89%|█████████████████████████████████████████████████████████████████████████████████████████████████▋ | 387M/436M [00:19<00:02, 19.1MB/s]

89%|██████████████████████████████████████████████████████████████████████████████████████████████████▍ | 390M/436M [00:19<00:02, 19.8MB/s]

90%|███████████████████████████████████████████████████████████████████████████████████████████████████ | 393M/436M [00:20<00:02, 20.5MB/s]

91%|███████████████████████████████████████████████████████████████████████████████████████████████████▋ | 395M/436M [00:20<00:01, 20.9MB/s]

91%|████████████████████████████████████████████████████████████████████████████████████████████████████▏ | 397M/436M [00:20<00:01, 20.2MB/s]

92%|████████████████████████████████████████████████████████████████████████████████████████████████████▉ | 400M/436M [00:20<00:01, 20.7MB/s]

92%|█████████████████████████████████████████████████████████████████████████████████████████████████████▍ | 402M/436M [00:20<00:01, 19.9MB/s]

93%|█████████████████████████████████████████████████████████████████████████████████████████████████████▉ | 404M/436M [00:20<00:02, 15.0MB/s]

93%|██████████████████████████████████████████████████████████████████████████████████████████████████████▍ | 406M/436M [00:20<00:01, 15.7MB/s]

94%|███████████████████████████████████████████████████████████████████████████████████████████████████████▏ | 409M/436M [00:20<00:01, 17.3MB/s]

94%|███████████████████████████████████████████████████████████████████████████████████████████████████████▊ | 412M/436M [00:21<00:01, 18.3MB/s]

95%|████████████████████████████████████████████████████████████████████████████████████████████████████████▍ | 414M/436M [00:21<00:01, 18.6MB/s]

96%|█████████████████████████████████████████████████████████████████████████████████████████████████████████▏ | 417M/436M [00:21<00:00, 19.7MB/s]

96%|█████████████████████████████████████████████████████████████████████████████████████████████████████████▊ | 419M/436M [00:21<00:00, 20.3MB/s]

97%|██████████████████████████████████████████████████████████████████████████████████████████████████████████▍ | 422M/436M [00:21<00:00, 20.7MB/s]

97%|███████████████████████████████████████████████████████████████████████████████████████████████████████████ | 425M/436M [00:21<00:00, 21.0MB/s]

98%|███████████████████████████████████████████████████████████████████████████████████████████████████████████▊ | 427M/436M [00:21<00:00, 21.3MB/s]

99%|████████████████████████████████████████████████████████████████████████████████████████████████████████████▍ | 430M/436M [00:21<00:00, 20.5MB/s]

99%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████ | 433M/436M [00:22<00:00, 20.8MB/s]

100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████▊| 435M/436M [00:22<00:00, 21.1MB/s]

100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████| 436M/436M [00:22<00:00, 19.6MB/s]

进行预测

for (image, mask), _ in zip(val_dataset, range(1)):
    pred_mask = basnet_model.predict(image)
    display([image[0], mask[0], normalize_output(pred_mask[0][0])])

1/1 ━━━━━━━━━━━━━━━━━━━━ 0 秒 32 秒/步



1/1 ━━━━━━━━━━━━━━━━━━━━ 32 秒 32 秒/步

png