Python 代码实现图像分割:基于数据增强和 U-Net 模型
下面是一个 Python 代码示例,实现了利用数据增强方法扩展样本数量并使用 U-Net 模型进行图像分割。代码中包含详细注释,以便理解每个步骤的作用和功能。
import os
import cv2
import numpy as np
from keras.preprocessing.image import ImageDataGenerator
from keras.models import Sequential
from keras.layers import Conv2D, MaxPooling2D, UpSampling2D, Dropout, concatenate
from keras.optimizers import Adam
# 定义数据增强器
data_generator = ImageDataGenerator(
rotation_range=20, # 随机旋转范围
width_shift_range=0.2, # 水平方向平移范围
height_shift_range=0.2, # 垂直方向平移范围
zoom_range=0.2, # 随机缩放范围
horizontal_flip=True, # 随机水平翻转
vertical_flip=True # 随机垂直翻转
)
# 定义 U-Net 模型
def unet_model():
model = Sequential()
# 编码器
model.add(Conv2D(64, (3, 3), activation='relu', padding='same', input_shape=(256, 256, 3)))
model.add(Conv2D(64, (3, 3), activation='relu', padding='same'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(128, (3, 3), activation='relu', padding='same'))
model.add(Conv2D(128, (3, 3), activation='relu', padding='same'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(256, (3, 3), activation='relu', padding='same'))
model.add(Conv2D(256, (3, 3), activation='relu', padding='same'))
model.add(MaxPooling2D(pool_size=(2, 2)))
# 解码器
model.add(Conv2D(256, (3, 3), activation='relu', padding='same'))
model.add(Conv2D(256, (3, 3), activation='relu', padding='same'))
model.add(UpSampling2D(size=(2, 2)))
model.add(Conv2D(128, (3, 3), activation='relu', padding='same'))
model.add(Conv2D(128, (3, 3), activation='relu', padding='same'))
model.add(UpSampling2D(size=(2, 2)))
model.add(Conv2D(64, (3, 3), activation='relu', padding='same'))
model.add(Conv2D(64, (3, 3), activation='relu', padding='same'))
model.add(UpSampling2D(size=(2, 2)))
model.add(Conv2D(1, (1, 1), activation='sigmoid'))
return model
# 加载低照度图片
image_path = 'path_to_images_folder'
images = []
for filename in os.listdir(image_path):
img = cv2.imread(os.path.join(image_path, filename))
if img is not None:
images.append(img)
# 数据增强扩展样本数量为10倍
augmented_images = []
for img in images:
img = img / 255.0 # 归一化到 0-1 范围
img = np.expand_dims(img, axis=0)
augmented_img = data_generator.flow(img, batch_size=1).next()[0]
augmented_images.append(augmented_img)
# 合并原始样本和扩展样本
all_images = images + augmented_images
# 构建训练集和标签
X_train = np.array(all_images)
Y_train = np.array(ground_truth_labels) # 请提供分割标签数据
# 创建 U-Net 模型
model = unet_model()
# 编译模型
model.compile(optimizer=Adam(learning_rate=0.001), loss='binary_crossentropy', metrics=['accuracy'])
# 训练模型
model.fit(X_train, Y_train, batch_size=16, epochs=10, validation_split=0.2)
# 使用模型进行图像分割预测
predicted_masks = model.predict(X_test)
# 可以进行后续的结果可视化等操作
请根据实际情况替换代码中的路径和变量,确保图片路径正确,并提供相应的分割标签数据。此外,还可以根据需要调整 U-Net 模型的结构和参数设置,以及数据增强器的参数设置,以获得更好的结果。
原文地址: https://www.cveoy.top/t/topic/bqdc 著作权归作者所有。请勿转载和采集!