File size: 3,087 Bytes
51ac7cc
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
#!/usr/bin/env python3
"""genbench 结果拼成每个源一个对比视频(2 列网格,每格 832×480 带标签)。
usage: genbench_compose.py <tag> ...   tag ∈ train_v10 train_v9 val_v10 val_v9 L3"""
import os
import sys

import cv2
import imageio.v3 as iio
import numpy as np

G = "/opt/dlami/nvme/zhiyangdeng/maliang/outputs/genbench"
L1 = "/opt/dlami/nvme/zhiyangdeng/maliang/outputs/sft_v10/eval_step-8000/L1_cond"
W, H = 832, 480
STY = {"orig": "原首帧", "inkwash": "水墨(没见过)", "clay": "黏土(没见过)", "papercraft": "纸艺低多边形(没见过)"}


def panel(path, k):
    """k-th 832-wide panel of an mp4 (title bar 48 px cropped) → [81,480,832,3]."""
    v = iio.imread(path)
    return v[:, -H:, k * W:(k + 1) * W]


def label(fr, text):
    out = fr.copy()
    cv2.rectangle(out, (0, 0), (W, 34), (0, 0, 0), -1)
    # cv2 没有中文字体:标签用英文
    cv2.putText(out, text, (10, 24), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (255, 230, 120), 2, cv2.LINE_AA)
    return out


def grid(tiles, ncol=2):
    T = min(len(v) for _, v in tiles)
    while len(tiles) % ncol:
        tiles.append(("", np.zeros_like(tiles[0][1])))
    frames = []
    for t in range(T):
        rows = [np.concatenate([label(v[t], n) for n, v in tiles[r:r + ncol]], 1) for r in range(0, len(tiles), ncol)]
        frames.append(np.concatenate(rows, 0))
    return np.stack(frames)


def write(path, frames):
    iio.imwrite(path, frames, fps=16, codec="libx264", quality=None, macro_block_size=16,
                ffmpeg_params=["-crf", "23", "-pix_fmt", "yuv420p", "-movflags", "+faststart"])
    print(path, frames.shape, round(os.path.getsize(path) / 1e6, 1), "MB")


EN = {"orig": "original first frame", "inkwash": "UNSEEN style: ink-wash", "clay": "UNSEEN style: claymation",
      "papercraft": "UNSEEN style: papercraft"}


def l2(tag):
    d = f"{G}/L2/{tag}"
    tiles = []
    any_mp4 = next(f for f in sorted(os.listdir(d)) if f.endswith(".mp4") and not f.endswith("_gen.mp4"))
    tiles.append(("input map (numeric ids, parts coloured)", panel(f"{d}/{any_mp4}", 1)))
    if tag.startswith("val"):
        cid = open(f"{d}/src/done").read().strip()
        tiles.append(("GT (held-out run)", panel(f"{L1}/{cid}.mp4", 0)))
        tiles.append(("generated: original first frame", panel(f"{L1}/{cid}.mp4", 1)))
    for s in ("orig", "inkwash", "clay", "papercraft"):
        p = f"{d}/{tag}_{s}.mp4"
        if os.path.exists(p):
            tiles.append((f"generated: {EN[s]}", panel(p, 0)))
    write(f"{G}/compare_{tag}.mp4", grid(tiles))


def l3():
    tiles = []
    for c in sorted(os.listdir(f"{G}/L3")):
        p = f"{G}/L3/{c}/{c}.mp4"
        if not os.path.exists(p):
            continue
        theme = c.split("__")[0]
        tiles.append((f"UNSEEN map [{theme}]: numeric ids", panel(p, 1)))
        tiles.append((f"generated from FLUX first frame [{theme}]", panel(p, 0)))
    write(f"{G}/compare_L3_unseen_maps.mp4", grid(tiles))


if __name__ == "__main__":
    for tag in sys.argv[1:]:
        l3() if tag == "L3" else l2(tag)