Python NN - 尝试创建人脸分类(区分不同的人脸)但效果不佳
Python NN - Trying to create face classification ( diffrentiate between diffrent faces ) but getting poor results
我正在尝试创建一个神经网络,它将获取 PersonA 和 PersonB 等的两张或多张面孔...并将识别每张面孔的人名。
比如NN得到那些图片:
1
2
NN 会说 - 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)
( 模型之前的几行只是从数据集中拍摄一张照片并给她一个自定义图片名称的数字,假设这是一张谢尔顿的照片,而不是她所说的输出 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')
])
我在您的代码中看到的唯一明显缺陷是您只有 运行 一个纪元。将 epochs
设置为喜欢 10、20 或您有足够耐心的任何数量。
可能有帮助的事情:
- 制作更深的网络(添加更多层)
- 增加神经元数量(对于 150x150x3 输入形状,你的神经元数量相当小)
我正在尝试创建一个神经网络,它将获取 PersonA 和 PersonB 等的两张或多张面孔...并将识别每张面孔的人名。
比如NN得到那些图片:
1 2
NN 会说 - 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)
( 模型之前的几行只是从数据集中拍摄一张照片并给她一个自定义图片名称的数字,假设这是一张谢尔顿的照片,而不是她所说的输出 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')
])
我在您的代码中看到的唯一明显缺陷是您只有 运行 一个纪元。将 epochs
设置为喜欢 10、20 或您有足够耐心的任何数量。
可能有帮助的事情:
- 制作更深的网络(添加更多层)
- 增加神经元数量(对于 150x150x3 输入形状,你的神经元数量相当小)