加载人脸检测器和编码器:
检测器:使用基于Caffe的DL人脸检测器来定位图像中的人脸。
编码器:模型基于Torch,负责通过深度学习特征提取来提取人脸编码。
接下来,让我们抓取图像路径并执行初始化。
遍历 imagePaths。从路径中提取人名。
构造了一个 blob。
然后,通过将 imageBlob 通过检测器网络来检测图像中的人脸。
检测列表包含定位图像中人脸的概率和坐标。
假设我们至少有一个检测,将进入 if 语句的主体。
假设图像中只有一张脸,因此提取具有最高置信度的检测并检查以确保置信度满足用于过滤弱检测的最小概率阈值。
假设已经达到了这个阈值,提取面部 ROI 并抓取/检查尺寸以确保面部 ROI 足够大。
然后,我们将利用编码器 并提取人脸编码。
继续构建另一个 blob。
随后,将 faceBlob 通过编码器 。 这会生成一个 128 维向量 (vec) 来描述面部。
然后我们简单地将名称和嵌入 vec 分别添加到 knownNames 和 knownEmbeddings 中。
继续循环图像、检测人脸并为数据集中的每个图像提取人脸编码的过程。
循环结束后剩下的就是将数据转储到磁盘。
运行结果:
loading face detector…
loading face recognizer…
quantifying faces…
processing image 1/19
processing image 2/19
processing image 3/19
processing image 4/19
processing image 5/19
processing image 6/19
processing image 7/19
processing image 8/19
processing image 9/19
processing image 10/19
processing image 11/19
processing image 12/19
processing image 13/19
processing image 14/19
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