当前位置: 首页 > 知识库问答 >
问题:

我想不出解决这个图像分割问题的办法

姜奇
2023-03-14

我的训练图像是由一些拼接图像的ELAs(Error Level Analysis)中提取的蓝色通道组成的,标签只是它们对应的地面真值掩码。

我已经构造了一个简单的编码器-解码器CNN下面给出做分割,并在细胞膜分割任务上测试了它。在那里它的表现很好,并且创建了接近地面的真实图像,所以我猜我创建的神经网络是足够的能力。

但是,它不能在CASIA1+CASIA1GroundTruth数据集上的拼接图像上工作。请帮助我修复它,我已经花了太多天在它上尝试不同的架构和预处理的图像,但没有运气。

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

def process(img):
    img=img.getchannel('B')
    return img

for i in splicedIMG:
  img=process(Image.open('ELAs/'+str(i)))
  X.append(np.array(img)/np.max(img))

for i in splicedGT:
  lbl=Image.open('SGTResized/'+str(i))
  Y.append(np.array(lbl)/np.max(lbl))

X = np.array(X)
Y = np.array(Y)

X = X.reshape(-1, 256,256, 1)
Y = Y.reshape(-1, 256,256, 1)

X_train, X_val, Y_train, Y_val = train_test_split(X, Y, test_size = 0.2)
model = Sequential()

model.add(Conv2D(filters = 16, kernel_size = (3,3),padding = 'same', 
                 activation ='relu', input_shape = (256,256,1)))
model.add(BatchNormalization())
model.add(Conv2D(filters = 16, kernel_size = (3,3),padding = 'same', 
                 activation ='relu'))
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2,2)))

model.add(Conv2D(filters = 32, kernel_size = (3,3),padding = 'same', 
                 activation ='relu'))
model.add(BatchNormalization())
model.add(Conv2D(filters = 32, kernel_size = (3,3),padding = 'same', 
                 activation ='relu'))
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2,2)))

model.add(Conv2D(filters = 64, kernel_size = (3,3),padding = 'same', 
                 activation ='relu'))
model.add(BatchNormalization())
model.add(Conv2D(filters = 64, kernel_size = (3,3),padding = 'same', 
                 activation ='relu'))
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2,2)))

model.add(Conv2D(filters = 128, kernel_size = (3,3),padding = 'same', 
                 activation ='relu'))
model.add(BatchNormalization())
model.add(Conv2D(filters = 128, kernel_size = (3,3),padding = 'same', 
                 activation ='relu'))
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2,2)))

model.add(UpSampling2D(size = (2,2)))
model.add(Conv2D(filters = 128, kernel_size = (3,3),padding = 'same', 
                 activation ='relu'))
model.add(BatchNormalization())
model.add(Conv2D(filters = 128, kernel_size = (3,3),padding = 'same', 
                 activation ='relu'))
model.add(BatchNormalization())

model.add(UpSampling2D(size = (2,2)))
model.add(Conv2D(filters = 64, kernel_size = (3,3),padding = 'same', 
                 activation ='relu'))
model.add(BatchNormalization())
model.add(Conv2D(filters = 64, kernel_size = (3,3),padding = 'same', 
                 activation ='relu'))
model.add(BatchNormalization())

model.add(UpSampling2D(size = (2,2)))
model.add(Conv2D(filters = 32, kernel_size = (3,3),padding = 'same', 
                 activation ='relu'))
model.add(BatchNormalization())
model.add(Conv2D(filters = 32, kernel_size = (3,3),padding = 'same', 
                 activation ='relu'))
model.add(BatchNormalization())

model.add(UpSampling2D(size = (2,2)))
model.add(Conv2D(filters = 16, kernel_size = (3,3),padding = 'same', 
                 activation ='relu', input_shape = (256,256,3)))
model.add(BatchNormalization())
model.add(Conv2D(filters = 16, kernel_size = (3,3),padding = 'same', 
                 activation ='relu'))
model.add(BatchNormalization())

model.add(Conv2D(filters = 1, kernel_size = (1,1), activation = 'sigmoid'))

model.summary()
model.compile(optimizer = Adam(lr = 0.0001), loss = 'binary_crossentropy', metrics = ['accuracy'])

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), batch_size=4, epochs=200, verbose=1, callbacks=[PlotLossesCallback(),model_checkpoint])

共有1个答案

方砚
2023-03-14

哎呀,我做了一个傻事。为了查看我从X数组中提取的测试内容,我将该数组乘以255,因为PIL不显示0-1范围内的数组。错误的是,我只是使用了相同的修改变量,并在测试/预测中通过了它。

 类似资料:
  • 启动错误 ApplicationContext.若要显示条件报告,请在启用“调试”的情况下重新运行应用程序。2019-10-17 15:44:43.968错误10460--[main]O.S.Boot.SpringApplication:应用程序运行失败 我的pom.xml:

  • 本文向大家介绍Mysql闪退问题图文解决办法,包括了Mysql闪退问题图文解决办法的使用技巧和注意事项,需要的朋友参考一下 之前在使用MySQL 5.5 Command Line Client时, 无论输入什么密码,都出现闪退的情况,后来查找资料才发现原来是之前使用360时,将mysql服务给关了,现将解决办法总结如下: 1.桌面找到计算机-->右键选择管理; 2.在管理页面点击服务,展开服务项;

  • 我正试图在Android Studio上调试我的项目——一个非常简单的东西——hello world。我得到这个信息: "安装未成功。应用程序无法安装:INSTALL_FAILED_MISSING_SHARED_LIBRARY apk列表:[0]'C:\Users\Pierr\AndroidStudioProjects\Hello\app\build\outputs\apk\debug\app d

  • 本文向大家介绍Android 出现问题Installation error: INSTALL_FAILED_CONFLICTING_PROVIDER解决办法,包括了Android 出现问题Installation error: INSTALL_FAILED_CONFLICTING_PROVIDER解决办法的使用技巧和注意事项,需要的朋友参考一下 Android 出现问题Installation e

  • 本文向大家介绍解决seaborn在pycharm中绘图不出图的问题,包括了解决seaborn在pycharm中绘图不出图的问题的使用技巧和注意事项,需要的朋友参考一下 如下所示: 在代码最后加上plt.show( )即可。 以上这篇解决seaborn在pycharm中绘图不出图的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持呐喊教程。

  • 给出一个由N个整数a组成的序列,用a[1],a[2]….a[N]表示。序列中的每个整数都有一个与其相关联的值W[1],W[2]……。W[N]。你必须选择给定数组a的一个子序列,使a中的所有元素都是严格递增的,并且在这个选定的子序列中元素的值之和是最大的。你必须打印这个最大值。 样本输入 我因为对比关系而变得很虚弱 约束1<=T<=51<=N<=2000001<=a[i]<=10^9,其中i∈[1.