Image processing Can';我不知道如何解决这个图像分割问题

Image processing Can';我不知道如何解决这个图像分割问题,image-processing,deep-learning,neural-network,image-segmentation,Image Processing,Deep Learning,Neural Network,Image Segmentation,我的训练图像是由从一些拼接图像的ELAs(误差水平分析)中提取的蓝色通道组成的,标签只是由它们相应的地面真值掩码组成 我已经构建了一个简单的编码器-解码器CNN,如下所示,用于进行分割,并在细胞膜分割任务中进行了测试。在那里,它表现得很好,可以创建接近地面的真实图像,所以我想我创建的神经网络足够强大 但是,它无法处理CASIA1+CASIA1GroundTruth数据集上的拼接图像。请帮助我修复它,我花了太多的时间尝试不同的架构和图像预处理,但没有运气 输入图像 基本事实 输出/生成图像

我的训练图像是由从一些拼接图像的ELAs(误差水平分析)中提取的蓝色通道组成的,标签只是由它们相应的地面真值掩码组成

我已经构建了一个简单的编码器-解码器CNN,如下所示,用于进行分割,并在细胞膜分割任务中进行了测试。在那里,它表现得很好,可以创建接近地面的真实图像,所以我想我创建的神经网络足够强大

但是,它无法处理CASIA1+CASIA1GroundTruth数据集上的拼接图像。请帮助我修复它,我花了太多的时间尝试不同的架构和图像预处理,但没有运气

输入图像

基本事实

输出/生成图像

首先,它声称这样的高精度(98%)和低损耗,但输出图像是如此错误。如果你仔细看的话,这有点像是得到了想要的面具,但是伴随着它的还有很多白色区域。似乎无法获得所需区域与背景的像素强度差异。请帮我修一下:(

准备工作 def过程(img): img=img.getchannel('B') 返回img 对于DIMG中的i: img=进程(Image.open('ELAs/'+str(i))) X.append(np.array(img)/np.max(img)) 对于DGT中的i: lbl=Image.open('SGTResized/'+str(i)) Y.append(np.array(lbl)/np.max(lbl)) X=np.数组(X) Y=np.数组(Y) X=X。重塑(-1256256,1) Y=Y。重塑(-1256256,1) X_列,X_val,Y_列,Y_val=列测试分割(X,Y,测试大小=0.2) 分段器模型
model=Sequential()
add(Conv2D(filters=16,kernel_size=(3,3),padding=‘same’,
激活='relu',输入_形状=(256256,1)))
添加(BatchNormalization())
add(Conv2D(filters=16,kernel_size=(3,3),padding=‘same’,
激活(='relu'))
添加(BatchNormalization())
model.add(MaxPoolig2D(池大小=(2,2)))
add(Conv2D(filters=32,kernel_size=(3,3),padding=‘same’,
激活(='relu'))
添加(BatchNormalization())
add(Conv2D(filters=32,kernel_size=(3,3),padding=‘same’,
激活(='relu'))
添加(BatchNormalization())
model.add(MaxPoolig2D(池大小=(2,2)))
add(Conv2D(filters=64,kernel_size=(3,3),padding=‘same’,
激活(='relu'))
添加(BatchNormalization())
add(Conv2D(filters=64,kernel_size=(3,3),padding=‘same’,
激活(='relu'))
添加(BatchNormalization())
model.add(MaxPoolig2D(池大小=(2,2)))
add(Conv2D(filters=128,kernel_size=(3,3),padding=‘same’,
激活(='relu'))
添加(BatchNormalization())
add(Conv2D(filters=128,kernel_size=(3,3),padding=‘same’,
激活(='relu'))
添加(BatchNormalization())
model.add(MaxPoolig2D(池大小=(2,2)))
添加(上采样2D(大小=(2,2)))
add(Conv2D(filters=128,kernel_size=(3,3),padding=‘same’,
激活(='relu'))
添加(BatchNormalization())
add(Conv2D(filters=128,kernel_size=(3,3),padding=‘same’,
激活(='relu'))
添加(BatchNormalization())
添加(上采样2D(大小=(2,2)))
add(Conv2D(filters=64,kernel_size=(3,3),padding=‘same’,
激活(='relu'))
添加(BatchNormalization())
add(Conv2D(filters=64,kernel_size=(3,3),padding=‘same’,
激活(='relu'))
添加(BatchNormalization())
添加(上采样2D(大小=(2,2)))
add(Conv2D(filters=32,kernel_size=(3,3),padding=‘same’,
激活(='relu'))
添加(BatchNormalization())
add(Conv2D(filters=32,kernel_size=(3,3),padding=‘same’,
激活(='relu'))
添加(BatchNormalization())
添加(上采样2D(大小=(2,2)))
add(Conv2D(filters=16,kernel_size=(3,3),padding=‘same’,
激活='relu',输入_形状=(256256,3)))
添加(BatchNormalization())
add(Conv2D(filters=16,kernel_size=(3,3),padding=‘same’,
激活(='relu'))
添加(BatchNormalization())
add(Conv2D(过滤器=1,内核大小=(1,1),激活='sigmoid'))
model.summary()
训练
model.compile(优化器=Adam(lr=0.0001),损耗='binary\u crossentropy',度量=['accurity']))
model_checkpoint=ModelCheckpoint('segmenter_weights.h5',monitor='loss',verbose=1,save_best_only=True)
model.fit(X_-train,Y_-train,validation_-data=(X_-val,Y_-val),批处理大小=4,纪元=200,冗余=1,回调=[PlotLossesCallback(),model_-checkpoint])

哎呀,我做了一个愚蠢的测试。为了查看我从X数组中选择了什么进行测试,我将该数组乘以255,因为PIL不显示0-1范围内的数组。错误地,我只是使用了相同的修改变量,并在测试/预测中传递了它。

如果您的问题是由明显的错误引起的,那么它不太可能有用未来的访问者。为什么不直接删除它呢?好吧。尽管根据我的经验,在这个网站上获得机器学习支持的情况非常罕见。可能是因为需要自己获取数据集、处理数据集并运行培训,而不仅仅是快速查看代码片段。