GoFaceRec:基于 Go 的深度学习人脸识别工具


GoFaceRec是一个用 Go 构建的人脸识别工具,利用 MTCNN 进行人脸检测和 QMagFace 进行人脸识别。

该项目的诞生是出于将深度学习模型的力量引入 Go 社区的愿望。经过一番努力,我得出的结论是,最好的方法是将模型转换为 TensorFlow,然后使用 tfgo(一个与 TensorFlow 的 C API 绑定的 Go)。

在 GoFaceRec 中,首先处理输入图像,然后将其嵌入与已经从我们的数据集计算出的嵌入进行比较。如果嵌入之间的距离低于特定阈值,则该面部被视为未知。否则,将打印正确的标签。

该项目在 Ubuntu 20.04 上使用 Go 1.17 进行测试。对于gocv,安装的OpenCV版本是4.7。对于tfgo,我安装的是这个版本而不是官方版本。

您可以通过在项目中运行以下命令来安装此软件包:

go get github.com/modanesh/GoFaceRec@v0.1.1

转换模型
将非 TF 模型转换为 TF 模型的方法有很多种。为此,我使用 ONNX 作为中介将QMagFace 的模型从 PyTorch 转换为 TF。
使用model_converter.py脚本先将 PyTorch 模型转换为 ONNX,然后再将 ONNX 模型转换为 TF。
model_converter.py中的一些代码取自官方QMagFace 的实现

提取图层
为了使用 tfgo 运行模型,您应该知道输入层和输出层的名称。

为了提取此类信息,该saved_model_cli命令可能很有用。导出的模型tf.saved_model.save()会自动带有“serve”标签,因为 SavedModel 文件格式是为服务而设计的。该标签包含导出的各种函数。

其中,始终存在“serving_default” signature_def。此签名 def 的工作方式与 TF 1.x 图完全相同。获取输入张量和输出张量,并将它们分别用作占位符来馈送和输出来获取。

运行模型
该项目使用 MTCNN 进行人脸检测,使用 QMagFace 进行人脸识别。对于 MTCNN,三个阶段(PNet、RNet、ONet)的使用方式与FaceNet类似。每个阶段都在其相应的函数中完成:

挑战
迄今为止的主要挑战是gocv.Mattfgo.Tensorgonum和 Go 原生切片之间的转换。需要进行转换,因为某些矩阵变换仅在 中可用,gocv而另一些则在tfgo. 此外,模型的输入tfgo应该是 类型tfgo.Tensor,因此不可避免地需要将读取的图像转换gocv为tfgo。此外,某些矩阵运算在这些软件包中都不可用,因此我必须自己从头开始实现它们。为此,我必须使用 Go 的原生切片。因此,这些类型之间不可避免的转换在整个代码中很频繁。

相比之下,这些类型转换在 Python 中完成得非常简单和快速。