【问题标题】:Single class image recognition with TensorFlow and Keras使用 TensorFlow 和 Keras 进行单类图像识别
【发布时间】:2020-09-04 15:29:01
【问题描述】:

所以,假设我有一个包含我自己照片的数据集。而我想做的是训练一个神经网络,这样它就可以识别给定图像上是否是我。

但是要训练一个神经网络,我必须至少有 2 个类,所以我必须有我自己的照片(我已经有),我还必须有“不是我自己”的照片,我没有知道该怎么做。

那么,我想知道的是,“不是我”的照片是什么?那只是不包含我的随机照片吗,因为我已经尝试过了,但它不起作用。

现在,我知道在 stackoverflow 上有类似的问题,但没有答案,这将帮助我解决我的问题。

这里有一些代码:

我使用预训练模型来更好地识别图像:

pre_trained_model = InceptionV3(input_shape = (150, 150, 3), 
                                include_top = False, 
                                weights = None)

pre_trained_model.load_weights('img_model.h5')
for layer in pre_trained_model.layers:
    layer.trainable = False
    
last_layer = pre_trained_model.get_layer('mixed7')
last_output = last_layer.output

还有我的模型声明:

# Flatten the output layer to 1 dimension
x = layers.Flatten()(last_output)
# Add a fully connected layer with 1,024 hidden units and ReLU activation
x = layers.Dense(1024, activation='relu')(x)
# Add a dropout rate of 0.2
x = layers.Dropout(0.2)(x)
# Add a final sigmoid layer for classification
x = layers.Dense(1, activation='sigmoid')(x)

model = Model( pre_trained_model.input, x) 

model.compile(optimizer = RMSprop(lr=0.0001), 
              loss = 'binary_crossentropy', 
              metrics = ['accuracy'])

我在这里训练我的模型:

history = model.fit(
            train_generator,
            validation_data = validation_generator,
            epochs = 2,
            verbose = 2)

最后,我自己测试网络:

img = image.load_img('imgs/some_img_of_me.jpg', target_size=(150, 150))
x = image.img_to_array(img)
x = np.expand_dims(x, axis=0)

classes = model.predict(x)
print(classes)

这是上面代码的结果:

[[0.]]

问题是模型总是返回[[0.]],不管给定图像上是否是我。

所以我想知道:

  • 如何解决我的问题
  • 我是否应该使用神经网络,也许还有另一种不涉及它们的解决方案
  • 在我的智能手机上我也有这个智能锁功能 - 当我想解锁我的智能手机时,它只会识别我的脸。所以看来我的问题的解决方案是存在的。

【问题讨论】:

  • 几个cmets: 1. 不涉及某种形式的神经网络,通常很难做任何图像分类问题。 2. 看起来你没有使用卷积层,这通常对图像分类很有用。 3. 我觉得用别人的照片来代替“不是你”的照片是个不错的选择。否则我不确定为什么你的模型总是返回 0,但值得检查一下你正在训练它与“你”有多少“不是你”的图片。如果你使用太多一个,神经网络通常最终只会预测那个结果。
  • 抱歉,发的太早了……我剩下的 cmets 都在里面了
  • 谢谢!你解释了很多! “我觉得用其他人的照片来代替‘不是你’的照片是一个不错的选择”,我也想过,我也使用了我的预训练模型中的卷积层。
  • 你应该创建一个答案,这样我就可以投票了。再次感谢。特别是对于这个:“如果你使用太多一个,神经网络通常最终只会预测那个结果。”,因为我遇到了这个确切的问题。

标签: python tensorflow machine-learning keras neural-network


【解决方案1】:

首先,人脸识别不作为常规分类问题处理。

最初,您可能有一万张包含数千个身份的照片。这是一个常规的分类解决方案。这意味着您的神经网络应该有数千个输出节点。输出中的每个节点都代表一个身份。假设您输入马特达蒙的图像。对于 is_matt_damon 节点,该实例的输出应为 1,其他节点应为 0。这样,您将针对一万个实例训练您的神经网络。

当训练结束时,网络的最后一层将被丢弃。这样,早期的层就代表了图像。我的意思是,即使你在训练中没有喂给莱昂纳多·迪卡普里奥的照片,神经网络也会在早期层返回一系列输出。这称为表示。

当您输入两张不同的迪卡普里奥照片时,您将获得两种不同的表现形式。预计这两种表示应该具有较低的距离。同样,如果你喂给马特达蒙和迪卡普里奥这对,那么表示应该有很长的距离。

欧几里得距离或余弦相似度可用于查找表示(或向量)之间的距离。

【讨论】:

    【解决方案2】:

    在没有神经网络的情况下进行任何图像识别都是极其困难的,所以在这方面,你做对了。

    但是,对于大多数图像识别问题,卷积层是一个聪明的想法,因为它们最初是为了模拟连接到视神经的神经通路而创建的。此外,有必要检查一下你为神经网络提供了多少“你”和“不是你”,否则网络通常最终只能预测一个类别。

    除了一些其他随机的东西之外,“不是你”图像的一个不错的选择是拥有不是你的人的照片。

    【讨论】:

    • 所以我想我会用 50/50 来表示“我”和“不是我”。我稍后会尝试并检查结果。
    猜你喜欢
    • 1970-01-01
    • 2016-04-14
    • 1970-01-01
    • 2019-08-08
    • 2017-08-30
    • 2019-09-21
    • 2019-07-06
    • 2021-06-17
    • 1970-01-01
    相关资源
    最近更新 更多