在我的人脸识别项目中,人脸被表示为在FaceNet中使用的128个维嵌入(FaceNet)。我可以用两种方式从图像中生成嵌入。
使用Tensorflow resnet模型v1。
emb_array = sess.run(embedding_layer,
{images_placeholder: images_array, phase_train_placeholder: False})可以传递图像数组并获得嵌入列表。这是一点slow.Took 1.6s。(但是对于大量的图像,时间几乎是恒定的)。注: GPU不可用
其他方法是使用dlib。
dlib.face_recognition_model_v1.compute_face_descriptor(image, shape)这给出了快速的结果。差不多0.05秒。但是只有一幅图像可以在time.Time上传递,并且随图像数的增加而增加。
有什么方法可以传递图像数组来计算dlib中的嵌入,还是可以提高dlib中的速度?
或者还有其他更快的方法来生成128维人脸嵌入?
更新:我将多个图像连接到单个映像并传递给dlib
dlib.face_recognition_model_v1.compute_face_descriptor(big_image, shapes)即将多幅单面图像转换为多个人脸图像。当然,时间与连在一起的图像数(即人脸数)成正比。对单个图像进行迭代的时间几乎相同。
发布于 2018-04-06 21:23:28
这个问题的一个更重要的方面是--您没有GPU可用的。我把这个放在这里,所以如果有人读了这个答案,就会对上下文有更好的理解。
推理所花费的时间主要有两部分。首先是设置时间。当你第一次运行网络的时候,Tensorflow会用它甜蜜的时间来设置自己,因此你的1.6秒的测量值可能是99.9999%的设置时间和0.0001%的图像处理。然后进行实际的推理计算,与设置相比,这对于一幅图像来说可能是很小的。一个更好的测量方法是运行1,000张图像,然后再运行2,000张图像,然后计算出差异,除以1,000,得到每幅图像需要多少时间来推断。
从表面上看,Dlib在第一次运行时并没有花费太多时间来设置,但它仍然是一个更好的基准,可以像上面所描述的那样做同样的事情。
我怀疑Tensorflow和Dlib在CPU上的执行速度应该是相当相似的,因为两者都使用优化的线性代数库(BLAS,LAPACK),而且对于矩阵乘法只能做那么多的优化工作。
不过,还有一件事你可能想试一试。大多数网络使用32位浮点计算进行训练和推理,但研究表明,在大多数情况下,推理 不会过分降低精确度的8位整数切换到8位整数,但却大大加快了推理速度。
通常最好是在训练时考虑到后来的量化,这不是这样的,因为你使用了一个预先训练过的模型,但是你仍然可以从量化中获益很多。您可以通过运行Tensorflow中包含的命令(其名称为quantize_graph)来量化您的模型,但是它还有一些内容。需要遵循的是一个不错的量化教程,但是要记住,正如本教程中所写的,脚本现在是在tensorflow/tools/quantization中而不是在contrib中。
https://stackoverflow.com/questions/49649291
复制相似问题