File size: 1,806 Bytes
ceea884
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
"""여러 주행 타일 (nusim.recon.tile) — 자르기·색 맞춤·카메라 번호, CPU."""

from dataclasses import dataclass, field

import numpy as np
import pytest

from nusim.recon.tile import crop_scene, fit_color


@dataclass
class _F:
    timestamp: int
    ego_translation: list


@dataclass
class _S:
    frames: dict
    lidar: list = field(default_factory=list)


def _scene(xs):
    fr = [_F(i * 100_000, [x, 0.0, 0.0]) for i, x in enumerate(xs)]
    return _S(frames={"CAM_FRONT": fr}, lidar=list(fr))


def test_crop_scene_keeps_time_span_inside_tile():
    s = _scene([-100, -50, -30, 0, 30, 50, 100])
    c = crop_scene(s, np.array([0.0, 0.0]), 40)
    xs = [f.ego_translation[0] for f in c.frames["CAM_FRONT"]]
    assert xs == [-30, 0, 30] and len(c.lidar) == 3


def test_crop_scene_none_when_outside():
    assert crop_scene(_scene([100, 200]), np.array([0.0, 0.0]), 40) is None


def test_fit_color_recovers_affine_and_ignores_masked():
    rng = np.random.default_rng(0)
    pred = rng.random((20, 30, 3)).astype(np.float32) * 0.5 + 0.2
    A = np.array([[0.9, 0.05, 0], [0, 1.1, 0], [0.02, 0, 0.8]], np.float32)
    gt = np.clip(pred @ A.T + 0.03, 0, 1)
    keep = np.ones((20, 30), bool)
    keep[:5] = False
    gt_bad = gt.copy()
    gt_bad[:5] = 1.0  # 가린 영역은 맞춤에 안 들어가야 한다
    out = fit_color(pred, gt_bad, keep)
    assert np.allclose(out[keep], gt[keep], atol=1e-4)


def test_trainer_names_tile_cameras():
    torch = pytest.importorskip("torch")
    from nusim.recon.train import CameraAdjust

    adj = CameraAdjust(12)
    with torch.no_grad():
        adj.delta[7, 3] = 0.1
    js = adj.to_json()
    assert "CAM_FRONT" in js and "CAM_FRONT#1" in js and len(js) == 12
    assert js["CAM_FRONT#1"]["translation_m"] == pytest.approx(0.1)