更快地计算面部描述符

5
在我的人脸识别项目中,一个人脸被表示为128维嵌入(face_descriptor),如FaceNet所使用的那样。我可以通过两种方式从图像生成嵌入。
第一种方法是使用Tensorflow resnet模型v1。
emb_array = sess.run(embedding_layer,
                    {images_placeholder: images_array, phase_train_placeholder: False})

可以传递一组图像,并获得嵌入列表。这有点慢,需要1.6秒(尽管对于大量图像,时间几乎是恒定的)。注意:没有可用的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个回答

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而不再是contrib目录下。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接