Skip to content

Commit 518075a

Browse files
committed
[benchmark] Fix detector not being reset between runs
1 parent d6b318c commit 518075a

File tree

4 files changed

+91
-51
lines changed

4 files changed

+91
-51
lines changed

benchmarks/README.md

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,16 +27,16 @@ python evaluate.py -d BBC --detector detect-content
2727
```
2828

2929
### Result
30-
The performance is computed as recall, precision, f1, and elapsed time.
30+
The performance is computed as recall, precision, f1, and elapsed time.
3131
The following results indicate that ContentDetector achieves the highest performance on the BBC dataset.
3232

3333
| Detector | Recall | Precision | F1 | Elapsed time (second) |
3434
|:-----------------:|:------:|:---------:|:-----:|:---------------------:|
35-
| AdaptiveDetector | 7.80 | 96.18 | 14.44 | 25.75 |
36-
| ContentDetector | 84.52 | 88.77 | 86.59 | 25.50 |
37-
| HashDetector | 8.57 | 80.27 | 15.48 | 23.78 |
38-
| HistogramDetector | 8.22 | 70.82 | 14.72 | 18.60 |
39-
| ThresholdDetector | 0.00 | 0.00 | 0.00 | 18.95 |
35+
| AdaptiveDetector | 87.52 | 97.21 | 92.11 | 27.84 |
36+
| ContentDetector | 85.23 | 89.53 | 87.33 | 26.46 |
37+
| HashDetector | 92.96 | 76.27 | 83.79 | 16.26 |
38+
| HistogramDetector | 90.55 | 72.76 | 80.68 | 16.13 |
39+
| ThresholdDetector | 0.00 | 0.00 | 0.00 | 18.95 |
4040

4141
## Citation
4242
### BBC

benchmarks/bbc_dataset.py

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
import os
21
import glob
2+
import os
3+
34

45
class BBCDataset:
56
"""
@@ -8,14 +9,19 @@ class BBCDataset:
89
The dataset consists of 11 videos (BBC/videos/bbc_01.mp4 to BBC/videos/bbc_11.mp4).
910
The annotated scenes are provided in corresponding files (BBC/fixed/[i]-scenes.txt).
1011
"""
12+
1113
def __init__(self, dataset_dir: str):
12-
self._video_files = [file for file in sorted(glob.glob(os.path.join(dataset_dir, 'videos', '*.mp4')))]
13-
self._scene_files = [file for file in sorted(glob.glob(os.path.join(dataset_dir, 'fixed', '*-scenes.txt')))]
14-
assert (len(self._video_files) == len(self._scene_files))
14+
self._video_files = [
15+
file for file in sorted(glob.glob(os.path.join(dataset_dir, "videos", "*.mp4")))
16+
]
17+
self._scene_files = [
18+
file for file in sorted(glob.glob(os.path.join(dataset_dir, "fixed", "*.txt")))
19+
]
20+
assert len(self._video_files) == len(self._scene_files)
1521
for video_file, scene_file in zip(self._video_files, self._scene_files):
16-
video_id = os.path.basename(video_file).replace('bbc_', '').split('.')[0]
17-
scene_id = os.path.basename(scene_file).split('-')[0]
18-
assert (video_id == scene_id)
22+
video_id = os.path.basename(video_file).replace("bbc_", "").split(".")[0]
23+
scene_id = os.path.basename(scene_file).split("_")[0]
24+
assert video_id == scene_id
1925

2026
def __getitem__(self, index):
2127
video_file = self._video_files[index]

benchmarks/benchmark.py

Lines changed: 60 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,51 +1,82 @@
1-
import time
21
import argparse
2+
import time
3+
34
from bbc_dataset import BBCDataset
45
from evaluator import Evaluator
5-
66
from tqdm import tqdm
7-
from scenedetect import detect
8-
from scenedetect import AdaptiveDetector, ContentDetector, HashDetector, HistogramDetector, ThresholdDetector
97

10-
def _load_detector(detector_name: str):
8+
from scenedetect import (
9+
AdaptiveDetector,
10+
ContentDetector,
11+
HashDetector,
12+
HistogramDetector,
13+
ThresholdDetector,
14+
detect,
15+
)
16+
17+
18+
def make_detector(detector_name: str):
1119
detector_map = {
12-
'detect-adaptive': AdaptiveDetector(),
13-
'detect-content': ContentDetector(),
14-
'detect-hash': HashDetector(),
15-
'detect-hist': HistogramDetector(),
16-
'detect-threshold': ThresholdDetector(),
20+
"detect-adaptive": AdaptiveDetector(),
21+
"detect-content": ContentDetector(),
22+
"detect-hash": HashDetector(),
23+
"detect-hist": HistogramDetector(),
24+
"detect-threshold": ThresholdDetector(),
1725
}
1826
return detector_map[detector_name]
1927

20-
def _detect_scenes(detector, dataset):
28+
29+
def _detect_scenes(detector_type: str, dataset):
2130
pred_scenes = {}
2231
for video_file, scene_file in tqdm(dataset):
2332
start = time.time()
33+
detector = make_detector(detector_type)
2434
pred_scene_list = detect(video_file, detector)
2535
elapsed = time.time() - start
26-
27-
pred_scenes[scene_file] = {
28-
'video_file': video_file,
29-
'elapsed': elapsed,
30-
'pred_scenes': [scene[1].frame_num for scene in pred_scene_list]
36+
scenes = {
37+
scene_file: {
38+
"video_file": video_file,
39+
"elapsed": elapsed,
40+
"pred_scenes": [scene[1].frame_num for scene in pred_scene_list],
41+
}
3142
}
43+
result = Evaluator().evaluate_performance(scenes)
44+
print(f"{video_file} results:")
45+
print(
46+
"Recall: {:.2f}, Precision: {:.2f}, F1: {:.2f} Elapsed time: {:.2f}\n".format(
47+
result["recall"], result["precision"], result["f1"], result["elapsed"]
48+
)
49+
)
50+
pred_scenes.update(scenes)
3251

3352
return pred_scenes
3453

35-
def main(args):
36-
dataset = BBCDataset('BBC')
37-
detector = _load_detector(args.detector)
38-
pred_scenes = _detect_scenes(detector, dataset)
39-
evaluator = Evaluator()
40-
result = evaluator.evaluate_performance(pred_scenes)
4154

42-
print('Detector: {} Recall: {:.2f}, Precision: {:.2f}, F1: {:.2f} Elapsed time: {:.2f}'
43-
.format(args.detector, result['recall'], result['precision'], result['f1'], result['elapsed']))
55+
def main(args):
56+
pred_scenes = _detect_scenes(detector_type=args.detector, dataset=BBCDataset("BBC"))
57+
result = Evaluator().evaluate_performance(pred_scenes)
58+
print("Overall Results:")
59+
print(
60+
"Detector: {} Recall: {:.2f}, Precision: {:.2f}, F1: {:.2f} Elapsed time: {:.2f}".format(
61+
args.detector, result["recall"], result["precision"], result["f1"], result["elapsed"]
62+
)
63+
)
4464

4565

46-
if __name__ == '__main__':
47-
parser = argparse.ArgumentParser(description='Benchmarking PySceneDetect performance.')
48-
parser.add_argument('--detector', type=str, choices=['detect-adaptive', 'detect-content', 'detect-hash', 'detect-hist', 'detect-threshold'],
49-
default='detect-content', help='Detector name. Implemented detectors are listed: https://www.scenedetect.com/docs/latest/cli.html')
66+
if __name__ == "__main__":
67+
parser = argparse.ArgumentParser(description="Benchmarking PySceneDetect performance.")
68+
parser.add_argument(
69+
"--detector",
70+
type=str,
71+
choices=[
72+
"detect-adaptive",
73+
"detect-content",
74+
"detect-hash",
75+
"detect-hist",
76+
"detect-threshold",
77+
],
78+
default="detect-content",
79+
help="Detector name. Implemented detectors are listed: https://www.scenedetect.com/docs/latest/cli.html",
80+
)
5081
args = parser.parse_args()
51-
main(args)
82+
main(args)

benchmarks/evaluator.py

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,38 @@
11
from statistics import mean
22

3+
34
class Evaluator:
45
def __init__(self):
56
pass
6-
7+
78
def _load_scenes(self, scene_filename):
89
with open(scene_filename) as f:
9-
gt_scene_list = [x.strip().split('\t')[1] for x in f.readlines()]
10+
gt_scene_list = [x.strip().split("\t")[1] for x in f.readlines()]
1011
gt_scene_list = [int(x) + 1 for x in gt_scene_list]
1112
return gt_scene_list
1213

1314
def evaluate_performance(self, pred_scenes):
1415
total_correct = 0
1516
total_pred = 0
1617
total_gt = 0
18+
assert pred_scenes
1719

1820
for scene_file, pred in pred_scenes.items():
1921
gt_scene_list = self._load_scenes(scene_file)
20-
pred_list = pred['pred_scenes']
22+
pred_list = pred["pred_scenes"]
2123
total_correct += len(set(pred_list) & set(gt_scene_list))
2224
total_pred += len(pred_list)
2325
total_gt += len(gt_scene_list)
2426

27+
assert total_pred, pred_scenes
2528
recall = total_correct / total_gt
2629
precision = total_correct / total_pred
2730
f1 = 2 * recall * precision / (recall + precision) if (recall + precision) != 0 else 0
28-
avg_elapsed = mean([x['elapsed'] for x in pred_scenes.values()])
31+
avg_elapsed = mean([x["elapsed"] for x in pred_scenes.values()])
2932
result = {
30-
'recall': recall * 100,
31-
'precision': precision * 100,
32-
'f1': f1 * 100,
33-
'elapsed': avg_elapsed
33+
"recall": recall * 100,
34+
"precision": precision * 100,
35+
"f1": f1 * 100,
36+
"elapsed": avg_elapsed,
3437
}
35-
return result
38+
return result

0 commit comments

Comments
 (0)