Print per-frame VMAF score instead of average.
compare_videos.py will now print the VMAF score for each frame. The CL also removes some stale comments. Bug: webrtc:9642 Change-Id: I5623588580dea06dd487d7763dc3a2511bd2cd3c Reviewed-on: https://webrtc-review.googlesource.com/c/105103 Commit-Queue: Paulina Hensman <phensman@webrtc.org> Reviewed-by: Patrik Höglund <phoglund@webrtc.org> Reviewed-by: Sami Kalliomäki <sakal@webrtc.org> Cr-Commit-Position: refs/heads/master@{#25092}
This commit is contained in:

committed by
Commit Bot

parent
b3b017950a
commit
ede87964ba
@ -7,6 +7,7 @@
|
||||
# in the file PATENTS. All contributing project authors may
|
||||
# be found in the AUTHORS file in the root of the source tree.
|
||||
|
||||
import json
|
||||
import optparse
|
||||
import os
|
||||
import shutil
|
||||
@ -162,12 +163,9 @@ def _RunFrameAnalyzer(options, yuv_directory=None):
|
||||
return frame_analyzer.returncode
|
||||
|
||||
|
||||
def _RunVmaf(options, yuv_directory):
|
||||
def _RunVmaf(options, yuv_directory, logfile):
|
||||
""" Run VMAF to compare videos and print output.
|
||||
|
||||
The provided vmaf directory is assumed to contain a c++ wrapper executable
|
||||
and a model.
|
||||
|
||||
The yuv_directory is assumed to have been populated with a reference and test
|
||||
video in .yuv format, with names according to the label.
|
||||
"""
|
||||
@ -179,26 +177,29 @@ def _RunVmaf(options, yuv_directory):
|
||||
os.path.join(yuv_directory, "ref.yuv"),
|
||||
os.path.join(yuv_directory, "test.yuv"),
|
||||
options.vmaf_model,
|
||||
'--log',
|
||||
logfile,
|
||||
'--log-fmt',
|
||||
'json',
|
||||
]
|
||||
if options.vmaf_phone_model:
|
||||
cmd.append('--phone-model')
|
||||
|
||||
vmaf = subprocess.Popen(cmd, stdin=_DevNull(),
|
||||
stdout=subprocess.PIPE, stderr=sys.stderr)
|
||||
stdout=sys.stdout, stderr=sys.stderr)
|
||||
vmaf.wait()
|
||||
if vmaf.returncode != 0:
|
||||
print 'Failed to run VMAF.'
|
||||
return 1
|
||||
output = vmaf.stdout.read()
|
||||
# Extract score from VMAF output.
|
||||
try:
|
||||
score = float(output.split('\n')[2].split()[3])
|
||||
except (ValueError, IndexError):
|
||||
print 'Error in VMAF output (expected "VMAF score = [float]" on line 3):'
|
||||
print output
|
||||
return 1
|
||||
|
||||
print 'RESULT Vmaf: %s= %f' % (options.label, score)
|
||||
# Read per-frame scores from VMAF output and print.
|
||||
with open(logfile) as f:
|
||||
vmaf_data = json.load(f)
|
||||
vmaf_scores = []
|
||||
for frame in vmaf_data['frames']:
|
||||
vmaf_scores.append(frame['metrics']['vmaf'])
|
||||
print 'RESULT VMAF: %s=' % options.label, vmaf_scores
|
||||
|
||||
return 0
|
||||
|
||||
|
||||
@ -238,15 +239,17 @@ def main():
|
||||
try:
|
||||
# Directory to save temporary YUV files for VMAF in frame_analyzer.
|
||||
yuv_directory = tempfile.mkdtemp()
|
||||
_, vmaf_logfile = tempfile.mkstemp()
|
||||
|
||||
# Run frame analyzer to compare the videos and print output.
|
||||
if _RunFrameAnalyzer(options, yuv_directory=yuv_directory) != 0:
|
||||
return 1
|
||||
|
||||
# Run VMAF for further video comparison and print output.
|
||||
return _RunVmaf(options, yuv_directory)
|
||||
return _RunVmaf(options, yuv_directory, vmaf_logfile)
|
||||
finally:
|
||||
shutil.rmtree(yuv_directory)
|
||||
os.remove(vmaf_logfile)
|
||||
else:
|
||||
return _RunFrameAnalyzer(options)
|
||||
|
||||
|
Reference in New Issue
Block a user