-
Notifications
You must be signed in to change notification settings - Fork 35
/
video_inception_score.py
54 lines (43 loc) · 2.42 KB
/
video_inception_score.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
"""Inception Score (IS) from the paper "Improved techniques for training
GANs". Matches the original implementation by Salimans et al. at
https://github.com/openai/improved-gan/blob/master/inception_score/model.py"""
import numpy as np
from . import metric_utils
#----------------------------------------------------------------------------
NUM_FRAMES_IN_BATCH = {128: 128, 256: 128, 512: 64, 1024: 32}
#----------------------------------------------------------------------------
def compute_isv(opts, num_gen: int, num_splits: int, backbone: str):
if backbone == 'c3d_ucf101':
# Perfectly reproduced torchscript version of the original chainer checkpoint:
# https://github.com/pfnet-research/tgan2/blob/f892bc432da315d4f6b6ae9448f69d046ef6fe01/tgan2/models/c3d/c3d_ucf101.py
# It is a UCF-101-finetuned C3D model.
detector_url = 'https://www.dropbox.com/s/jxpu7avzdc9n97q/c3d_ucf101.pt?dl=1'
else:
raise NotImplementedError(f'Backbone {backbone} is not supported.')
num_frames = 16
batch_size = NUM_FRAMES_IN_BATCH[opts.dataset_kwargs.resolution] // num_frames
if opts.generator_as_dataset:
compute_gen_stats_fn = metric_utils.compute_feature_stats_for_dataset
gen_opts = metric_utils.rewrite_opts_for_gen_dataset(opts)
gen_opts.dataset_kwargs.load_n_consecutive = num_frames
gen_opts.dataset_kwargs.load_n_consecutive_random_offset = False
gen_opts.dataset_kwargs.subsample_factor = 1
gen_kwargs = dict()
else:
compute_gen_stats_fn = metric_utils.compute_feature_stats_for_generator
gen_opts = opts
gen_kwargs = dict(num_video_frames=num_frames, subsample_factor=1)
gen_probs = compute_gen_stats_fn(
opts=gen_opts, detector_url=detector_url, detector_kwargs={},
capture_all=True, max_items=num_gen, temporal_detector=True, **gen_kwargs).get_all() # [num_gen, num_classes]
if opts.rank != 0:
return float('nan'), float('nan')
scores = []
np.random.RandomState(42).shuffle(gen_probs)
for i in range(num_splits):
part = gen_probs[i * num_gen // num_splits : (i + 1) * num_gen // num_splits]
kl = part * (np.log(part) - np.log(np.mean(part, axis=0, keepdims=True)))
kl = np.mean(np.sum(kl, axis=1))
scores.append(np.exp(kl))
return float(np.mean(scores)), float(np.std(scores))
#----------------------------------------------------------------------------