使用Keras的图像相似性检测



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

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

以下是一些例子:

[cat_photo_1,cat_photo_2]->1

[cat_photo_1,airplane_photo_1]->0

[airplane_photo_1,airplane_photo_2]->1

我意识到我将无法使用Keras Conv2D和MaxPooling2D层,因为我的输入形状是(2150150,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'))

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

您使用的方法可能不适合您的问题陈述。最好的方法是使用Triplet loss作为损失函数。像纸一样的脸网使用这个损失函数来比较脸
但是您可以使用您的图像。

最新更新