我建议您使用自动编码器进行降维。自动编码器是具有沙漏形状的神经网络,旨在学习数据的压缩表示。您可以先在已有的数据上对其进行训练,然后使用它一次提取压缩表示。在您的情况下,您需要一个带有卷积层的自动编码器,因为您需要处理像素数据。
一旦你训练得足够好,你就可以从你的流中一个一个地生成每个图像的表示。您可以一次加载一个而不会出现内存问题。每次生成压缩表示时,都可以将其与以前的表示进行比较。来自同一个人的两张照片最终会在潜在压缩空间中彼此非常相似。或者,您甚至可以训练一个简单的分类器来为您进行匹配(例如,如果您想匹配两张同一张脸但转向相反方向的图片,这可能特别有用)。
互联网和 GitHub 上有很多 Autoencoder 作品。在这里,我为 Python + TensorFlow 2 中的前馈编写了一个简单的教程。在您的情况下,您需要它的卷积版本。您的 Encoder 部分将需要 2D Conv 层,而 Decoder 将需要一个逆操作,可以使用 Upsampling 层或 Transpose Conv 层来完成(我已经看过这两种实现,这是对两者的解释以及如何使用它们) .
中的自动编码器模型tensorflow.keras看起来像这样:
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Input, Dense, Conv2D, MaxPooling2D, UpSampling2D
autoencoder = Sequential([
# Encoder
Conv2D(16, (3, 3), input_shape=(28,28,1) activation='relu', padding='same'),
MaxPooling2D((2, 2), padding='same'),
Conv2D(8, (3, 3), activation='relu', padding='same'),
MaxPooling2D((2, 2), padding='same'),
Conv2D(8, (3, 3), activation='relu', padding='same'),
MaxPooling2D((2, 2), padding='same'), # This is the compressed representation
# Decoder
Conv2D(8, (3, 3), activation='relu', padding='same'),
UpSampling2D((2, 2)),
Conv2D(8, (3, 3), activation='relu', padding='same'),
UpSampling2D((2, 2)),
Conv2D(16, (3, 3), activation='relu'),
UpSampling2D((2, 2)),
Conv2D(1, (3, 3), activation='sigmoid', padding='same')
])
这是我从这篇 Keras 博客文章中获取的带有上采样层的稍微修改的版本。或者,可以在此处找到带有 Conv Traspose 层的版本。
PS:看看这篇关于在手写数字中查找对齐的文章。不完全是您的问题,但有丰富的类比恕我直言。