Creating a new FeatureExtractorΒΆ
from typing import Dict, Any
import numpy as np
from videolib import Video
from qualitylib.feature_extractor import FeatureExtractor
from features import ssim
from qualitylib.result import Result
class SsimFeatureExtractor(FeatureExtractor):
NAME = 'SSIM_fex'
VERSION = '1.0'
feat_names = np.array(['lum', 'cs', 'ssim']) # Leave empty if feature names are not to be provided
def _run_on_asset(self, asset_dict: Dict[str, Any]) -> Result:
sample_interval = self._get_sample_interval(asset_dict) # Temporal subsampling
feats_dict = {key: [] for key in self.feat_names} # Use list/array if no feat_names are used
with Video(
asset_dict['ref_path'], mode='r',
standard=asset_dict['ref_standard'],
width=asset_dict['width'], height=asset_dict['height']
) as v_ref:
with Video(
asset_dict['dis_path'], mode='r',
standard=asset_dict['dis_standard'],
width=asset_dict['width'], height=asset_dict['height']
) as v_dis:
for i, (frame_ref, frame_dis) in enumerate(zip(v_ref, v_dis)):
if i % sample_interval:
continue
lum_val, cs_val, ssim_val = ssim(frame_ref, frame_dis, full=True)
feats_dict['lum'].append(lum_val)
feats_dict['cs'].append(cs_val)
feats_dict['ssim'].append(ssim_val)
feats = np.array(list(feats_dict.values())).T
print(f'Processed {asset_dict["dis_path"]}')
return self._to_result(asset_dict, feats, list(feats_dict.keys()))