File size: 3,501 Bytes
98075af
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
99
100
101
102
103
104
105
106
107
108
109
110
import time

import torch
from PIL import Image
from torchvision.models.detection import (
    fasterrcnn_resnet50_fpn,
    FasterRCNN_ResNet50_FPN_Weights,
    keypointrcnn_resnet50_fpn,
    KeypointRCNN_ResNet50_FPN_Weights,
)

from backend.app.ml.sensor_fusion import load_fusion_for_cam_frame
from backend.app.ml.inference import predict, USING_FUSION_MODEL


def main():
    img_path = r"DataSet/samples/CAM_FRONT/n008-2018-08-01-15-16-36-0400__CAM_FRONT__1533151603512404.jpg"
    img = Image.open(img_path).convert("RGB")

    device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
    print("device", device)
    print("using_fusion_model", USING_FUSION_MODEL)

    t0 = time.perf_counter()
    w_det = FasterRCNN_ResNet50_FPN_Weights.DEFAULT
    m_det = fasterrcnn_resnet50_fpn(weights=w_det, progress=False).to(device).eval()
    if device.type == "cuda":
        torch.cuda.synchronize()
    load_det = (time.perf_counter() - t0) * 1000

    t0 = time.perf_counter()
    w_pose = KeypointRCNN_ResNet50_FPN_Weights.DEFAULT
    m_pose = keypointrcnn_resnet50_fpn(weights=w_pose, progress=False).to(device).eval()
    if device.type == "cuda":
        torch.cuda.synchronize()
    load_pose = (time.perf_counter() - t0) * 1000

    print("load_ms_fasterrcnn", round(load_det, 2))
    print("load_ms_keypointrcnn", round(load_pose, 2))

    in_det = w_det.transforms()(img).unsqueeze(0).to(device)
    in_pose = w_pose.transforms()(img).unsqueeze(0).to(device)

    with torch.no_grad():
        _ = m_det(in_det)
        _ = m_pose(in_pose)
    if device.type == "cuda":
        torch.cuda.synchronize()

    n = 5

    st = time.perf_counter()
    with torch.no_grad():
        for _ in range(n):
            _ = m_det(in_det)
    if device.type == "cuda":
        torch.cuda.synchronize()
    det_ms = (time.perf_counter() - st) * 1000 / n

    st = time.perf_counter()
    with torch.no_grad():
        for _ in range(n):
            _ = m_pose(in_pose)
    if device.type == "cuda":
        torch.cuda.synchronize()
    pose_ms = (time.perf_counter() - st) * 1000 / n

    print("avg_ms_det_per_frame", round(det_ms, 2))
    print("avg_ms_pose_per_frame", round(pose_ms, 2))

    m = 30
    st = time.perf_counter()
    for _ in range(m):
        _ = load_fusion_for_cam_frame(
            "n008-2018-08-01-15-16-36-0400__CAM_FRONT__1533151603512404.jpg",
            data_root="DataSet",
        )
    fusion_ms = (time.perf_counter() - st) * 1000 / m
    print("avg_ms_fusion_lookup", round(fusion_ms, 2))

    pts = [(0, 10), (2, 10), (4, 10), (6, 10)]
    neigh = [
        [(8, 12), (8.5, 12), (9, 12), (9.5, 12)],
        [(15, 7), (15.5, 7.2), (16, 7.5), (16.4, 7.7)],
    ]
    fusion_feats = [[0.2, 0.1, 0.25], [0.25, 0.1, 0.3], [0.3, 0.12, 0.35], [0.35, 0.15, 0.4]]

    for _ in range(10):
        _ = predict(pts, neigh, fusion_feats=fusion_feats)
    if device.type == "cuda":
        torch.cuda.synchronize()

    k = 300
    st = time.perf_counter()
    for _ in range(k):
        _ = predict(pts, neigh, fusion_feats=fusion_feats)
    if device.type == "cuda":
        torch.cuda.synchronize()
    pred_ms = (time.perf_counter() - st) * 1000 / k
    print("avg_ms_transformer_predict", round(pred_ms, 4))

    approx = 2 * det_ms + pose_ms + fusion_ms + 6 * pred_ms
    fps = 1000.0 / approx if approx > 0 else 0.0
    print("approx_live_2frame_ms", round(approx, 2))
    print("approx_live_equiv_fps", round(fps, 2))


if __name__ == "__main__":
    main()