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

R.y*_*y.z 2 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)
Run Code Online (Sandbox Code Playgroud)

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

squ*_*ick 6

Tensorflow 有data.Dataset专门用于此的。检查它在这里

你可以创建一个datasetfrom frame_buffer,然后你可以创建一个map函数dataset

然而,该函数需要是 tensorflow ops,但您需要cv2函数。为此,请使用tf.py_func它,因为它允许您将普通的 Python 代码包装为 tensorflow 操作,请在此处阅读。

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

一旦你有了你的dataset对象,你就可以iterator从它创建一个,并从迭代器开始构建你的图,这样feed_dict也避免了使用的开销。

是 GPU 的通用 Tensorflow 性能指南。

希望这可以帮助!


Pam*_*Pam 5

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

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