将视频帧提供给张量流模型的最快方法是什么?

时间:2018-02-18 08:51:10

标签: tensorflow

有一个用于图像识别的预训练Tensorflow模型。我想将它用作特征提取器。

为了提高性能,视频帧以cv2.read()读取并缓存在frameBuffer中。 在下一步中,我选择一批图像并在一组预处理后将它们送到图形中(为了准备图像以供给):

for x in range ( lowerIndex,upperIndex):
   frame = frameBuffer[x]
   img_data = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
   encode_param = [int(cv2.IMWRITE_JPEG_QUALITY), 100]
   result, img_str = cv2.imencode('.jpg', frame, encode_param)
   img_str = img_str.tostring(order='C')
   batchFrameBuffer.append(img_str)

预处理步骤需要很长时间,在此期间GPU的利用率为0。 有没有办法让GPU始终工作? (例如使用不同的线程(一个用于读取和预处理,另一个用于运行会话)

2 个答案:

答案 0 :(得分:5)

Squadrick的答案可能是最好的想法,但我也建议预处理视频以提取帧作为一个独立的步骤。如果你有空间,那么独立拥有这些框架会很有用。许多公共视频数据集(阿姆斯特丹普通视频库,现在Kaggle上的ImageNet VOD)将每个视频作为jpegs文件夹,frame1.jpg,frame2.jpg等提供。每次您想要训练新模型时,它都会保存对视频的解码。它会占用大量的cpu并占用大量空间,但它会加速你的模型训练。我发现opencv(C版)中的mpeg帧提取相当慢,甚至只是为了显示一个帧。

此外,也许FFMPEG可以将您的帧提取作为一个独立的步骤提取到RGB。重新编码为jpeg只能解码回RGB进行模型训练是使用CPU来节省磁盘空间。

答案 1 :(得分:4)

Tensorflow专门针对此dataset。看看here

您可以从frame_buffer创建map,然后您可以datasetcv2添加一个函数。

然而,该函数需要是tensorflow操作,但您需要tf.py_func个函数。为此,使用dataset,因为它允许您将普通的python代码包装为tensorflow操作,阅读它here

使用C++的好处是多线程是由Tensorflow在Python完成的,而不是你必须在dataset.map中手动完成。您甚至可以将并行线程数设置为dataset中的参数。

获得iterator对象后,可以从中创建feed_dict,并从迭代器开始构建图形,因此也避免了使用Promise的问题。 。

Here是针对GPU的一般Tensorflow性能指南。

希望这有帮助!