Msy20070905 2024-07-18 13:44 采纳率: 21.2%
浏览 10
已结题

setting an array element with a sequence.

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.
怎么解决啊

  • 写回答

4条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-07-18 13:44
    关注

    引自免费微信小程序:皆我百晓生

    你的代码中存在一些问题,特别是在处理图像数据和模型预测的部分。让我们一步步来解决这些问题。

    首先,关于错误“setting an array element with a sequence. The requested array has an inhomogeneous shape after 1 dimensions.”,这通常发生在尝试将不同形状或类型的数组元素组合到一个数组中。在你的代码中,这个问题可能是由于尝试将不同形状的数据(例如,模型的预测输出和原始图像数据)直接相乘导致的。解决这个问题需要对你的数据处理流程进行审查和调整。

    针对你的代码,以下是几个关键问题及其解决方案:

    1. 模型预测与数据处理不匹配:你的模型输出是一个二值化的掩膜(mask),而原始图像数据是彩色图像。你不能直接将这两者相乘,因为它们具有不同的维度和含义。你需要找到一种方法来结合这两个信息。一种常见的方法是将掩膜应用于图像的相应通道上。
    2. 数组形状不一致:在进行元素级运算(如乘法)时,涉及的数组必须具有相同的形状。在你的代码中,你试图将预测掩膜(pred_mask)与原始图像(image)相乘。为了这样做,你需要确保它们的形状相匹配。你可以使用resize函数来调整掩膜的形状,使其与图像的形状相匹配。
    3. 卷积处理的问题:在应用卷积处理之前,确保图像数据的维度和类型是正确的。你可能需要对图像数据进行必要的预处理(如缩放、归一化等)。此外,卷积核的选择和应用方式也需要根据你的具体需求进行调整。

    针对上述问题,以下是修改后的代码片段,主要关注图像处理和合成的部分:

    def apply_convolution(image):
        kernel = np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]])
        return cv2.filter2D(image, -1, kernel)
    
    def process_and_synthesize_image(image):
        # 预测分割
        pred_mask = model.predict(np.expand_dims(image, axis=0))[0]
        pred_mask = (pred_mask > 0.5).astype(np.uint8)
        
        # 调整掩膜大小以匹配图像大小
        pred_mask = cv2.resize(pred_mask, (image.shape[1], image.shape[0]))
        
        # 分离人物和环境
        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
        return final_image
    
    for image in test_data:
        final_image = process_and_synthesize_image(image)
        cv2.imshow('Final Image', final_image)
        cv2.waitKey(0)
        cv2.destroyAllWindows()
    

    请注意,上述代码只是一个基本的框架,具体的实现可能需要根据你的具体需求和图像数据的特点进行调整。特别是合成最终图像的部分,你可能需要进一步调整以确保得到满意的结果。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 7月26日
  • 已采纳回答 7月18日
  • 创建了问题 7月18日

悬赏问题

  • ¥15 35114 SVAC视频验签的问题
  • ¥15 impedancepy
  • ¥15 在虚拟机环境下完成以下,要求截图!
  • ¥15 求往届大挑得奖作品(ppt…)
  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见