我有一堆图像数据和相应的坐标数据,把图像分成几个部分,假设有A,B,C和D部分,每个图像的这些部分位于不同的位置。我试图建立一个模型来训练他们,然后预测图像将正确地对应于这四个部分中的每一个。
我的想法是先进行图像分割,然后再进行图像分类。
那么,如何使用给定的坐标数据进行图像分割,以及应该使用什么模型和方法(如果使用PyTorch)?
提前感谢
发布于 2022-05-26 09:03:45
最近,我正在阅读Francois的“用Python进行深度学习”一书。
这是他在宠物数据集中应用tensorflow图像分割的笔记本(抱歉,不是Py手电筒,但概念可能有用)。
总之,您将需要一个包含您的图像的文件夹,以及一个包含图像分割掩码(也包括图像)的文件夹。例如,掩码上的每个像素可以是0、1或2。所以,如果你要用matplotlib来可视化它(当你乘以127,你要么是黑色(0),127 (灰色),或者254 (接近白色))。图像中的每一个像素都应该是0-1之间的值,你会在神经网络中看到我们是如何用254除以比例的。
你的神经网络的逻辑如下:
,因为我们想预测图像分割中的每个像素的类别,我们需要返回到输入图像的原始形状。因此,您将有一个新的卷积层堆栈,它与压缩相反,以便返回到原始图像大小。
希望以上研究能提供一些基本的理论依据。
在高层次上,您需要构建一个遵循以下一般原则的神经网络:
你会有两层关键的层。
第一个堆栈如下:
这可能如下所示:
def get_model(img_size, num_classes):
inputs = keras.Input(shape=img_size + (3,))
x = layers.Rescaling(1./255)(inputs)
x = layers.Conv2D(64, 3, strides=2, activation="relu", padding="same")(x)
x = layers.Conv2D(64, 3, activation="relu", padding="same")(x)
x = layers.Conv2D(128, 3, strides=2, activation="relu", padding="same")(x)
x = layers.Conv2D(128, 3, activation="relu", padding="same")(x)
x = layers.Conv2D(256, 3, strides=2, padding="same", activation="relu")(x)
x = layers.Conv2D(256, 3, activation="relu", padding="same")(x)第二层层与上面的层相反。由于在图像分类中,每个像素都属于一个类,所以我们现在尝试返回图像的原始形状大小,而不是“压缩”。
x = layers.Conv2DTranspose(256, 3, activation="relu", padding="same")(x)
x = layers.Conv2DTranspose(256, 3, activation="relu", padding="same", strides=2)(x)
x = layers.Conv2DTranspose(128, 3, activation="relu", padding="same")(x)
x = layers.Conv2DTranspose(128, 3, activation="relu", padding="same", strides=2)(x)
x = layers.Conv2DTranspose(64, 3, activation="relu", padding="same")(x)
x = layers.Conv2DTranspose(64, 3, activation="relu", padding="same", strides=2)(x)最后,您将应用softmax函数,因为您在多个输出之间进行分类,如下所示:
outputs = layers.Conv2D(num_classes, 3, activation="softmax",
padding="same")(x)
model = keras.Model(inputs, outputs)
return model最后,如果性能不像预期的那样,剩余块和批处理规范化是可以帮助改进模型的两个关键因素,但我不会在本文中介绍它。
我最好的建议是通过一个在线的例子,或者我上面提供的例子来帮助在一些新的数据上复制它。
https://stackoverflow.com/questions/72386541
复制相似问题