import os
import cv2
import numpy as np
import tensorflow as tf
from tensorflow.keras.preprocessing.image import img_to_array, load_img
# 加载数据集
def load_images_from_folder(folder):
images = []
for filename in os.listdir(folder):
if filename.endswith(".jpg"):
img = load_img(os.path.join(folder, filename))
img = img_to_array(img)
images.append(img)
return np.array(images)
train_data = load_images_from_folder('train_data')
test_data = load_images_from_folder('test_data')
### 图像分割模型
from tensorflow.keras.models import Model
from tensorflow.keras.layers import Input, Conv2D, MaxPooling2D, UpSampling2D, concatenate
def unet_model(input_size=(256, 256, 3)):
inputs = Input(input_size)
conv1 = Conv2D(64, 3, activation='relu', padding='same')(inputs)
conv1 = Conv2D(64, 3, activation='relu', padding='same')(conv1)
pool1 = MaxPooling2D(pool_size=(2, 2))(conv1)
conv2 = Conv2D(128, 3, activation='relu', padding='same')(pool1)
conv2 = Conv2D(128, 3, activation='relu', padding='same')(conv2)
pool2 = MaxPooling2D(pool_size=(2, 2))(conv2)
conv3 = Conv2D(256, 3, activation='relu', padding='same')(pool2)
conv3 = Conv2D(256, 3, activation='relu', padding='same')(conv3)
pool3 = MaxPooling2D(pool_size=(2, 2))(conv3)
conv4 = Conv2D(512, 3, activation='relu', padding='same')(pool3)
conv4 = Conv2D(512, 3, activation='relu', padding='same')(conv4)
pool4 = MaxPooling2D(pool_size=(2, 2))(conv4)
conv5 = Conv2D(1024, 3, activation='relu', padding='same')(pool4)
conv5 = Conv2D(1024, 3, activation='relu', padding='same')(conv5)
up6 = concatenate([UpSampling2D(size=(2, 2))(conv5), conv4], axis=3)
conv6 = Conv2D(512, 3, activation='relu', padding='same')(up6)
conv6 = Conv2D(512, 3, activation='relu', padding='same')(conv6)
up7 = concatenate([UpSampling2D(size=(2, 2))(conv6), conv3], axis=3)
conv7 = Conv2D(256, 3, activation='relu', padding='same')(up7)
conv7 = Conv2D(256, 3, activation='relu', padding='same')(conv7)
up8 = concatenate([UpSampling2D(size=(2, 2))(conv7), conv2], axis=3)
conv8 = Conv2D(128, 3, activation='relu', padding='same')(up8)
conv8 = Conv2D(128, 3, activation='relu', padding='same')(conv8)
up9 = concatenate([UpSampling2D(size=(2, 2))(conv8), conv1], axis=3)
conv9 = Conv2D(64, 3, activation='relu', padding='same')(up9)
conv9 = Conv2D(64, 3, activation='relu', padding='same')(conv9)
conv10 = Conv2D(1, 1, activation='sigmoid')(conv9)
model = Model(inputs=[inputs], outputs=[conv10])
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
return model
model = unet_model()
model.summary()
### 训练模型
from sklearn.model_selection import train_test_split
# 假设train_data有相应的mask图像
train_images, val_images, train_masks, val_masks = train_test_split(train_data, train_masks, test_size=0.2,
random_state=42)
model.fit(train_images, train_masks, validation_data=(val_images, val_masks), epochs=50, batch_size=8)
### 图像处理和合成
def apply_convolution(image):
kernel = np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]])
return cv2.filter2D(image, -1, kernel)
for image in test_data:
# 预测分割
pred_mask = model.predict(np.expand_dims(image, axis=0))[0]
pred_mask = (pred_mask > 0.5).astype(np.uint8)
# 分离人物和环境
person = image * pred_mask
environment = image * (1 - pred_mask)
# 分别卷积处理
person_processed = apply_convolution(person)
environment_processed = apply_convolution(environment)
# 合成最终图像
final_image = person_processed + environment_processed
cv2.imshow('Final Image', final_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
这段代码报setting an array element with a sequence. The requested array has an inhomogeneous shape after 1 dimensions. The detected shape was (12,) + inhomogeneous part.
怎么解决啊