政安晨:【Keras机器学习示例演绎】(一)—— 利用类 U-Net 架构进行图像分割

本文主要是介绍政安晨:【Keras机器学习示例演绎】(一)—— 利用类 U-Net 架构进行图像分割,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

下载数据

准备输入图像的路径和目标分割掩码

一幅输入图像和相应的分割掩码是什么样子的?

准备数据集,以加载和矢量化成批数据

准备 U-Net Xception 风格模型

预留验证分割

训练模型

可视化预测


政安晨的个人主页政安晨

欢迎 👍点赞✍评论⭐收藏

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

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

本文目标:在宠物数据集上从头开始训练的图像分割模型。

下载数据

!!wget https://www.robots.ox.ac.uk/~vgg/data/pets/data/images.tar.gz
!!wget https://www.robots.ox.ac.uk/~vgg/data/pets/data/annotations.tar.gz
!
!curl -O https://thor.robots.ox.ac.uk/datasets/pets/images.tar.gz
!curl -O https://thor.robots.ox.ac.uk/datasets/pets/annotations.tar.gz
!
!tar -xf images.tar.gz
!tar -xf annotations.tar.gz

演绎展示:

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  CurrentDload  Upload   Total   Spent    Left  Speed
100  755M  100  755M    0     0  21.3M      0  0:00:35  0:00:35 --:--:-- 22.2M% Total    % Received % Xferd  Average Speed   Time    Time     Time  CurrentDload  Upload   Total   Spent    Left  Speed
100 18.2M  100 18.2M    0     0  7977k      0  0:00:02  0:00:02 --:--:-- 7974k

准备输入图像的路径和目标分割掩码

import osinput_dir = "images/"
target_dir = "annotations/trimaps/"
img_size = (160, 160)
num_classes = 3
batch_size = 32input_img_paths = sorted([os.path.join(input_dir, fname)for fname in os.listdir(input_dir)if fname.endswith(".jpg")]
)
target_img_paths = sorted([os.path.join(target_dir, fname)for fname in os.listdir(target_dir)if fname.endswith(".png") and not fname.startswith(".")]
)print("Number of samples:", len(input_img_paths))for input_path, target_path in zip(input_img_paths[:10], target_img_paths[:10]):print(input_path, "|", target_path)

演绎展示:

Number of samples: 7390
images/Abyssinian_1.jpg | annotations/trimaps/Abyssinian_1.png
images/Abyssinian_10.jpg | annotations/trimaps/Abyssinian_10.png
images/Abyssinian_100.jpg | annotations/trimaps/Abyssinian_100.png
images/Abyssinian_101.jpg | annotations/trimaps/Abyssinian_101.png
images/Abyssinian_102.jpg | annotations/trimaps/Abyssinian_102.png
images/Abyssinian_103.jpg | annotations/trimaps/Abyssinian_103.png
images/Abyssinian_104.jpg | annotations/trimaps/Abyssinian_104.png
images/Abyssinian_105.jpg | annotations/trimaps/Abyssinian_105.png
images/Abyssinian_106.jpg | annotations/trimaps/Abyssinian_106.png
images/Abyssinian_107.jpg | annotations/trimaps/Abyssinian_107.png

一幅输入图像和相应的分割掩码是什么样子的?

from IPython.display import Image, display
from keras.utils import load_img
from PIL import ImageOps# Display input image #7
display(Image(filename=input_img_paths[9]))# Display auto-contrast version of corresponding target (per-pixel categories)
img = ImageOps.autocontrast(load_img(target_img_paths[9]))
display(img)

准备数据集,以加载和矢量化成批数据

import keras
import numpy as np
from tensorflow import data as tf_data
from tensorflow import image as tf_image
from tensorflow import io as tf_iodef get_dataset(batch_size,img_size,input_img_paths,target_img_paths,max_dataset_len=None,
):"""Returns a TF Dataset."""def load_img_masks(input_img_path, target_img_path):input_img = tf_io.read_file(input_img_path)input_img = tf_io.decode_png(input_img, channels=3)input_img = tf_image.resize(input_img, img_size)input_img = tf_image.convert_image_dtype(input_img, "float32")target_img = tf_io.read_file(target_img_path)target_img = tf_io.decode_png(target_img, channels=1)target_img = tf_image.resize(target_img, img_size, method="nearest")target_img = tf_image.convert_image_dtype(target_img, "uint8")# Ground truth labels are 1, 2, 3. Subtract one to make them 0, 1, 2:target_img -= 1return input_img, target_img# For faster debugging, limit the size of dataif max_dataset_len:input_img_paths = input_img_paths[:max_dataset_len]target_img_paths = target_img_paths[:max_dataset_len]dataset = tf_data.Dataset.from_tensor_slices((input_img_paths, target_img_paths))dataset = dataset.map(load_img_masks, num_parallel_calls=tf_data.AUTOTUNE)return dataset.batch(batch_size)

准备 U-Net Xception 风格模型

from keras import layersdef get_model(img_size, num_classes):inputs = keras.Input(shape=img_size + (3,))### [First half of the network: downsampling inputs] #### Entry blockx = layers.Conv2D(32, 3, strides=2, padding="same")(inputs)x = layers.BatchNormalization()(x)x = layers.Activation("relu")(x)previous_block_activation = x  # Set aside residual# Blocks 1, 2, 3 are identical apart from the feature depth.for filters in [64, 128, 256]:x = layers.Activation("relu")(x)x = layers.SeparableConv2D(filters, 3, padding="same")(x)x = layers.BatchNormalization()(x)x = layers.Activation("relu")(x)x = layers.SeparableConv2D(filters, 3, padding="same")(x)x = layers.BatchNormalization()(x)x = layers.MaxPooling2D(3, strides=2, padding="same")(x)# Project residualresidual = layers.Conv2D(filters, 1, strides=2, padding="same")(previous_block_activation)x = layers.add([x, residual])  # Add back residualprevious_block_activation = x  # Set aside next residual### [Second half of the network: upsampling inputs] ###for filters in [256, 128, 64, 32]:x = layers.Activation("relu")(x)x = layers.Conv2DTranspose(filters, 3, padding="same")(x)x = layers.BatchNormalization()(x)x = layers.Activation("relu")(x)x = layers.Conv2DTranspose(filters, 3, padding="same")(x)x = layers.BatchNormalization()(x)x = layers.UpSampling2D(2)(x)# Project residualresidual = layers.UpSampling2D(2)(previous_block_activation)residual = layers.Conv2D(filters, 1, padding="same")(residual)x = layers.add([x, residual])  # Add back residualprevious_block_activation = x  # Set aside next residual# Add a per-pixel classification layeroutputs = layers.Conv2D(num_classes, 3, activation="softmax", padding="same")(x)# Define the modelmodel = keras.Model(inputs, outputs)return model# Build model
model = get_model(img_size, num_classes)
model.summary()

演绎展示:

Model: "functional_1"
┏━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━┓
┃ Layer (type)        ┃ Output Shape      ┃ Param # ┃ Connected to         ┃
┡━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━┩
│ input_layer         │ (None, 160, 160,  │       0 │ -                    │
│ (InputLayer)        │ 3)                │         │                      │
├─────────────────────┼───────────────────┼─────────┼──────────────────────┤
│ conv2d (Conv2D)     │ (None, 80, 80,    │     896 │ input_layer[0][0]    │
│                     │ 32)               │         │                      │
├─────────────────────┼───────────────────┼─────────┼──────────────────────┤
│ batch_normalization │ (None, 80, 80,    │     128 │ conv2d[0][0]         │
│ (BatchNormalizatio… │ 32)               │         │                      │
├─────────────────────┼───────────────────┼─────────┼──────────────────────┤
│ activation          │ (None, 80, 80,    │       0 │ batch_normalization… │
│ (Activation)        │ 32)               │         │                      │
├─────────────────────┼───────────────────┼─────────┼──────────────────────┤
│ activation_1        │ (None, 80, 80,    │       0 │ activation[0][0]     │
│ (Activation)        │ 32)               │         │                      │
├─────────────────────┼───────────────────┼─────────┼──────────────────────┤
│ separable_conv2d    │ (None, 80, 80,    │   2,400 │ activation_1[0][0]   │
│ (SeparableConv2D)   │ 64)               │         │                      │
├─────────────────────┼───────────────────┼─────────┼──────────────────────┤
│ batch_normalizatio… │ (None, 80, 80,    │     256 │ separable_conv2d[0]… │
│ (BatchNormalizatio… │ 64)               │         │                      │
├─────────────────────┼───────────────────┼─────────┼──────────────────────┤
│ activation_2        │ (None, 80, 80,    │       0 │ batch_normalization… │
│ (Activation)        │ 64)               │         │                      │
├─────────────────────┼───────────────────┼─────────┼──────────────────────┤
│ separable_conv2d_1  │ (None, 80, 80,    │   4,736 │ activation_2[0][0]   │
│ (SeparableConv2D)   │ 64)               │         │                      │
├─────────────────────┼───────────────────┼─────────┼──────────────────────┤
│ batch_normalizatio… │ (None, 80, 80,    │     256 │ separable_conv2d_1[… │
│ (BatchNormalizatio… │ 64)               │         │                      │
├─────────────────────┼───────────────────┼─────────┼──────────────────────┤
│ max_pooling2d       │ (None, 40, 40,    │       0 │ batch_normalization… │
│ (MaxPooling2D)      │ 64)               │         │                      │
├─────────────────────┼───────────────────┼─────────┼──────────────────────┤
│ conv2d_1 (Conv2D)   │ (None, 40, 40,    │   2,112 │ activation[0][0]     │
│                     │ 64)               │         │                      │
├─────────────────────┼───────────────────┼─────────┼──────────────────────┤
│ add (Add)           │ (None, 40, 40,    │       0 │ max_pooling2d[0][0], │
│                     │ 64)               │         │ conv2d_1[0][0]       │
├─────────────────────┼───────────────────┼─────────┼──────────────────────┤
│ activation_3        │ (None, 40, 40,    │       0 │ add[0][0]            │
│ (Activation)        │ 64)               │         │                      │
├─────────────────────┼───────────────────┼─────────┼──────────────────────┤
│ separable_conv2d_2  │ (None, 40, 40,    │   8,896 │ activation_3[0][0]   │
│ (SeparableConv2D)   │ 128)              │         │                      │
├─────────────────────┼───────────────────┼─────────┼──────────────────────┤
│ batch_normalizatio… │ (None, 40, 40,    │     512 │ separable_conv2d_2[… │
│ (BatchNormalizatio… │ 128)              │         │                      │
├─────────────────────┼───────────────────┼─────────┼──────────────────────┤
│ activation_4        │ (None, 40, 40,    │       0 │ batch_normalization… │
│ (Activation)        │ 128)              │         │                      │
├─────────────────────┼───────────────────┼─────────┼──────────────────────┤
│ separable_conv2d_3  │ (None, 40, 40,    │  17,664 │ activation_4[0][0]   │
│ (SeparableConv2D)   │ 128)              │         │                      │
├─────────────────────┼───────────────────┼─────────┼──────────────────────┤
│ batch_normalizatio… │ (None, 40, 40,    │     512 │ separable_conv2d_3[… │
│ (BatchNormalizatio… │ 128)              │         │                      │
├─────────────────────┼───────────────────┼─────────┼──────────────────────┤
│ max_pooling2d_1     │ (None, 20, 20,    │       0 │ batch_normalization… │
│ (MaxPooling2D)      │ 128)              │         │                      │
├─────────────────────┼───────────────────┼─────────┼──────────────────────┤
│ conv2d_2 (Conv2D)   │ (None, 20, 20,    │   8,320 │ add[0][0]            │
│                     │ 128)              │         │                      │
├─────────────────────┼───────────────────┼─────────┼──────────────────────┤
│ add_1 (Add)         │ (None, 20, 20,    │       0 │ max_pooling2d_1[0][… │
│                     │ 128)              │         │ conv2d_2[0][0]       │
├─────────────────────┼───────────────────┼─────────┼──────────────────────┤
│ activation_5        │ (None, 20, 20,    │       0 │ add_1[0][0]          │
│ (Activation)        │ 128)              │         │                      │
├─────────────────────┼───────────────────┼─────────┼──────────────────────┤
│ separable_conv2d_4  │ (None, 20, 20,    │  34,176 │ activation_5[0][0]   │
│ (SeparableConv2D)   │ 256)              │         │                      │
├─────────────────────┼───────────────────┼─────────┼──────────────────────┤
│ batch_normalizatio… │ (None, 20, 20,    │   1,024 │ separable_conv2d_4[… │
│ (BatchNormalizatio… │ 256)              │         │                      │
├─────────────────────┼───────────────────┼─────────┼──────────────────────┤
│ activation_6        │ (None, 20, 20,    │       0 │ batch_normalization… │
│ (Activation)        │ 256)              │         │                      │
├─────────────────────┼───────────────────┼─────────┼──────────────────────┤
│ separable_conv2d_5  │ (None, 20, 20,    │  68,096 │ activation_6[0][0]   │
│ (SeparableConv2D)   │ 256)              │         │                      │
├─────────────────────┼───────────────────┼─────────┼──────────────────────┤
│ batch_normalizatio… │ (None, 20, 20,    │   1,024 │ separable_conv2d_5[… │
│ (BatchNormalizatio… │ 256)              │         │                      │
├─────────────────────┼───────────────────┼─────────┼──────────────────────┤
│ max_pooling2d_2     │ (None, 10, 10,    │       0 │ batch_normalization… │
│ (MaxPooling2D)      │ 256)              │         │                      │
├─────────────────────┼───────────────────┼─────────┼──────────────────────┤
│ conv2d_3 (Conv2D)   │ (None, 10, 10,    │  33,024 │ add_1[0][0]          │
│                     │ 256)              │         │                      │
├─────────────────────┼───────────────────┼─────────┼──────────────────────┤
│ add_2 (Add)         │ (None, 10, 10,    │       0 │ max_pooling2d_2[0][… │
│                     │ 256)              │         │ conv2d_3[0][0]       │
├─────────────────────┼───────────────────┼─────────┼──────────────────────┤
│ activation_7        │ (None, 10, 10,    │       0 │ add_2[0][0]          │
│ (Activation)        │ 256)              │         │                      │
├─────────────────────┼───────────────────┼─────────┼──────────────────────┤
│ conv2d_transpose    │ (None, 10, 10,    │ 590,080 │ activation_7[0][0]   │
│ (Conv2DTranspose)   │ 256)              │         │                      │
├─────────────────────┼───────────────────┼─────────┼──────────────────────┤
│ batch_normalizatio… │ (None, 10, 10,    │   1,024 │ conv2d_transpose[0]… │
│ (BatchNormalizatio… │ 256)              │         │                      │
├─────────────────────┼───────────────────┼─────────┼──────────────────────┤
│ activation_8        │ (None, 10, 10,    │       0 │ batch_normalization… │
│ (Activation)        │ 256)              │         │                      │
├─────────────────────┼───────────────────┼─────────┼──────────────────────┤
│ conv2d_transpose_1  │ (None, 10, 10,    │ 590,080 │ activation_8[0][0]   │
│ (Conv2DTranspose)   │ 256)              │         │                      │
├─────────────────────┼───────────────────┼─────────┼──────────────────────┤
│ batch_normalizatio… │ (None, 10, 10,    │   1,024 │ conv2d_transpose_1[… │
│ (BatchNormalizatio… │ 256)              │         │                      │
├─────────────────────┼───────────────────┼─────────┼──────────────────────┤
│ up_sampling2d_1     │ (None, 20, 20,    │       0 │ add_2[0][0]          │
│ (UpSampling2D)      │ 256)              │         │                      │
├─────────────────────┼───────────────────┼─────────┼──────────────────────┤
│ up_sampling2d       │ (None, 20, 20,    │       0 │ batch_normalization… │
│ (UpSampling2D)      │ 256)              │         │                      │
├─────────────────────┼───────────────────┼─────────┼──────────────────────┤
│ conv2d_4 (Conv2D)   │ (None, 20, 20,    │  65,792 │ up_sampling2d_1[0][… │
│                     │ 256)              │         │                      │
├─────────────────────┼───────────────────┼─────────┼──────────────────────┤
│ add_3 (Add)         │ (None, 20, 20,    │       0 │ up_sampling2d[0][0], │
│                     │ 256)              │         │ conv2d_4[0][0]       │
├─────────────────────┼───────────────────┼─────────┼──────────────────────┤
│ activation_9        │ (None, 20, 20,    │       0 │ add_3[0][0]          │
│ (Activation)        │ 256)              │         │                      │
├─────────────────────┼───────────────────┼─────────┼──────────────────────┤
│ conv2d_transpose_2  │ (None, 20, 20,    │ 295,040 │ activation_9[0][0]   │
│ (Conv2DTranspose)   │ 128)              │         │                      │
├─────────────────────┼───────────────────┼─────────┼──────────────────────┤
│ batch_normalizatio… │ (None, 20, 20,    │     512 │ conv2d_transpose_2[… │
│ (BatchNormalizatio… │ 128)              │         │                      │
├─────────────────────┼───────────────────┼─────────┼──────────────────────┤
│ activation_10       │ (None, 20, 20,    │       0 │ batch_normalization… │
│ (Activation)        │ 128)              │         │                      │
├─────────────────────┼───────────────────┼─────────┼──────────────────────┤
│ conv2d_transpose_3  │ (None, 20, 20,    │ 147,584 │ activation_10[0][0]  │
│ (Conv2DTranspose)   │ 128)              │         │                      │
├─────────────────────┼───────────────────┼─────────┼──────────────────────┤
│ batch_normalizatio… │ (None, 20, 20,    │     512 │ conv2d_transpose_3[… │
│ (BatchNormalizatio… │ 128)              │         │                      │
├─────────────────────┼───────────────────┼─────────┼──────────────────────┤
│ up_sampling2d_3     │ (None, 40, 40,    │       0 │ add_3[0][0]          │
│ (UpSampling2D)      │ 256)              │         │                      │
├─────────────────────┼───────────────────┼─────────┼──────────────────────┤
│ up_sampling2d_2     │ (None, 40, 40,    │       0 │ batch_normalization… │
│ (UpSampling2D)      │ 128)              │         │                      │
├─────────────────────┼───────────────────┼─────────┼──────────────────────┤
│ conv2d_5 (Conv2D)   │ (None, 40, 40,    │  32,896 │ up_sampling2d_3[0][… │
│                     │ 128)              │         │                      │
├─────────────────────┼───────────────────┼─────────┼──────────────────────┤
│ add_4 (Add)         │ (None, 40, 40,    │       0 │ up_sampling2d_2[0][… │
│                     │ 128)              │         │ conv2d_5[0][0]       │
├─────────────────────┼───────────────────┼─────────┼──────────────────────┤
│ activation_11       │ (None, 40, 40,    │       0 │ add_4[0][0]          │
│ (Activation)        │ 128)              │         │                      │
├─────────────────────┼───────────────────┼─────────┼──────────────────────┤
│ conv2d_transpose_4  │ (None, 40, 40,    │  73,792 │ activation_11[0][0]  │
│ (Conv2DTranspose)   │ 64)               │         │                      │
├─────────────────────┼───────────────────┼─────────┼──────────────────────┤
│ batch_normalizatio… │ (None, 40, 40,    │     256 │ conv2d_transpose_4[… │
│ (BatchNormalizatio… │ 64)               │         │                      │
├─────────────────────┼───────────────────┼─────────┼──────────────────────┤
│ activation_12       │ (None, 40, 40,    │       0 │ batch_normalization… │
│ (Activation)        │ 64)               │         │                      │
├─────────────────────┼───────────────────┼─────────┼──────────────────────┤
│ conv2d_transpose_5  │ (None, 40, 40,    │  36,928 │ activation_12[0][0]  │
│ (Conv2DTranspose)   │ 64)               │         │                      │
├─────────────────────┼───────────────────┼─────────┼──────────────────────┤
│ batch_normalizatio… │ (None, 40, 40,    │     256 │ conv2d_transpose_5[… │
│ (BatchNormalizatio… │ 64)               │         │                      │
├─────────────────────┼───────────────────┼─────────┼──────────────────────┤
│ up_sampling2d_5     │ (None, 80, 80,    │       0 │ add_4[0][0]          │
│ (UpSampling2D)      │ 128)              │         │                      │
├─────────────────────┼───────────────────┼─────────┼──────────────────────┤
│ up_sampling2d_4     │ (None, 80, 80,    │       0 │ batch_normalization… │
│ (UpSampling2D)      │ 64)               │         │                      │
├─────────────────────┼───────────────────┼─────────┼──────────────────────┤
│ conv2d_6 (Conv2D)   │ (None, 80, 80,    │   8,256 │ up_sampling2d_5[0][… │
│                     │ 64)               │         │                      │
├─────────────────────┼───────────────────┼─────────┼──────────────────────┤
│ add_5 (Add)         │ (None, 80, 80,    │       0 │ up_sampling2d_4[0][… │
│                     │ 64)               │         │ conv2d_6[0][0]       │
├─────────────────────┼───────────────────┼─────────┼──────────────────────┤
│ activation_13       │ (None, 80, 80,    │       0 │ add_5[0][0]          │
│ (Activation)        │ 64)               │         │                      │
├─────────────────────┼───────────────────┼─────────┼──────────────────────┤
│ conv2d_transpose_6  │ (None, 80, 80,    │  18,464 │ activation_13[0][0]  │
│ (Conv2DTranspose)   │ 32)               │         │                      │
├─────────────────────┼───────────────────┼─────────┼──────────────────────┤
│ batch_normalizatio… │ (None, 80, 80,    │     128 │ conv2d_transpose_6[… │
│ (BatchNormalizatio… │ 32)               │         │                      │
├─────────────────────┼───────────────────┼─────────┼──────────────────────┤
│ activation_14       │ (None, 80, 80,    │       0 │ batch_normalization… │
│ (Activation)        │ 32)               │         │                      │
├─────────────────────┼───────────────────┼─────────┼──────────────────────┤
│ conv2d_transpose_7  │ (None, 80, 80,    │   9,248 │ activation_14[0][0]  │
│ (Conv2DTranspose)   │ 32)               │         │                      │
├─────────────────────┼───────────────────┼─────────┼──────────────────────┤
│ batch_normalizatio… │ (None, 80, 80,    │     128 │ conv2d_transpose_7[… │
│ (BatchNormalizatio… │ 32)               │         │                      │
├─────────────────────┼───────────────────┼─────────┼──────────────────────┤
│ up_sampling2d_7     │ (None, 160, 160,  │       0 │ add_5[0][0]          │
│ (UpSampling2D)      │ 64)               │         │                      │
├─────────────────────┼───────────────────┼─────────┼──────────────────────┤
│ up_sampling2d_6     │ (None, 160, 160,  │       0 │ batch_normalization… │
│ (UpSampling2D)      │ 32)               │         │                      │
├─────────────────────┼───────────────────┼─────────┼──────────────────────┤
│ conv2d_7 (Conv2D)   │ (None, 160, 160,  │   2,080 │ up_sampling2d_7[0][… │
│                     │ 32)               │         │                      │
├─────────────────────┼───────────────────┼─────────┼──────────────────────┤
│ add_6 (Add)         │ (None, 160, 160,  │       0 │ up_sampling2d_6[0][… │
│                     │ 32)               │         │ conv2d_7[0][0]       │
├─────────────────────┼───────────────────┼─────────┼──────────────────────┤
│ conv2d_8 (Conv2D)   │ (None, 160, 160,  │     867 │ add_6[0][0]          │
│                     │ 3)                │         │                      │
└─────────────────────┴───────────────────┴─────────┴──────────────────────┘
 Total params: 2,058,979 (7.85 MB)
 Trainable params: 2,055,203 (7.84 MB)
 Non-trainable params: 3,776 (14.75 KB)

预留验证分割

import random# Split our img paths into a training and a validation set
val_samples = 1000
random.Random(1337).shuffle(input_img_paths)
random.Random(1337).shuffle(target_img_paths)
train_input_img_paths = input_img_paths[:-val_samples]
train_target_img_paths = target_img_paths[:-val_samples]
val_input_img_paths = input_img_paths[-val_samples:]
val_target_img_paths = target_img_paths[-val_samples:]# Instantiate dataset for each split
# Limit input files in `max_dataset_len` for faster epoch training time.
# Remove the `max_dataset_len` arg when running with full dataset.
train_dataset = get_dataset(batch_size,img_size,train_input_img_paths,train_target_img_paths,max_dataset_len=1000,
)
valid_dataset = get_dataset(batch_size, img_size, val_input_img_paths, val_target_img_paths
)

训练模型

# Configure the model for training.
# We use the "sparse" version of categorical_crossentropy
# because our target data is integers.
model.compile(optimizer=keras.optimizers.Adam(1e-4), loss="sparse_categorical_crossentropy"
)callbacks = [keras.callbacks.ModelCheckpoint("oxford_segmentation.keras", save_best_only=True)
]# Train the model, doing validation at the end of each epoch.
epochs = 50
model.fit(train_dataset,epochs=epochs,validation_data=valid_dataset,callbacks=callbacks,verbose=2,
)

演绎展示:
 

Epoch 1/50WARNING: All log messages before absl::InitializeLog() is called are written to STDERR
I0000 00:00:1700414690.172044 2226172 device_compiler.h:187] Compiled cluster using XLA!  This line is logged at most once for the lifetime of the process.
Corrupt JPEG data: 240 extraneous bytes before marker 0xd932/32 - 62s - 2s/step - loss: 1.6363 - val_loss: 2.2226
Epoch 2/50Corrupt JPEG data: 240 extraneous bytes before marker 0xd932/32 - 3s - 94ms/step - loss: 0.9223 - val_loss: 1.8273
Epoch 3/50Corrupt JPEG data: 240 extraneous bytes before marker 0xd932/32 - 3s - 82ms/step - loss: 0.7894 - val_loss: 2.0044
Epoch 4/50Corrupt JPEG data: 240 extraneous bytes before marker 0xd932/32 - 3s - 83ms/step - loss: 0.7174 - val_loss: 2.3480
Epoch 5/50Corrupt JPEG data: 240 extraneous bytes before marker 0xd932/32 - 3s - 82ms/step - loss: 0.6695 - val_loss: 2.7528
Epoch 6/50Corrupt JPEG data: 240 extraneous bytes before marker 0xd932/32 - 3s - 83ms/step - loss: 0.6325 - val_loss: 3.1453
Epoch 7/50Corrupt JPEG data: 240 extraneous bytes before marker 0xd932/32 - 3s - 84ms/step - loss: 0.6012 - val_loss: 3.5611
Epoch 8/50Corrupt JPEG data: 240 extraneous bytes before marker 0xd932/32 - 3s - 87ms/step - loss: 0.5730 - val_loss: 4.0003
Epoch 9/50Corrupt JPEG data: 240 extraneous bytes before marker 0xd932/32 - 3s - 85ms/step - loss: 0.5466 - val_loss: 4.4798
Epoch 10/50Corrupt JPEG data: 240 extraneous bytes before marker 0xd932/32 - 3s - 86ms/step - loss: 0.5210 - val_loss: 5.0245
Epoch 11/50Corrupt JPEG data: 240 extraneous bytes before marker 0xd932/32 - 3s - 87ms/step - loss: 0.4958 - val_loss: 5.5950
Epoch 12/50Corrupt JPEG data: 240 extraneous bytes before marker 0xd932/32 - 3s - 87ms/step - loss: 0.4706 - val_loss: 6.1534
Epoch 13/50Corrupt JPEG data: 240 extraneous bytes before marker 0xd932/32 - 3s - 85ms/step - loss: 0.4453 - val_loss: 6.6107
Epoch 14/50Corrupt JPEG data: 240 extraneous bytes before marker 0xd932/32 - 3s - 83ms/step - loss: 0.4202 - val_loss: 6.8010
Epoch 15/50Corrupt JPEG data: 240 extraneous bytes before marker 0xd932/32 - 3s - 84ms/step - loss: 0.3956 - val_loss: 6.6751
Epoch 16/50Corrupt JPEG data: 240 extraneous bytes before marker 0xd932/32 - 3s - 83ms/step - loss: 0.3721 - val_loss: 6.0800
Epoch 17/50Corrupt JPEG data: 240 extraneous bytes before marker 0xd932/32 - 3s - 84ms/step - loss: 0.3506 - val_loss: 5.1820
Epoch 18/50Corrupt JPEG data: 240 extraneous bytes before marker 0xd932/32 - 3s - 82ms/step - loss: 0.3329 - val_loss: 4.0350
Epoch 19/50Corrupt JPEG data: 240 extraneous bytes before marker 0xd932/32 - 4s - 114ms/step - loss: 0.3216 - val_loss: 3.0513
Epoch 20/50Corrupt JPEG data: 240 extraneous bytes before marker 0xd932/32 - 3s - 94ms/step - loss: 0.3595 - val_loss: 2.2567
Epoch 21/50Corrupt JPEG data: 240 extraneous bytes before marker 0xd932/32 - 3s - 100ms/step - loss: 0.4417 - val_loss: 1.5873
Epoch 22/50Corrupt JPEG data: 240 extraneous bytes before marker 0xd932/32 - 3s - 101ms/step - loss: 0.3531 - val_loss: 1.5798
Epoch 23/50Corrupt JPEG data: 240 extraneous bytes before marker 0xd932/32 - 3s - 96ms/step - loss: 0.3353 - val_loss: 1.5525
Epoch 24/50Corrupt JPEG data: 240 extraneous bytes before marker 0xd932/32 - 3s - 95ms/step - loss: 0.3392 - val_loss: 1.4625
Epoch 25/50Corrupt JPEG data: 240 extraneous bytes before marker 0xd932/32 - 3s - 95ms/step - loss: 0.3596 - val_loss: 0.8867
Epoch 26/50Corrupt JPEG data: 240 extraneous bytes before marker 0xd932/32 - 3s - 94ms/step - loss: 0.3528 - val_loss: 0.8021
Epoch 27/50Corrupt JPEG data: 240 extraneous bytes before marker 0xd932/32 - 3s - 92ms/step - loss: 0.3237 - val_loss: 0.7986
Epoch 28/50Corrupt JPEG data: 240 extraneous bytes before marker 0xd932/32 - 3s - 89ms/step - loss: 0.3198 - val_loss: 0.8533
Epoch 29/50Corrupt JPEG data: 240 extraneous bytes before marker 0xd932/32 - 3s - 84ms/step - loss: 0.3272 - val_loss: 1.0588
Epoch 30/50Corrupt JPEG data: 240 extraneous bytes before marker 0xd932/32 - 3s - 88ms/step - loss: 0.3164 - val_loss: 1.1889
Epoch 31/50Corrupt JPEG data: 240 extraneous bytes before marker 0xd932/32 - 3s - 85ms/step - loss: 0.2987 - val_loss: 0.9518
Epoch 32/50Corrupt JPEG data: 240 extraneous bytes before marker 0xd932/32 - 3s - 87ms/step - loss: 0.2749 - val_loss: 0.9011
Epoch 33/50Corrupt JPEG data: 240 extraneous bytes before marker 0xd932/32 - 3s - 84ms/step - loss: 0.2595 - val_loss: 0.8872
Epoch 34/50Corrupt JPEG data: 240 extraneous bytes before marker 0xd932/32 - 3s - 87ms/step - loss: 0.2552 - val_loss: 1.0221
Epoch 35/50Corrupt JPEG data: 240 extraneous bytes before marker 0xd932/32 - 3s - 82ms/step - loss: 0.2628 - val_loss: 1.1553
Epoch 36/50Corrupt JPEG data: 240 extraneous bytes before marker 0xd932/32 - 3s - 85ms/step - loss: 0.2788 - val_loss: 2.1549
Epoch 37/50Corrupt JPEG data: 240 extraneous bytes before marker 0xd932/32 - 3s - 94ms/step - loss: 0.2870 - val_loss: 1.6282
Epoch 38/50Corrupt JPEG data: 240 extraneous bytes before marker 0xd932/32 - 3s - 89ms/step - loss: 0.2702 - val_loss: 1.3201
Epoch 39/50Corrupt JPEG data: 240 extraneous bytes before marker 0xd932/32 - 3s - 91ms/step - loss: 0.2569 - val_loss: 1.2364
Epoch 40/50Corrupt JPEG data: 240 extraneous bytes before marker 0xd932/32 - 3s - 106ms/step - loss: 0.2523 - val_loss: 1.3673
Epoch 41/50Corrupt JPEG data: 240 extraneous bytes before marker 0xd932/32 - 3s - 86ms/step - loss: 0.2570 - val_loss: 1.3999
Epoch 42/50Corrupt JPEG data: 240 extraneous bytes before marker 0xd932/32 - 3s - 87ms/step - loss: 0.2680 - val_loss: 0.9976
Epoch 43/50Corrupt JPEG data: 240 extraneous bytes before marker 0xd932/32 - 3s - 83ms/step - loss: 0.2558 - val_loss: 1.0209
Epoch 44/50Corrupt JPEG data: 240 extraneous bytes before marker 0xd932/32 - 3s - 85ms/step - loss: 0.2403 - val_loss: 1.3271
Epoch 45/50Corrupt JPEG data: 240 extraneous bytes before marker 0xd932/32 - 3s - 83ms/step - loss: 0.2414 - val_loss: 1.1993
Epoch 46/50Corrupt JPEG data: 240 extraneous bytes before marker 0xd932/32 - 3s - 84ms/step - loss: 0.2516 - val_loss: 1.0532
Epoch 47/50Corrupt JPEG data: 240 extraneous bytes before marker 0xd932/32 - 3s - 83ms/step - loss: 0.2695 - val_loss: 1.1183
Epoch 48/50Corrupt JPEG data: 240 extraneous bytes before marker 0xd932/32 - 3s - 87ms/step - loss: 0.2555 - val_loss: 1.0432
Epoch 49/50Corrupt JPEG data: 240 extraneous bytes before marker 0xd932/32 - 3s - 82ms/step - loss: 0.2290 - val_loss: 0.9444
Epoch 50/50Corrupt JPEG data: 240 extraneous bytes before marker 0xd932/32 - 3s - 83ms/step - loss: 0.1994 - val_loss: 1.2182<keras.src.callbacks.history.History at 0x7fe01842dab0>

可视化预测

# Generate predictions for all images in the validation setval_dataset = get_dataset(batch_size, img_size, val_input_img_paths, val_target_img_paths
)
val_preds = model.predict(val_dataset)def display_mask(i):"""Quick utility to display a model's prediction."""mask = np.argmax(val_preds[i], axis=-1)mask = np.expand_dims(mask, axis=-1)img = ImageOps.autocontrast(keras.utils.array_to_img(mask))display(img)# Display results for validation image #10
i = 10# Display input image
display(Image(filename=val_input_img_paths[i]))# Display ground-truth target mask
img = ImageOps.autocontrast(load_img(val_target_img_paths[i]))
display(img)# Display mask predicted by our model
display_mask(i)  # Note that the model only sees inputs at 150x150.

演绎展示:
 

 32/32 ━━━━━━━━━━━━━━━━━━━━ 5s 100ms/step


这篇关于政安晨:【Keras机器学习示例演绎】(一)—— 利用类 U-Net 架构进行图像分割的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/917021

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

mybatis的整体架构

mybatis的整体架构分为三层: 1.基础支持层 该层包括:数据源模块、事务管理模块、缓存模块、Binding模块、反射模块、类型转换模块、日志模块、资源加载模块、解析器模块 2.核心处理层 该层包括:配置解析、参数映射、SQL解析、SQL执行、结果集映射、插件 3.接口层 该层包括:SqlSession 基础支持层 该层保护mybatis的基础模块,它们为核心处理层提供了良好的支撑。

百度/小米/滴滴/京东,中台架构比较

小米中台建设实践 01 小米的三大中台建设:业务+数据+技术 业务中台--从业务说起 在中台建设中,需要规范化的服务接口、一致整合化的数据、容器化的技术组件以及弹性的基础设施。并结合业务情况,判定是否真的需要中台。 小米参考了业界优秀的案例包括移动中台、数据中台、业务中台、技术中台等,再结合其业务发展历程及业务现状,整理了中台架构的核心方法论,一是企业如何共享服务,二是如何为业务提供便利。

基于人工智能的图像分类系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 图像分类是计算机视觉中的一个重要任务,目标是自动识别图像中的对象类别。通过卷积神经网络(CNN)等深度学习技术,我们可以构建高效的图像分类系统,广泛应用于自动驾驶、医疗影像诊断、监控分析等领域。本文将介绍如何构建一个基于人工智能的图像分类系统,包括环境

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

poj 1258 Agri-Net(最小生成树模板代码)

感觉用这题来当模板更适合。 题意就是给你邻接矩阵求最小生成树啦。~ prim代码:效率很高。172k...0ms。 #include<stdio.h>#include<algorithm>using namespace std;const int MaxN = 101;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int n