【发布时间】:2020-04-28 21:46:27
【问题描述】:
我正在尝试创建一个神经网络,该网络将获取 PersonA 和 PersonB 的两张或多张面孔等...并识别每个面孔的人名。
例如神经网络得到那些图片:
神经网络会说 - 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