首页 > 解决方案 > 使用 Keras 进行图像相似性检测

问题描述

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

到目前为止,我的方法是尝试创建一个可以检测 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'))

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

标签: pythontensorflowkerasdeep-learning

解决方案


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


推荐阅读