【问题标题】:Image Similarity Detection using Keras使用 Keras 进行图像相似性检测
【发布时间】:2020-11-07 04:47:34
【问题描述】:

我目前正在尝试制作一个工具来帮助我“清理”图像数据集。我想要的是这个工具能够检测不属于正确类别的图像。例如,如果我正在制作一个飞机照片数据集,但不知何故在其中获得了一张汽车照片,我希望它能够检测到它属于错误的类别。

到目前为止,我的方法是尝试创建一个可以检测 2 个图像是否相似的模型。 为此,我决定为卷积网络提供成对的照片,其中一些来自我标记为 1 的同一类别,而另一些来自不同类别的我标记为 0。

这里有一些例子:

[cat_photo_1, cat_photo_2] --> 1

[cat_photo_1, plane_photo_1] --> 0

[airplane_photo_1, plane_photo_2] --> 1

我意识到我无法使用 Keras Conv2D 和 MaxPooling2D 层,因为我的输入形状是 (2, 150, 150, 3)。所以我决定简单地使用 3D 的,希望它能解决问题。

所以我首先尝试使用这种架构构建我的网络:

model = models.Sequential()
model.add(layers.Conv3D(32, (3, 3, 3), activation='relu', input_shape=(2, 150, 150, 3)))
model.add(layers.MaxPooling3D((2, 2, 2)))
model.add(layers.Conv3D(64, (3, 3, 3), activation='relu'))
model.add(layers.MaxPooling3D((2, 2, 2)))
model.add(layers.Conv3D(64, (3, 3, 3), activation='relu'))
model.add(layers.Flatten())
model.add(layers.Dense(128, activation='relu'))
model.add(layers.Dense(1, activation='sigmoid'))

但是我遇到了多个关于内核和池大小的错误,我完全不明白,所以我只是尝试更改值并设法使其与这些值一起工作:

model = models.Sequential()
model.add(layers.Conv3D(32, (2, 3, 3), activation='relu', input_shape=(2, 150, 150, 3)))
model.add(layers.MaxPooling3D((1, 2, 2)))
model.add(layers.Conv3D(64, (1, 3, 3), activation='relu'))
model.add(layers.MaxPooling3D((1, 2, 2)))
model.add(layers.Conv3D(64, (1, 3, 3), activation='relu'))
model.add(layers.Flatten())
model.add(layers.Dense(128, activation='relu'))
model.add(layers.Dense(1, activation='sigmoid'))

所以我的问题是为什么会这样工作,这是解决我问题的好方法吗?

【问题讨论】:

  • 为什么不能使用图像分类模型两次(在每张图像上)并比较类别?
  • 是的,我认为这种方法是最后的解决方案,但我首先想看看是否可以直接训练一个模型来识别图像之间的相似性。

标签: python tensorflow keras deep-learning


【解决方案1】:

您使用的方法可能不适合您的问题陈述。 最好的办法是使用 Triplet loss 作为损失函数。 像 facenet 这样的论文使用这个损失函数来比较人脸..
但是你可以使用你的图片。

【讨论】:

  • 所以我会向网络提供 3 个图像(输入、正、负)的样本并使用 Triplet Loss 函数?但是我用什么来做标签呢?
  • 1:如果输入和正图像属于同一类别,0:如果输入和正图像属于不同类别......
猜你喜欢
  • 2017-04-01
  • 1970-01-01
  • 2014-10-03
  • 2017-12-10
  • 2014-09-29
  • 2012-07-17
  • 2011-04-16
  • 2018-05-14
  • 1970-01-01
相关资源
最近更新 更多