gpt4 book ai didi

python-3.x - Keras 模型 - Unet 图像分割

转载 作者:行者123 更新时间:2023-11-30 09:07:41 25 4
gpt4 key购买 nike

我正在尝试使用 Keras 模型 API 重新创建 UNet,我收集了细胞图像及其分段版本,并尝试用它来训练模型。这样做时,我可以上传不同的单元格并获取图像的分段版本作为预测。

https://github.com/JamilGafur/Unet

from __future__ import print_function

from matplotlib import pyplot as plt
from keras import losses
import os
from keras.models import Model
from keras.layers import Input, concatenate, Conv2D, MaxPooling2D, Conv2DTranspose
from keras.optimizers import Adam
import cv2
import numpy as np
# training data
image_location = "C:/Users/JamilG-Lenovo/Desktop/train/"
image = image_location+"image"
label = image_location +"label"


class train_data():

def __init__(self, image, label):
self.image = []
self.label = []
for file in os.listdir(image):
if file.endswith(".tif"):
self.image.append(cv2.imread(image+"/"+file,0))

for file in os.listdir(label):
if file.endswith(".tif"):
#print(label+"/"+file)
self.label.append(cv2.imread(label+"/"+file,0))

def get_image(self):
return np.array(self.image)

def get_label(self):
return np.array(self.label)



def get_unet(rows, cols):
inputs = Input((rows, cols, 1))
conv1 = Conv2D(32, (3, 3), activation='relu', padding='same')(inputs)
conv1 = Conv2D(32, (3, 3), activation='relu', padding='same')(conv1)
pool1 = MaxPooling2D(pool_size=(2, 2))(conv1)

conv2 = Conv2D(64, (3, 3), activation='relu', padding='same')(pool1)
conv2 = Conv2D(64, (3, 3), activation='relu', padding='same')(conv2)
pool2 = MaxPooling2D(pool_size=(2, 2))(conv2)

conv3 = Conv2D(128, (3, 3), activation='relu', padding='same')(pool2)
conv3 = Conv2D(128, (3, 3), activation='relu', padding='same')(conv3)
pool3 = MaxPooling2D(pool_size=(2, 2))(conv3)

conv4 = Conv2D(256, (3, 3), activation='relu', padding='same')(pool3)
conv4 = Conv2D(256, (3, 3), activation='relu', padding='same')(conv4)
pool4 = MaxPooling2D(pool_size=(2, 2))(conv4)

conv5 = Conv2D(512, (3, 3), activation='relu', padding='same')(pool4)
conv5 = Conv2D(512, (3, 3), activation='relu', padding='same')(conv5)

up6 = concatenate([Conv2DTranspose(256, (2, 2), strides=(2, 2), padding='same')(conv5), conv4], axis=3)
conv6 = Conv2D(256, (3, 3), activation='relu', padding='same')(up6)
conv6 = Conv2D(256, (3, 3), activation='relu', padding='same')(conv6)

up7 = concatenate([Conv2DTranspose(128, (2, 2), strides=(2, 2), padding='same')(conv6), conv3], axis=3)
conv7 = Conv2D(128, (3, 3), activation='relu', padding='same')(up7)
conv7 = Conv2D(128, (3, 3), activation='relu', padding='same')(conv7)

up8 = concatenate([Conv2DTranspose(64, (2, 2), strides=(2, 2), padding='same')(conv7), conv2], axis=3)
conv8 = Conv2D(64, (3, 3), activation='relu', padding='same')(up8)
conv8 = Conv2D(64, (3, 3), activation='relu', padding='same')(conv8)

up9 = concatenate([Conv2DTranspose(32, (2, 2), strides=(2, 2), padding='same')(conv8), conv1], axis=3)
conv9 = Conv2D(32, (3, 3), activation='relu', padding='same')(up9)
conv9 = Conv2D(32, (3, 3), activation='relu', padding='same')(conv9)

conv10 = Conv2D(1, (1, 1), activation='sigmoid')(conv9)

model = Model(inputs=[inputs], outputs=[conv10])
model.compile(optimizer=Adam(lr=1e-5), loss = losses.mean_squared_error)

return model



def main():
# load all the training images
train_set = train_data(image, label)
# get the training image
train_images = train_set.get_image()
# get the segmented image
train_label = train_set.get_label()
print("type of train_images" + str(type(train_images[0])))
print("type of train_label" + str(type(train_label[0])))
print('\n')
print("shape of train_images" + str(train_images[0].shape))
print("shape of train_label" + str(train_label[0].shape))


plt.imshow(train_images[0], interpolation='nearest')
plt.title("actual image")
plt.show()

plt.imshow(train_label[0], interpolation='nearest')
plt.title("segmented image")
plt.show()
# create a UNet (512,512)
unet = get_unet(train_label[0].shape[0],
train_label[0].shape[1])

# look at the summary of the unet
unet.summary()
#-----------errors start here-----------------

# fit the unet with the actual image, train_images
# and the output, train_label
unet.fit(train_images, train_label, batch_size=16, epochs=10)

main()

当我尝试运行它时,我希望它能够拟合超过 10 个时期,但相反,它抛出以下错误:

File "C:\ProgramData\Anaconda3\lib\site-packages\keras\engine\training.py", 
line 144, in _standardize_input_data str(array.shape))

ValueError: Error when checking input: expected input_5 to have shape (None,
512, 512, 1) but got array with shape (1, 30, 512, 512)

如果有人能告诉我我做错了什么,代码应该是什么,或者指出我正确的方向,我将非常感激。

谢谢!

最佳答案

我认为当您以“ channel 优先模式”传递图像时,Keras 期望“ channel 最后”。

有多种方法可以更改此设置,请引用:https://keras.io/backend/

关于python-3.x - Keras 模型 - Unet 图像分割,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47645797/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com