processing image 15/19
processing image 16/19
processing image 17/19
processing image 18/19
processing image 19/19
serializing 19 encodings…
Process finished with exit code 0
===================================================================
已经为每张脸提取了 128 维编码——但是我们如何根据这些嵌入来识别一个人呢?
答案是我们需要在嵌入之上训练一个“标准”机器学习模型(例如 SVM、k-NN 分类器、随机森林等)。
今天我们使用SVM实现
打开 train_face.py 文件并插入以下代码:
from sklearn.preprocessing import LabelEncoder
from sklearn.svm import SVC
import pickle
embeddings_path=‘output/embeddings.pickle’
recognizer_path=‘output/recognizer.pickle’
lable_path=‘output/le.pickle’
加载编码模型
print(“[INFO] loading face embeddings…”)
data = pickle.loads(open(embeddings_path, “rb”).read())
给label编码
print(“[INFO] encoding labels…”)
le = LabelEncoder()
labels = le.fit_transform(data[“names”])
训练用于接受人脸 128-d 嵌入的模型,然后产生实际的人脸识别
recognizer = SVC(C=1.0, kernel=“linear”, probability=True)
recognizer.fit(data[“embeddings”], labels)
保存模型
f = open(recognizer_path, “wb”)
f.write(pickle.dumps(recognizer))
f.close()
保存lable
f = open(lable_path, “wb”)
f.write(pickle.dumps(le))
f.close()
导入包和模块。 我们将使用 scikit-learn 的支持向量机 (SVM) 实现,这是一种常见的机器学习模型。
定义变量。
-
embeddings_path:序列化编码。
-
recognizer_path:这将是我们识别人脸的输出模型。 它基于 SVM。
-
lable_path:标签编码器输出文件路径
加载编码。
然后初始化 scikit-learn LabelEncoder 并编码名称标签。
训练模型。本文使用的是线性支持向量机 (SVM),但如果您愿意,您可以尝试使用其他机器学习模型进行试验。
训练模型后,我们将模型和标签编码器保存到电脑上。
运行train_face.py 脚本。
===================================================================
新建脚本文件recognize_face.py,插入一下代码:
import numpy as np
import pickle
import cv2
import os
导入包,然后我们需要新增一个resize方法。
def resize(image, width=None, height=None, inter=cv2.INTER_AREA):
dim = None
(h, w) = image.shape[:2]
如果高和宽为None则直接返回
if width is None and height is None:
return image
检查宽是否是None
if width is None:
计算高度的比例并并按照比例计算宽度
r = height / float(h)
dim = (int(w * r), height)
高为None
else:
计算宽度比例,并计算高度
r = width / float(w)
dim = (width, int(h * r))
resized = cv2.resize(image, dim, interpolation=i