-
Notifications
You must be signed in to change notification settings - Fork 487
Expand file tree
/
Copy pathbenchmark.py
More file actions
98 lines (85 loc) · 2.99 KB
/
benchmark.py
File metadata and controls
98 lines (85 loc) · 2.99 KB
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
import argparse
import time
from bbc_dataset import BBCDataset
from evaluator import Evaluator
from tqdm import tqdm
from scenedetect import (
AdaptiveDetector,
ContentDetector,
HashDetector,
HistogramDetector,
KoalaDetector,
SceneManager,
ThresholdDetector,
open_video,
)
def make_detector(detector_name: str):
detector_map = {
"detect-adaptive": AdaptiveDetector(),
"detect-content": ContentDetector(),
"detect-hash": HashDetector(),
"detect-hist": HistogramDetector(),
"detect-threshold": ThresholdDetector(),
"detect-koala": KoalaDetector(),
}
return detector_map[detector_name]
def _detect_scenes(detector_type: str, dataset):
pred_scenes = {}
for video_file, scene_file in tqdm(dataset):
start = time.time()
detector = make_detector(detector_type)
video = open_video(video_file)
scene_manager = SceneManager()
scene_manager.add_detector(detector)
# TODO: We should also do this for detect-hash.
if detector_type == "detect-koala":
scene_manager.auto_downscale = False
scene_manager.detect_scenes(
video=video,
show_progress=True,
)
pred_scene_list = scene_manager.get_scene_list()
elapsed = time.time() - start
scenes = {
scene_file: {
"video_file": video_file,
"elapsed": elapsed,
"pred_scenes": [scene[1].frame_num for scene in pred_scene_list],
}
}
result = Evaluator().evaluate_performance(scenes)
print(f"{video_file} results:")
print(
"Recall: {:.2f}, Precision: {:.2f}, F1: {:.2f} Elapsed time: {:.2f}\n".format(
result["recall"], result["precision"], result["f1"], result["elapsed"]
)
)
pred_scenes.update(scenes)
return pred_scenes
def main(args):
pred_scenes = _detect_scenes(detector_type=args.detector, dataset=BBCDataset("BBC"))
result = Evaluator().evaluate_performance(pred_scenes)
print("Overall Results:")
print(
"Detector: {} Recall: {:.2f}, Precision: {:.2f}, F1: {:.2f} Elapsed time: {:.2f}".format(
args.detector, result["recall"], result["precision"], result["f1"], result["elapsed"]
)
)
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="Benchmarking PySceneDetect performance.")
parser.add_argument(
"--detector",
type=str,
choices=[
"detect-adaptive",
"detect-content",
"detect-hash",
"detect-hist",
"detect-threshold",
"detect-koala",
],
default="detect-content",
help="Detector name. Implemented detectors are listed: https://www.scenedetect.com/docs/latest/cli.html",
)
args = parser.parse_args()
main(args)