python - 更快地计算 face_descriptor

标签 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.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)

即将单张人脸的多张图片转换为多张人脸的单张图片。 静止时间与连接的图像数量(即人脸数量)成正比。迭代单个图像的时间几乎相同。

最佳答案

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

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

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

我怀疑 Tensorflow 和 Dlib 在 CPU 上的执行速度方面应该非常相似,因为它们都使用优化的线性代数库(BLAS、LAPACK),并且对于矩阵乘法可以做的优化有限。

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

通常在训练时考虑后期量化来训练网络会更好,这里不是这种情况,因为您使用的是预训练模型,但您仍然可以从量化中受益匪浅。您基本上可以通过运行包含在 Tensorflow 中的命令(具有令人惊讶的名称 quantize_graph)来量化您的模型,但还有更多。有 a nice quantization tutorial跟随,但请记住脚本现在在 tensorflow/tools/quantization 中正如本教程中所写,不再参与贡献。

关于python - 更快地计算 face_descriptor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49649291/

相关文章:

python - 如何将 Python Flask 应用程序部署到在 Amazon Linux EC2 实例上运行的 Apache (Httpd)

machine-learning - 我如何将 bool 张量输入到 tf.cond() 而不仅仅是一个 bool 值?

python - 为什么隐蔽的 Tensorflow 升级到 2.9.1 会破坏使用 GPU 而不是 CPU 的 Google Colab Jupyter 笔记本?

neural-network - 我可以在 Keras 中使用带有卷积神经网络的矩形图像吗?

machine-learning - 使用卷积神经网络进行集成学习

未找到 Python 方法,但已在类中定义

python - Django + Angular2 : How to fetch data from database?

python - Keras:将模型对象作为参数传递给损失函数

python - 神经网络中 DataFrame 的批量输入

java - Apache Spark Broadcast 变量是 Broadcast 类型?不是RDD?