VMAF (Video Multimethod Assessment Fusion) 由 Netflix
开发并开源,利用大量的主观数据作为训练集,通过机器学习的手段将不同评估维度的算法进行“融合”,得到一个能准确反映主观意志的画质评价标准。
VMAF 主要包括3种指标:visual quality fidelity(VIF)、detail loss
measure(DLM)、temporal information(TI)。其中 VIF 和 DLM 是空间域的也即一帧画面之内的特征,TI
是时间域的也即多帧画面之间相关性的特征。这些特性之间融合计算总分的过程使用了训练好的 SVM 来预测。对每张图的打分,最终用于参考
一、命令汇总
编译环境准备
brew install gcc meson doxygen nasm freetype pkg-config hdf5
brew install numpy scipy
下载源码
git clone https://github.com/Netflix/vmaf.git
cd vmaf
git submodule update --init --recursive
编译
make
下载 VMAF 并安装
cd python
pip3 install cython
pip3 install -r requirements.txt
pip3 install --user . # 此时,会出现各种报错
环境变量配置
vim ~/.bash_profile
source ~/.bash_profile
在 vmaf 根目录下
./unittest
PyCharm执行
which python
python ./vmaf/script/run_vmaf.py yuv420p 576 324 test/resource/yuv/src01_hrc00_576x324.yuv test/resource/yuv/src01_hrc01_576x324.yuv --out-fmt json
二、报错汇总
编译环境准备时:
报错1:
Permission denied @ apply2files - /usr/local/lib/docker/cli-plugins
解决1:
sudo chown -R $(whoami) $(brew --prefix)/*
下载 VMAF 并安装:
报错2:
ninja: build stopped: subcommand failed.
解决2:其实不影响后续的执行,但是在最终运行的时候会报错。我是通过替换tools的文件解决的。
报错3:
vmaf/core/adm_dwt2_cy.c:634:10: fatal error: '../../../libvmaf/src/feature/adm.c' file not found
#include "../../../libvmaf/src/feature/adm.c"
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
解决3:修改相关路径为绝对路径
文件路径:
/vmaf/python/vmaf/core
vim adm_dwt2_cy.pyx
重新执行
pip3 install -r requirements.txt
pip3 install --user .
报错4:
#warning "Using deprecated NumPy API, disable it with " \
^
In file included from vmaf/core/adm_dwt2_cy.c:636:
/Users/meizhuo/vmaf/libvmaf/src/feature/adm_tools.c:27:10: fatal error: 'mem.h' file not found
#include "mem.h"
^~~~~~~
解决4:
cd libvmaf/src/feature/
cp /Users/XXXX/vmaf/libvmaf/src/mem.h .
执行Python文件命令:
python ./vmaf/script/run_vmaf.py yuv420p 576 324 test/resource/yuv/src01_hrc00_576x324.yuv test/resource/yuv/src01_hrc01_576x324.yuv --out-fmt json
报错5:
ModuleNotFoundError: No module named 'vmaf'
解决5:
/vmaf/python/vmaf/script/run_vmaf.py
curpath = os.path.abspath(os.path.dirname(__file__))
root_path = os.path.split(os.path.split(curpath)[0])[0]
if root_path not in sys.path:
sys.path.append(root_path)
/vmaf/python/vmaf/svmutil.py
if VmafConfig.root_path() not in sys.path:
sys.path.append(VmafConfig.root_path())
三、执行命令
VMAF:
python ./vmaf/script/run_vmaf.py yuv420p 576 324 test/resource/yuv/A.yuv test/resource/yuv/B.yuv --out-fmt json
python ./vmaf/script/run_vmaf.py yuv420p 480 270 test/resource/yuv/sparks_ref_480x270.yuv42010le.yuv test/resource/yuv/sparks_dis_480x270.yuv42010le.yuv --out-fmt json
./vmaf/script/run_vmaf.py yuv420p 1280 720 ./test/resource/yuv/_1.000000.yuv ./test/resource/yuv/_1.000001.yuv --out-fmt json
./run_vmaf yuv420p 576 324 python/test/resource/yuv/src01_hrc00_576x324.yuv python/test/resource/yuv/src01_hrc01_576x324.yuv --out-fmt json
mfPEVQScore:4.534
mfPEVQScore:4.532
四、成功图示:
五、运用-处理顺序
1、截取视频中的一张图:确认视频的分辨率、宽高:
ffmpeg -i screenrecording.mov -ss 00:00:00 -frames:v 1 image.png -hide_banner
2、修改分辨率,宽高等比缩放
ffmpeg -i screenrecording.mov -ss 00:00:5.95 -t 00:00:12 -vf scale=320:180 out.mov
3、截取视频长度,以防循环播放:
ffmpeg -i screenrecording.mov -ss 00:00:5.95 -t 00:00:11.9 -vf scale=320:180 out.mov
4、从图片中获取log的位置,进行尺寸切除
ffmpeg -i screenrecording.mov -ss 00:00:5.95 -t 00:00:11.9 -filter:v "crop=2868:1614:6:16,scale=1280:720" -r 30 sc_cropped.mov
ffmpeg -i screenrecording.mov -ss 00:00:5.95 -t 00:00:11.9 -filter:v "crop=2868:1614:6:16,scale=1280:720" -r 30 -c:v rawvideo sc_cropped.avi
5、进行裁剪:摆脱小作物
ffmpeg -i sc_cropped.mov -filter:v "crop=iw/1.1:ih/1.1” sc_cropped_overlays.mov
6、使用原始视频作为输入,并且我们可以指定一个无损的 h.264 avi 文件作为输出:
ffmpeg -i sc_cropped.avi -filter:v "crop=iw/1.1:ih/1.1" -c:v libx264 -crf 0 sc_cropped_overlays.avi
7、我们将相同的裁剪应用于原始文件,并将输出指定为无损 h.264:
ffmpeg -i meeting_ref.avi -filter:v "crop=iw/1.1:ih/1.1" -c:v libx264 -crf 0 meeting_ref_1_1_crop.avi
8、传入执行:curl
六、学习地址、参考文档
1.音频质量评估-1
2.https://github.com/ludlows/python-pesq
3.https://github.com/google/visqol
4.实践总结地址:https://www.cnblogs.com/darlingmz/p/14832841.html
5.PS:学习地址Mac安装教程:https://testerhome.com/topics/25083