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