|
import numpy as np |
|
from tqdm import tqdm |
|
import cv2 |
|
from vbench.utils import load_dimension_info |
|
|
|
|
|
def get_frames(video_path): |
|
frames = [] |
|
video = cv2.VideoCapture(video_path) |
|
while video.isOpened(): |
|
success, frame = video.read() |
|
if success: |
|
frames.append(frame) |
|
else: |
|
break |
|
video.release() |
|
assert frames != [] |
|
return frames |
|
|
|
|
|
def mae_seq(frames): |
|
ssds = [] |
|
for i in range(len(frames)-1): |
|
ssds.append(calculate_mae(frames[i], frames[i+1])) |
|
return np.array(ssds) |
|
|
|
|
|
def calculate_mae(img1, img2): |
|
"""Computing the mean absolute error (MAE) between two images.""" |
|
if img1.shape != img2.shape: |
|
print("Images don't have the same shape.") |
|
return |
|
return np.mean(cv2.absdiff(np.array(img1, dtype=np.float32), np.array(img2, dtype=np.float32))) |
|
|
|
|
|
def cal_score(video_path): |
|
"""please ensure the video is static""" |
|
frames = get_frames(video_path) |
|
score_seq = mae_seq(frames) |
|
return (255.0 - np.mean(score_seq).item())/255.0 |
|
|
|
|
|
def temporal_flickering(video_list): |
|
sim = [] |
|
video_results = [] |
|
for video_path in tqdm(video_list): |
|
try: |
|
score_per_video = cal_score(video_path) |
|
except AssertionError: |
|
continue |
|
video_results.append({'video_path': video_path, 'video_results': score_per_video}) |
|
sim.append(score_per_video) |
|
avg_score = np.mean(sim) |
|
return avg_score, video_results |
|
|
|
|
|
def compute_temporal_flickering(json_dir, device, submodules_list): |
|
video_list, _ = load_dimension_info(json_dir, dimension='temporal_flickering', lang='en') |
|
all_results, video_results = temporal_flickering(video_list) |
|
return all_results, video_results |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|