【发布时间】:2018-09-18 19:17:51
【问题描述】:
我目前正在为我的人体检测应用程序使用 Tensorflow 对象检测 API。 我尝试在 API 本身中进行过滤,但它仍然有效,但我仍然没有受到它的影响,因为它很慢。所以我想知道我是否可以删除模型本身中的其他类别以使其更快。
如果不可能,由于我将使用两个摄像头,您能否给我其他建议以使 API 更快。在此先感谢,也请原谅我的英语:)
【问题讨论】:
标签: python opencv tensorflow
我目前正在为我的人体检测应用程序使用 Tensorflow 对象检测 API。 我尝试在 API 本身中进行过滤,但它仍然有效,但我仍然没有受到它的影响,因为它很慢。所以我想知道我是否可以删除模型本身中的其他类别以使其更快。
如果不可能,由于我将使用两个摄像头,您能否给我其他建议以使 API 更快。在此先感谢,也请原谅我的英语:)
【问题讨论】:
标签: python opencv tensorflow
您的问题涉及使用神经网络预训练模型的几个主题。
理论方法
通常,您始终可以通过移除 softmax 层中的相应神经元来中和类别,并仅使用矩阵的相关行计算新的 softmax 层。
这种方法肯定会奏效(也许这就是您所说的过滤),但不会大大加快网络计算时间,因为大部分触发器(乘法和加法)都会保留。
与决策树类似,修剪是可能的,但可能会降低性能。我将解释修剪的含义,但请注意,您的类别的准确性可能会保持不变,因为您不仅要修剪,而且还要预测更少的类别。
将学习转移到您的问题上。请参阅斯坦福大学的计算机视觉课程here。大多数情况下,我看到效果良好的方法是保持卷积层不变,并准备一个包含您想要检测的对象的中等大小的数据集。
如果您要求,我会添加更多的理论方法,但以上是我所知道的最常见和最准确的方法。
实用方法
确保您是 serving 您的 tensorflow 模型,而不仅仅是使用推理 Python 代码。这可以显着提高性能。
您可以将网络的参数导出并加载到更快的框架中,例如CNTK 或Caffe。这些框架在 C++/CSharp 中工作,并且可以更快地进行推理。 确保正确加载权重,一些框架在保存/加载时使用不同的张量维度顺序(类似小/大端的问题)。
如果您的应用程序对多个图像执行推理,您可以通过多个 GPU 分配计算。 **这也可以在 tensorflow 中完成,请参阅Using GPUs。
修剪神经网络
也许这是使大型网络适应简单任务的最有趣的方法。可以看新手指南here。
修剪意味着您从网络中删除参数,特别是决策树/神经网络 (resp) 中的整个节点/神经元。要在对象检测中做到这一点,您可以执行以下操作(最简单的方法):
上述过程是最基本的过程,但您可以找到大量建议算法这样做的论文。例如 Automated Pruning for Deep Neural Network Compression 和 An iterative pruning algorithm for feedforward neural networks。
【讨论】: