更快地计算face_descriptor

时间:2018-04-04 11:00:07

标签: python tensorflow neural-network face-detection dlib

在我的面部识别项目中,面部被表示为FaceNet中使用的128维嵌入(face_descriptor)。 我可以通过两种方式从图像中生成嵌入。

使用Tensorflow resnet模型v1。

emb_array = sess.run(embedding_layer,
                    {images_placeholder: images_array, phase_train_placeholder: False})

可以传递图像数组并获得嵌入列表。 这有点慢。看1.6s。(虽然大量图像的时间几乎不变)。 注意:GPU不可用

其他方法是使用dlib

dlib.face_recognition_model_v1.compute_face_descriptor(image, shape)

这给出了快速的结果。差不多0.05秒。 但是一次只能传递一个图像。时间会随着图像数量的增加而增加。

有没有办法传递图像数组来计算dlib中的嵌入或以任何方式提高dlib的速度?

或者还有其他更快的方法来生成128维面部嵌入吗?

更新: 我将多个图像连接成单个图像并传递给dlib

dlib.face_recognition_model_v1.compute_face_descriptor(big_image, shapes)

即将具有单个面的多个图像转换为具有多个面的单个图像。 静止时间与连接的图像数(即面数)成比例。迭代单个图像的时间几乎相同。

1 个答案:

答案 0 :(得分:5)

此问题的一个更重要的方面是您没有可用的GPU 。我把它放在这里,所以如果有人读到这个答案将更好地理解上下文。

推理所消耗的时间有两个主要部分。首先是设置时间。当您第一次运行网络时,Tensorflow会将其甜蜜,甜蜜的时间设置为自我,因此您的1.6秒测量设置时间可能为99.9999%,处理图像的时间为0.0001%。然后它进行实际的推理计算,与设置相比,这对于一个图像来说可能很小。更好的测量方法是通过它运行1,000张图像,然后运行2,000张图像并计算差值,除以1,000,得出每张图像推断的时间。

从外观上看,Dlib在第一次运行时没有花太多时间进行设置,但如上所述仍然是一个更好的基准。

我怀疑Tensorflow和Dlib在CPU的执行速度方面应该非常相似,因为它们都使用优化的线性代数库(BLAS,LAPACK),并且只能进行矩阵乘法的优化。

还有一件事你可能想尝试一下。大多数网络使用32位浮点计算进行训练和推理,但研究表明,在大多数情况下,为推理 doesn't degrade accuracy too much切换到8位整数,但会大大加快推理速度。 / p>

通常最好在训练时训练一个网络,以便稍后量化,这不是这里的情况,因为你使用预训练的模型,但你仍然可以从量化中获益很多。您可以基本上运行Tensorflow中包含的命令(具有令人惊讶的名称quantize_graph)来量化您的模型,但还有一点点。有a nice quantization tutorial要遵循,但请记住,脚本现在位于tensorflow/tools/quantization中,而不再是contrib中的内容,如教程中所述。