使用OpenCV进行人脸识别--(4)训练人脸识别模型

准备工作

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)标签编码已写入磁盘,使我们能够将它们应用于输入图像和视频。

 

希望对你有帮助。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章