首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >给定坐标数据的图像分割

给定坐标数据的图像分割
EN

Stack Overflow用户
提问于 2022-05-26 04:01:53
回答 1查看 210关注 0票数 0

我有一堆图像数据和相应的坐标数据,把图像分成几个部分,假设有A,B,C和D部分,每个图像的这些部分位于不同的位置。我试图建立一个模型来训练他们,然后预测图像将正确地对应于这四个部分中的每一个。

我的想法是先进行图像分割,然后再进行图像分类。

那么,如何使用给定的坐标数据进行图像分割,以及应该使用什么模型和方法(如果使用PyTorch)?

提前感谢

EN

回答 1

Stack Overflow用户

发布于 2022-05-26 09:03:45

最近,我正在阅读Francois的“用Python进行深度学习”一书。

这是他在宠物数据集中应用tensorflow图像分割的笔记本(抱歉,不是Py手电筒,但概念可能有用)。

https://github.com/fchollet/deep-learning-with-python-notebooks/blob/master/chapter09_part01_image-segmentation.ipynb

总之,您将需要一个包含您的图像的文件夹,以及一个包含图像分割掩码(也包括图像)的文件夹。例如,掩码上的每个像素可以是0、1或2。所以,如果你要用matplotlib来可视化它(当你乘以127,你要么是黑色(0),127 (灰色),或者254 (接近白色))。图像中的每一个像素都应该是0-1之间的值,你会在神经网络中看到我们是如何用254除以比例的。

你的神经网络的逻辑如下:

  • Conv2D操作用于转换数据,找到有用的特性。最初的几个堆栈将找到基本的东西,如垂直和水平边缘。然后,更深层次将开始识别更有意义的表示,例如,它可以是眼睛、脸、耳朵。
  • --转换不是预先定义的,这些实际上是未知的(权重),模型将自己计算出来。
  • ,因为会有大量的参数我们倾向于向下采样,以防止过度拟合。在图像分类中,我们倾向于使用MaxPooling,但在图像分割中,您希望使用大步。这是因为MaxPooling倾向于破坏空间信息(您正在获取大量的值网格并将其转换为一个值,从而积极地删除信息。对于对象检测/图像分割任务来说,大步是更好的。) compression).
  • However
  • 这些层的输出代表了图像的大块,并且减少了特征的数量(有点像

,因为我们想预测图像分割中的每个像素的类别,我们需要返回到输入图像的原始形状。因此,您将有一个新的卷积层堆栈,它与压缩相反,以便返回到原始图像大小。

希望以上研究能提供一些基本的理论依据。

在高层次上,您需要构建一个遵循以下一般原则的神经网络:

你会有两层关键的层。

第一个堆栈如下:

  • 与padding=same一起使用conv2d层(其中一些层有一个stide=2来降低样本)

这可能如下所示:

代码语言:javascript
复制
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)

第二层层与上面的层相反。由于在图像分类中,每个像素都属于一个类,所以我们现在尝试返回图像的原始形状大小,而不是“压缩”。

代码语言:javascript
复制
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函数,因为您在多个输出之间进行分类,如下所示:

代码语言:javascript
复制
outputs = layers.Conv2D(num_classes, 3, activation="softmax", 
padding="same")(x)    
model = keras.Model(inputs, outputs)
return model

最后,如果性能不像预期的那样,剩余块和批处理规范化是可以帮助改进模型的两个关键因素,但我不会在本文中介绍它。

我最好的建议是通过一个在线的例子,或者我上面提供的例子来帮助在一些新的数据上复制它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72386541

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档