最近在学习视频问答(Video Question Answering),发现视频问答中对于视觉特征的处理通常是使用预训练模型提前处理好的,然而运行一些提取特征的代码的时候发现GPU占用率并不高,发现大部分时间花费在了加载视频上,考虑到以后大量的读取需求,于是自己做了一些使用python库加载视频的实验。使用的方法如下:
方法 | 结果 | 备注 |
---|---|---|
opencv | √ | |
scikit-video | √ | |
imageio | √ | |
vidgear | √ | |
pyav | √ | |
torchvision | √ | |
simplecv | × | 似乎不支持python3 |
mahotas | × | 似乎不支持加载视频 |
kornia | × | 不是用来读取视频的,用于对视频进行增强 |
moviepy | × | 不能读取视频流,通常用于视频剪辑 |
simpleITK | × | 不支持视频,通常用于医学影像 |
pgmagick | × | 更常用在gif动图上,似乎不支持视频 |
注:以上若有不准确的地方请指正
测试的结果如下图所示:(这里的截图忘记放torchvision的了,完整的表格请参考我的github仓库)
在实验过程中注意到的一些现象:
- 帧合成千万不要一帧一帧concate,用list进行append之后再进行concate,这样会快很多
- 做resize对于画面比较大的视频来说性价比很高,对于不那么大的视频来说收益不高
- opencv需要BGR通道重排,使用numpy的transpose重排和torch的permute重排区别不大
- 转成PIL再转换为tensor是反向优化,考虑到也不用随机数据增强,所以还是opencv吧
- 先将图片ndarray数组汇聚成一个数组,再转换成Tensor会稍微快一点点
- 由于pytorch ToTensor只接受ndarray和PILImage输入,所以如果读取格式特殊,则需要转化,会造成速度全面落后
- vidgrear看起来很厉害,其实是最慢的,不知道是不是我api使用有问题
- 把视频提取成图片并没有什么优势,反而会导致文件大小迅速增大
- torchvision提供的io根据版本api差异比较大,不过性能确实可以与opencv相比
最后结论就是:使用opencv就好了
上述结果的测试代码和运行方法详见我的github仓库:load_video_as_tensor,如果对您有帮助请给我一个star