File size: 1,894 Bytes
b87a24a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c1bf807
b87a24a
 
 
 
 
 
 
 
 
 
 
c1bf807
 
b87a24a
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
import cv2
import multiprocessing as mp

BASE_IMG_SIZE = 640
REF_PIXELS = 640 * 640
REF_FPS_CPU = 13.0
TRACK_STABILITY_STRIDE = 3


def _cpu_score():
    return mp.cpu_count()


def _video_meta(path):
    cap = cv2.VideoCapture(path)
    fps = cap.get(cv2.CAP_PROP_FPS)
    frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
    w = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
    h = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
    cap.release()

    duration = frames / fps if fps else 0
    pixels = w * h
    return fps, frames, duration, w, h, pixels


def _estimate_fps(imgsz, cpu_score):
    scale = (imgsz * imgsz) / REF_PIXELS
    return (REF_FPS_CPU * cpu_score / 12) / scale


def _select_imgsz(pixels):
    if pixels >= 3840 * 2160:
        return 640
    if pixels >= 2560 * 1440:
        return 704
    if pixels >= 1920 * 1080:
        return 736
    if pixels >= 1280 * 720:
        return 800
    return 960


def _select_stride(video_fps, model_fps):
    if model_fps >= video_fps:
        return 1
    ratio = video_fps / model_fps
    stride = int(round(ratio))
    return max(1, min(stride, TRACK_STABILITY_STRIDE))


def get_optimal_config(video_path):
    fps, frames, duration, w, h, pixels = _video_meta(video_path)
    cpu_score = _cpu_score()

    imgsz = _select_imgsz(pixels)
    model_fps = _estimate_fps(imgsz, cpu_score)
    detect_stride = _select_stride(fps, model_fps)
    effective_fps = model_fps / detect_stride
    realtime_possible = effective_fps >= fps

    return {
        "video_fps": fps,
        "frames": frames,
        "duration": round(duration, 2),
        "resolution": [w, h],
        "pixels": pixels,
        "cpu_score": cpu_score,
        "imgsz": imgsz,
        "detect_stride": detect_stride,
        "model_fps_est": round(model_fps, 2),
        "effective_fps_est": round(effective_fps, 2),
        "realtime_possible": realtime_possible
    }