准备工作
1)在我们的环境中安装scikit-learn,一个机器学习库
pip install scikit-learn
疑问
1)我们已经为每张脸提取了128-d嵌入 - 但是我们如何根据这些嵌入实际识别出一个人呢?
答案是我们需要在嵌入之上训练“标准”机器学习模型(例如SVM,k-NN分类器,随机森林等)。
2)从那里我们解析命令行参数:
- - embeddings :序列化嵌入的路径(我们通过运行之前的 extract_embeddings .py 脚本导出它 )。
- - recognizer :这将是我们识别面部的输出模型。它基于SVM。我们将保存它,以便我们可以在接下来的两个识别脚本中使用它。
- - le :我们的标签编码器输出文件路径。我们将标签编码器序列化为磁盘,以便我们可以在图像/视频人脸识别脚本中使用它和识别器模型。
每个参数都是 必需的。
源代码:
# USAGE
# python train_model.py --embeddings output/embeddings.pickle --recognizer output/recognizer.pickle --le output/le.pickle
# import the necessary packages
from sklearn.preprocessing import LabelEncoder
from sklearn.svm import SVC
import argparse
import pickle
#构造参数解析器并解析参数
ap = argparse.ArgumentParser()
ap.add_argument("-e", "--embeddings", required=True,
help="path to serialized db of facial embeddings")
ap.add_argument("-r", "--recognizer", required=True,
help="path to output model trained to recognize faces")
ap.add_argument("-l", "--le", required=True,
help="path to output label encoder")
args = vars(ap.parse_args())
# 加载面嵌入
print("[INFO] loading face embeddings...")
data = pickle.loads(open(args["embeddings"], "rb").read())
# 编码标签
print("[INFO] encoding labels...")
le = LabelEncoder()
labels = le.fit_transform(data["names"])
#训练用于接受面部和面部128-d嵌入的模型
#然后产生实际的人脸识别
print("[INFO] training model...")
recognizer = SVC(C=1.0, kernel="linear", probability=True)
recognizer.fit(data["embeddings"], labels)
#将实际的人脸识别模型写入磁盘
f = open(args["recognizer"], "wb")
f.write(pickle.dumps(recognizer))
f.close()
# 将标签编码器写入磁盘
f = open(args["le"], "wb")
f.write(pickle.dumps(le))
f.close()
在命令行终端执行命令,来执行此程序:
python train_model.py --embeddings output/embeddings.pickle --recognizer output/recognizer.pickle --le output/le.pickle
运行结果
代码解释
让我们加载面部嵌入并编码我们的标签:
17 18 19 20 21 22 23 24 |
# load the face embeddings print("[INFO] loading face embeddings...") data = pickle.loads(open(args["embeddings"], "rb").read())
# encode the labels print("[INFO] encoding labels...") le = LabelEncoder() labels = le.fit_transform(data["names"]) |
在这里,我们从载入我们的嵌入 步骤#1的 第19行。我们不会在此模型训练脚本中生成任何嵌入 - 我们将使用先前生成和序列化的嵌入。
然后我们初始化我们的scikit-learn LabelEncoder 并编码我们的名称 标签 (第23和24行)。
现在是时候训练我们的SVM模型识别面部了:
26 27 28 29 30 |
# train the model used to accept the 128-d embeddings of the face and # then produce the actual face recognition print("[INFO] training model...") recognizer = SVC(C=1.0, kernel="linear", probability=True) recognizer.fit(data["embeddings"], labels) |
在 第29行,我们初始化我们的SVM模型,在 第30行,我们 拟合 模型(也称为“训练模型”)。
在这里,我们使用线性支持向量机(SVM),但如果您愿意,可以尝试使用其他机器学习模型。
训练模型后,我们将模型和标签编码器输出到磁盘作为pickle文件。
32 33 34 35 36 37 38 39 40 |
# write the actual face recognition model to disk f = open(args["recognizer"], "wb") f.write(pickle.dumps(recognizer)) f.close()
# write the label encoder to disk f = open(args["le"], "wb") f.write(pickle.dumps(le)) f.close() |
我们在这个块中将两个pickle文件写入磁盘 - 面部识别器模型和标签编码器。
此时,请确保先执行步骤#1中的代码 。您可以从“下载”部分获取包含代码和数据的zip 。
现在我们已经完成了train_model .py的编码 ,让我们将它应用于我们提取的面嵌入:
1 2 3 4 5 6 7 8 |
$ python train_model.py --embeddings output/embeddings.pickle \ --recognizer output/recognizer.pickle \ --le output/le.pickle [INFO] loading face embeddings... [INFO] encoding labels... [INFO] training model... $ ls output/ embeddings.pickle le.pickle recognizer.pickle |
在这里,您可以看到我们的SVM已经过嵌入式培训,并且(1)SVM本身和(2)标签编码已写入磁盘,使我们能够将它们应用于输入图像和视频。
希望对你有帮助。