更快地计算face_descriptor

Sre*_*A R 5 python face-detection neural-network dlib tensorflow

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

使用Tensorflow resnet模型v1.

emb_array = sess.run(embedding_layer,
                    {images_placeholder: images_array, phase_train_placeholder: False})
Run Code Online (Sandbox Code Playgroud)

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

其他方法是使用dlib

dlib.face_recognition_model_v1.compute_face_descriptor(image, shape)
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

dlib.face_recognition_model_v1.compute_face_descriptor(big_image, shapes)
Run Code Online (Sandbox Code Playgroud)

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

Pet*_*dan 6

这个问题最重要的方面之一是您没有可用的GPU。我将其放在此处,以便任何人阅读此答案将对上下文有更好的理解。

推理所花费的时间有两个主要部分。首先是设置时间。首次运行网络时,Tensorflow会花很甜蜜的时间进行自我设置,因此1.6秒的测量时间可能是99.9999%的设置时间和0.0001%的图像处理时间。然后,它执行实际的推理计算,与设置相比,对于一张图像而言这可能很小。更好的测量方法是先运行1,000张图像,然后再运行2,000张图像,然后计算出差值,然后除以1,000,以得出每张图像推断所需的时间。

从外观上看,Dlib在第一次运行时并不需要花费很多时间进行设置,但这样做仍然是更好的基准测试。

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

您可能还想尝试另一件事。大多数网络使用32位浮点计算来进行训练和推理,但是研究表明,在大多数情况下,切换到8位整数进行推理 不会过多地降低准确性,但是会大大提高推理速度。

通常最好在训练时考虑到以后的量化来训练网络,在这种情况下不是这样,因为您使用的是预先训练的模型,但是您仍然可以从量化中受益。您可以通过基本运行Tensorflow中包含的命令(具有令人惊讶的名称quantize_graph)来量化模型,但还有更多功能。有一个不错的量化教程可以遵循,但是请记住,该脚本现在已存在tensorflow/tools/quantization并且不再有任何贡献,如该教程中所写。