【问题标题】:Python NN - Trying to create face classification ( diffrentiate between diffrent faces ) but getting poor resultsPython NN - 尝试创建人脸分类(区分不同的人脸)但结果不佳
【发布时间】:2020-04-28 21:46:27
【问题描述】:

我正在尝试创建一个神经网络,该网络将获取 PersonA 和 PersonB 的两张或多张面孔等...并识别每个面孔的人名。

例如神经网络得到那些图片:

1 2

神经网络会说 - 1 是谢尔顿,2 是伦纳德。

所以我做了以下代码 -

import numpy as np
import tensorflow as tf
from pathlib import Path
import cv2
from random import shuffle

X = []
Y = []
NAMES = {

}
i = 0
for filename in Path('data').rglob('*.jpg'):
    i += 1
    img = cv2.imread(str(filename), cv2.IMREAD_UNCHANGED)
    resized = cv2.resize(img, (150, 150), interpolation=cv2.INTER_AREA)
    X.append(np.asarray(resized))
    thisName = str(filename).split("_")[0].split("\\")[1]
    if i == 1:
        NAMES[thisName] = 0
    if thisName in NAMES.keys():
        Y.append(np.asarray(NAMES[thisName]))
    else:
        print(NAMES.values())
        NAMES[thisName] = max(NAMES.values()) + 1
        Y.append(np.asarray(NAMES[thisName]))
Z = list(zip(X, Y))
shuffle(Z)  # WE SHUFFLE X,Y TO PERFORM RANDOM ON THE TEST LEVEL
X, Y = zip(*Z)

X = np.asarray(X)
Y = np.asarray(Y)

model = tf.keras.models.Sequential([
    tf.keras.layers.Conv2D(16, (3, 3), activation='relu', input_shape=(150, 150, 3)),
    tf.keras.layers.MaxPooling2D(2, 2),
    tf.keras.layers.Conv2D(32, (3, 3), activation='relu'),
    tf.keras.layers.MaxPooling2D(2, 2),
    tf.keras.layers.Conv2D(64, (3, 3), activation='relu'),
    tf.keras.layers.MaxPooling2D(2, 2),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(1024, activation='relu'),
    tf.keras.layers.Dense(7, activation='softmax', name='pred')

])
model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])
# -------------- OUR TENSOR FLOW NEURAL NETWORK MODEL -------------- #
print("fitting")
history = model.fit(X, Y, epochs=1, batch_size=20)
print("testing")
model.evaluate(X, Y)

( 模型之前的行只是为了从数据集中拍摄一张照片并给她一个自定义图片名称的数字,假设这是一张 Sheldon 的照片,而不是她作为输出 0并将图像作为自己的输入...)

我拿了这个:test + training data,并且在我安装它之后我已经在上面测试了模型,但不幸的是,我没有得到 90% 的例外结果,我只得到了 25%。

我做错了吗?

非常感谢,对不起我的英语

编辑:我的数据集看起来不错,除了 penny 的图片(但它应该不会影响太大)

编辑 2:在我添加了一些 conv2d 后,我得到了 75% 而不是 25%,我仍然想要更多,但它绝对更好

这是我的新模型:

model = tf.keras.models.Sequential([
    tf.keras.layers.Conv2D(64, (3, 3), activation='relu', input_shape=(150, 150, 3)),
    tf.keras.layers.MaxPooling2D(2, 2),
    tf.keras.layers.Conv2D(128, (3, 3), activation='relu'),
    tf.keras.layers.MaxPooling2D(2, 2),
    tf.keras.layers.Conv2D(256, (3, 3), activation='relu'),
    tf.keras.layers.MaxPooling2D(2, 2),
    tf.keras.layers.Conv2D(512, (3, 3), activation='relu'),
    tf.keras.layers.MaxPooling2D(2, 2),
    tf.keras.layers.Conv2D(1024, (3, 3), activation='relu'),
    tf.keras.layers.MaxPooling2D(2, 2),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(2048, activation='relu'),
    tf.keras.layers.Dense(7, activation='softmax', name='pred')

])

【问题讨论】:

  • 我认为您应该考虑添加更多Conv2D 层以进行有效的特征提取。
  • @ShubhamPanchal 谢谢,我会试试的
  • @ShubhamPanchal 哇,我做到了,它从 25% 变成了 63%,非常感谢男孩

标签: python tensorflow image-processing neural-network face-recognition


【解决方案1】:

我在您的代码中看到的唯一明显缺陷是您只运行了一个 epoch。将epochs 设置为喜欢 10、20 或您有足够耐心的任何数量。

可能有帮助的事情:

  • 制作更深的网络(添加更多层)
  • 增加神经元的数量(对于 150x150x3 输入形状,你的神经元非常小)

【讨论】:

  • 嗨,我会尝试这些时代,但你能看看我的 EDIT2 看看你是不是这个意思?
  • 顺便说一下,我只做了 1 个 epoch,因为在第一个 epoch 之后,拟合堆栈 100% 准确
  • 如果您在训练集上有 100% 而不是在测试集上,则应该使用训练和验证集。在fit() 中包含validation_split=.2,您将更好地了解您的实际模型性能。如果你在训练集上有 100% 但在测试集上有 75%,那么你就过拟合了
猜你喜欢
  • 2020-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-31
  • 2011-09-14
  • 2014-05-23
  • 2018-06-30
  • 2019-11-18
相关资源
最近更新 更多