首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >快速计算face_descriptor

快速计算face_descriptor
EN

Stack Overflow用户
提问于 2018-04-04 11:00:06
回答 1查看 1.5K关注 0票数 5

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

使用Tensorflow resnet模型v1。

代码语言:javascript
复制
emb_array = sess.run(embedding_layer,
                    {images_placeholder: images_array, phase_train_placeholder: False})

可以传递图像数组并获得嵌入列表。这是一点slow.Took 1.6s。(但是对于大量的图像,时间几乎是恒定的)。注: GPU不可用

其他方法是使用dlib。

代码语言:javascript
复制
dlib.face_recognition_model_v1.compute_face_descriptor(image, shape)

这给出了快速的结果。差不多0.05秒。但是只有一幅图像可以在time.Time上传递,并且随图像数的增加而增加。

有什么方法可以传递图像数组来计算dlib中的嵌入,还是可以提高dlib中的速度?

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

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

代码语言:javascript
复制
dlib.face_recognition_model_v1.compute_face_descriptor(big_image, shapes)

即将多幅单面图像转换为多个人脸图像。当然,时间与连在一起的图像数(即人脸数)成正比。对单个图像进行迭代的时间几乎相同。

EN

回答 1

Stack Overflow用户

发布于 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中。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49649291

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档