python - 使用 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'))
所以我的问题是为什么会这样工作,这是解决我问题的好方法吗?
解决方案
您使用的方法可能不适合您的问题陈述。最好的办法是使用Triplet 损失作为损失函数。像 facenet 这样的纸使用这个损失函数来比较人脸。
但是你可以使用你的图像。
推荐阅读
- function - 一次调用一个序列中的所有元素的函数xquery
- c++ - 返回数据类型的函数 const 含义
- javascript - 在 if 语句中使用 Fetch 响应
- python - 如何将夹具返回的值作为参数传递给函数
- c++ - 我可以减少此 c++ 代码中的内存使用吗?
- laravel - Laravel 环境和邮件信息
- java - Android Studio 上的电子邮件和密码身份验证问题
- python - 使用 pywt 的连续 morlet 小波变换
- python - 为什么当前目录中的python脚本需要./才能用shebang执行?
- r - 用于 Shiny 应用程序的 renderPlot() 中的 if/ifelse 语句(初级)