【问题标题】:Calculate face_descriptor faster更快地计算 face_descriptor
【发布时间】:2018-09-13 21:56:32
【问题描述】:

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

使用 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)

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

【问题讨论】:

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


    【解决方案1】:

    这个问题的一个更重要的方面是您没有可用的 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 位整数会大大加快推理速度。

    通常最好在训练时考虑到后期量化来训练网络,这里不是这种情况,因为您使用的是预训练模型,但您仍然可以从量化中受益很多。您可以通过运行包含在 Tensorflow 中的命令(具有令人惊讶的名称 quantize_graph)来量化您的模型,但还有更多内容。后面还有 a nice quantization tutorial,但请记住,该脚本现在位于 tensorflow/tools/quantization 中,而不是 contrib 中,如教程中所述。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-08-03
      • 2013-06-24
      • 1970-01-01
      • 2014-07-19
      • 2012-07-11
      • 2011-12-12
      • 1970-01-01
      • 2019-05-25
      相关资源
      最近更新 更多