我对深度学习还是个新手。所以,我试图运行OpenCV来捕获帧并将这些帧传递给我训练过的模型。模型所需的输入维度为(48,48,1)。
模型的第一层:
model.add(Conv2D(input_shape=(48,48,1),filters=64,kernel_size=(3,3),padding="same", activation="relu"))
我正在尝试转换OpenCV帧输入以适应模型的尺寸。然而,我试图使用cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
和调整大小,但输出维度是(48,48)只有
我尝试了下面显示的另一种方法,但输出是(48,48,3),然后在添加轴以便能够将其传递给模型后,输出维度是(1,48,48,3)
coverted_image= cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
faces_detected = face_haar_cascade.detectMultiScale(coverted_image)
#Draw Triangles around the faces detected
for (x,y,w,h) in faces_detected:
cv2.rectangle(frame,(x,y), (x+w,y+h), (255,0,0))
roi_gray=frame[y:y+w,x:x+h]
roi_gray=cv2.resize(roi_gray,(48,48))
image_pixels = tf.keras.preprocessing.image.img_to_array(roi_gray)
print(image_pixels.shape)
image_pixels = np.expand_dims(image_pixels, axis = 0)
print(image_pixels.shape)
image_pixels /= 255
print(image_pixels.shape)
我如何将输入的形状调整为(48,48,1)以能够从模型中获得预测?
openCV图像只是numpy数组,所以它们可以很容易地使用numpy命令进行操作。
例如:
import numpy as np
x = np.array(range(48*48)).reshape(48,48)
x.shape
48岁的(48)
x = x.reshape(48,48,1)
x.shape
(48,48,1)
你应该做的是:
检测面临
首先,必须像前面那样使用face_haar_cascade来检测并裁剪face部分。这给你一个大小为(n,x,y,c,m)的数据集,其中n对应于检测到的面数,x,y是像素坐标,c &;是图像通道的数量,在本例中为3 (rgb格式),m是一个大小为nx1的向量,它包含了人脸所属的类。
在Keras中使用FaceNet进行人脸嵌入
FaceNet是一个系统,给定一张人脸图像,从人脸中提取高质量的特征,并预测这些特征的128个元素向量表示,称为人脸嵌入。如果你只想要48个特征,我建议使用特征选择算法,比如relief。应用此方法后,您将得到一个维度(n,128,m)的数组,n是要分类的人数,128是特征的数量(可约为48),m是指人脸所属的类向量。假设您有48张图片,那么数组的大小将是(48,48,1)。在此之后,您必须应用预处理步骤,例如规范化数据和删除异常值。之后,您可以应用任何模型。
我做面部嵌入的方法如下:
# calculate a face embedding for each face in the dataset using facenet
from numpy import load
from numpy import expand_dims
from numpy import asarray
from numpy import savez_compressed
from keras.models import load_model
# get the face embedding for one face
def get_embedding(model, face_pixels):
# scale pixel values
face_pixels = face_pixels.astype('float32')
# standardize pixel values across channels (global)
mean, std = face_pixels.mean(), face_pixels.std()
face_pixels = (face_pixels - mean) / std
# transform face into one sample
samples = expand_dims(face_pixels, axis=0)
# make prediction to get embedding
yhat = model.predict(samples)
return yhat[0]
# load model
model=load_model("/<path to the folder where the model is>/facenet_keras.h5")
# load the face dataset
data = load('/<path to the folder where the dataset of detected and cropped faces is stored>/FacesDetected.npz')
trainX,trainy = data['arr_0'], data['arr_1']
# convert each face in the train set to an embedding
newTrainX = list()
for face_pixels in trainX:
embedding = get_embedding(model, face_pixels)
newTrainX.append(embedding)
newTrainX = asarray(newTrainX)
# save arrays to one file in compressed format
savez_compressed('<path to the folder where you want to save the face embeddings>/FacesEmbeddings.npz', newTrainX, trainy)
我建议你看看这篇文章:https://machinelearningmastery.com/how-to-develop-a-face-recognition-system-using-facenet-in-keras-and-an-svm-classifier/