1. 简介:
最近需要将视频文件直接用于深度模型训练的输入,而不是像之前那样先将视频文件提取成单帧保存下来,因为这样做会出现几个问题,一个是要使用ffmpeg命令,将耗费数小时的时间提取帧,另一个是需要而外的存储空间,还有就是训练代码在加载图片时存在很大的IO操作,会影响训练的效率。因此,有没有一个方法,可以直接将视频文件作为训练数据,但又不会出现以上诸多问题呢,lintel就是为了解决这个问题而诞生的。
Lintel是一个Python模块,可用于解码视频,并使用FFmpeg C接口直接返回视频中所有帧的字节数组。
Lintel的创建目的是使用视频数据集(如NTU RGB + D,Kinetics和Charades动作识别数据集)开发机器学习算法。
Lintel最重要的优势是:
- Lintel为视频解码提供了一个简单而快速的Python接口,可以将其放入现有的机器学习培训脚本中。
- 通过在数据处理流水线中即时解码视频,可以使输入流水线绕过I / O瓶颈------如果将数据以JPEG等编码图像格式存储为帧,则会有这个问题。
- 使用FFmpeg C API动态解码视频可以高度控制输入。例如,视频可以以动态帧速率解码,而不会降低效率。
- 该控制的一个示例是loadvid_frame_nums的实现,其中传递帧索引的列表以指示要解码哪些特定帧。
- 通过直接使用FFmpeg C API,而不是使用ffmpeg命令行工具的管道输入,可以完全避免围绕ffmpeg命令行工具与性能密集型机器学习应用程序连接的许多问题和复杂性。
2. 安装最新版ffmpeg及配置~/.bashrc文件
- 1. 安装环境:python3
- 2. 由于从apt-get install的ffmpeg程序版本号太老,需要从源码编译及安装最新版ffmpeg。
#如果他日这个代码无效,可尝试直接从ffmpeg官网获取最新版本安装,http://ffmpeg.org/download.html#releases
git clone https://github.com/FFmpeg/FFmpeg.git && cd FFmpeg
#建议安装到自己创建的文件夹,方便设置~/.bashrc
./configure --enable-shared --enable-gpl --enable-pic --enable-runtime-cpudetect --cc="gcc -fPIC" --prefix=$my_app_path
make -j$(nproc) && make install
- 3. 配置~/.bashrc文件
在~/.bashrc末尾添加配置如下,最下面的三行,缺一不可。
#ffmpeg
export ffmpegpath=my_app_path/ffmpeg
export PATH=${ffmpegpath}/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=${ffmpegpath}/lib${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
export CPATH=${ffmpegpath}/include${CPATH:+:${CPATH}}
export LIBRARY_PATH=${ffmpegpath}/lib${LIBRARY_PATH:+:${LIBRARY_PATH}}
更新激活~/.bashrc
source ~/.bashrc
3. 安装lintel
有两种方法
#法一
git clone https://github.com/dukebw/lintel.git
cd lintel
pip3 install -e ./
#法二
git clone https://github.com/dukebw/lintel.git
cd lintel
python setup.py build
python setup.py install
4. 测试lintel
lintel_test --filename <video-filename> --width <width> --height <height>
通过标准:来自视频的解码帧应该显示没有失真,在<500ms内解码每个剪辑。
传递--width 0 --height 0将测试动态调整大小。
5. 安装时的debug
安装容易出问题的地方在于配置~/.bashrc文件,这个比较隐蔽,如果没配置好这里,会出现如下问题:
ImportError: <lintel-path>/_lintel.cpython-36m-x86_64-linux-gnu.so: undefined symbol: avcodec_receive_frame
6.lintel项目地址
https://github.com/dukebw/lintel