vkgs-sim / docs /presentation /build_from_template.py
kimjunhan's picture
Add files using upload-large-folder tool
ceea884 verified
Raw History Blame Contribute Delete
82.8 kB
import copy import os import json from PIL import Image from pptx import Presentation from pptx.chart.data import CategoryChartData from pptx.dml.color import RGBColor from pptx.enum.chart import XL_CHART_TYPE, XL_LABEL_POSITION from pptx.enum.shapes import MSO_SHAPE from pptx.enum.text import MSO_ANCHOR, PP_ALIGN from pptx.oxml.ns import qn from pptx.util import Inches, Pt A = "/tmp/claude-1000/-home-mm-Downloads-vkgs-sim/8bf0e66c-975d-4257-af27-61bc25ee4316/scratchpad/deck/" NAVY, BLUE, LIGHT, PALE, GRAY, ORANGE, WHITE = (RGBColor(0x1F, 0x3B, 0x70), RGBColor(0x44, 0x72, 0xC4), RGBColor(0xDC, 0xE6, 0xF4), RGBColor(0xF2, 0xF5, 0xFA), RGBColor(0x40, 0x40, 0x40), RGBColor(0xED, 0x7D, 0x31), RGBColor(0xFF, 0xFF, 0xFF)) FONT = "๋ง‘์€ ๊ณ ๋”•" KEEP = {"์Šฌ๋ผ์ด๋“œ ๋ฒˆํ˜ธ ๊ฐœ์ฒด ํ‹€ 1", "์ œ๋ชฉ 1", "๊ทธ๋ฃน 6", "TextBox 9", "TextBox 4"} def shape(sl, name): for sh in sl.shapes: if sh.name == name: return sh raise KeyError(name) def set_runs_text(tf, text): """์ฒซ ๋ฌธ๋‹จ ์ฒซ run ์˜ ์„œ์‹์œผ๋กœ text ๋งŒ ๋‚จ๊ธด๋‹ค.""" p0 = tf.paragraphs[0] for p in tf.paragraphs[1:]: p._p.getparent().remove(p._p) runs = p0.runs if not runs: p0.text = text return runs[0].text = text for r in runs[1:]: r._r.getparent().remove(r._r) def set_paragraphs(tf, items): """์ฒซ ๋ฌธ๋‹จ์„ ๋ณธ์œผ๋กœ ๋ฌธ๋‹จ๋งˆ๋‹ค ๋ณต์‚ฌ (๊ธ€๋จธ๋ฆฌํ‘œยท๊ฐ„๊ฒฉ ์œ ์ง€).""" p0 = tf.paragraphs[0]._p for p in tf.paragraphs[1:]: p._p.getparent().remove(p._p) parent = p0.getparent() proto = copy.deepcopy(p0) parent.remove(p0) for it in items: p = copy.deepcopy(proto) rs = p.findall(qn("a:r")) for r in rs[1:]: p.remove(r) if rs: rs[0].find(qn("a:t")).text = it parent.append(p) def body(sl, tab, heading, bullets): for sh in list(sl.shapes): if sh.name not in KEEP: sh._element.getparent().remove(sh._element) set_runs_text(shape(sl, "์ œ๋ชฉ 1").text_frame, "VKGS-Sim") set_runs_text(shape(sl, "TextBox 4").text_frame, tab) grp = shape(sl, "๊ทธ๋ฃน 6") for c in grp.shapes: if c.has_text_frame and c.text_frame.text.strip(): set_runs_text(c.text_frame, heading) set_paragraphs(shape(sl, "TextBox 9").text_frame, bullets) return 1.82 + 0.28 * sum(1 + len(b) // 95 for b in bullets) + 0.15 # ๋ณธ๋ฌธ ๋‹ค์Œ y (12pt, ์ค„๊ฐ„๊ฒฉ 150%) def notes(sl, text): sl.notes_slide.notes_text_frame.text = text def tb(sl, x, y, w, h, text, size=12, bold=False, color=GRAY, align=PP_ALIGN.LEFT, anchor=MSO_ANCHOR.TOP, font=FONT): t = sl.shapes.add_textbox(Inches(x), Inches(y), Inches(w), Inches(h)) tf = t.text_frame tf.word_wrap = True tf.margin_left = tf.margin_right = Inches(0.04) tf.margin_top = tf.margin_bottom = Inches(0.02) tf.vertical_anchor = anchor for i, line in enumerate(text.split("\n")): p = tf.paragraphs[0] if i == 0 else tf.add_paragraph() p.alignment = align r = p.add_run() r.text = line r.font.size, r.font.bold, r.font.color.rgb, r.font.name = Pt(size), bold, color, font return t def box(sl, x, y, w, h, text, fill=LIGHT, color=GRAY, size=12, bold=False, line=None, align=PP_ALIGN.CENTER, title=None): s = sl.shapes.add_shape(MSO_SHAPE.ROUNDED_RECTANGLE, Inches(x), Inches(y), Inches(w), Inches(h)) s.adjustments[0] = 0.08 s.fill.solid() s.fill.fore_color.rgb = fill if line: s.line.color.rgb = line s.line.width = Pt(1.25) else: s.line.fill.background() s.shadow.inherit = False tf = s.text_frame tf.word_wrap = True tf.margin_left = tf.margin_right = Inches(0.1) tf.margin_top = tf.margin_bottom = Inches(0.06) tf.vertical_anchor = MSO_ANCHOR.MIDDLE if title is None else MSO_ANCHOR.TOP lines = ([(title, True, size + 1)] if title else []) + [(l, bold, size) for l in text.split("\n") if l] for i, (l, b, sz) in enumerate(lines): p = tf.paragraphs[0] if i == 0 else tf.add_paragraph() p.alignment = PP_ALIGN.CENTER if (title and i == 0) else align p.space_after = Pt(3) r = p.add_run() r.text = l r.font.size, r.font.bold, r.font.color.rgb, r.font.name = Pt(sz), b, color, FONT return s def arrow(sl, x, y, w=0.36, h=0.24, color=BLUE): s = sl.shapes.add_shape(MSO_SHAPE.RIGHT_ARROW, Inches(x), Inches(y), Inches(w), Inches(h)) s.fill.solid() s.fill.fore_color.rgb = color s.line.fill.background() s.shadow.inherit = False return s def image(sl, path, x, y, w=None, h=None): iw, ih = Image.open(path).size if w and h: # ์ƒ์ž ์•ˆ์— ๋งž์ถ˜๋‹ค (contain), ๊ฐ€์šด๋ฐ s = min(w / iw, h / ih) ww, hh = iw * s, ih * s return sl.shapes.add_picture(path, Inches(x + (w - ww) / 2), Inches(y + (h - hh) / 2), Inches(ww), Inches(hh)) if w: return sl.shapes.add_picture(path, Inches(x), Inches(y), Inches(w), Inches(w * ih / iw)) return sl.shapes.add_picture(path, Inches(x), Inches(y), Inches(h * iw / ih), Inches(h)) def table(sl, x, y, w, rows, colw, size=11, rowh=0.3, align_right=()): t = sl.shapes.add_table(len(rows), len(rows[0]), Inches(x), Inches(y), Inches(w), Inches(rowh * len(rows))).table for j, cw in enumerate(colw): t.columns[j].width = Inches(w * cw) for i, row in enumerate(rows): t.rows[i].height = Inches(rowh) for j, v in enumerate(row): c = t.cell(i, j) c.margin_left = c.margin_right = Inches(0.08) c.margin_top = c.margin_bottom = Inches(0.03) c.vertical_anchor = MSO_ANCHOR.MIDDLE c.fill.solid() c.fill.fore_color.rgb = NAVY if i == 0 else (PALE if i % 2 == 0 else WHITE) tf = c.text_frame tf.word_wrap = True p = tf.paragraphs[0] p.text = "" p.alignment = PP_ALIGN.RIGHT if (j in align_right and i > 0) else PP_ALIGN.LEFT r = p.add_run() r.text = str(v) r.font.size, r.font.name = Pt(size), FONT r.font.bold = i == 0 r.font.color.rgb = WHITE if i == 0 else GRAY return t def kpi(sl, x, y, w, num, label, color=NAVY): s = box(sl, x, y, w, 1.05, "", fill=PALE, line=LIGHT) tb(sl, x + 0.1, y + 0.08, w - 0.2, 0.55, num, size=26, bold=True, color=color, align=PP_ALIGN.CENTER) tb(sl, x + 0.1, y + 0.64, w - 0.2, 0.35, label, size=11, color=GRAY, align=PP_ALIGN.CENTER) return s def caption(sl, x, y, w, text): return tb(sl, x, y, w, 0.32, text, size=12, bold=True, color=GRAY, align=PP_ALIGN.CENTER) import sys prs = Presentation(sys.argv[1]) slides = list(prs.slides) # ------------------------------------------------------------------ 1 ํ‘œ์ง€ s = slides[0] for sh in s.shapes: if sh.name == "์ œ๋ชฉ 1": set_runs_text(sh.text_frame, "VKGS-Sim: 3D Gaussian Splatting ๊ธฐ๋ฐ˜ Vulkan ์ฃผํ–‰ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ") elif sh.name == "๋ถ€์ œ๋ชฉ 2": sh.text_frame.text = "nuScenes ์‹ฑ๊ฐ€ํฌ๋ฅด ์‹ค์ฃผํ–‰ ๋กœ๊ทธ๋กœ ๋งŒ๋“  closed-loop ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ" for r in sh.text_frame.paragraphs[0].runs: r.font.size = Pt(16) elif sh.name == "ํ…์ŠคํŠธ ๊ฐœ์ฒด ํ‹€ 3": set_runs_text(sh.text_frame, "2026. 10. 12.") elif sh.name == "ํ…์ŠคํŠธ ๊ฐœ์ฒด ํ‹€ 6": set_paragraphs(sh.text_frame, ["๊ตญ๋ฏผ๋Œ€ํ•™๊ต ์ฐจ๋Ÿ‰์ง€๋Šฅ์—ฐ๊ตฌ์‹ค", "kimjunhan"]) notes(s, "VKGS-Sim ์ง„ํ–‰ ๋ณด๊ณ . ์‹ค์ œ ์ฃผํ–‰ ๋กœ๊ทธ๋กœ ๋งŒ๋“  3D ์žฅ๋ฉด ์œ„์—์„œ ์ฃผํ–‰ ๋ชจ๋ธ์ด ์šด์ „ํ•˜๊ณ , ๊ทธ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ค์Œ ๊ด€์ธก์„ ๋ฐ”๊พธ๋Š” ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ๋ฅผ ์†Œ๊ฐœํ•œ๋‹ค.") # ------------------------------------------------------------------ 2 ๋ชฉ์ฐจ s = slides[1] for sh in s.shapes: if sh.name == "ํ…์ŠคํŠธ ๊ฐœ์ฒด ํ‹€ 2": set_paragraphs(sh.text_frame, ["์—ฐ๊ตฌ ๋ฐฐ๊ฒฝ ๋ฐ ๋ชฉํ‘œ", "์‹œ๋ฎฌ๋ ˆ์ด์…˜ ์—”์ง„ ์•„ํ‚คํ…์ฒ˜", "๋ฉ€ํ‹ฐ๋ทฐ ์‹œ์  ๋ณ€ํ™˜ ๋ชจ๋ธ ์•„ํ‚คํ…์ฒ˜", "๋ฐ์ดํ„ฐ ๋ฐ ํ•™์Šต", "์‹œ๋ฎฌ๋ ˆ์ด์…˜ ๊ฒฐ๊ณผ", "์ง„ํ–‰ ํ˜„ํ™ฉ ๋ฐ ๊ณ„ํš"]) notes(s, "๋‹ค์„ฏ ๋ถ€๋ถ„์œผ๋กœ ๋ฐœํ‘œํ•œ๋‹ค.") def divider(sl, title, note): for sh in sl.shapes: if sh.name == "์ œ๋ชฉ 1": set_runs_text(sh.text_frame, title) notes(sl, note) divider(slides[2], "์—ฐ๊ตฌ ๋ฐฐ๊ฒฝ ๋ฐ ๋ชฉํ‘œ", "๋จผ์ € ์™œ closed-loop ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ๊ฐ€ ํ•„์š”ํ•œ์ง€์™€ 3DGS ๋ฅผ ์„ค๋ช…ํ•œ๋‹ค.") # ------------------------------------------------------------------ 4 ์—ฐ๊ตฌ ๋ฐฐ๊ฒฝ s = slides[3] y = body(s, "์—ฐ๊ตฌ ๋ฐฐ๊ฒฝ", "์—ฐ๊ตฌ ๋ฐฐ๊ฒฝ โ€” open-loop ํ‰๊ฐ€์˜ ํ•œ๊ณ„์™€ closed-loop ์‹œ๋ฎฌ๋ ˆ์ด์…˜", [ "๊ธฐ์กด ์ฃผํ–‰ ๋ชจ๋ธ ํ‰๊ฐ€๋Š” ๊ธฐ๋ก๋œ ์˜์ƒ์„ ์ž…๋ ฅํ•˜๊ณ  ์ •๋‹ต ๊ถค์ ๊ณผ ๋น„๊ตํ•˜๋Š” open-loop ๋ฐฉ์‹์ž„", "๋ชจ๋ธ์ด ๋‹ค๋ฅด๊ฒŒ ์šด์ „ํ•ด๋„ ๋‹ค์Œ ์˜์ƒ์€ ๋ฐ”๋€Œ์ง€ ์•Š์œผ๋ฏ€๋กœ, ์‹ค์ˆ˜๊ฐ€ ๋ˆ„์ ๋˜๋Š” ์ƒํ™ฉ์„ ํ‰๊ฐ€ํ•  ์ˆ˜ ์—†์Œ", "๋ณธ ์—ฐ๊ตฌ๋Š” ์‹ค์ฃผํ–‰ ๋กœ๊ทธ๋กœ 3D ์žฅ๋ฉด์„ ์žฌ๊ตฌ์„ฑํ•˜๊ณ , ๋ชจ๋ธ์˜ ์ œ์–ด๋กœ ์›€์ง์ธ ์ž์ฐจ ์œ„์น˜์—์„œ ์ƒˆ 6์บ  ์˜์ƒ์„ ๋ Œ๋”๋งํ•˜๋Š” closed-loop ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ๋ฅผ ๊ฐœ๋ฐœํ•จ", "๋ชฉํ‘œ: ๋‹จ์ผ RTX 3060 Ti (8 GB) ์—์„œ ์‹ฑ๊ฐ€ํฌ๋ฅด ๋‚ฎ ๋งต ์ „์ฒด (284์”ฌ, 30 km) ๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ Œ๋”๋ง", ]) y = max(y, 3.55) labels = ["6์บ  ๊ด€์ธก", "VLM / VLA", "์กฐํ–ฅ ยท ๊ฐ€์†", "์ž์ฐจ ์ ๋ถ„ ยท ์ถฉ๋Œ", "3DGS ๋ Œ๋”"] bw, gap, x0 = 2.0, 0.55, 0.85 for i, l in enumerate(labels): x = x0 + i * (bw + gap) box(s, x, y + 0.35, bw, 0.75, l, fill=NAVY if i == 4 else LIGHT, color=WHITE if i == 4 else NAVY, size=14, bold=True) if i < 4: arrow(s, x + bw + 0.1, y + 0.6) back = s.shapes.add_shape(MSO_SHAPE.U_TURN_ARROW, Inches(x0 + 0.3), Inches(y + 1.25), Inches(4 * (bw + gap) + bw - 0.6), Inches(0.55)) back.rotation = 180 back.fill.solid() back.fill.fore_color.rgb = LIGHT back.line.fill.background() back.shadow.inherit = False tb(s, x0, y + 1.95, 4 * (bw + gap) + bw, 0.32, "๋ Œ๋” ๊ฒฐ๊ณผ๊ฐ€ ๋‹ค์Œ ๊ด€์ธก์ด ๋œ๋‹ค โ€” ์ œ์–ด๊ฐ€ ์žฅ๋ฉด์„ ๋ฐ”๊พธ๋Š” ๋ฃจํ”„", size=12, bold=True, color=NAVY, align=PP_ALIGN.CENTER) box(s, 0.85, y + 2.45, 5.6, 0.95, "๊ธฐ๋ก ์˜์ƒ์„ ์žฌ์ƒ โ†’ ์ •๋‹ต ๊ถค์ ๊ณผ ๋น„๊ต\n๋ชจ๋ธ์ด ๋ฒ—์–ด๋‚˜๋„ ์˜์ƒ์€ ๊ทธ๋Œ€๋กœ", title="open-loop (๊ธฐ์กด)", fill=PALE, line=LIGHT, size=11) box(s, 6.9, y + 2.45, 5.6, 0.95, "๋ชจ๋ธ์˜ ์กฐํ–ฅ ยท ๊ฐ€์†์œผ๋กœ ์ž์ฐจ ์ด๋™\n๊ทธ ์œ„์น˜์—์„œ 6์บ  ์˜์ƒ์„ ์ƒˆ๋กœ ๋ Œ๋”", title="closed-loop (VKGS-Sim)", fill=PALE, line=BLUE, size=11) notes(s, "ํ•ต์‹ฌ ๋‚œ์ ์€ ์›๋ž˜ ๊ถค์ ์—์„œ ๋ฒ—์–ด๋‚˜๋ฉด ํ•™์Šต ์นด๋ฉ”๋ผ๊ฐ€ ๋ณธ ์  ์—†๋Š” ์‹œ์ ์ด ๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋ž˜์„œ ์‹œ์  ๋ณ€ํ™˜ ์ฆ๊ฐ•๊ณผ ๊ตฌ๊ฐ„ ๋ถ„ํ•  ๊ฐ™์€ ์ž‘์—…์ด ์ด์–ด์ง„๋‹ค.") # ------------------------------------------------------------------ 5 3DGS s = slides[4] y = body(s, "์—ฐ๊ตฌ ๋ฐฐ๊ฒฝ", "3D Gaussian Splatting ๊ฐœ์š”", [ "์žฅ๋ฉด์„ ์ˆ˜๋ฐฑ๋งŒ ๊ฐœ์˜ 3D ๊ฐ€์šฐ์‹œ์•ˆ (์œ„์น˜ ยท ๊ณต๋ถ„์‚ฐ ยท ๋ถˆํˆฌ๋ช…๋„ ยท ๊ตฌ๋ฉด์กฐํ™” ์ƒ‰) ์œผ๋กœ ํ‘œํ˜„ํ•˜๋Š” ๋ช…์‹œ์  ์žฅ๋ฉด ํ‘œํ˜„", "์นด๋ฉ”๋ผ๋กœ ํˆฌ์˜ โ†’ ๊นŠ์ด์ˆœ ์ •๋ ฌ โ†’ ์•ž์—์„œ๋ถ€ํ„ฐ ์•ŒํŒŒ ๋ธ”๋ Œ๋”ฉํ•˜์—ฌ ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑ: C = ฮฃ cแตข ฮฑแตข ฮ (1 โˆ’ ฮฑโฑผ)", "๋ฏธ๋ถ„ ๊ฐ€๋Šฅํ•˜์—ฌ ์‹ค์ œ ์‚ฌ์ง„๊ณผ์˜ ์˜ค์ฐจ๋กœ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ํ•™์Šตํ•˜๊ณ , ํ•™์Šต ํ›„์—๋Š” ๋ž˜์Šคํ„ฐํ™”๋กœ ์‹ค์‹œ๊ฐ„ ๋ Œ๋”๋ง์ด ๊ฐ€๋Šฅํ•จ", ]) table(s, 0.85, y + 0.2, 6.1, [ ["ํŒŒ๋ผ๋ฏธํ„ฐ", "์˜๋ฏธ", "๋ฐ”์ดํŠธ"], ["์œ„์น˜ ฮผ (xyz)", "๊ฐ€์šฐ์‹œ์•ˆ ์ค‘์‹ฌ", "12"], ["์Šค์ผ€์ผ + ํšŒ์ „ (์ฟผํ„ฐ๋‹ˆ์–ธ)", "๊ณต๋ถ„์‚ฐ ฮฃ = R S Sแต€ Rแต€", "28"], ["๋ถˆํˆฌ๋ช…๋„ ฮฑ", "์–ผ๋งˆ๋‚˜ ๊ฐ€๋ฆฌ๋Š”๊ฐ€", "4"], ["๊ตฌ๋ฉด์กฐํ™” ๊ณ„์ˆ˜ (3์ฐจ, 48๊ฐœ)", "๋ณด๋Š” ๋ฐฉํ–ฅ์— ๋”ฐ๋ฅธ ์ƒ‰", "192"], ["ํ•ฉ๊ณ„", "๊ตฌ๊ฐ„ ๋ชจ๋ธ๋‹น 200๋งŒ ๊ฐœ โ‰ˆ 0.5 GB", "236"], ], [0.38, 0.47, 0.15], size=12, rowh=0.38, align_right=(2,)) steps = [("โ‘  ํˆฌ์˜", "ฮฃ โ†’ ํ™”๋ฉด 2D ๊ณต๋ถ„์‚ฐ\n๋ณด๋Š” ๋ฐฉํ–ฅ์˜ SH ์ƒ‰"), ("โ‘ก ์ •๋ ฌ", "๋ณด์ด๋Š” ๊ฐ€์šฐ์‹œ์•ˆ๋งŒ\nGPU radix ์ •๋ ฌ"), ("โ‘ข ๋ธ”๋ Œ๋”ฉ", "์•ž์—์„œ๋ถ€ํ„ฐ ๋ˆ„์ \n๊ฐ€๊นŒ์šด ๊ฒƒ์ด ๊ฐ€๋ฆผ")] for i, (t, d) in enumerate(steps): x = 7.35 + i * 1.85 box(s, x, y + 0.2, 1.55, 2.25, d, title=t, fill=PALE, line=BLUE, size=11) if i < 2: arrow(s, x + 1.57, y + 1.2, w=0.26, h=0.2) tb(s, 7.35, y + 2.6, 5.3, 0.6, "ํ•™์Šต: PyTorch + gsplat (CUDA) / ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ: Vulkan ์œผ๋กœ ๊ฐ™์€ ์‹์„ ์žฌ๊ตฌํ˜„ โ€” ๋‘ ๊ฒฐ๊ณผ๊ฐ€ PSNR 56 dB ๋กœ ์ผ์น˜", size=11, bold=True, color=NAVY) notes(s, "NeRF ์ฒ˜๋Ÿผ ์‹ ๊ฒฝ๋ง์ด ์•„๋‹ˆ๋ผ ๋ช…์‹œ์ ์ธ ๊ฐ€์šฐ์‹œ์•ˆ ์ง‘ํ•ฉ์ด๋‹ค. 2D ๊ณต๋ถ„์‚ฐ์€ ฮฃ' = J W ฮฃ Wแต€ Jแต€. ๋ธ”๋ Œ๋”ฉ ์ˆœ์„œ๊ฐ€ ๊ฒฐ๊ณผ๋ฅผ ์ •ํ•˜๋ฏ€๋กœ ์ •๋ ฌ์ด ํ•ต์‹ฌ ๋น„์šฉ์ด๋‹ค.") # ------------------------------------------------------------------ 7 ์ „์ฒด ์•„ํ‚คํ…์ฒ˜ s = slides[5] y = body(s, "์—ฐ๊ตฌ ๋ฐฐ๊ฒฝ", "์ „์ฒด ์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜", [ "๋ฐ์ดํ„ฐ ๊ณ„์ธต โ†’ ์žฌ๊ตฌ์„ฑ (CUDA) โ†’ ๋ Œ๋”๋ง (Vulkan) โ†’ closed-loop ์‹œ๋ฎฌ๋ ˆ์ด์…˜์˜ 4๋‹จ๊ณ„๋กœ ๊ตฌ์„ฑ๋จ", "ํ•™์Šต์€ ๋ฏธ๋ถ„์ด ํ•„์š”ํ•˜์—ฌ PyTorch + gsplat ์„, ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ๋Š” ๋ฉ”์‹œ ยท ์กฐ๋ช… ยท ํ›„์ฒ˜๋ฆฌ๋ฅผ ํ•œ ํ”„๋ ˆ์ž„์— ์„ž๊ธฐ ์œ„ํ•ด Vulkan ์„ ์‚ฌ์šฉํ•จ", "๋ชจ๋“  ๋‹จ๊ณ„๊ฐ€ ๋‹จ์ผ RTX 3060 Ti 8 GB ์—์„œ ๋™์ž‘ํ•˜๋ฉฐ, ์กฐ์ •๊ฐ’์€ configs/ (sim.json, ํ•™์Šต ํ”„๋ฆฌ์…‹, ์ž‘์—… JSON) ์— ๋‘ ", ]) stages = [("โ‘  ๋ฐ์ดํ„ฐ ๊ณ„์ธต", "NFS ์œ„ nuScenes ๋ฅผ ์ฝ๊ธฐ ์ „์šฉ์œผ๋กœ\nํ•œ ๋ฒˆ ํ›‘์–ด ์”ฌ ์ธ๋ฑ์Šค ์บ์‹œ\n(6์บ  ยท ํฌ์ฆˆ ยท ์บ˜๋ฆฌ๋ธŒ ยท ๋ผ์ด๋‹ค ยท ๋ฐ•์Šค)\n์ธ๋ฑ์Šค 35.8์ดˆ ยท ์”ฌ ๋กœ๋“œ 7 ms"), ("โ‘ก ์žฌ๊ตฌ์„ฑ (CUDA)", "PyTorch + gsplat 3DGS ํ•™์Šต\n๋ผ์ด๋‹ค ์ดˆ๊ธฐํ™” ยท ๊นŠ์ด ๊ฐ๋…\n์ฐจ๋Ÿ‰ยท์‚ฌ๋žŒ ๊ฐ€๋ฆผ ยท ํ•˜๋Š˜ ํ๋ธŒ๋งต\n60 m ๊ตฌ๊ฐ„ ๋‹จ์œ„"), ("โ‘ข ๋ Œ๋”๋ง (Vulkan)", "vkgs_viewer: bindless\n+ ๋ Œ๋” ๊ทธ๋ž˜ํ”„ (JSON)\nGPU radix ์ •๋ ฌ ยท 6์บ  ยท BEV\n๊ตฌ๊ฐ„ ์ŠคํŠธ๋ฆฌ๋ฐ ยท ์˜คํ”„์Šคํฌ๋ฆฐ"), ("โ‘ฃ ์‹œ๋ฎฌ๋ ˆ์ด์…˜", "์ž์ „๊ฑฐ ๋ชจ๋ธ ์ž์ฐจ\n์žฅ์• ๋ฌผ ยท ์—ฐ์„ ์ถฉ๋Œ\n๋ผ์ด๋‹ค ยท ๋ ˆ์ด๋” ๋ ˆ์ด์บ์ŠคํŠธ\n์Šคํฌ๋ฆฝํŠธ ์ œ์–ด โ†’ ๊ด€์ธก ์ €์žฅ")] bw = 2.75 for i, (t, d) in enumerate(stages): x = 0.85 + i * (bw + 0.38) box(s, x, y + 0.25, bw, 1.75, d, title=t, fill=NAVY if i == 3 else PALE, color=WHITE if i == 3 else GRAY, line=None if i == 3 else BLUE, size=11) if i < 3: arrow(s, x + bw + 0.04, y + 1.01, w=0.3, h=0.22) tb(s, 0.85, y + 2.15, 11.8, 0.32, "๊ฒฐ๊ณผ๋ฌผ: outputs/gs_day/<scene>/seg<k> (๊ตฌ๊ฐ„ ๋ชจ๋ธ) โ†’ ๋ Œ๋” / ์ฆ๊ฐ• (outputs/aug/map ยท outputs/aug/aug_artfixer) / ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ", size=11, bold=True, color=NAVY, align=PP_ALIGN.CENTER) notes(s, "ํ•™์Šต VRAM ์•ฝ 2.3~3 GB. ์—ฌ๋Ÿฌ ๋‹จ๊ณ„ ์ž‘์—…์€ configs/jobs/<์ด๋ฆ„>.json + nusim run ์œผ๋กœ ๋Œ๋ฆฐ๋‹ค.") # ------------------------------------------------------------------ 9 ๋ Œ๋”๋Ÿฌ ์„ฑ๋Šฅ s = slides[11] y = body(s, "์—”์ง„ ๊ตฌ์กฐ", "Vulkan ๋ Œ๋”๋Ÿฌ ์„ฑ๋Šฅ", [ "gsplat 1.4.0 ๊ณผ ๊ฐ™์€ ์…ฐ์ด๋” ์ˆ˜์‹์„ Vulkan ์œผ๋กœ ๊ตฌํ˜„ํ•˜์—ฌ ํ•™์Šต๊ธฐ ๋ Œ๋”์™€ PSNR 56 dB ๋กœ ์ผ์น˜ํ•จ", "์ •๋ ฌ์ด ํ”„๋ ˆ์ž„์˜ 58% ๋ฅผ ์ฐจ์ง€ํ•˜์—ฌ, ๋ณด์ด๋Š” ๊ฐ€์šฐ์‹œ์•ˆ๋งŒ ์••์ถ•ํ•œ ๋’ค GPU radix ์ •๋ ฌ๋กœ ๊ต์ฒดํ•จ", ]) for i, (n, l) in enumerate([("56 dB", "ํ•™์Šต๊ธฐ ๋ Œ๋”์™€์˜ PSNR"), ("13ร—", "์ •๋ ฌ 31~35 ms โ†’ 2.7 ms"), ("16 ms", "1600ร—900 ํ•œ ์žฅ (์˜คํ”„์Šคํฌ๋ฆฐ)"), ("0.19 s", "๊ตฌ๊ฐ„ ๋ชจ๋ธ ๊ต์ฒด (200๋งŒ ๊ฐœ)")]): kpi(s, 0.85 + i * 3.0, y + 0.2, 2.75, n, l) table(s, 0.85, y + 1.55, 11.75, [ ["๊ตฌ์„ฑ", "๋‚ด์šฉ"], ["bindless ๋ฆฌ์†Œ์Šค", "์…ฐ์ด๋”๊ฐ€ ์Šฌ๋กฏ ๋ฒˆํ˜ธ๋กœ ๋ฒ„ํผ ยท ์ด๋ฏธ์ง€๋ฅผ ๊ณ ๋ฅธ๋‹ค โ€” ์ƒˆ ํŒจ์Šค์— ๋””์Šคํฌ๋ฆฝํ„ฐ ์ฝ”๋“œ๊ฐ€ ํ•„์š” ์—†์Œ"], ["๋ Œ๋” ๊ทธ๋ž˜ํ”„", "ํ”„๋ ˆ์ž„ ๊ตฌ์„ฑ์„ JSON ์ด ์ •ํ•˜๊ณ  ๋ฐฐ๋ฆฌ์–ด๋Š” ๊ทธ๋ž˜ํ”„๊ฐ€ ์ž๋™์œผ๋กœ ์‚ฝ์ž… (๊ฒ€์ฆ ๋ ˆ์ด์–ด ๋™๊ธฐํ™” ๊ฒ€์ฆ)"], ["์ •ํ™•๋„", "RGBA16F ๋ž˜์Šคํ„ฐ (32๋น„ํŠธ ๋Œ€๋น„ 64 dB), ๊ฑฐ๋ฆฌ ๋ˆ„์  r32f, ํ•™์Šต๊ธฐ ๋น„๊ต ์‹œ FXAA ๋”"], ["๋ Œ๋” ํƒ€๊ฒŸ ยท ์ •๋ ฌ", "16/32๋น„ํŠธ ยท radix/bitonic ยท FXAA ๋ฅผ ๊ทธ๋ž˜ํ”„ JSON ๊ณผ sim.json ์œผ๋กœ ์„ ํƒ"], ], [0.22, 0.78], size=12, rowh=0.4) tb(s, 0.85, y + 3.7, 11.75, 0.3, "* ์ˆ˜์น˜๋Š” ํ•™์Šต๊ณผ GPU ๋ฅผ ํ•จ๊ป˜ ์“ฐ๋Š” ์ƒํƒœ์—์„œ ์ธก์ •", size=10, color=GRAY) notes(s, "56 dB ๋Š” nusim render compare ๋กœ ๊ฐ™์€ ์นด๋ฉ”๋ผ์—์„œ ํ•™์Šต๊ธฐ ๋ Œ๋”์™€ ๋น„๊ตํ•œ ๊ฐ’. 800ร—450 ์—์„œ๋Š” ์žฅ๋‹น 6.8 ms.") divider(slides[18], "๋ฐ์ดํ„ฐ ๋ฐ ํ•™์Šต", "nuScenes ๋ฐ์ดํ„ฐ, ํ•™์Šต ๋ฐฉ๋ฒ•, ์žฌ๊ตฌ์„ฑ ๊ฒฐ๊ณผ, ์ฆ๊ฐ• ๊ฒฐ๊ณผ๋ฅผ ์„ค๋ช…ํ•œ๋‹ค.") # ------------------------------------------------------------------ 12 ๋ฐ์ดํ„ฐ์…‹ s = slides[19] y = body(s, "๋ฐ์ดํ„ฐ", "nuScenes ์‹ฑ๊ฐ€ํฌ๋ฅด ๋ฐ์ดํ„ฐ์…‹", [ "nuScenes 850์”ฌ ์ค‘ ์‹ฑ๊ฐ€ํฌ๋ฅด 383์”ฌ์„ ์‚ฌ์šฉ (๋ณด์Šคํ„ด 467์”ฌ ์ œ์™ธ) โ€” 6์บ  1600ร—900 ์•ฝ 11.7 Hz, ์ด๋ฏธ์ง€ 532,157์žฅ, 32์ฑ„๋„ ๋ผ์ด๋‹ค + ๋ ˆ์ด๋” 5๋Œ€", "๋ฐค ์˜์ƒ์€ ๋„ˆ๋ฌด ์–ด๋‘์›Œ ์žฌ๊ตฌ์„ฑ ํ’ˆ์งˆ์ด ๋‚ฎ์œผ๋ฏ€๋กœ ๋‚ฎ 284์”ฌ (์ฃผํ–‰ ๊ฒฝ๋กœ 30 km) ์œผ๋กœ ๋งต์„ ๊ตฌ์„ฑํ•จ โ€” ๊ทธ์ค‘ 77% ๊ฐ€ 3 m/s ์ด์ƒ์˜ ๋น ๋ฅธ ์ฃผํ–‰", ]) table(s, 0.85, y + 0.2, 3.9, [["์ง€์—ญ", "์ „์ฒด", "๋‚ฎ"], ["one-north", "183", "183"], ["queenstown", "115", "82"], ["holland village", "85", "19"], ["ํ•ฉ๊ณ„", "383", "284"]], [0.52, 0.24, 0.24], size=12, rowh=0.4, align_right=(1, 2)) tb(s, 0.85, y + 2.35, 3.9, 0.9, "ํ‚คํ”„๋ ˆ์ž„ (์–ด๋…ธํ…Œ์ด์…˜) 2 Hz, ๊ทธ ์‚ฌ์ด sweep ๊นŒ์ง€ ํ•™์Šต์— ์‚ฌ์šฉ. ์›๋ณธ์€ NFS ๊ณต์šฉ ๋ณผ๋ฅจ์—์„œ ์ฝ๊ธฐ ์ „์šฉ.", size=11, color=GRAY) image(s, A + "gt_6cam.jpg", 5.05, y + 0.2, w=7.6, h=2.85) caption(s, 5.05, y + 3.1, 7.6, "์‹ค์ œ 6์บ  ์‚ฌ์ง„ (scene-0402) โ€” ์œ„: ์•ž์™ผ์ชฝ ยท ์•ž ยท ์•ž์˜ค๋ฅธ์ชฝ / ์•„๋ž˜: ๋’ค์˜ค๋ฅธ์ชฝ ยท ๋’ค ยท ๋’ค์™ผ์ชฝ") notes(s, "CAM_BACK ๋งŒ HFOV 89ยฐ (fx 809), ๋‚˜๋จธ์ง€ 5๋Œ€๋Š” ์•ฝ 64ยฐ (fx ์•ฝ 1260). ๋ฐค โ†’ ๋‚ฎ ๋ณ€ํ™˜ (CycleGAN-Turbo) ์€ ์„ผ์„œ ์žก์Œ์„ ํ‚ค์›Œ ์“ธ ์ˆ˜ ์—†์—ˆ๋‹ค.") # ------------------------------------------------------------------ 13 ํ•™์Šต ๋ฐฉ๋ฒ• s = slides[20] y = body(s, "ํ•™์Šต", "ํ•™์Šต ๋ฐฉ๋ฒ• ๋ฐ ๊ตฌ๊ฐ„ ๋ถ„ํ• ", [ "๋ผ์ด๋‹ค ๋ˆ„์ ์œผ๋กœ ๊ฐ€์šฐ์‹œ์•ˆ์„ ์ดˆ๊ธฐํ™”ํ•˜๊ณ  ๊นŠ์ด ๊ฐ๋… (ฮป = 0.1), gsplat MCMC ๋ฐ€๋„ ์ œ์–ด (์ตœ๋Œ€ 200๋งŒ ๊ฐœ), ํ•˜๋Š˜ ํ๋ธŒ๋งต ๋ถ„๋ฆฌ๋ฅผ ์ ์šฉํ•จ", "์ฐจ๋Ÿ‰ ยท ์‚ฌ๋žŒ์€ 3D ๋ฐ•์Šค๋กœ ๊ฐ€๋ ค ํ™˜๊ฒฝ ์ „์šฉ ๋งต์„ ํ•™์Šตํ•˜๊ณ , ์นด๋ฉ”๋ผ๋ณ„ ์ƒ‰ ์•„ํ•€ ยท ์™ธ๋ถ€ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ํ•จ๊ป˜ ๋ณด์ •ํ•จ โ€” ๊ตฌ๊ฐ„๋‹น 15k ์Šคํ…, ์•ฝ 20๋ถ„", "๋น ๋ฅธ ์”ฌ์€ ํ†ต์งธ๋กœ ํ•™์Šตํ•˜๋ฉด ์ ํ•ฉ ์ž์ฒด๊ฐ€ ์‹คํŒจํ•˜์—ฌ 60 m ๊ตฌ๊ฐ„ (10 m ๊ฒน์นจ) ์œผ๋กœ ๋‚˜๋ˆ  ํ•™์Šตํ•จ โ€” 284์”ฌ โ†’ 696 ํ•™์Šต ๋‹จ์œ„", ]) cd = CategoryChartData() cd.categories = ["์”ฌ ํ†ต์งธ", "๊ตฌ๊ฐ„ 1", "๊ตฌ๊ฐ„ 2", "๊ตฌ๊ฐ„ 3", "๊ตฌ๊ฐ„ 4", "๊ตฌ๊ฐ„ 5"] cd.add_series("์ •์  PSNR (dB)", (16.23, 23.78, 22.76, 23.04, 23.02, 22.70)) gf = s.shapes.add_chart(XL_CHART_TYPE.COLUMN_CLUSTERED, Inches(0.85), Inches(y + 0.1), Inches(7.2), Inches(3.3), cd) ch = gf.chart ch.has_legend = False ch.has_title = True ch.chart_title.text_frame.text = "scene-0402 (11.9 m/s, 235 m) ์ •์  PSNR (dB)" ch.chart_title.text_frame.paragraphs[0].runs[0].font.size = Pt(12) ch.chart_title.text_frame.paragraphs[0].runs[0].font.bold = True pl = ch.plots[0] pl.gap_width = 60 pl.has_data_labels = True pl.data_labels.font.size = Pt(11) pl.data_labels.number_format = "0.00" pl.data_labels.number_format_is_linked = False pl.data_labels.position = XL_LABEL_POSITION.OUTSIDE_END ser = pl.series[0] ser.format.fill.solid() ser.format.fill.fore_color.rgb = BLUE pt0 = ser.points[0] pt0.format.fill.solid() pt0.format.fill.fore_color.rgb = RGBColor(0xA5, 0xA5, 0xA5) va = ch.value_axis va.minimum_scale, va.maximum_scale = 0, 30 va.has_major_gridlines = True va.major_gridlines.format.line.color.rgb = RGBColor(0xE0, 0xE0, 0xE0) va.tick_labels.font.size = Pt(10) ch.category_axis.tick_labels.font.size = Pt(11) box(s, 8.35, y + 0.15, 4.3, 3.2, "ํ†ต์งธ ํ•™์Šต์€ ํ•™์Šต ์†์‹ค๋ถ€ํ„ฐ ๋†’์•˜๋‹ค\n(L1 0.135 vs 0.05) โ€” ์ผ๋ฐ˜ํ™”๊ฐ€ ์•„๋‹ˆ๋ผ ์ ํ•ฉ ์‹คํŒจ\n\n์›์ธ์€ ์žฅ๋ฉด ๊ธธ์ด\n(์ „๋žต ยท ๊นŠ์ด ๊ฐ๋… ยท ์นด๋ฉ”๋ผ ๋ณด์ •์€ ์›์ธ ์•„๋‹˜)\n\n๊ตฌ๊ฐ„ ๊ฒฝ๊ณ„ ํ”„๋ ˆ์ž„ 4์Œ์—์„œ\n์ƒ‰ ยท ๊ธฐํ•˜ ์ด์Œ๋งค ์—†์Œ", title="+7.5 dB (16.23 โ†’ 23.78)", fill=PALE, line=BLUE, size=11) notes(s, "๋‚ฎ 284์”ฌ ์ค‘ 77% (218์”ฌ) ๊ฐ€ 3 m/s ๋ฅผ ๋„˜์–ด ๊ตฌ๊ฐ„ ๋ถ„ํ• ์ด ํ•„์ˆ˜๋‹ค. ๊ตฌ๊ฐ„์€ ๊ฐ™์€ ๊ธธ์ด๋กœ ๋‚˜๋ˆ„๋˜ 60 m ์ดํ•˜, ์ด์›ƒ 10 m ๊ฒน์นจ. 1๋‹จ๊ณ„ ๊ธฐ์ค€์„ ์€ scene-0003 6๋งŒ ์Šคํ… PSNR 25.62 / SSIM 0.804.") # ------------------------------------------------------------------ 14 ์žฌ๊ตฌ์„ฑ ๊ฒฐ๊ณผ s = slides[21] y = body(s, "ํ•™์Šต", "์žฌ๊ตฌ์„ฑ ๊ฒฐ๊ณผ", [ "ํ•™์Šต ์‹œ์  ์žฌํ˜„: ๊ฐ™์€ ์นด๋ฉ”๋ผ ยท ๊ฐ™์€ ์ˆœ๊ฐ„์˜ ์‹ค์ œ ์‚ฌ์ง„๊ณผ ์žฌ๊ตฌ์„ฑ ๋ Œ๋”๋ฅผ ๋น„๊ต (scene-0008) โ€” ๋ Œ๋”์—์„œ๋Š” ์ฃผ์ฐจ ์ฐจ๋Ÿ‰์ด ์ œ๊ฑฐ๋จ (ํ™˜๊ฒฝ ์ „์šฉ ๋งต)", "๊ตฌ๊ฐ„ ์ •์  PSNR ์ค‘์•™๊ฐ’ 24.7 dB (84 ๋‹จ์œ„), ํ•˜์œ„ 10% 22.1 dB, ํ•™์Šต ์‹คํŒจ 0๊ฑด", ]) image(s, A + "recon_vs_gt.jpg", 0.85, y + 0.15, w=11.8, h=3.3) caption(s, 0.85, y + 3.5, 5.9, "์‹ค์ œ ์‚ฌ์ง„ โ†‘") caption(s, 6.75, y + 3.5, 5.9, "3DGS ๋ Œ๋” (์ฐจ๋Ÿ‰ ์ œ๊ฑฐ) โ†‘") notes(s, "์ด ๊ทธ๋ฆผ์€ ํ•™์Šต์— ์“ด ์‹œ์ ์˜ ์žฌํ˜„์ด๋‹ค. ํ•™์Šต์—์„œ ๋บ€ ์˜† ์ฐจ์„  ์ฃผํ–‰์˜ ์‹ค์ œ ์‚ฌ์ง„์œผ๋กœ ์žฌ๋ฉด ์•ฝ 16.5 dB ๋กœ ํฌ๊ฒŒ ๋–จ์–ด์ง„๋‹ค โ€” ์ƒˆ ์‹œ์  ํ’ˆ์งˆ์ด ๋‚จ์€ ํ•ต์‹ฌ ๊ณผ์ œ๋‹ค.") # ------------------------------------------------------------------ 15 ์ฆ๊ฐ• ๊ฒฐ๊ณผ s = slides[22] y = body(s, "์ฆ๊ฐ•", "์‹œ์  ๋ณ€ํ™˜ ๋ฐ์ดํ„ฐ ์ฆ๊ฐ• ๊ฒฐ๊ณผ", [ "๋ณ€ํ˜• 9์ข…: ์ขŒ์šฐ 0.5 ยท 1 m ์ด๋™, ๋†’์ด +0.4 / โˆ’0.3 m, ์•„๋ž˜๋กœ 3ยฐ, ์ขŒ์šฐ 4ยฐ ํšŒ์ „ โ€” ํ‚คํ”„๋ ˆ์ž„ 2 Hz, ์ฐจ๋Ÿ‰ ๋ฏธํฌํ•จ (ํ™˜๊ฒฝ ์ „์šฉ ๋งต)", "ํ˜„์žฌ 32์”ฌ ์™„๋ฃŒ: 70,824์žฅ (14 GB) โ€” 284์”ฌ ์™„๋ฃŒ ์‹œ ์•ฝ 61๋งŒ ์žฅ์œผ๋กœ ๋‚ฎ ๋ฐ์ดํ„ฐ๊ฐ€ 9๋ฐฐ๊ฐ€ ๋จ", ]) pic = image(s, A + "aug_grid.jpg", 0.85, y + 0.15, w=11.8) gh = pic.height / 914400 names = ["์›๋ณธ (์‹ค์ œ)", "left 1 m", "left 0.5 m", "right 0.5 m", "right 1 m", "high 0.4 m", "low 0.3 m", "pitch down 3ยฐ", "yaw left 4ยฐ", "yaw right 4ยฐ"] cw = 11.8 / 5 for i, n in enumerate(names): r, c = divmod(i, 5) t = tb(s, 0.85 + c * cw + 0.05, y + 0.15 + r * gh / 2 + 0.04, 1.3, 0.26, n, size=10, bold=True, color=WHITE) t.fill.solid() t.fill.fore_color.rgb = ORANGE if i == 0 else NAVY table(s, 0.85, y + 0.3 + gh, 11.8, [["ํ•ญ๋ชฉ", "๋‚ด์šฉ"], ["๊ฒฐ๊ณผ ๊ฒฝ๋กœ", "outputs/aug/map/<scene>/<variant>/<CAM>/<์›๋ณธ ํŒŒ์ผ๋ช…>.jpg + meta.json (๋ฐ”๋€ calibrated_sensor, ์›๋ณธ ํŒŒ์ผ ยท ํฌ์ฆˆ)"], ["ํ•œ๊ณ„", "์˜† 1 m ์—์„œ ๋…ธ๋ฉด ๋ฒˆ์ง ยท ์ง€์šด ์ฐจ๋Ÿ‰ ์ž๋ฆฌ (์˜ค๋ฅธ์ชฝ ์Šนํ•ฉ์ฐจ) ๊ฐ€ ํ๋ฆฟํ•˜๊ฒŒ ๋‚จ์Œ"]], [0.15, 0.85], size=11, rowh=0.34) notes(s, "์ƒˆ ์”ฌ์ด ๋Š˜์–ด๋‚˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๊ฐ™์€ ์”ฌ์˜ '๋‹ค๋ฅธ ์นด๋ฉ”๋ผ ๋ฐฐ์น˜' ๋ฒ„์ „์ด 9๊ฐœ ์ƒ๊ธด๋‹ค. ํ•™์Šต์ด ์”ฌ์„ ๋๋‚ด๋ฉด ๋ฐ”๋กœ ์ด์–ด์„œ ์ฆ๊ฐ•ํ•œ๋‹ค (nusim run day_map).") divider(slides[23], "์‹œ๋ฎฌ๋ ˆ์ด์…˜ ๊ฒฐ๊ณผ", "์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ ๊ตฌ์„ฑ, ๊ตฌ๊ฐ„ ์ŠคํŠธ๋ฆฌ๋ฐ๊ณผ ์ถฉ๋Œ, ์„ผ์„œ, ์‹œ๊ฐํ™”๋ฅผ ๋ณด์ธ๋‹ค.") # ------------------------------------------------------------------ 17 ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ๊ตฌ์„ฑ s = slides[24] y = body(s, "์‹œ๋ฎฌ๋ ˆ์ด์…˜", "์‹œ๋ฎฌ๋ ˆ์ด์…˜ ๊ตฌ์„ฑ", [ "์žฌ๊ตฌ์„ฑ ์žฅ๋ฉด ์œ„์— ์ž์ฐจ ยท ๋ฌผ๋ฆฌ ยท ์„ผ์„œ๋ฅผ ์–น์–ด, ๋ชจ๋ธ์˜ ์ œ์–ด โ†’ ๋‹ค์Œ ๊ด€์ธก์˜ ๋ฃจํ”„๋ฅผ ๊ตฌ์„ฑํ•จ", ]) table(s, 0.85, y + 0.15, 11.8, [ ["๊ตฌ์„ฑ ์š”์†Œ", "๊ตฌํ˜„"], ["์ž์ฐจ", "ํ‚ค๋„ค๋งˆํ‹ฑ ์ž์ „๊ฑฐ ๋ชจ๋ธ (์กฐํ–ฅ ยท ๊ฐ€์† ยท ํ›„์ง„), glTF ์ฐจ๋Ÿ‰ (Suzuki Carry) ๋ฐ”ํ€ด ๊ตฌ๋ฆ„ ยท ์„œ์ŠคํŽœ์…˜, ์ •์ง€ ์ƒํƒœ๋กœ ์‹œ์ž‘"], ["์ถฉ๋Œ", "์ •์  ๋ผ์ด๋‹ค๋กœ ๋งŒ๋“  ์žฅ์• ๋ฌผ ์ง€๋„ (0.2 m) + ์ฃผํ–‰๊ฐ€๋Šฅ์˜์—ญ ๊ฒฝ๊ณ„ (์—ฐ์„). ์Šค์นจ (2์  ์ดํ•˜) ๊ณผ ๋น ์ ธ๋‚˜๊ฐ€๋Š” ์›€์ง์ž„์€ ํ—ˆ์šฉ"], ["๋งต ๋กœ๋”", "๊ตฌ๊ฐ„ ๋ชจ๋ธ ์ŠคํŠธ๋ฆฌ๋ฐ โ€” ์ž์ฐจ ์œ„์น˜์˜ ๊ตฌ๊ฐ„์„ ๊ทธ๋ฆฌ๊ณ  ์ด์›ƒ ๊ตฌ๊ฐ„์„ ๋ฏธ๋ฆฌ ์ฝ์–ด ๊ฒฝ๊ณ„์—์„œ 0.19์ดˆ ๋งŒ์— ๊ต์ฒด"], ["์„ผ์„œ", "6์บ  (ํ•™์Šต๊ณผ ๊ฐ™์€ ์บ˜๋ฆฌ๋ธŒ) + ๋ ˆ์ด์บ์ŠคํŠธ ๋ผ์ด๋‹ค 1๋Œ€ ยท ๋ ˆ์ด๋” 5๋Œ€, ํŒจ๋„์—์„œ ๋ณด๊ธฐ ์ผœ๊ธฐ"], ["์ œ์–ด ์ธํ„ฐํŽ˜์ด์Šค", "ํ‚ค๋ณด๋“œ ๋˜๋Š” ์Šคํฌ๋ฆฝํŠธ (--controls, 50 ms ๊ณ ์ • ์Šคํ…) โ†’ ๊ตฌ๊ฐ„๋งˆ๋‹ค 6์บ  ยท ์„ผ์„œ ๊ด€์ธก ์ €์žฅ (VLA ์—ฐ๊ฒฐ ์ž๋ฆฌ)"], ["๊ธฐ๋ก", "drive_log.csv: ์œ„์น˜ ยท ์†๋„ ยท ๋„๋กœ ์ดํƒˆ ยท ์›๋ž˜ ๊ถค์ ์—์„œ ๋ฒ—์–ด๋‚œ ๊ฑฐ๋ฆฌ ยท ์ถฉ๋Œ ์ข…๋ฅ˜"], ], [0.18, 0.82], size=12, rowh=0.52) notes(s, "ํ•ฉ์„ฑ ๋‚ ์”จ (๋น„ ยท ์•ˆ๊ฐœ ยท ๋ฐค, ์Šฌ๋ผ์ด๋” UI) ๋„ ๊ตฌํ˜„๋ผ ์žˆ์ง€๋งŒ ๋…ผ๋ฌธ ๋ฒ”์œ„์—์„œ ๋บ๋‹ค. ๋‹ค๋ฅธ ๊ตํ†ต ์ฐธ๊ฐ€์ž๋Š” ์•„์ง ์—†๋‹ค.") # ------------------------------------------------------------------ 18 ์ŠคํŠธ๋ฆฌ๋ฐ ยท ์ถฉ๋Œ s = slides[25] y = body(s, "์‹œ๋ฎฌ๋ ˆ์ด์…˜", "๊ตฌ๊ฐ„ ์ŠคํŠธ๋ฆฌ๋ฐ ๋ฐ ์ถฉ๋Œ ํŒ์ • ๊ฐœ์„ ", [ "๊ตฌ๊ฐ„ ๋ชจ๋ธ ์ŠคํŠธ๋ฆฌ๋ฐ: ๋ฒ„ํผ๋ฅผ ๊ฐ€์žฅ ํฐ ๊ตฌ๊ฐ„ ํฌ๊ธฐ๋กœ ํ•œ ๋ฒˆ ์žก๊ณ  ๊ฒฝ๊ณ„์—์„œ ๋‚ด์šฉ๋งŒ ๊ต์ฒด, 3 m ํžˆ์Šคํ…Œ๋ฆฌ์‹œ์Šค๋กœ ๊นœ๋นก์ž„ ๋ฐฉ์ง€", "์žฅ์• ๋ฌผ ์ง€๋„ ๊ฐœ์„ : ๊ธด ์”ฌ์˜ ๋ผ์ด๋‹ค ๋ฒˆ์ง์œผ๋กœ ์ง€๋ฉด์ด ๋‚ฎ๊ฒŒ ์žกํžˆ๊ณ  ๊ฐ€๋กœ์ˆ˜ ์•„๋ž˜ ๋…ธ๋ฉด์ด '๊ตฌ์กฐ๋ฌผ' ๋กœ ๋‚จ๋˜ ๋ฌธ์ œ ์ˆ˜์ • โ€” ๋…ธ๋ฉด ์œ„ ์นธ 11,091 โ†’ 83", ]) image(s, A + "segrun_seams.jpg", 0.85, y + 0.15, w=6.2, h=3.2) caption(s, 0.85, y + 3.38, 6.2, "๊ตฌ๊ฐ„ ๊ฒฝ๊ณ„ 4๊ณณ (ํ–‰) ์˜ ๊ฒฝ๊ณ„ ์ „ํ›„ ํ”„๋ ˆ์ž„ โ€” ์ด์Œ๋งค ์—†์Œ") image(s, A + "obst_cmp.png", 7.35, y + 0.15, w=5.3, h=3.2) caption(s, 7.35, y + 3.38, 5.3, "์žฅ์• ๋ฌผ ์ง€๋„ ๊ฐœ์„  ์ „ / ํ›„ (ํŒŒ๋ž‘ ์›๋ž˜ ๊ฒฝ๋กœ, ๋นจ๊ฐ• ์ถฉ๋Œ ์ง€์ )") notes(s, "์ง€๋ฉด = ์ฒซ ๋นฝ๋นฝํ•œ 10 cm ์ธต, ๋…ธ๋ฉด์—์„œ ๋‚จ๊ธฐ๋Š” ์นธ = ์ง€๋ฉด ์œ„ 2~3 m ์— ์ ์ด ์žˆ๋Š” ์นธ (๊ธฐ๋‘ฅ ยท ์ค„๊ธฐ ยท ๋ฒฝ). ์Šค์นจ ํŒ์ •๊ณผ ๋น ์ ธ๋‚˜๊ฐ€๊ธฐ ํŒ์ •์œผ๋กœ '๋ณด์ด์ง€ ์•Š๋Š” ๋ฌผ์ฒด์— ๊ฐ‡ํžˆ๋Š”' ๋ฌธ์ œ๋„ ํ•ด๊ฒฐํ–ˆ๋‹ค.") # ------------------------------------------------------------------ 19 ์„ผ์„œ s = slides[26] y = body(s, "์„ผ์„œ", "๋ ˆ์ด์บ์ŠคํŠธ ๋ผ์ด๋‹ค ยท ๋ ˆ์ด๋” ์„ผ์„œ", [ "์นด๋ฉ”๋ผ์ฒ˜๋Ÿผ ์ž์ฐจ์— ์žฅ์ฐฉํ•˜๋Š” ์„ผ์„œ (CARLA ray-cast ๋ฐฉ์‹) โ€” 3DGS ๊นŠ์ด๊ฐ€ ์•„๋‹ˆ๋ผ ์‹ค์ œ ๋ผ์ด๋‹ค ๋ˆ„์  ๋ณต์…€ ์›”๋“œ (์ง€๋ฉด 0.5 m ๋†’์ด ์ง€๋„) ์— ๊ด‘์„ ์„ ์จ", "๋น”์ด ๋Š˜ ์ง€๋‚˜๊ฐ€๋Š” ์นธ์„ ์ง€์šฐ๋Š” ๋นˆ ๊ณต๊ฐ„ ๊นŽ๊ธฐ๋กœ ์ง€์šด ์ฐจ๋Ÿ‰์˜ ์ž”ํ•ด๋ฅผ ์ œ๊ฑฐ โ€” ์‹ค์ œ ๋ผ์ด๋‹ค ๋Œ€๋น„ ๊ฐ™์€ ๋ฐฉํ–ฅ ๊ฑฐ๋ฆฌ ์˜ค์ฐจ ์ค‘์•™๊ฐ’ 24% โ†’ 3.9~5.9%", ]) image(s, A + "sensors_sim.png", 0.85, y + 0.15, w=4.3, h=3.2) caption(s, 0.85, y + 3.38, 4.3, "์‹œ๋ฎฌ ๋ผ์ด๋‹ค + ๋ ˆ์ด๋” 5๋Œ€ (10 m/s ์ฃผํ–‰)") image(s, A + "sensors_real.png", 5.35, y + 0.15, w=4.3, h=3.2) caption(s, 5.35, y + 3.38, 4.3, "์‹ค์ œ nuScenes ๋ผ์ด๋‹ค (๊ฐ™์€ ์ˆœ๊ฐ„)") table(s, 9.9, y + 0.15, 2.75, [["๊ฑฐ๋ฆฌ ์˜ค์ฐจ", "์ค‘์•™๊ฐ’"], ["์ฒ˜์Œ", "24%"], ["scene-0402", "5.9%"], ["scene-0003", "3.9%"]], [0.6, 0.4], size=11, rowh=0.38, align_right=(1,)) tb(s, 9.9, y + 1.8, 2.75, 1.6, "๋ผ์ด๋‹ค 32์ฑ„๋„ ํ•œ ๋ฐ”ํ€ด 4 ms\n๋ ˆ์ด๋”: ๋„ํ”Œ๋Ÿฌ vr ยท ๋ณด์ • ์†๋„\n๋…ธ๋ฉด ๋ฐ˜์‚ฌ ์ œ๊ฑฐ\nO ํ‚ค๋กœ nuScenes ํ˜•์‹ .bin ์ €์žฅ\n\n๋ ˆ์ด๋” ์ƒ‰: ๋นจ๊ฐ• ๋‹ค๊ฐ€์˜ด ยท ํŒŒ๋ž‘ ๋ฉ€์–ด์ง ยท ๋…ธ๋ž‘ ์ •์ง€", size=10, color=GRAY) notes(s, "์„ค์ •์€ sim.json sensors (HDL-32E ๊ทผ์‚ฌ, ARS 408 ๊ทผ์‚ฌ, nuScenes ์žฅ์ฐฉ ์œ„์น˜ ๊ทผ์‚ฌ). ์‹ค์ œ ์ชฝ ๊ฐ€๊นŒ์šด ๋ฉ์–ด๋ฆฌ๋Š” ๊ทธ ์ˆœ๊ฐ„์˜ ์‹ค์ œ ์ฐจ ยท ์‚ฌ๋žŒ์œผ๋กœ ํ™˜๊ฒฝ ์ „์šฉ ๋งต์—๋Š” ์—†๋‹ค. ๋‚จ์€ ๊ฒƒ: ๋‹ค๋ฅธ ์ฐจ๋Ÿ‰์˜ ์‹ค์ œ ๋†’์ด ยท ์†๋„, ๋ผ์ด๋‹ค ์„ธ๊ธฐ.") # ------------------------------------------------------------------ 20 ์‹œ๊ฐํ™” s = slides[27] y = body(s, "์‹œ๊ฐํ™”", "์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ ์‹œ๊ฐํ™” โ€” ์‹ค์ œ 6์บ  vs ์žฌ๊ตฌ์„ฑ 6์บ ", [ "scene-0402 (235 m) ๋ฅผ ๊ตฌ๊ฐ„ 5๊ฐœ๋กœ ์ด์–ด 6์บ ์œผ๋กœ ๋ Œ๋” โ€” 238ํ”„๋ ˆ์ž„ ร— 6์บ ์„ 13์ดˆ์— ๋ Œ๋”๋ง (์žฅ๋‹น 6.8 ms, 800ร—450), ๊ตฌ๊ฐ„ ๊ต์ฒด 4ํšŒ", ]) image(s, A + "gt_6cam.jpg", 0.85, y + 0.15, w=5.85, h=2.25) caption(s, 0.85, y + 2.45, 5.85, "์‹ค์ œ nuScenes 6์บ  โ†‘") vw, vh = 5.85, 5.85 * 720 / 1920 # ์˜์ƒ 1920ร—720 โ€” ์œ„ ์‚ฌ์ง„๊ณผ ๊ฐ™์€ ๋„ˆ๋น„ import os if os.environ.get("NOVIDEO"): image(s, A + "drive_6cam_still.jpg", 6.8, y + 0.15, w=5.85, h=2.25) else: mv = s.shapes.add_movie(A + "drive_6cam.mp4", Inches(6.8), Inches(y + 0.15 + (2.25 - vh) / 2), Inches(vw), Inches(vh), poster_frame_image=A + "drive_6cam_still.jpg", mime_type="video/mp4") mv.name = "์ฃผํ–‰ ์˜์ƒ" caption(s, 6.8, y + 2.45, 5.85, "VKGS-Sim ์žฌ๊ตฌ์„ฑ ์ฃผํ–‰ ์˜์ƒ (ํด๋ฆญํ•˜๋ฉด ์žฌ์ƒ) โ†‘") box(s, 0.85, y + 2.95, 11.8, 0.75, "์ฃผํ–‰ ์˜์ƒ: 20์ดˆ, 12 fps, 6์บ  ๋ชจ์ž์ดํฌ โ€” ์œ„: ์•ž์™ผ์ชฝ ยท ์•ž ยท ์•ž์˜ค๋ฅธ์ชฝ / ์•„๋ž˜: ๋’ค์˜ค๋ฅธ์ชฝ ยท ๋’ค ยท ๋’ค์™ผ์ชฝ\n์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ ์ง์ ‘ ์ฃผํ–‰: nusim render view scene-0402 --model outputs/gs_day/scene-0402", fill=PALE, line=LIGHT, size=11) notes(s, "์˜ค๋ฅธ์ชฝ ์˜์ƒ์„ ํด๋ฆญํ•˜๋ฉด ์žฌ์ƒ๋œ๋‹ค. ์žฌ์ƒ ์ „ ํ‘œ์‹œ ํ™”๋ฉด์€ ์™ผ์ชฝ ์‹ค์ œ ์‚ฌ์ง„๊ณผ ๊ฐ™์€ ์ˆœ๊ฐ„(120๋ฒˆ์งธ ํ”„๋ ˆ์ž„)์ด๋‹ค. ์ฐจ๋Ÿ‰ ยท ์‚ฌ๋žŒ์€ ์ง€์šด ํ™˜๊ฒฝ ์ „์šฉ ๋งต์ด๋‹ค.") divider(slides[34], "์ง„ํ–‰ ํ˜„ํ™ฉ ๋ฐ ๊ณ„ํš", "์‹ฑ๊ฐ€ํฌ๋ฅด ๋‚ฎ ๋งต ๊ตฌ์ถ• ํ˜„ํ™ฉ๊ณผ ํ–ฅํ›„ ๊ณ„ํš.") # ------------------------------------------------------------------ 22 ์ง„ํ–‰ ํ˜„ํ™ฉ s = slides[36] y = body(s, "์ง„ํ–‰ ํ˜„ํ™ฉ", "์‹ฑ๊ฐ€ํฌ๋ฅด ๋‚ฎ ๋งต ๊ตฌ์ถ• ํ˜„ํ™ฉ (2026-10-12)", [ "ํ•™์Šต ๋‹จ์œ„ 696๊ฐœ ์ค‘ 253๊ฐœ (36%) ์™„๋ฃŒ โ€” ์ƒˆ ๋„๋กœ๋ฅผ ๋งŽ์ด ๋ฎ๋Š” ์”ฌ ์ˆœ์„œ๋กœ ํ•™์Šต ์ค‘, ์ •์  PSNR ์ค‘์•™๊ฐ’ 24.67 dB", "์ตœ๊ทผ 48์‹œ๊ฐ„ ์†๋„ (์‹œ๊ฐ„๋‹น ์•ฝ 2.6 ๋‹จ์œ„) ๊ธฐ์ค€ ๋‚จ์€ 443๋‹จ์œ„์— ์•ฝ 7์ผ โ€” 10์›” 19์ผ ๋ฌด๋ ต ์™„๋ฃŒ ์˜ˆ์ƒ", ]) for i, (n, l) in enumerate([("253 / 696", "ํ•™์Šต ๋‹จ์œ„ (36%)"), ("75", "์ฆ๊ฐ•์ด ๋๋‚œ ์”ฌ (๋ณ€ํ˜• 9์ข…)"), ("161k", "์ฆ๊ฐ• ์ด๋ฏธ์ง€ (32 GB)"), ("51์”ฌ", "one-north ์ง€์—ญ ๋งต (๊ตฌ๊ฐ„ 149๊ฐœ)")]): kpi(s, 0.85 + i * 3.0, y + 0.15, 2.75, n, l) table(s, 0.85, y + 1.5, 11.75, [["ํ•ญ๋ชฉ", "10์›” 10์ผ", "10์›” 12์ผ"], ["์™„๋ฃŒ ํ•™์Šต ๋‹จ์œ„", "84", "253"], ["์ฆ๊ฐ• ์”ฌ ยท ์ด๋ฏธ์ง€", "32์”ฌ ยท 70.8k", "75์”ฌ ยท 160.9k"], ["์ง€์—ญ ๋งต", "์”ฌ ํ•˜๋‚˜ ์•ˆ์˜ ๊ตฌ๊ฐ„๋งŒ", "one-north 51์”ฌ ยท ๊ตฌ๊ฐ„ 149๊ฐœ ยท ์„ผ์„œ 51/51"], ["๋‹ค์‹œ ํ•™์Šตํ•  ๋‹จ์œ„", "0", "72 (NAS ์žฅ์•  ๋•Œ ์‹คํŒจ โ€” ๋‹ค์Œ ํšŒ์ฐจ์— ์ž๋™ ์žฌํ•™์Šต)"]], [0.3, 0.25, 0.45], size=12, rowh=0.4) notes(s, "์‹คํŒจ 72๊ฐœ๋Š” 10์›” 10์ผ ์ €๋… NAS ์žฅ์• (์•ฝ 40๋ถ„) ๋™์•ˆ ๋ฐ์ดํ„ฐ์…‹์„ ๋ชป ์ฝ์€ ๊ฒƒ์œผ๋กœ, ๋Œ€๊ธฐ ยท ์žฌ์‹œ๋„ ๋กœ์ง์„ ๋„ฃ์€ ๋’ค๋กœ ์ƒˆ ์‹คํŒจ๋Š” ์—†๋‹ค. ๋””์Šคํฌ ์—ฌ์œ  641 GB.") # ------------------------------------------------------------------ 21b ์ง€์—ญ ๋งต (์ƒˆ) s = slides[28] y = body(s, "์‹œ๋ฎฌ๋ ˆ์ด์…˜", "์ง€์—ญ ๋งต โ€” ์”ฌ ์‚ฌ์ด๋ฅผ ์ด์–ด ๋‹ฌ๋ฆฌ๊ธฐ (one-north)", [ "ํ•™์Šต๋œ 60๊ฐœ ์”ฌ ยท 179๊ฐœ ๊ตฌ๊ฐ„์„ ๊ณตํ†ต ์›์  ํ•˜๋‚˜๋กœ ๋ฌถ์Œ โ€” ์ž์ฐจ์— ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๊ตฌ๊ฐ„์„ ๊ทธ๋ฆฌ๊ณ  ๊ฐ€๊นŒ์šด 3๊ฐœ๋ฅผ ๋ฏธ๋ฆฌ ์ฝ์–ด ์”ฌ ๊ฒฝ๊ณ„๋ฅผ ๋„˜์–ด ๊ณ„์† ์ฃผํ–‰", "๋ผ์ด๋‹ค ยท ๋ ˆ์ด๋” ๋ณต์…€ ์›”๋“œ๋Š” ์”ฌ๋งˆ๋‹ค ๋”ฐ๋กœ ๋‘๊ณ  (์ง€์—ญ ์ „์ฒด ํ•œ ๊ฒฉ์ž๋Š” 1 GB ์ดˆ๊ณผ) ๋‹ฌ๋ฆฌ๋Š” ๊ตฌ๊ฐ„์˜ ์”ฌ ๊ฒƒ์œผ๋กœ ๊ต์ฒด โ€” 179๊ฐœ ๊ตฌ๊ฐ„ ๋ชจ๋‘ ์„ผ์„œ ๋ฐ์ดํ„ฐ ํ™•์ธ", ]) image(s, A + "region_onenorth.png", 0.85, y + 0.15, h=3.3) caption(s, 0.85, y + 3.48, 3.4, "one-north ์ง€์—ญ ๋งต: ํšŒ์ƒ‰ = ๋ณต์…€ ์›”๋“œ, ์ƒ‰ ์„  = ๊ตฌ๊ฐ„, โ˜… ์ถœ๋ฐœ") image(s, A + "strip_all.png", 4.45, y + 0.15, w=5.87, h=3.3) caption(s, 4.45, y + 3.48, 5.87, "์ฃผํ–‰ ํ™”๋ฉด โ€” ์ „๋ฐฉ ์นด๋ฉ”๋ผ 3๋Œ€ ยท BEV ๋ฅผ ํ™”๋ฉด ์œ„์ชฝ ํ•œ ์ค„์— (V ยท N)") table(s, 10.5, y + 0.15, 2.15, [["ํ•ญ๋ชฉ", "๊ฐ’"], ["์”ฌ", "60"], ["๊ตฌ๊ฐ„", "179"], ["๋ณต์…€ ์›”๋“œ", "60 / 60"], ["์ถœ๋ฐœ", "0042"]], [0.55, 0.45], size=11, rowh=0.38, align_right=(1,)) tb(s, 10.5, y + 2.2, 2.15, 1.4, "ํœ  ยท ๊ฐ€์šด๋ฐ ๋ฒ„ํŠผ ๋“œ๋ž˜๊ทธ๋กœ ์ฐจ ๋’ค ์‹œ์  ๊ฑฐ๋ฆฌ 0.4~5๋ฐฐ\n\n์ถฉ๋Œ์€ ์•„์ง ์—ฐ์„๋งŒ (์ง€์—ญ ๋‹จ์œ„ ์žฅ์• ๋ฌผ ์ง€๋„๋Š” ๋‹ค์Œ ๋‹จ๊ณ„)", size=10, color=GRAY) notes(s, "nusim render map singapore-onenorth. ์„ผ์„œ๊ฐ€ ์ผ๋ถ€ ๊ตฌ๊ฐ„์—์„œ ๊บผ์ง€๋˜ ์›์ธ: ์”ฌ์˜ ๊ตฌ๊ฐ„์ด ํ•˜๋‚˜ ๋” ํ•™์Šต๋  ๋•Œ๋งˆ๋‹ค ๋ณต์…€ ์›”๋“œ๋ฅผ '๋‚ก์Œ' ์œผ๋กœ ๋ณด๊ณ  ๊ป๋‹ค. ๋ณต์…€์€ ์”ฌ ์ „์ฒด ๋ผ์ด๋‹ค๋กœ ๋งŒ๋“ค์–ด ๊ธฐํ•˜๊ฐ€ ๊ทธ๋Œ€๋กœ์ด๋ฏ€๋กœ, ๋งŒ๋“  ์›์ ์„ ๊ธฐ๋กํ•ด ๊ทธ๋Œ€๋กœ ์“ฐ๊ฒŒ ๊ณ ์ณค๋‹ค.") # ------------------------------------------------------------------ 21d ์„ผ์„œ ์ฃผํ–‰ ์˜์ƒ (์ƒˆ) V = "/home/mm/Downloads/vkgs-sim/outputs/videos/" def movie(sl, name, x, y, w, h): """์˜์ƒ (NOVIDEO=1 ์ด๋ฉด ํ‘œ์ง€ ํ™”๋ฉด๋งŒ โ€” PDF ์šฉ). 1280ร—720 ์„ ์ƒ์ž ์•ˆ์— ๋งž์ถ˜๋‹ค.""" vh = min(h, w * 9 / 16) vw = vh * 16 / 9 xx, yy = x + (w - vw) / 2, y + (h - vh) / 2 if os.environ.get("NOVIDEO"): return image(sl, V + name + "_poster.jpg", xx, yy, w=vw, h=vh) mv = sl.shapes.add_movie(V + name + ".mp4", Inches(xx), Inches(yy), Inches(vw), Inches(vh), poster_frame_image=V + name + "_poster.jpg", mime_type="video/mp4") mv.name = name return mv s = slides[29] y = body(s, "์‹œ๋ฎฌ๋ ˆ์ด์…˜", "์ฃผํ–‰ ์˜์ƒ โ€” ์นด๋ฉ”๋ผ ยท BEV ยท ๋ผ์ด๋‹ค ยท ๋ ˆ์ด๋”๋ฅผ ๋ชจ๋‘ ์ผ  ์ž๋™ ์ฃผํ–‰", [ "์ž๋™ ์ฃผํ–‰ (T ํ‚ค โ€” ๊ธฐ๋ก ๊ถค์ ์„ pure pursuit ๋กœ ๋”ฐ๋ผ๊ฐ€๋ฉฐ 20 km/h) ์œผ๋กœ one-north ์ง€์—ญ ๋งต์„ ๋‹ฌ๋ฆฌ๋ฉฐ ์ฐฝ ํ™”๋ฉด ๊ทธ๋Œ€๋กœ ๋…นํ™”", "์œ„์ชฝ ์ค„ = ์ „๋ฐฉ ์นด๋ฉ”๋ผ 3๋Œ€ ยท BEV (V ยท N), ์žฅ๋ฉด ์œ„ = ๋ผ์ด๋‹ค 32์ฑ„๋„ (๋†’์ด๋ณ„ ์ƒ‰) ยท ๋ ˆ์ด๋” 5๋Œ€ (๋นจ๊ฐ• ๋‹ค๊ฐ€์˜ด ยท ํŒŒ๋ž‘ ๋ฉ€์–ด์ง ยท ๋…ธ๋ž‘ ์ •์ง€)", ]) movie(s, "sensors_all", 0.85, y + 0.12, 8.6, 4.0) caption(s, 0.85, y + 4.15, 8.6, "ํด๋ฆญํ•˜๋ฉด ์žฌ์ƒ (20์ดˆ) โ€” nusim run demo_videos") table(s, 9.7, y + 0.15, 2.95, [["ํ•ญ๋ชฉ", "๊ฐ’"], ["๋…นํ™”", "20 fps ๊ณ ์ • ์Šคํ…"], ["๊ธธ์ด", "400ํ”„๋ ˆ์ž„ ยท 20์ดˆ"], ["๋ผ์ด๋‹ค", "HDL-32E ๊ทผ์‚ฌ"], ["๋ ˆ์ด๋”", "ARS 408 ๊ทผ์‚ฌ ร— 5"], ["์„ผ์„œ 1ํšŒ", "์•ฝ 4 ms (CPU)"]], [0.42, 0.58], size=10, rowh=0.34) tb(s, 9.7, y + 2.35, 2.95, 1.7, "์ฐฝ ํ™”๋ฉด ๋…นํ™”: --record-screen DIR\n(UI ยท ๋ฏธ๋ฆฌ๋ณด๊ธฐ ์ค„ ํฌํ•จ)\n\n์ž๋™ ์ฃผํ–‰: --autopilot ๋˜๋Š” T,\nํ™”์‚ดํ‘œ๋ฅผ ๋ˆ„๋ฅด๋ฉด ์†์œผ๋กœ", size=10, color=GRAY) notes(s, "์„ผ์„œ๋Š” 3DGS ๊นŠ์ด๊ฐ€ ์•„๋‹ˆ๋ผ ๋ผ์ด๋‹ค ๋ˆ„์  ๋ณต์…€ ์›”๋“œ์— ๋ ˆ์ด์บ์ŠคํŠธํ•œ๋‹ค. ์ง€์—ญ ๋งต์—์„œ๋Š” ๋‹ฌ๋ฆฌ๋Š” ๊ตฌ๊ฐ„์˜ ์”ฌ ๋ณต์…€ ์›”๋“œ๋กœ ๋ฐ”๊ฟ” ๋ผ์šด๋‹ค.") # ------------------------------------------------------------------ 21e ๋‚ ์”จ ์˜์ƒ (์ƒˆ) s = slides[30] y = body(s, "์‹œ๋ฎฌ๋ ˆ์ด์…˜", "๋‚ ์”จ ์ฃผํ–‰ ์˜์ƒ โ€” ์•„์นจ ยท ๋น„ ยท ๋ˆˆ", [ "๊ฐ™์€ ์ž๋™ ์ฃผํ–‰ ๊ฒฝ๋กœ๋ฅผ ๋‚ ์”จ ํ”„๋ฆฌ์…‹๋งŒ ๋ฐ”๊ฟ” ๋…นํ™” โ€” ๋‚ ์”จ๋Š” 3DGS ๋ Œ๋” ๋’ค ํ›„์ฒ˜๋ฆฌ (weather.comp) ์™€ ์ž์ฐจ ์ฃผ๋ณ€ ์›”๋“œ ๊ณต๊ฐ„ ๊ฐ•์ˆ˜ ์ž…์ž (precip)", ]) for i, (nm, t) in enumerate([("weather_morning", "์•„์นจ โ€” ์กฐ๋„ 0.6 ยท ์˜…์€ ์•ˆ๊ฐœ"), ("weather_rain", "๋น„ โ€” ๊ฐ•์ˆ˜ 0.5 ยท ์ –์€ ๋…ธ๋ฉด"), ("weather_snow", "๋ˆˆ โ€” ๊ฐ•์„ค 0.5 ยท ์Œ“์ธ ๋ˆˆ")]): movie(s, nm, 0.85 + i * 3.97, y + 0.15, 3.85, 2.17) caption(s, 0.85 + i * 3.97, y + 2.35, 3.85, t) table(s, 0.85, y + 2.85, 11.75, [["ํ”„๋ฆฌ์…‹", "์กฐ๋„", "๊ตฌ๋ฆ„", "๋น„", "๋ˆˆ", "์•ˆ๊ฐœ", "ํšจ๊ณผ"], ["์•„์นจ (morning)", "0.6", "0.15", "-", "-", "0.15", "๋‚ฎ์€ ํ•ด ยท ์•„์นจ ์•ˆ๊ฐœ"], ["๋น„ (rain)", "0.75", "0.8", "0.5", "-", "-", "๋น—์ค„๊ธฐ ๋ชจ์…˜ ๋ธ”๋Ÿฌ ยท ์ –์€ ๋…ธ๋ฉด ๋ฐ˜์‚ฌ ยท ๋ Œ์ฆˆ ๋ฌผ๋ฐฉ์šธ"], ["๋ˆˆ (snow)", "0.8", "-", "-", "0.5", "-", "๋ˆˆ์†ก์ด ์ดˆ์  ํ๋ฆผ ยท ๋…ธ๋ฉด ๋ˆˆ ๋ฎ์ž„ 0.4"]], [0.16, 0.08, 0.08, 0.08, 0.08, 0.08, 0.44], size=10, rowh=0.32) notes(s, "์„ธ ์˜์ƒ์„ ๊ฐ๊ฐ ํด๋ฆญํ•ด ์žฌ์ƒ. ๋‚ ์”จ ์กฐ์ •๊ฐ’์€ configs/sim.json weather (ํ”„๋ฆฌ์…‹ 11๊ฐœ, ์ฐฝ์˜ ๋‚ ์”จ ํŒจ๋„์—์„œ ๋ฐ”๋กœ ๋ฐ”๊ฟˆ).") # ------------------------------------------------------------------ 21f ์นด๋ฉ”๋ผ ์ข…๋ฅ˜ (์ƒˆ) s = slides[31] y = body(s, "์„ผ์„œ", "์นด๋ฉ”๋ผ ์„ผ์„œ ์ข…๋ฅ˜ โ€” RGB ยท ๊นŠ์ด ยท ์‹œ๋งจํ‹ฑ ์„ธ๊ทธ๋ฉ˜ํ…Œ์ด์…˜ ยท ํ‘๋ฐฑ", [ "๋‚ ์”จ ํŒจ๋„์˜ '์นด๋ฉ”๋ผ' ๋ฒ„ํŠผ (๋˜๋Š” F3) ์œผ๋กœ ๋ฐ”๊ฟˆ โ€” ํ™”๋ฉด ยท ์ „๋ฐฉ 3๋Œ€ ยท BEV ๋ฏธ๋ฆฌ๋ณด๊ธฐ ยท ๋…นํ™”์— ํ•จ๊ป˜ ์ ์šฉ, 6์บ  ๊ด€์ธก ์ €์žฅ(O)์€ ๋Š˜ RGB", ]) image(s, A + "camera_modes.jpg", 0.85, y + 0.12, w=7.4, h=4.2) rows = [("๊นŠ์ด", "๋ Œ๋”ํ•  ๋•Œ ์Œ“๋Š” ๊ฑฐ๋ฆฌ ๋ฒ„ํผ (ฮฃzฮฑ / ฮฃฮฑ) ์˜ ํ‘œ๋ฉด ๊ฑฐ๋ฆฌ๋ฅผ ๋กœ๊ทธ ๋ˆˆ๊ธˆ ์ƒ‰์œผ๋กœ โ€” ์ถ”๊ฐ€ ๋ Œ๋” ์—†์Œ"), ("์‹œ๋งจํ‹ฑ", "๊ฐ€์šฐ์‹œ์•ˆ๋งˆ๋‹ค ๊ฐ€๊นŒ์šด lidarseg ๋ผ์ด๋‹ค ์ ์˜ ๋‹ค์ˆ˜๊ฒฐ ๋ผ๋ฒจ (11์ข…, Cityscapes ์ƒ‰) โ†’ SH ์ƒ‰ ๋Œ€์‹  ๋ผ๋ฒจ ์ƒ‰์œผ๋กœ ์Šคํ”Œ๋žซ"), ("ํ‘๋ฐฑ", "๋‚ ์”จ ยท ISP ๋ฅผ ๊ฑฐ์นœ ์ตœ์ข… ์˜์ƒ์˜ ๋ฃจ๋งˆ"), ("๊ตฌํ˜„", "๋ Œ๋” ๊ทธ๋ž˜ํ”„ camera_mode ํŒจ์Šค 1๊ฐœ + ์ „์ฒ˜๋ฆฌ ์…ฐ์ด๋” ๋ถ„๊ธฐ โ€” ๊ฐ™์€ ํ”„๋ ˆ์ž„์—์„œ ๋ฐ”๊ฟˆ, ๋‹ค์‹œ ํ•™์Šต ์—†์Œ")] for i, (t, d) in enumerate(rows): box(s, 8.45, y + 0.12 + i * 1.06, 4.2, 0.96, d, title=t, fill=PALE, line=BLUE, size=10) notes(s, "์‹œ๋งจํ‹ฑ ๋ผ๋ฒจ: nusim recon semantic (๋ชจ๋ธ ์˜† semantic.rgba). ๋ผ์ด๋‹ค๊ฐ€ ์•ˆ ๋‹ฟ๋Š” ๋†’์€ ๊ฑด๋ฌผ ์œ—๋ถ€๋ถ„์€ ์ด์›ƒ ๋ผ๋ฒจ์—์„œ ๋ฒˆ์ง€๊ณ , ๊ทธ๋ž˜๋„ ์—†์œผ๋ฉด ๊ฑด๋ฌผ, ํ•˜๋Š˜ ๊ตฌ๋Š” ํ•˜๋Š˜๋กœ ์น ํ•œ๋‹ค. ๋ฐ˜ํˆฌ๋ช… ํŒŒ์‚ฌ๋“œ(์ฐฝ๋ฌธ)๋Š” ๋ฎ์ž„์œผ๋กœ ๋‚˜๋ˆ  ๋ผ๋ฒจ ์ƒ‰ ๊ทธ๋Œ€๋กœ ๋‘”๋‹ค.") # ------------------------------------------------------------------ 21g ์„ฑ๋Šฅ ๋น„๊ต โ€” ํ’ˆ์งˆ (์ƒˆ) def highlight(t, rows): """ํ‘œ์—์„œ ์šฐ๋ฆฌ ํ–‰์„ ๊ฐ•์กฐ (์—ฐํ•œ ํŒŒ๋ž‘ ๋ฐฐ๊ฒฝ ยท ๊ตต๊ฒŒ ยท ๋‚จ์ƒ‰ ๊ธ€์ž).""" for i in rows: for j in range(len(t.columns)): c = t.cell(i, j) c.fill.solid() c.fill.fore_color.rgb = LIGHT for r in c.text_frame.paragraphs[0].runs: r.font.bold, r.font.color.rgb = True, NAVY def metric_boxes(sl, y, items): w = (11.8 - 0.15 * (len(items) - 1)) / len(items) for i, (t, d) in enumerate(items): box(sl, 0.85 + i * (w + 0.15), y, w, 0.76, d, title=t, fill=PALE, line=BLUE, size=9) s = slides[32] y = body(s, "์„ฑ๋Šฅ ๋น„๊ต", "nuScenes ๋ Œ๋”๋ง ํ’ˆ์งˆ ๋น„๊ต โ€” ๊ด€๋ จ ๋…ผ๋ฌธ์ด nuScenes ์—์„œ ๋ณด๊ณ ํ•œ ๊ฐ’", [ "๋…ผ๋ฌธ๋งˆ๋‹ค ์žฅ๋ฉด ยท ํ•ด์ƒ๋„ ยท ํ‰๊ฐ€ ๋ถ„ํ• ์ด ๋‹ฌ๋ผ ๋ฌถ์Œ(ํ‰๊ฐ€ ์กฐ๊ฑด)๋ผ๋ฆฌ๋Š” ์ง์ ‘ ๋น„๊ตํ•  ์ˆ˜ ์—†์Œ โ€” ๊ฐ™์€ ๋ฌถ์Œ ์•ˆ์—์„œ๋งŒ ์ˆœ์œ„๊ฐ€ ์˜๋ฏธ ์žˆ์Œ", ]) metric_boxes(s, y + 0.05, [ ("PSNR (dB) โ†‘", "๋ Œ๋” ์˜์ƒ๊ณผ ์‹ค์ œ ์‚ฌ์ง„์˜ ํ”ฝ์…€ ์˜ค์ฐจ๋ฅผ ๋กœ๊ทธ๋กœ ์žฐ ๊ฐ’.\n1 dB ์˜ค๋ฅด๋ฉด RMS ์˜ค์ฐจ๊ฐ€ ์•ฝ 11% ์ค„์–ด๋“ ๋‹ค"), ("SSIM (0~1) โ†‘", "๋ฐ๊ธฐ ยท ๋Œ€๋น„ ยท ๊ตฌ์กฐ์˜ ์ง€์—ญ ์œ ์‚ฌ๋„.\n์œค๊ณฝ๊ณผ ์งˆ๊ฐ์ด ์–ผ๋งˆ๋‚˜ ๋ณด์กด๋๋Š”์ง€"), ("LPIPS (0~1) โ†“", "๋”ฅ๋Ÿฌ๋‹ ํŠน์ง• ๊ณต๊ฐ„์˜ ๊ฑฐ๋ฆฌ.\n์‚ฌ๋žŒ์ด ๋А๋ผ๋Š” ํ๋ฆผ ยท ์™œ๊ณก์— ๊ฐ€์žฅ ๊ฐ€๊น๋‹ค"), ]) rows = [["ํ‰๊ฐ€ ์กฐ๊ฑด (์ถœ์ฒ˜)", "๋ฐฉ๋ฒ•", "PSNR โ†‘", "SSIM โ†‘", "LPIPS โ†“"], ["SplatAD ํ‘œ 1 โ€” 10์žฅ๋ฉด, 1600ร—900, ํ•œ ์žฅ ๊ฑธ๋Ÿฌ ํ‰๊ฐ€, ํ™”๋ฉด ์ „์ฒด", "UniSim", "22.66", "0.743", "0.414"], ["", "PVG", "24.94", "0.768", "0.497"], ["", "OmniRe", "25.50", "0.798", "0.386"], ["", "Street Gaussians", "25.54", "0.799", "0.375"], ["", "NeuRAD", "26.17", "0.790", "0.312"], ["", "SplatAD", "27.54", "0.849", "0.302"], ["NeuRAD ํ‘œ 1 โ€” 4์žฅ๋ฉด, 4์žฅ๋งˆ๋‹ค ํ‰๊ฐ€", "S-NeRF", "26.21", "0.831", "0.228"], ["", "NeuRAD-2x", "27.13", "0.820", "0.205"], ["DrivingGaussian ํ‘œ 1 โ€” 6์žฅ๋ฉด, 1600ร—900, 5์žฅ๋งˆ๋‹ค", "3D-GS", "26.08", "0.717", "0.298"], ["", "EmerNeRF", "26.75", "0.760", "0.311"], ["", "DrivingGaussian-L", "28.74", "0.865", "0.237"], ["HUGSIM ํ‘œ V โ€” Waymo 2 + nuScenes 2 ์‹œํ€€์Šค", "HUGSIM", "25.36", "0.776", "0.171"], ["VKGS-Sim (์šฐ๋ฆฌ) โ€” 800ร—450, 8์žฅ๋งˆ๋‹ค, ์ •์  ์˜์—ญ *", "ํ•™์Šต ๋‹จ์œ„ 258๊ฐœ ์ค‘์•™๊ฐ’", "24.65", "0.766", "๋ฏธ์ธก์ •"], ["", "scene-0039 (SplatAD ์žฅ๋ฉด)", "24.86", "0.799", "๋ฏธ์ธก์ •"]] t = table(s, 0.85, y + 0.92, 11.8, rows, [0.40, 0.24, 0.12, 0.12, 0.12], size=9, rowh=0.22, align_right=(2, 3, 4)) highlight(t, [13, 14]) tb(s, 0.85, y + 0.96 + 0.22 * len(rows), 11.8, 0.3, "* ์ฐจ๋Ÿ‰ ยท ์‚ฌ๋žŒ์„ ์ง€์šด ํ™˜๊ฒฝ ์ „์šฉ ๋ชจ๋ธ์ด๋ผ ์ •์  ์˜์—ญ๋งŒ ์žผ (ํ™”๋ฉด ์ „์ฒด 23.41 dB). ์ถœ์ฒ˜ ํ‘œ๋Š” 2026-10-12 arXiv ์›๋ฌธ์—์„œ ํ™•์ธ.", size=9, color=GRAY) notes(s, "๊ฐ™์€ ๋ฌถ์Œ ์•ˆ์—์„œ๋งŒ ๋น„๊ตํ•œ๋‹ค. ์šฐ๋ฆฌ ํ–‰์€ ํ”„๋กœํ† ์ฝœ์ด ๋‹ฌ๋ผ ์ฐธ๊ณ ๊ฐ’์ด๋‹ค. ๊ณต์ • ๋น„๊ต๋Š” SplatAD ํ”„๋กœํ† ์ฝœ(10์žฅ๋ฉด, ์› ํ•ด์ƒ๋„, ํ™”๋ฉด ์ „์ฒด, LPIPS) ์žฌํ˜„์ด ๋‚จ์€ ์ผ โ€” docs/paper/nuscenes_comparison.md.") # ------------------------------------------------------------------ 21h ์„ฑ๋Šฅ ๋น„๊ต โ€” ์†๋„ ร— ํ’ˆ์งˆ (์ƒˆ) s = slides[33] y = body(s, "์„ฑ๋Šฅ ๋น„๊ต", "๋ Œ๋”๋ง ์†๋„ ร— ํ’ˆ์งˆ โ€” ๊ฐ™์€ ํ‘œ์— ๋‘˜ ๋‹ค ๋ณด๊ณ ํ•œ ๋…ผ๋ฌธ", [ "VKGS-Sim ์€ 2026-10-12 ์ธก์ • (scene-0039, 6์บ  240์žฅ ํ‰๊ท , GPU ๋‹จ๋…). 1600ร—900 ํ•œ ์žฅ 15.5 ms ์ค‘ 86% ๊ฐ€ ์Šคํ”Œ๋žซ ๋ž˜์Šคํ„ฐ", ]) metric_boxes(s, y + 0.05, [ ("FPS โ†‘", "์ดˆ๋‹น ๋ Œ๋”ํ•˜๋Š” ์˜์ƒ ์žฅ์ˆ˜.\nํ•ด์ƒ๋„ ยท GPU ์— ๋”ฐ๋ผ ํฌ๊ฒŒ ๋‹ฌ๋ผ์ง„๋‹ค"), ("MP/s โ†‘", "์ดˆ๋‹น ๋ Œ๋”ํ•˜๋Š” ํ”ฝ์…€ ์ˆ˜ (๋ฐฑ๋งŒ) = FPS ร— ๊ฐ€๋กœ ร— ์„ธ๋กœ.\nํ•ด์ƒ๋„๊ฐ€ ๋‹ฌ๋ผ๋„ ๋น„๊ตํ•  ์ˆ˜ ์žˆ๋‹ค"), ("PSNR โ†‘", "ํ’ˆ์งˆ (์•ž ์žฅ). ์†๋„์™€ ํ•จ๊ป˜ ๋ด์•ผ ํ•œ๋‹ค โ€”\n๊ฐ€์šฐ์‹œ์•ˆ ์ˆ˜๋ฅผ ์ค„์ด๋ฉด ๋นจ๋ผ์ง€๊ณ  ํ’ˆ์งˆ์ด ๋–จ์–ด์ง„๋‹ค"), ]) rows = [["์ถœ์ฒ˜", "๋ฐฉ๋ฒ•", "PSNR โ†‘", "์†๋„ โ†‘", "ํ•˜๋“œ์›จ์–ด ยท ๋น„๊ณ "], ["SplatAD ํ‘œ 1 (nuScenes 10์žฅ๋ฉด)", "UniSim", "22.66", "13.3 MP/s", "GPU ํ‘œ๊ธฐ ์—†์Œ (ํ•™์Šต์€ A100)"], ["", "NeuRAD", "26.17", "11.8 MP/s", ""], ["", "PVG", "24.94", "18.8 MP/s", ""], ["", "Street Gaussians", "25.54", "21.5 MP/s", ""], ["", "OmniRe", "25.50", "16.3 MP/s", ""], ["", "SplatAD", "27.54", "106.1 MP/s", ""], ["HUGSIM ํ‘œ V (Waymo 2 + nuScenes 2)", "NeuRAD", "24.49", "2.61 FPS", "RTX 3090, ํ•ด์ƒ๋„ ํ‘œ๊ธฐ ์—†์Œ"], ["", "Street Gaussians", "โ€”", "66.5 FPS", "๊ฐ€์šฐ์‹œ์•ˆ 685๋งŒ"], ["", "HUGSIM", "25.36", "89.15 FPS", "๊ฐ€์šฐ์‹œ์•ˆ 445๋งŒ"], ["VKGS-Sim (์šฐ๋ฆฌ, Vulkan)", "1600ร—900", "24.65 *", "64 FPS ยท 93 MP/s", "RTX 3060 Ti 8 GB, ๊ฐ€์šฐ์‹œ์•ˆ 200๋งŒ"], ["", "800ร—450", "24.65 *", "188 FPS ยท 68 MP/s", "๊ฐ™์€ ์กฐ๊ฑด"]] t = table(s, 0.85, y + 0.92, 11.8, rows, [0.27, 0.17, 0.1, 0.18, 0.28], size=9.5, rowh=0.25, align_right=(2, 3)) highlight(t, [10, 11]) tb(s, 0.85, y + 0.96 + 0.25 * len(rows), 11.8, 0.5, "* PSNR ์€ ์šฐ๋ฆฌ ํ”„๋กœํ† ์ฝœ (800ร—450 ยท 8์žฅ๋งˆ๋‹ค ยท ์ •์  ์˜์—ญ, ์•ž ์žฅ). 1600ร—900 ํ•œ ์žฅ = ์ „์ฒ˜๋ฆฌ 1.23 ยท ์ •๋ ฌ 0.63 ยท ๋ž˜์Šคํ„ฐ 13.38 ms. " "ํ•™์Šต๊ณผ GPU ๋ฅผ ๊ฐ™์ด ์“ฐ๋ฉด 17.1 ms.", size=9, color=GRAY) notes(s, "SplatAD ๋Š” MP/s ๋กœ, HUGSIM ์€ FPS ๋กœ ๋ƒˆ๋‹ค. ์šฐ๋ฆฌ GPU(RTX 3060 Ti) ๋Š” HUGSIM ์˜ RTX 3090 ๋ณด๋‹ค ์•ฝํ•˜๋‹ค. ๊ณ ํ•ด์ƒ๋„์—์„œ๋Š” ๋ธ”๋ Œ๋”ฉ ์ฑ„์›€๋ฅ ์ด ๋ณ‘๋ชฉ์ด๋ผ 800ร—450 ์—์„œ๋Š” ๋ž˜์Šคํ„ฐ๊ฐ€ 3.5 ms ๋กœ ์ค€๋‹ค.") # ------------------------------------------------------------------ 21c ์•ˆ์ •์„ฑ ๊ฐœ์„  (์ƒˆ) s = slides[35] y = body(s, "์ง„ํ–‰ ํ˜„ํ™ฉ", "์•ˆ์ •์„ฑ ๊ฐœ์„  โ€” 10์›” 10์ผ ~ 12์ผ์— ์ฐพ์€ ๋ฌธ์ œ์™€ ํ•ด๊ฒฐ", [ "์‚ฌํ˜์งธ ๋„๋Š” ์ผ๊ด„ ํ•™์Šต์—์„œ ๋“œ๋Ÿฌ๋‚œ ์‹คํŒจ๋ฅผ ์›์ธ๊นŒ์ง€ ์ฐพ์•„ ๊ณ ์นจ โ€” ๊ฐ™์€ ์ผ์ด ๋‹ค์‹œ ์ƒ๊ฒจ๋„ ์‚ฌ๋žŒ ์† ์—†์ด ์ด์–ด์ง€๋„๋ก ํ•จ", ]) table(s, 0.85, y + 0.2, 11.8, [["๋ฌธ์ œ", "์›์ธ", "ํ•ด๊ฒฐ"], ["ํ•™์Šต ๋‹จ์œ„ 79๊ฐœ ์‹คํŒจ", "NAS ์ผ์‹œ ์žฅ์•  (10/10 18:44โ€“19:25, ์ž…์ถœ๋ ฅ ์˜ค๋ฅ˜)", "๋ฐ์ดํ„ฐ์…‹์ด ๋Œ์•„์˜ฌ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฐ ๋’ค ๋‹ค์‹œ ์‹œ๋„, ์ตœ๋Œ€ 3ํšŒ์ฐจ ์žฌํ•™์Šต"], ["์ฆ๊ฐ• 2์”ฌ ์‹คํŒจ (PNG ์†์ƒ)", "๋ฉ”๋ชจ๋ฆฌ ๋น„ํŠธ 1๊ฐœ ๋’ค์ง‘ํž˜ (ECC ์—†์Œ) โ€” ๋‹ค์‹œ ๋ Œ๋”ํ•œ ๊ฒƒ๊ณผ 1๋น„ํŠธ ์ฐจ์ด", "PNG ๋ฅผ ๋ชจ๋‘ ์—ด์–ด ๊ฒ€์‚ฌํ•˜๊ณ  ๊นจ์กŒ์œผ๋ฉด ๊ทธ ๊ตฌ๊ฐ„์„ ๋‹ค์‹œ ๋ Œ๋”"], ["์ง€์—ญ ๋งต ์ผ๋ถ€์—์„œ ๋ผ์ด๋‹ค ยท ๋ ˆ์ด๋” ๊บผ์ง", "๋ณต์…€ ์›”๋“œ๊ฐ€ ์—†๊ฑฐ๋‚˜, ๊ตฌ๊ฐ„์ด ํ•˜๋‚˜ ๋” ํ•™์Šต๋˜๋ฉด '๋‚ก์Œ' ์œผ๋กœ ๋ณด๊ณ  ๊บผ ๋ฒ„๋ฆผ", "์”ฌ๋ณ„ ๋ณต์…€ ์›”๋“œ ๊ต์ฒด ยท ๊ธฐํ•˜๊ฐ€ ๊ฐ™์œผ๋ฉด ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉ ยท ์—†๋Š” ์”ฌ์€ ๋งต์„ ์—ด ๋•Œ ์ƒ์„ฑ"], ["์ฐจ๊ฐ€ ์›€์ง์ด์ง€ ์•Š์Œ", "์ฐฝ์ด ํ‚ค๋ณด๋“œ ํฌ์ปค์Šค๋ฅผ ๋ชป ๋ฐ›์Œ ยท ํ•œ๊ธ€ ์ž…๋ ฅ๊ธฐ (ibus) ๊ฐ€ ํ‚ค ์ด๋ฒคํŠธ๋ฅผ ๊ฐ€๋กœ์ฑ”", "ํฌ์ปค์Šค ์š”์ฒญ + ํ™”๋ฉด ๊ฒฝ๊ณ , ๋ทฐ์–ด์—์„œ ์ž…๋ ฅ๊ธฐ๋ฅผ ๋”"], ["์ง€๋ฉด ๋ชจ๋ธ (HUGSIM ๋‹ค์ค‘ ํ‰๋ฉด) ์‹คํ—˜", "์ฐจ์„  ๋ณ€๊ฒฝ ์‹œ์  PSNR +0.08 dB โ€” ํšจ๊ณผ ๋ฏธ๋ฏธ", "๋งต ๋ฐฐ์น˜์—๋Š” ๋„ฃ์ง€ ์•Š์Œ"]], [0.22, 0.4, 0.38], size=11, rowh=0.55) notes(s, "PNG ์†์ƒ: ๋ Œ๋”๋Š” ๊ฒฐ์ •์ ์ด๋ผ ์„ธ ๋ฒˆ ๋‹ค์‹œ ๋ Œ๋”ํ•ด๋„ ๊ฐ™์€ ํŒŒ์ผ์ด ๋‚˜์™”๊ณ , ๊นจ์ง„ ํŒŒ์ผ์€ ๊ทธ๊ฒƒ๊ณผ ์ •ํ™•ํžˆ 1๋น„ํŠธ ๋‹ฌ๋ž๋‹ค. ECC ์—†๋Š” ๋ฉ”๋ชจ๋ฆฌ์˜ ์ผ์‹œ ์˜ค๋ฅ˜๋กœ ๋ณด๋ฉฐ memtest86 ์ ๊ฒ€์„ ๊ถŒํ•œ๋‹ค.") # ------------------------------------------------------------------ 23 ํ–ฅํ›„ ๊ณ„ํš s = slides[37] y = body(s, "ํ–ฅํ›„ ๊ณ„ํš", "ํ–ฅํ›„ ์—ฐ๊ตฌ ๊ณ„ํš", [ "์ง€์—ญ ๋งต์„ ์™„์„ฑํ•˜๊ณ , ์ฃผํ–‰ ๋ชจ๋ธ์„ ํƒœ์šฐ๊ณ , ์ƒˆ ์‹œ์  ํ’ˆ์งˆ์„ ๊ฐœ์„ ํ•˜๋Š” ์ˆœ์„œ๋กœ ์ง„ํ–‰ํ•จ", ]) plans = [("์ง€์—ญ ๋‹จ์œ„ ์žฅ์• ๋ฌผ ์ง€๋„", "์ง€์—ญ ๋งต์€ ์•„์ง ์—ฐ์„ ์ถฉ๋Œ๋งŒ โ€” ์„ผ์„œ์ฒ˜๋Ÿผ ์”ฌ๋ณ„ ์žฅ์• ๋ฌผ ์ง€๋„๋ฅผ ๋ฐ”๊ฟ” ๋ผ์›Œ ๊ฑด๋ฌผ ยท ๊ธฐ๋‘ฅ๊ณผ์˜ ์ถฉ๋Œ๊นŒ์ง€"), ("VLA ์—ฐ๊ฒฐ ยท ํ‰๊ฐ€", "closed-loop ์—ฐ๊ฒฐ (--serve + Gym) ๊ณผ HD-Score ์ง€ํ‘œ๋Š” ๊ตฌํ˜„๋จ โ€” VLM/VLA ์ •์ฑ…์„ ์ง€์—ญ ๋งต ์œ„์—์„œ ํ‰๊ฐ€"), ("์ƒˆ ์‹œ์  ํ’ˆ์งˆ (ํ•ต์‹ฌ ๊ณผ์ œ)", "์˜† ์ฐจ์„  ์‹ค์ œ ์‚ฌ์ง„ ๊ธฐ์ค€ ์•ฝ 16.5 dB (์ž๊ธฐ ๊ฒฝ๋กœ ์•ฝ 23 dB) โ€” ์ง€๋ฉด ๋ชจ๋ธ์€ +0.08 dB ๋กœ ํšจ๊ณผ ๋ฏธ๋ฏธ, ๋‹ค๋ฅธ ๋ฐฉ๋ฒ• ๊ฒ€ํ† "), ("๊ตํ†ต ์ฐธ๊ฐ€์ž", "3DRealCar ์ฐจ๋Ÿ‰ ์—์…‹ ์‚ฝ์ž… (๋†’์ด ยท ์†๋„ โ†’ ๋ ˆ์ด๋” ๋„ํ”Œ๋Ÿฌ), queenstown ยท holland village ์ง€์—ญ ๋งต")] for i, (t, d) in enumerate(plans): r, c = divmod(i, 2) box(s, 0.85 + c * 6.0, y + 0.2 + r * 1.75, 5.75, 1.55, d, title=t, fill=NAVY if i == 2 else PALE, color=WHITE if i == 2 else GRAY, line=None if i == 2 else BLUE, size=12) notes(s, "์—ฌ๋Ÿฌ ์ฃผํ–‰ ํ•ฉ์น˜๊ธฐ (ํƒ€์ผ): ๊ฐ™์€ ๊ธธ์„ ๋‹ค๋ฅธ ์ฐจ์„ ์œผ๋กœ ์ง€๋‚˜๊ฐ„ ์ฃผํ–‰์„ ํ•จ๊ป˜ ํ•™์Šตํ•˜๋ฉด ์˜† ์ฐจ์„ ์ด ์‹ค์ œ ์‚ฌ์ง„์œผ๋กœ ๊ฐ๋…๋œ๋‹ค. ์ฃผํ–‰ 1~2๊ฐœ๋Š” ์ •์ƒ, 6๊ฐœ์—์„œ 3k ์Šคํ… ์ดํ›„ ๋ฌด๋„ˆ์ง„๋‹ค.") for sh in slides[38].shapes: if sh.name == "ํ…์ŠคํŠธ ๊ฐœ์ฒด ํ‹€ 6": for para in sh.text_frame.paragraphs: rs = para.runs if not rs: continue if "์„ค ์žฌ ์šฐ" in rs[0].text: rs[0].text = "kimjunhan" if rs[0].text == "Email": rs[1].text = " : kimjunhan1605@gmail.com" notes(slides[38], "์งˆ์˜์‘๋‹ต.") notes(slides[39], "๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.") # ================================================================== โ…ก. ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ์—”์ง„ ์•„ํ‚คํ…์ฒ˜ divider(slides[6], "์‹œ๋ฎฌ๋ ˆ์ด์…˜ ์—”์ง„ ์•„ํ‚คํ…์ฒ˜", "Vulkan ๊ธฐ๋ฐ˜ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ์—”์ง„์˜ ์ „์ฒด ๊ตฌ์กฐ, ํ•œ ํ”„๋ ˆ์ž„์˜ ๋ Œ๋” ๊ทธ๋ž˜ํ”„, ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ๋ฃจํ”„, Python ๊ณผ์˜ ๋ฐ์ดํ„ฐ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์„ค๋ช…ํ•œ๋‹ค.") def module(sl, x, y, w, h, title, desc, fill=WHITE, line=LIGHT, tcolor=NAVY, dcolor=GRAY, size=10): box(sl, x, y, w, h, "", fill=fill, line=line) tb(sl, x + 0.06, y + 0.04, w - 0.12, 0.26, title, size=size + 1, bold=True, color=tcolor) tb(sl, x + 0.06, y + 0.3, w - 0.12, h - 0.32, desc, size=size, color=dcolor) def figure(sl, path, y, w=11.8, h=4.4, x=0.85): im = Image.open(path) s_ = min(w / im.width, h / im.height) ww, hh = im.width * s_, im.height * s_ return sl.shapes.add_picture(path, Inches(x + (w - ww) / 2), Inches(y), Inches(ww), Inches(hh)) def down_arrow(sl, x, y, w=0.26, h=0.26, color=BLUE): s_ = sl.shapes.add_shape(MSO_SHAPE.DOWN_ARROW, Inches(x), Inches(y), Inches(w), Inches(h)) s_.fill.solid() s_.fill.fore_color.rgb = color s_.line.fill.background() s_.shadow.inherit = False # ------------------------------------------------------------------ 8 ์—”์ง„ ์ „์ฒด ๊ตฌ์กฐ๋„ s = slides[7] y = body(s, "์—”์ง„ ๊ตฌ์กฐ", "์‹œ๋ฎฌ๋ ˆ์ด์…˜ ์—”์ง„ ์ „์ฒด ๊ตฌ์กฐ๋„", [ "(a) CPU ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ๋ฃจํ”„๊ฐ€ ๋งค ํ”„๋ ˆ์ž„ ์ œ์–ด ยท ์ž์ฐจ ๋™์—ญํ•™ ยท ์ถฉ๋Œ ยท ๊ตฌ๊ฐ„ ์ŠคํŠธ๋ฆฌ๋ฐ ยท ์„ผ์„œ ยท ๊ธฐ๋ก์„ ์ฒ˜๋ฆฌํ•˜๊ณ , (b) GPU ๋ Œ๋” ๊ทธ๋ž˜ํ”„๊ฐ€ ๊ฐ€์šฐ์‹œ์•ˆ โ†’ ์ •๋ ฌ โ†’ ๋ž˜์Šคํ„ฐ โ†’ ํ›„์ฒ˜๋ฆฌ๋กœ ์˜์ƒ์„ ๋งŒ๋“ฆ (๊ทธ๋ฆผ์˜ ๊ฐ ๋‹จ๊ณ„๋Š” scene-0402 ์‹ค์ œ ๋ฐ์ดํ„ฐ)", ]) figure(s, "/home/mm/Downloads/vkgs-sim/docs/presentation/figures/out/fig_engine_pipeline.png", y + 0.02, h=6.98 - (y + 0.02)) notes(s, "์ฐธ๊ณ ํ•œ ๋„์‹ ํ˜•์‹: 3DGS (Kerbl 2023) ์ตœ์ ํ™” ํŒŒ์ดํ”„๋ผ์ธ, HUGSIM ยท OmniRe ๊ฐœ์š”๋„ โ€” ๋‹จ๊ณ„๋งˆ๋‹ค ์‹ค์ œ ์ค‘๊ฐ„ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์—ฌ ์ค€๋‹ค. (a) ์˜ ์žฅ์• ๋ฌผ ์ง€๋„ ยท ๊ตฌ๊ฐ„ ยท ๋ผ์ด๋‹ค ยท ์†๋„ ๊ธฐ๋ก, (b) ์˜ ๊ฐ€์šฐ์‹œ์•ˆ ยท ํ™”๋ฉด ํƒ€์› ยท ์ •๋ ฌ ์ˆœ์„œ ยท ํ•˜๋Š˜ ยท ์ƒ‰ ยท ๊ฑฐ๋ฆฌ๋Š” ๋ชจ๋‘ scene-0402 ๊ตฌ๊ฐ„ 1 ๋ชจ๋ธ๊ณผ ์‹ค์ œ ์ฃผํ–‰ ๋กœ๊ทธ์—์„œ ๋งŒ๋“  ๊ทธ๋ฆผ์ด๋‹ค. ์—”์ง„์€ ํ•˜๋‚˜์˜ ์‹คํ–‰ ํŒŒ์ผ(vkgs_viewer)์ด๊ณ , ์ฐฝ ๋ชจ๋“œ(์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ)์™€ ์˜คํ”„์Šคํฌ๋ฆฐ ๋ชจ๋“œ(๋ฐ์ดํ„ฐ ๋ Œ๋” ยท ์ฆ๊ฐ•)๊ฐ€ ๊ฐ™์€ ๋ Œ๋”๋Ÿฌ๋ฅผ ์“ด๋‹ค.") # ------------------------------------------------------------------ 9 ๋ Œ๋” ๊ทธ๋ž˜ํ”„ ํŒŒ์ดํ”„๋ผ์ธ s = slides[8] y = body(s, "์—”์ง„ ๊ตฌ์กฐ", "๋ Œ๋” ๊ทธ๋ž˜ํ”„ โ€” ํ•œ ํ”„๋ ˆ์ž„์˜ ํŒจ์Šค ํŒŒ์ดํ”„๋ผ์ธ", [ "ํ”„๋ ˆ์ž„ ๊ตฌ์„ฑ์€ configs/render_graph.json ์ด ์ •ํ•จ โ€” ํŒจ์Šค๋งˆ๋‹ค ์“ฐ๋Š” ์ž์›๊ณผ ์šฉ๋„ (uses) ๋ฅผ ์„ ์–ธํ•˜๋ฉด ๊ทธ๋ž˜ํ”„๊ฐ€ ๋ฐฐ๋ฆฌ์–ด ยท ๋ ˆ์ด์•„์›ƒ ์ „ํ™˜์„ ์ž๋™์œผ๋กœ ์‚ฝ์ž…ํ•จ", "๊ฐ€์šฐ์‹œ์•ˆ SSBO โ†’ preprocess (ํˆฌ์˜ ยท SH ยท ๋ณด์ด๋Š” ๊ฒƒ๋งŒ ์••์ถ•) โ†’ GPU radix ์ •๋ ฌ โ†’ ํ•˜๋Š˜ ๋ฐฐ๊ฒฝ โ†’ ์Šคํ”Œ๋žซ ๋ž˜์Šคํ„ฐ (RGBA16F ์ƒ‰ + r32f ๊ฑฐ๋ฆฌ) โ†’ ํ›„์ฒ˜๋ฆฌ โ€” 800ร—450 ์žฅ๋‹น ์•ฝ 6.8 ms", ]) figure(s, "/home/mm/Downloads/vkgs-sim/docs/presentation/figures/out/fig_engine_pipeline_b.png", y + 0.1, h=6.95 - (y + 0.1)) notes(s, "์‹ค์ œ ํŒจ์Šค ์ˆœ์„œ: clear_draw_args โ†’ preprocess โ†’ sort โ†’ readback_count โ†’ background โ†’ scene โ†’ precip โ†’ weather โ†’ fxaa โ†’ fxaa_resolve โ†’ to_present (camera_isp ๊บผ์ง). ์ธก์ •(800ร—450): preprocess 2.02 ms, sort 0.44 ms (์ด์ „ bitonic 31~35 ms ๋Œ€๋น„ 13๋ฐฐ), scene 4.38 ms. preprocess ๊ฐ€ 200๋งŒ ๊ฐœ ์ค‘ ๋ณด์ด๋Š” ์•ฝ 25~46๋งŒ ๊ฐœ๋งŒ ์••์ถ•ํ•ด ์ •๋ ฌ ๋Œ€์ƒ์„ ์ค„์ธ๋‹ค. RGBA16F ๋ธ”๋ Œ๋”ฉ์€ 32๋น„ํŠธ ๋Œ€๋น„ 64 dB, ๊ฑฐ๋ฆฌ ๋ˆ„์ ์€ ์„ผ์„œ ยท ๋‚ ์”จ ยท ๋ฐ˜์‚ฌ์— ์“ด๋‹ค.") # ------------------------------------------------------------------ 10 ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ๋ฃจํ”„ s = slides[9] y = body(s, "์—”์ง„ ๊ตฌ์กฐ", "์‹œ๋ฎฌ๋ ˆ์ด์…˜ ๋ฃจํ”„ โ€” ํ•œ ํ”„๋ ˆ์ž„์— ์ผ์–ด๋‚˜๋Š” ์ผ", [ "์ œ์–ด ์ž…๋ ฅ โ†’ ์ž์ฐจ ์ ๋ถ„ ยท ์ถฉ๋Œ โ†’ ๊ตฌ๊ฐ„ ์„ ํƒ โ†’ ์„ผ์„œ โ†’ ๋ Œ๋” โ†’ ๊ธฐ๋ก์˜ ์ˆœ์„œ๋กœ ๋งค ํ”„๋ ˆ์ž„์„ ์ฒ˜๋ฆฌํ•˜๋ฉฐ, ์Šคํฌ๋ฆฝํŠธ ์ œ์–ด๋Š” 50 ms ๊ณ ์ • ์Šคํ…์ด๋ผ ์žฌํ˜„ ๊ฐ€๋Šฅํ•จ", "VLA ๋ชจ๋ธ์€ '์ œ์–ด ์ž…๋ ฅ' ์ž๋ฆฌ์— ๋“ค์–ด์™€ 6์บ  (+ ์„ผ์„œ) ๊ด€์ธก์„ ๋ฐ›๊ณ  ์กฐํ–ฅ ยท ๊ฐ€์†์„ ๋Œ๋ ค์ฃผ๋Š” ๊ตฌ์กฐ โ€” ๊ธฐ๋ก๋œ ์ œ์–ด๋Š” drive_log.csv ๋กœ ๋‚จ์Œ (์˜ค๋ฅธ์ชฝ: ์‹ค์ œ ์‹œํ—˜ ์ฃผํ–‰์˜ ์†๋„)", ]) pic = figure(s, "/home/mm/Downloads/vkgs-sim/docs/presentation/figures/out/fig_engine_pipeline_a.png", y + 0.05, h=2.75) yy = y + 0.2 + pic.height / 914400 table(s, 0.85, yy, 11.8, [["๋‹จ๊ณ„", "ํ•ต์‹ฌ ์ฒ˜๋ฆฌ"], ["โ‘ข ์ถฉ๋Œ", "์ฐจ์ฒด ์ƒ˜ํ”Œ 0.1 m ๊ฒฉ์ž ยท ๊นŠ์ด = ๋‹ฟ์€ ์  โˆ’ ์Šค์นจ (2) ยท ๊ฐ™์€ ๋ฐฉํ–ฅ 0.3 m ์•ž์ด ๋” ๊นŠ์ง€ ์•Š์œผ๋ฉด ํ—ˆ์šฉ (๊ฐ‡ํž˜ ๋ฐฉ์ง€)"], ["โ‘ฃ ๊ตฌ๊ฐ„", "๋‹ด๋‹น ๊ถค์ ์ด ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๊ตฌ๊ฐ„ ยท 3 m ํžˆ์Šคํ…Œ๋ฆฌ์‹œ์Šค ยท ๊ฐ€๊นŒ์šด 3๊ตฌ๊ฐ„ ๋น„๋™๊ธฐ ๋กœ๋“œ ยท ๊ต์ฒด 0.19์ดˆ"], ["โ‘ค ์„ผ์„œ", "๋„ค ๋ฐ”ํ€ด ์ž๋ฆฌ ์ง€๋ฉด ๋†’์ด๋กœ z ยท pitch ยท roll โ†’ ๋ผ์ด๋‹ค 32 ร— 1,091 ๊ด‘์„  DDA 4 ms ยท ๋ ˆ์ด๋” 5๋Œ€ ๋„ํ”Œ๋Ÿฌ"]], [0.1, 0.9], size=10, rowh=0.29) notes(s, "โ‘ข ์žฅ์• ๋ฌผ ์ง€๋„์˜ ์™ธํ†จ์ด ์นธ์ด๋‚˜ ํ™”๋‹จ ๊ฐ€์žฅ์ž๋ฆฌ ํ•œ ์นธ์— ์ฐจ์ฒด ์˜†์ด ์Šค์น˜๊ธฐ๋งŒ ํ•ด๋„ ๋ง‰ํ˜€ ๊ฐ‡ํžˆ๋˜ ๋ฌธ์ œ๋ฅผ ์Šค์นจ ํ—ˆ์šฉ๊ณผ ํƒˆ์ถœ ํŒ์ •์œผ๋กœ ํ•ด๊ฒฐํ–ˆ๋‹ค. โ‘ค ๊ธฐ์šธ์–ด์ง„ ๊ธธ์„ ๋ฌด์‹œํ•˜๋ฉด ๋‚ฎ์€ ๋น”์˜ ๋…ธ๋ฉด ๊ฑฐ๋ฆฌ๊ฐ€ 20% ๋„˜๊ฒŒ ์งง์•„์ ธ ๋…ธ๋ฉด์— ์•‰ํžŒ๋‹ค.") # ------------------------------------------------------------------ 11 ๋ฐ์ดํ„ฐ ์ธํ„ฐํŽ˜์ด์Šค s = slides[10] y = body(s, "์—”์ง„ ๊ตฌ์กฐ", "Python โ†” ์—”์ง„ ๋ฐ์ดํ„ฐ ์ธํ„ฐํŽ˜์ด์Šค", [ "์—”์ง„๊ณผ Python ์€ ์‚ฌ๋žŒ์ด ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ํŒŒ์ผ๋กœ๋งŒ ์—ฐ๊ฒฐ๋จ โ€” ๊ฐ ํŒŒ์ผ์€ ๋ฌด์—‡์œผ๋กœ ๋งŒ๋“ค์—ˆ๋Š”์ง€ export.json ์— ๋‚จ๊ธฐ๊ณ , ๋ชจ๋ธ ยท ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๋ฐ”๋€Œ๋ฉด ์ž๋™์œผ๋กœ ๋‹ค์‹œ ๋งŒ๋“ฆ", ]) table(s, 0.85, y + 0.15, 11.8, [ ["ํŒŒ์ผ", "๋งŒ๋“œ๋Š” ๊ณณ (Python)", "๋‚ด์šฉ", "์—”์ง„์—์„œ ์“ฐ๋Š” ๊ณณ"], ["point_cloud.ply (๊ตฌ๊ฐ„๋งˆ๋‹ค)", "recon train", "๊ฐ€์šฐ์‹œ์•ˆ + ์›์  ์ฃผ์„ (nusim_origin)", "๋ Œ๋”๋Ÿฌ ยท SegmentStreamer"], ["segments.txt", "render/segmap.py", "๊ตฌ๊ฐ„ ์›์  ์ฐจ ยท ๋‹ด๋‹น ๊ถค์  ์ ", "SegmentMap (๊ตฌ๊ฐ„ ์„ ํƒ)"], ["rig.txt", "render/export.py", "ํ”„๋ ˆ์ž„๋ณ„ 6์บ  w2c ยท ์ž์ฐจ ํฌ์ฆˆ ยท ๊ฐ์ฒด ๋ฐ•์Šค", "์žฌ์ƒ ยท ์šด์ „ ์นด๋ฉ”๋ผ ยท ์ฆ๊ฐ•"], ["map.txt ยท drivable.txt", "render/export.py", "๋งต ์„  ยท ์ฃผํ–‰๊ฐ€๋Šฅ์˜์—ญ ํด๋ฆฌ๊ณค", "์˜ค๋ฒ„๋ ˆ์ด ยท ์—ฐ์„ ํŒ์ •"], ["obstacles.pgm", "sim/obstacles.py", "0.2 m ์žฅ์• ๋ฌผ ๊ฒฉ์ž (์ •์  ๋ผ์ด๋‹ค)", "์ถฉ๋Œ ํŒ์ •"], ["world.vox", "sim/voxels.py + vkgs_voxcarve", "0.2 m ๋ณต์…€ + 0.5 m ์ง€๋ฉด ๋†’์ด ์ง€๋„", "๋ผ์ด๋‹ค ยท ๋ ˆ์ด๋” ยท ๋…ธ๋ฉด ์ •์ฐฉ"], ["sky.ktx2 ยท IBL", "recon/sky.py ยท render/ibl.py", "ํ•™์Šต ํ•˜๋Š˜ ํ๋ธŒ๋งต ยท ํ™˜๊ฒฝ๊ด‘ (BC6H)", "background ยท glTF ์กฐ๋ช…"], ["sim.json ยท render_graph.json", "configs/", "๋‚ ์”จ ยท ์„ผ์„œ ยท ์ถฉ๋Œ ยท ์นด๋ฉ”๋ผ ยท ํŒจ์Šค ๊ตฌ์„ฑ", "์—”์ง„ ์ „์ฒด ์„ค์ •"], ], [0.22, 0.24, 0.32, 0.22], size=10, rowh=0.42) notes(s, "ํ•˜๋“œ์ฝ”๋”ฉ์„ ์ค„์ด๊ธฐ ์œ„ํ•ด ์กฐ์ •๊ฐ’์€ ๋ชจ๋‘ configs/ ์— ์žˆ๋‹ค. ์ขŒํ‘œ๊ณ„๋Š” nusim/data/rig.py ์˜ docstring ์ด ์œ ์ผํ•œ ์ถœ์ฒ˜๋‹ค. ๋ชจ๋“  ํŒŒ์ผ์€ ๊ทธ ๋ชจ๋ธ์˜ ์›์  ๊ธฐ์ค€ ์ขŒํ‘œ๋ฅผ ์“ด๋‹ค.") # ================================================================== โ…ข. ๋ฉ€ํ‹ฐ๋ทฐ ์‹œ์  ๋ณ€ํ™˜ ๋ชจ๋ธ ์•„ํ‚คํ…์ฒ˜ divider(slides[12], "๋ฉ€ํ‹ฐ๋ทฐ ์‹œ์  ๋ณ€ํ™˜ ๋ชจ๋ธ ์•„ํ‚คํ…์ฒ˜", "6์บ  ๋ฉ€ํ‹ฐ๋ทฐ ์˜์ƒ์„ ์ƒˆ๋กœ์šด ์นด๋ฉ”๋ผ ๋ฐฐ์น˜๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ชจ๋ธ โ€” ๊ตฌ๊ฐ„๋ณ„ 3DGS ์žฌ๊ตฌ์„ฑ ๋ชจ๋ธ์˜ ๊ตฌ์กฐ, ๋ชจ๋“ˆ, ์†์‹ค ํ•จ์ˆ˜, ๋ฆฌ๊ทธ ๋ณ€ํ™˜์„ ์„ค๋ช…ํ•œ๋‹ค.") # ------------------------------------------------------------------ 14 ๋ชจ๋ธ ์ „์ฒด ๊ตฌ์กฐ๋„ s = slides[13] y = body(s, "๋ชจ๋ธ ๊ตฌ์กฐ", "๋ฉ€ํ‹ฐ๋ทฐ ์‹œ์  ๋ณ€ํ™˜ ๋ชจ๋ธ ์ „์ฒด ๊ตฌ์กฐ๋„", [ "๊ตฌ๊ฐ„๋งˆ๋‹ค ๋ฉ€ํ‹ฐ๋ทฐ ์‚ฌ์ง„ ยท ๋ผ์ด๋‹ค๋กœ 3DGS ์žฅ๋ฉด์„ ํ•™์Šต: ๋ผ์ด๋‹ค ์ดˆ๊ธฐํ™” โ†’ 3D ๊ฐ€์šฐ์‹œ์•ˆ โ†’ ๋ฏธ๋ถ„ ๋ž˜์Šคํ„ฐ๋ผ์ด์ € โ†’ ๋ Œ๋” (์ƒ‰ ยท ๊นŠ์ด) โ†’ ์‚ฌ์ง„ ยท ๋ผ์ด๋‹ค ยท ๋งˆ์Šคํฌ ๊ฐ๋… โ†’ ์—ญ์ „ํŒŒ", "ํ•™์Šต๋œ ์žฅ๋ฉด์„ ๋ฆฌ๊ทธ ๋ณ€ํ˜• T ๋ฅผ ์ค€ 6์บ ์œผ๋กœ ๋‹ค์‹œ ๋ Œ๋”๋งํ•ด ์ƒˆ ์‹œ์  ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑ (๊ทธ๋ฆผ์˜ ๊ฐ ๋‹จ๊ณ„๋Š” scene-0402 ์‹ค์ œ ๋ฐ์ดํ„ฐ)", ]) figure(s, "/home/mm/Downloads/vkgs-sim/docs/presentation/figures/out/fig_viewpoint_model_a.png", y + 0.15, h=6.9 - (y + 0.15)) notes(s, "์ฐธ๊ณ ํ•œ ๋„์‹ ํ˜•์‹: 3DGS (Kerbl 2023) Fig. 2 ์ตœ์ ํ™” ํŒŒ์ดํ”„๋ผ์ธ โ€” ์ดˆ๊ธฐ ์  โ†’ 3D ๊ฐ€์šฐ์‹œ์•ˆ โ†’ ํˆฌ์˜ ยท ํƒ€์ผ ๋ž˜์Šคํ„ฐ โ†’ ์ด๋ฏธ์ง€, ๊ทธ๋ฆฌ๊ณ  gradient ๋˜๋Œ๋ฆผ. ์—ฌ๊ธฐ์„œ๋Š” SfM ์  ๋Œ€์‹  ๋ผ์ด๋‹ค ๋ˆ„์ ์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•˜๊ณ , ์‚ฌ์ง„ ์†์‹ค์— ๋ผ์ด๋‹ค ๊นŠ์ด ยท ํ•˜๋Š˜ ยท ์ •๊ทœํ™”๋ฅผ ๋”ํ–ˆ๋‹ค. (b) ๋Š” ์‹œ์  ๋ณ€ํ™˜์ด ํ•™์Šต์ด ์•„๋‹ˆ๋ผ '์ƒˆ ์นด๋ฉ”๋ผ ๋ฐฐ์น˜๋กœ ๋‹ค์‹œ ์ฐ๊ธฐ' ์ž„์„ ๋ณด์ธ๋‹ค. ์˜ค๋ฅธ์ชฝ 9์žฅ์€ ๊ฐ™์€ ์ˆœ๊ฐ„์˜ ์•ž ์นด๋ฉ”๋ผ ๋ณ€ํ˜• 9์ข…์ด๋‹ค.") # ------------------------------------------------------------------ 15 ์žฅ๋ฉด ํ‘œํ˜„ ยท ๋ฏธ๋ถ„ ๋ Œ๋”๋Ÿฌ s = slides[14] y = body(s, "๋ชจ๋ธ ๊ตฌ์กฐ", "๋ชจ๋“ˆ โ‘  ์žฅ๋ฉด ํ‘œํ˜„ ๋ฐ ๋ฏธ๋ถ„ ๋ž˜์Šคํ„ฐ๋ผ์ด์ €", [ "์žฅ๋ฉด ๋ชจ๋ธ์€ ์‹ ๊ฒฝ๋ง์ด ์•„๋‹Œ ๋ช…์‹œ์  ๊ฐ€์šฐ์‹œ์•ˆ ์ง‘ํ•ฉ์ด๋ฉฐ, ๋ผ์ด๋‹ค๋กœ ์ดˆ๊ธฐํ™”ํ•˜๊ณ  3DGS-MCMC ๋กœ ๊ฐœ์ˆ˜ (์ตœ๋Œ€ 200๋งŒ) ๋ฅผ ์œ ์ง€ํ•˜๋ฉฐ ์œ„์น˜๋ฅผ ์žฌ๋ฐฐ์น˜ํ•จ", "๋ฏธ๋ถ„ ๋ž˜์Šคํ„ฐ๋ผ์ด์ € (gsplat 1.4.0) ๊ฐ€ ์ƒ‰ ยท ๋ถˆํˆฌ๋ช…๋„ ยท ๊นŠ์ด๋ฅผ ํ•จ๊ป˜ ๋ Œ๋”๋งํ•˜๊ณ , ๊ทธ gradient ๋กœ ๋ชจ๋“  ๊ฐ€์šฐ์‹œ์•ˆ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๊ฐฑ์‹ ํ•จ", ]) box(s, 0.85, y + 0.15, 5.75, 3.55, "", fill=PALE, line=BLUE) tb(s, 0.95, y + 0.2, 5.5, 0.3, "๊ฐ€์šฐ์‹œ์•ˆ ์žฅ๋ฉด G", size=13, bold=True, color=NAVY) table(s, 1.0, y + 0.58, 5.45, [["ํ•ญ๋ชฉ", "์„ค์ •"], ["์ดˆ๊ธฐํ™”", "์ •์  ๋ผ์ด๋‹ค ๋ˆ„์  (์•ฝ 400 sweep) โ†’ ๋ณต์…€ โ†’ ์‚ฌ์ง„ ํˆฌ์˜ ์ƒ‰"], ["ํŒŒ๋ผ๋ฏธํ„ฐ", "ฮผ ยท ์Šค์ผ€์ผ ยท ์ฟผํ„ฐ๋‹ˆ์–ธ ยท ฮฑ ยท SH (3์ฐจ, 1,000 ์Šคํ…๋งˆ๋‹ค ์ฐจ์ˆ˜ ์ฆ๊ฐ€)"], ["๋ฐ€๋„ ์ œ์–ด", "MCMC: ์ƒํ•œ 200๋งŒ, ๋‚ฎ์€ ฮฑ ์žฌ๋ฐฐ์น˜, ์œ„์น˜ ์žก์Œ (lr 5e5)"], ["์ •๊ทœํ™”", "๋ถˆํˆฌ๋ช…๋„ ยท ์Šค์ผ€์ผ ํ‰๊ท  ๊ฐ 0.01 (๋ณด์ด๋Š” ๊ฒƒ๋งŒ ์˜ต์…˜)"], ["๊ฐ€๋ฆผ", "์ฐจ๋Ÿ‰ ยท ์‚ฌ๋žŒ 3D ๋ฐ•์Šค โ†’ ์‚ฌ์ง„ ยท ๋ผ์ด๋‹ค์—์„œ ์ œ์™ธ"]], [0.25, 0.75], size=10, rowh=0.44) box(s, 6.9, y + 0.15, 5.75, 3.55, "", fill=PALE, line=BLUE) tb(s, 7.0, y + 0.2, 5.5, 0.3, "๋ฏธ๋ถ„ ๋ž˜์Šคํ„ฐ๋ผ์ด์ € (gsplat)", size=13, bold=True, color=NAVY) rs = [("ํˆฌ์˜", "ฮฃโ€ฒ = J W ฮฃ Wแต€ Jแต€, ๋ณด๋Š” ๋ฐฉํ–ฅ์œผ๋กœ SH ์ƒ‰ ๊ณ„์‚ฐ"), ("ํƒ€์ผ ์ •๋ ฌ", "16ร—16 ํƒ€์ผ๋งˆ๋‹ค ๊ฒน์น˜๋Š” ๊ฐ€์šฐ์‹œ์•ˆ์„ ๊นŠ์ด์ˆœ ์ •๋ ฌ"), ("์•ŒํŒŒ ๋ธ”๋ Œ๋”ฉ", "C = ฮฃ cแตข ฮฑแตข ฮ (1 โˆ’ ฮฑโฑผ), ฮฑ ๋ˆ„์  ยท ๊ธฐ๋Œ€ ๊นŠ์ด D"), ("์—ญ์ „ํŒŒ", "ฮผ ยท ฮฃ ยท ฮฑ ยท SH ๋กœ gradient (packed ๋ชจ๋“œ)"), ("์นด๋ฉ”๋ผ ํ–‰๋ ฌ", "view gradient ๋” (2.2๋ฐฐ ๋А๋ ค์ง) โ†’ ฮ” ๋Š” ๋ณ„๋„ ๋ชจ๋“ˆ")] for k, (t, d) in enumerate(rs): box(s, 7.05, y + 0.6 + k * 0.6, 1.5, 0.5, t, fill=NAVY, color=WHITE, size=10, bold=True) tb(s, 8.62, y + 0.62 + k * 0.6, 3.95, 0.48, d, size=10, color=GRAY, anchor=MSO_ANCHOR.MIDDLE) notes(s, "Vulkan ๋ Œ๋”๋Ÿฌ๋Š” ์ด ๋ž˜์Šคํ„ฐ๋ผ์ด์ €์™€ ๊ฐ™์€ ์ˆ˜์‹(gs_common.glsl)์„ ์“ฐ๊ณ , ํ•™์Šต๊ธฐ ๋ Œ๋”์™€ PSNR 56 dB ๋กœ ์ผ์น˜ํ•œ๋‹ค. ํ•™์Šต์€ 2๋ฐฐ ๋‹ค์šด์Šค์ผ€์ผ(800ร—450)์—์„œ ํ•œ๋‹ค.") # ------------------------------------------------------------------ 16 ๋ณด์ • ยท ํ•˜๋Š˜ s = slides[15] y = body(s, "๋ชจ๋ธ ๊ตฌ์กฐ", "๋ชจ๋“ˆ โ‘ก ์นด๋ฉ”๋ผ ๋ณด์ • ๋ฐ ํ•˜๋Š˜ ๋ชจ๋ธ", [ "6๋Œ€ ์นด๋ฉ”๋ผ์˜ ์ƒ‰ ยท ์žฅ์ฐฉ ์˜ค์ฐจ์™€ ํ•˜๋Š˜์„ ๋ณ„๋„ ๋ชจ๋“ˆ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ, ๊ฐ€์šฐ์‹œ์•ˆ์ด ์นด๋ฉ”๋ผ ์ฐจ์ด๋‚˜ ํ•˜๋Š˜์„ ํก์ˆ˜ํ•ด ์ƒ๊ธฐ๋Š” floater ๋ฅผ ๋ง‰์Œ", ]) cards = [("์ƒ‰ ๋ณด์ • (ColorCorrection)", "์นด๋ฉ”๋ผ๋ณ„ 3ร—4 ์•„ํ•€ + ํ”„๋ ˆ์ž„๋ณ„ RGB log ๊ฒŒ์ธ\n\naffine_c = [I|0] + d_c โˆ’ mean(d)\nlog_gain_v = g_v โˆ’ mean(g)\n\n์ค‘์‹ฌํ™” โ†’ ๋ณด์ • ์—†์ด ๊ทธ๋ฆฐ ply ๊ฐ€ ๊ณง\nํ‰๊ท  ์นด๋ฉ”๋ผ ์ƒ‰ (์ฆ๊ฐ• ์˜์ƒ์˜ ์ƒ‰ ๊ธฐ์ค€)"), ("์™ธ๋ถ€ ํŒŒ๋ผ๋ฏธํ„ฐ ๋ณด์ • (CameraAdjust)", "์นด๋ฉ”๋ผ๋ณ„ SE(3) ฮ” (ํšŒ์ „๋ฒกํ„ฐ 3 + ์ด๋™ 3)\n\nw2cโ€ฒ = ฮ” ยท w2c\ncamโ†’egoโ€ฒ = camโ†’ego ยท ฮ”โปยน\n\nlr 1e-4, 4 ์Šคํ…๋งˆ๋‹ค, 3๋งŒ ์Šคํ…๊นŒ์ง€\n์‚ฌ์ „ ์ •๊ทœํ™” 5e-4\n๊ฒฐ๊ณผ: ํšŒ์ „ 0.1~0.4ยฐ, ์ด๋™ ์•ฝ 1 cm"), ("ํ•˜๋Š˜ ๋ชจ๋ธ (SkyCube)", "ํ•™์Šต ํ๋ธŒ๋งต 256ยฒ (lr 0.01)\n\nรŽ_final = รŽ + (1 โˆ’ ฮฑ) ยท S(๊ด‘์„  ๋ฐฉํ–ฅ)\n\nBCE: ํ•˜๋Š˜ ํ”ฝ์…€ ฮฑ โ†’ 0,\n๋ผ์ด๋‹ค ํ‘œ๋ฉด ํ”ฝ์…€ ฮฑ โ†’ 1 (ฮป 0.05)\n\n์ €์žฅ: sky.ktx2 (RGBA16F ์„ ํ˜•)\nโ†’ Vulkan background ํŒจ์Šค")] for k, (t, d) in enumerate(cards): box(s, 0.85 + k * 4.0, y + 0.2, 3.8, 2.45, d, title=t, fill=PALE, line=BLUE, size=11, align=PP_ALIGN.LEFT) why = [("๋ถ„๋ฆฌํ•˜์ง€ ์•Š์œผ๋ฉด", "์นด๋ฉ”๋ผ๋งˆ๋‹ค ๋‹ค๋ฅธ ์ƒ‰ ยท ๋…ธ์ถœ์„ ๊ฐ€์šฐ์‹œ์•ˆ ์ƒ‰์ด ํก์ˆ˜ โ†’ ์ƒˆ ์‹œ์ ์—์„œ ์–ผ๋ฃฉ"), ("๋ถ„๋ฆฌํ•˜์ง€ ์•Š์œผ๋ฉด", "์žฅ์ฐฉ ์˜ค์ฐจ (0.1~0.4ยฐ) ๋งŒํผ ๊ฐ™์€ ๋ฌผ์ฒด๊ฐ€ ๊ฒน์ณ ํ๋ ค์ง"), ("๋ถ„๋ฆฌํ•˜์ง€ ์•Š์œผ๋ฉด", "ํ•˜๋Š˜์ด 9 m ๊ฑฐ๋ฆฌ์˜ ๋ฐ์€ ๊ฐ€์šฐ์‹œ์•ˆ ๋ฉ์–ด๋ฆฌ๋กœ ๊ตฌ์›Œ์ ธ floater ๊ฐ€ ๋จ")] for k, (t, d) in enumerate(why): x = 0.85 + k * 4.0 down_arrow(s, x + 1.77, y + 2.72, h=0.24, color=ORANGE) box(s, x, y + 3.02, 3.8, 0.85, d, title=t, fill=WHITE, line=ORANGE, size=10) notes(s, "ํ•˜๋Š˜์„ ๋ถ„๋ฆฌํ•˜์ง€ ์•Š์œผ๋ฉด ํ•˜๋Š˜ ์ผ๋ถ€๊ฐ€ ๊ฐ€๊นŒ์šด ๋ถˆํˆฌ๋ช… ๊ฐ€์šฐ์‹œ์•ˆ์œผ๋กœ ๊ตฌ์›Œ์ ธ(9 m ๊ฑฐ๋ฆฌ์˜ ๋ฐ์€ ๋ฉ์–ด๋ฆฌ) ์ƒˆ ์‹œ์ ์—์„œ ๋– ๋‹ค๋‹Œ๋‹ค. 'ํ•˜๋Š˜ ์•„๋‹˜' ์ „์ฒด์— ฮฑโ†’1 ์„ ๊ฑธ๋ฉด ๋‚˜๋ญ‡์žŽ ์‚ฌ์ด๋กœ floater ๊ฐ€ ์ƒ๊ฒจ ๋ผ์ด๋‹ค๊ฐ€ ํ‘œ๋ฉด์„ ํ™•์ธํ•œ ํ”ฝ์…€์—๋งŒ ๊ฑด๋‹ค.") # ------------------------------------------------------------------ 17 ์†์‹ค ยท ํ•™์Šต ์„ค์ • s = slides[16] y = body(s, "๋ชจ๋ธ ๊ตฌ์กฐ", "์†์‹ค ํ•จ์ˆ˜ ๋ฐ ํ•™์Šต ์„ค์ •", [ "์‚ฌ์ง„ ์žฌ๊ตฌ์„ฑ ์†์‹ค์— ๋ผ์ด๋‹ค ๊นŠ์ด ยท ํ•˜๋Š˜ ๋ถ„๋ฆฌ ยท MCMC ์ •๊ทœํ™” ยท ์นด๋ฉ”๋ผ ๋ณด์ • ์‚ฌ์ „์„ ๋”ํ•ด ํ•™์Šตํ•จ โ€” ์‚ฌ์ง„ ์†์‹ค์€ ์ฐจ๋Ÿ‰ ยท ์‚ฌ๋žŒ ๋งˆ์Šคํฌ ๋ฐ– ํ”ฝ์…€์—์„œ๋งŒ ๊ณ„์‚ฐ", ]) box(s, 0.85, y + 0.15, 11.8, 0.62, "L = 0.8 ยท L1 + 0.2 ยท (1 โˆ’ SSIM) + 0.1 ยท L_depth + 0.05 ยท (L_sky + L_surf) + 0.01 ยท mean(ฮฑ) + 0.01 ยท mean(s) + 5ยท10โปโด ยท R(ฮ”)", fill=NAVY, color=WHITE, size=14, bold=True) table(s, 0.85, y + 0.95, 6.3, [["ํ•ญ", "์ •์˜"], ["L1 ยท D-SSIM", "๋ Œ๋” รŽ ์™€ ์‹ค์ œ ์‚ฌ์ง„, ๊ฐ์ฒด ๋งˆ์Šคํฌ ๋ฐ– ํ”ฝ์…€ (SSIM ฮป 0.2)"], ["L_depth", "|D โˆ’ D_lidar| / D_lidar, 1/4 ํ•ด์ƒ๋„, ์ฐจ๋Ÿ‰ ํ”ฝ์…€ ์ œ์™ธ"], ["L_sky ยท L_surf", "ํ•˜๋Š˜ ํ”ฝ์…€ โˆ’log(1โˆ’ฮฑ), ๋ผ์ด๋‹ค ํ‘œ๋ฉด ํ”ฝ์…€ โˆ’log ฮฑ"], ["mean(ฮฑ) ยท mean(s)", "MCMC ๋ถˆํˆฌ๋ช…๋„ ยท ์Šค์ผ€์ผ ์ •๊ทœํ™”"], ["R(ฮ”)", "์นด๋ฉ”๋ผ ์™ธ๋ถ€ ํŒŒ๋ผ๋ฏธํ„ฐ ๋ณด์ •์˜ ํฌ๊ธฐ ์‚ฌ์ „"]], [0.3, 0.7], size=10, rowh=0.44) table(s, 7.4, y + 0.95, 5.25, [["ํ•™์Šต ์„ค์ • (day_map)", "๊ฐ’"], ["์Šคํ… / ๊ตฌ๊ฐ„", "15,000 (์•ฝ 20๋ถ„)"], ["ํ•ด์ƒ๋„", "800ร—450 (2๋ฐฐ ์ถ•์†Œ)"], ["๊ฐ€์šฐ์‹œ์•ˆ ์ƒํ•œ", "2,000,000"], ["lr ์œ„์น˜ / ์Šค์ผ€์ผ", "1.6e-4 (โ†’ ร—0.01) / 5e-3"], ["lr ํšŒ์ „ / ๋ถˆํˆฌ๋ช…๋„ / ์ƒ‰", "1e-3 / 5e-2 / 1e-3"], ["์žฌ๋ฐฐ์น˜ ๊ตฌ๊ฐ„", "500 ~ 15,000 ์Šคํ…"]], [0.55, 0.45], size=10, rowh=0.37) notes(s, "L_depth ๋Š” ๊ฐ™์€ ์ •์  ๋ผ์ด๋‹ค๋ฅผ ๊ทธ ์นด๋ฉ”๋ผ์— ํˆฌ์˜ํ•œ ๊นŠ์ด ์ง€๋„์™€์˜ ์ƒ๋Œ€ ์˜ค์ฐจ๋‹ค. ์ฐจ๋Ÿ‰ ํ”ฝ์…€์˜ ๋ผ์ด๋‹ค ๊นŠ์ด๋Š” ์ฐจ ๋’ค ๋ฐฐ๊ฒฝ์ด๋ผ ๋บ€๋‹ค. GPU ํ…์„œ ๊ฐ’์„ ํŒŒ์ด์ฌ if ๋กœ ๊ฒ€์‚ฌํ•˜๋ฉด ๋งค ์Šคํ… ๋™๊ธฐํ™”๊ฐ€ ๊ฑธ๋ ค ํ•™์Šต ๋ฃจํ”„์—์„œ ํ”ผํ•œ๋‹ค.") # ------------------------------------------------------------------ 18 ๋ฆฌ๊ทธ ๋ณ€ํ™˜ s = slides[17] y = body(s, "๋ชจ๋ธ ๊ตฌ์กฐ", "๋ชจ๋“ˆ โ‘ข ๋ฉ€ํ‹ฐ๋ทฐ ๋ฆฌ๊ทธ ๋ณ€ํ™˜ ๋ฐ ๋ Œ๋”๋ง", [ "6๋Œ€ ์นด๋ฉ”๋ผ ์ „์ฒด์— ๊ฐ™์€ ๋ณ€ํ˜• T ๋ฅผ ์ฃผ์–ด ๋ฆฌ๊ทธ ๊ธฐํ•˜๋ฅผ ์œ ์ง€ํ•œ ์ฑ„ '๋‹ค๋ฅธ ์ฐจ์— ๋‹จ ์นด๋ฉ”๋ผ' ๋ฅผ ๋งŒ๋“ฆ โ€” ์ž์ฐจ ๊ถค์  ยท ์‹œ๊ฐ์€ ์›๋ณธ ๊ทธ๋Œ€๋กœ", "ํ”„๋ ˆ์ž„๋งˆ๋‹ค ๊ทธ ์‹œ๊ฐ์„ ๋งก์€ ๊ตฌ๊ฐ„ ๋ชจ๋ธ๋กœ ๋ Œ๋”๋งํ•˜์—ฌ ๊ตฌ๊ฐ„ ๊ฒฝ๊ณ„์—์„œ๋„ ์ƒ‰ ยท ๊ธฐํ•˜ ์ด์Œ๋งค ์—†์ด ์ด์–ด์ง (scene-0402: ๊ตฌ๊ฐ„ 5๊ฐœ)", ]) pic = figure(s, "/home/mm/Downloads/vkgs-sim/docs/presentation/figures/out/fig_viewpoint_model_b.png", y + 0.1, h=2.9) yy = y + 0.2 + pic.height / 914400 table(s, 0.85, yy, 11.8, [["๋‹จ๊ณ„", "๋‚ด์šฉ"], ["1 ยท ๋ณ€ํ˜• ์ •์˜", "shift [x ์•ž, y ์™ผ์ชฝ, z ์œ„] m ยท rot [roll, pitch, yaw]ยฐ โ€” configs/aug/rig_variants.json (9์ข…)"], ["2 ยท ์บ˜๋ฆฌ๋ธŒ ๋ณ€ํ™˜", "Rโ€ฒ = Rz(yaw) ยท R ยท Rx(โˆ’pitch) ยท Rz(roll), tโ€ฒ = t + shift โ†’ w2cโ€ฒ = (ego โ†’ world ยท cam โ†’ egoโ€ฒ)โปยน ยท ฮ”"], ["3 ยท ๋‹ด๋‹น ๊ตฌ๊ฐ„", "CAM_FRONT ์‹œ๊ฐ โˆˆ [own0, own1) ์ธ ๊ตฌ๊ฐ„ ๋ชจ๋ธ (๊ฒน์นจ 10 m ์˜ ๊ฐ€์šด๋ฐ์—์„œ ์ž๋ฆ„)"], ["4 ยท ๋ Œ๋” ยท ์ถœ๋ ฅ", "๊ตฌ๊ฐ„๋งˆ๋‹ค rig.txt โ†’ ์˜คํ”„์Šคํฌ๋ฆฐ 6์บ  (FXAA ๋”, ํ•˜๋Š˜ ํ๋ธŒ๋งต) โ†’ <variant>/<CAM>/*.jpg + meta.json"]], [0.16, 0.84], size=10, rowh=0.31) notes(s, "๋ณ€ํ™˜ ๊ณต์‹์€ nusim/aug/rig_aug.py transform_calib ๊ทธ๋Œ€๋กœ๋‹ค. pitch + ๋Š” ์นด๋ฉ”๋ผ๊ฐ€ ์•„๋ž˜๋กœ ์ˆ™์ด๋Š” ๋ฐฉํ–ฅ, yaw + ๋Š” ์™ผ์ชฝ์œผ๋กœ ๋Œ๋ฆฌ๋Š” ๋ฐฉํ–ฅ. ๋ฆฌ๊ทธ ์ „์ฒด์— ๊ฐ™์€ T ๋ฅผ ์ฃผ๋ฏ€๋กœ 6์บ  ์‚ฌ์ด์˜ ์ƒ๋Œ€ ๊ธฐํ•˜๊ฐ€ ์‹ค์ œ ์ฐจ๋Ÿ‰์ฒ˜๋Ÿผ ์ผ๊ด€๋œ๋‹ค.") # ================================================================== 10-14 ์ถ”๊ฐ€: ArtiFixer ยท ์ฐจ์„  ํ›„์ฒ˜๋ฆฌ ยท ๋˜๋จน์ž„ ยท ์›์ธ ๋ถ„์„ ยท ๋…ธ๋ฉด ํ…์Šค์ฒ˜ from pptx.chart.data import CategoryChartData as _CCD from pptx.enum.chart import XL_LEGEND_POSITION for sh in slides[0].shapes: if sh.name == "ํ…์ŠคํŠธ ๊ฐœ์ฒด ํ‹€ 3": set_runs_text(sh.text_frame, "2026. 10. 14.") divider(slides[12], "๋ฉ€ํ‹ฐ๋ทฐ ์‹œ์  ๋ณ€ํ™˜ ๋ชจ๋ธ ์•„ํ‚คํ…์ฒ˜", "6์บ  ๋ฉ€ํ‹ฐ๋ทฐ ์˜์ƒ์„ ์ƒˆ๋กœ์šด ์นด๋ฉ”๋ผ ๋ฐฐ์น˜๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ชจ๋ธ โ€” ๊ตฌ๊ฐ„๋ณ„ 3DGS ์žฌ๊ตฌ์„ฑ ๋ชจ๋ธ์˜ ๊ตฌ์กฐ, ๋ชจ๋“ˆ, ์†์‹ค, ๋ฆฌ๊ทธ ๋ณ€ํ™˜, " "๊ทธ๋ฆฌ๊ณ  ๋ Œ๋”๋ฅผ ๊ณ ์น˜๋Š” ArtiFixer ํ™•์‚ฐ ๋ณด์ • ยท ๋…ธ๋ฉด ์ฐจ์„  ํ›„์ฒ˜๋ฆฌ ยท 3DGS ๋˜๋จน์ž„ ๋ฏธ์„ธ์กฐ์ •์„ ์„ค๋ช…ํ•œ๋‹ค.") def line_chart(sl, x, y, w, h, cats, series, title, colors, ymin=None, ymax=None, fmt='0.0'): cd = _CCD() cd.categories = cats for n, v in series: cd.add_series(n, v) gf = sl.shapes.add_chart(XL_CHART_TYPE.LINE_MARKERS, Inches(x), Inches(y), Inches(w), Inches(h), cd) ch = gf.chart ch.has_title = True ch.chart_title.text_frame.text = title tp = ch.chart_title.text_frame.paragraphs[0] tp.runs[0].font.size, tp.runs[0].font.bold, tp.runs[0].font.name, tp.runs[0].font.color.rgb = Pt(11), True, FONT, NAVY ch.has_legend = True ch.legend.position = XL_LEGEND_POSITION.BOTTOM ch.legend.include_in_layout = False ch.legend.font.size, ch.legend.font.name = Pt(9), FONT va = ch.value_axis if ymin is not None: va.minimum_scale = ymin if ymax is not None: va.maximum_scale = ymax va.has_major_gridlines = True va.major_gridlines.format.line.color.rgb = LIGHT va.tick_labels.font.size = Pt(9) va.format.line.fill.background() ch.category_axis.tick_labels.font.size = Pt(9) ch.category_axis.tick_labels.font.name = FONT for k, s_ in enumerate(ch.plots[0].series): s_.format.line.color.rgb = colors[k] s_.format.line.width = Pt(2.25) s_.marker.format.fill.solid() s_.marker.format.fill.fore_color.rgb = colors[k] s_.marker.format.line.color.rgb = colors[k] s_.smooth = False pl = ch.plots[0] pl.has_data_labels = True dl = pl.data_labels dl.number_format, dl.number_format_is_linked = fmt, False dl.position = XL_LABEL_POSITION.ABOVE dl.font.size, dl.font.name = Pt(8), FONT return ch def flow(sl, y, steps, h=0.95, fills=None, size=10): """๊ฐ€๋กœ ๋‹จ๊ณ„ ์ƒ์ž + ํ™”์‚ดํ‘œ.""" n = len(steps) aw = 0.3 w = (11.8 - aw * (n - 1) - 0.06 * 2 * (n - 1)) / n for i, (t, d) in enumerate(steps): x = 0.85 + i * (w + aw + 0.12) f = (fills or {}).get(i) box(sl, x, y, w, h, d, title=t, fill=f or PALE, color=WHITE if f == NAVY else GRAY, line=None if f == NAVY else BLUE, size=size) if i < n - 1: arrow(sl, x + w + 0.06, y + h / 2 - 0.12, w=aw) # ------------------------------------------------------------------ ๋ชจ๋“ˆ โ‘ฃ ArtiFixer (์ƒˆ) s = slides[40] y = body(s, "๋ชจ๋ธ ๊ตฌ์กฐ", "๋ชจ๋“ˆ โ‘ฃ ArtiFixer ํ™•์‚ฐ ๋ณด์ • โ€” ์ƒˆ ์‹œ์  ๋ Œ๋”์˜ ๊ฒฐํ•จ ๋ณต์›", [ "์ƒˆ ์‹œ์  (์˜† 1 m ๋“ฑ) ์—์„œ 3DGS ๋ Œ๋”๋Š” ํ๋ฆผ ยท floater ยท ๋นˆ ๊ณณ์ด ์ƒ๊น€ โ†’ ๋น„๋””์˜ค ํ™•์‚ฐ ๋ชจ๋ธ์ด ๊ฐ™์€ ์ˆœ๊ฐ„์˜ ์‹ค์ œ ์‚ฌ์ง„์„ ์ฐธ์กฐํ•ด ๊ฒฐํ•จ์„ ๊ณ ์นœ ์˜์ƒ์„ ์ƒ์„ฑํ•จ", "ArtiFixer (NVIDIA, SIGGRAPH 2026) ์‚ฌ์ „ํ•™์Šต 1.3B ๋ชจ๋ธ์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉ โ€” ํ•™์Šต ์—†์ด ์ถ”๋ก ๋งŒ, ์ •๋ฉด ์นด๋ฉ”๋ผ ยท ๋ฆฌ๊ทธ ๋ณ€ํ˜• 9์ข… ยท ํ‚คํ”„๋ ˆ์ž„", ]) flow(s, y + 0.15, [ ("์ž…๋ ฅ โ‘  3DGS ๋ Œ๋”", "๊ตฌ๊ฐ„ ๋ชจ๋ธ ร— ๋ณ€ํ˜• ์ž์„ธ\n640ร—360 ์—ฐ์† ํ”„๋ ˆ์ž„\n+ ๋ถˆํˆฌ๋ช…๋„ ์ง€๋„ (๋นˆ ๊ณณ ํ‘œ์‹œ)"), ("์ž…๋ ฅ โ‘ก ์ฐธ์กฐ ๋ทฐ", "๊ฐ™์€ ์‹œ๊ฐ์˜ ์›๋ž˜ ์นด๋ฉ”๋ผ\n์‹ค์ œ ์‚ฌ์ง„ + ์ž์„ธ\n(transforms.json)"), ("ArtiFixer 1.3B", "Wan2.1-T2V-1.3B ๊ธฐ๋ฐ˜\n์ž๊ธฐํšŒ๊ท€ ๋น„๋””์˜ค ํ™•์‚ฐ\n์ฐธ์กฐ ๋ทฐ 3์žฅ ยท ๊ตญ์†Œ ์ฃผ์˜ 14"), ("์ถœ๋ ฅ", "๋ณด์ • ์˜์ƒ (ํ‚คํ”„๋ ˆ์ž„)\nโ†’ ๋ชจ๋“ˆ โ‘ค ์ฐจ์„  ํ›„์ฒ˜๋ฆฌ\nโ†’ ๋ชจ๋“ˆ โ‘ฅ 3DGS ๋˜๋จน์ž„"), ], h=1.25, fills={2: NAVY}) table(s, 0.85, y + 1.65, 7.1, [["์„ค์ •", "๊ฐ’ (configs/aug/artifixer.json)"], ["์ฒดํฌํฌ์ธํŠธ", "artifixer-1.3b.pt (Wan-AI/Wan2.1-T2V-1.3B-Diffusers)"], ["์ถ”๋ก  ์ธ์ž", "--num_views 3 ยท --max_neighbors_per_encode 1 ยท --local_attn_size 14"], ["๊ถค์ ", "--render_trajectory trajectory (๋ณ€ํ˜• ์ž์„ธ ์ˆœ์„œ๋Œ€๋กœ)"], ["์‹คํ–‰ ํ™˜๊ฒฝ", "๋ณ„๋„ artifixer ํ™˜๊ฒฝ ํ•˜์œ„ ํ”„๋กœ์„ธ์Šค (torch ๋ฒ„์ „ ๋‹ค๋ฆ„), ์”ฌ๋‹น ๋ชจ๋ธ 1ํšŒ ๋กœ๋“œ"], ["VRAM ยท ์‹œ๊ฐ„", "์•ฝ 7.7 GB (8 GB ๊ฑฐ์˜ ์ „๋ถ€) ยท ์”ฌ๋‹น 26~38๋ถ„ (์ถ”๋ก  ์•ฝ 25๋ถ„)"]], [0.32, 0.68], size=10, rowh=0.36) box(s, 8.15, y + 1.65, 4.5, 2.16, "โ€ข 3DGS ๋Š” ํ•™์Šต ๊ถค์  ๊ทผ์ฒ˜์—์„œ๋งŒ ์„ ๋ช… โ€” ์˜† ์ฐจ์„ ์€ ๊ฐ๋…์ด ์—†๋‹ค\nโ€ข ํ™•์‚ฐ ๋ชจ๋ธ์€ '๊ทธ๋Ÿด๋“ฏํ•œ' ์งˆ๊ฐ์„ ์ฑ„์šฐ์ง€๋งŒ ์ฐจ์„  ๊ฐ™์€ ๊ธฐํ•˜ ์ •๋ณด๋Š” ํ๋ ค์ง€๊ฑฐ๋‚˜ ๋Š๊น€\n" "โ†’ ์ฐจ์„ ์€ ๋ชจ๋“ˆ โ‘ค ์—์„œ ์‹ค์ œ ์‚ฌ์ง„์œผ๋กœ ๋˜๋Œ๋ฆฐ๋‹ค", title="์™œ ํ•„์š”ํ•œ๊ฐ€ ยท ํ•œ๊ณ„", fill=WHITE, line=ORANGE, size=10, align=PP_ALIGN.LEFT) notes(s, "์ฐธ๊ณ : ArtiFixer (de Lutio et al., SIGGRAPH 2026, nv-tlabs/ArtiFixer), Difix3D+ (Wu et al., CVPR 2025) โ€” ๋‘˜ ๋‹ค 3D ์žฌ๊ตฌ์„ฑ ๋ Œ๋”๋ฅผ ํ™•์‚ฐ ๋ชจ๋ธ๋กœ ๊ณ ์น˜๊ณ , ๊ณ ์นœ ์˜์ƒ์„ ๋‹ค์‹œ 3D ์— ์ฆ๋ฅ˜ํ•˜๋Š” ๋ฐฉ์‹. " "GPU ๊ฐ€ 8 GB ๋ผ ArtiFixer ๋ฅผ ๋Œ๋ฆฌ๋Š” ๋™์•ˆ ๋ทฐ์–ด ยท ํ•™์Šต์„ ํ•จ๊ป˜ ๋Œ๋ฆด ์ˆ˜ ์—†๋‹ค.") # ------------------------------------------------------------------ ๋ชจ๋“ˆ โ‘ค ์ฐจ์„  ํ›„์ฒ˜๋ฆฌ (์ƒˆ) s = slides[41] y = body(s, "๋ชจ๋ธ ๊ตฌ์กฐ", "๋ชจ๋“ˆ โ‘ค ๋…ธ๋ฉด ํ‰๋ฉด ํ˜ธ๋ชจ๊ทธ๋ž˜ํ”ผ ์ฐจ์„  ํ›„์ฒ˜๋ฆฌ", [ "๊ฐ™์€ ์‹œ๊ฐ ยท ๊ฐ™์€ ์ž์ฐจ์—์„œ ์นด๋ฉ”๋ผ๋งŒ ์˜ฎ๊ธด ๊ฒƒ์ด๋ฏ€๋กœ, ๋…ธ๋ฉด์„ ํ‰๋ฉด (์ž์ฐจ z = 0) ์œผ๋กœ ๋ณด๋ฉด ๋ณ€ํ˜• ์นด๋ฉ”๋ผ ํ”ฝ์…€์„ ์›๋ž˜ ์นด๋ฉ”๋ผ์˜ ์‹ค์ œ ์‚ฌ์ง„ (1600ร—900) ์— ์ •ํ™•ํžˆ ๋Œ€์‘์‹œํ‚ฌ ์ˆ˜ ์žˆ์Œ (์—ญ์›๊ทผ ๋ณ€ํ™˜, IPM)", "๋…ธ๋ฉด๋งŒ ์‹ค์ œ ์‚ฌ์ง„ ํ”ฝ์…€๋กœ ๋ฐ”๊พธ๊ณ  ๋‚˜๋จธ์ง€๋Š” ArtiFixer ๊ฒฐ๊ณผ๋ฅผ ์œ ์ง€ โ†’ ์ฐจ์„  ์ ์„  ๊ฐ„๊ฒฉ ยท ํญ ยท ์ƒ‰์ด ์‹ค์ œ์™€ ๊ฐ™์Œ", ]) box(s, 0.85, y + 0.12, 11.8, 0.55, "x_o โ‰ƒ K_o (R โˆ’ t nแต€ / d) K_vโปยน x_v (n, d: ์ž์ฐจ ๋…ธ๋ฉด ํ‰๋ฉด, R, t: ๋ณ€ํ˜• โ†’ ์›๋ž˜ ์นด๋ฉ”๋ผ)", fill=NAVY, color=WHITE, size=14, bold=True) flow(s, y + 0.85, [ ("1 ยท ๊ด‘์„  โ†’ ๋…ธ๋ฉด", "๋ณ€ํ˜• ์นด๋ฉ”๋ผ ํ”ฝ์…€๋งˆ๋‹ค\n๋…ธ๋ฉด ํ‰๋ฉด ๊ต์  X\n(35 m ๋„˜์œผ๋ฉด ์ œ์™ธ)"), ("2 ยท ์›๋ž˜ ์นด๋ฉ”๋ผ๋กœ", "X ๋ฅผ ์‹ค์ œ ์‚ฌ์ง„์— ํˆฌ์˜\n์–‘์„ ํ˜• ์ƒ˜ํ”Œ\n(์‚ฌ์ง„ ๋ฐ–์ด๋ฉด ์ œ์™ธ)"), ("3 ยท ๋งˆ์Šคํฌ", "SegFormer-B5 (Cityscapes)\n์ฐจ๋„๋งŒ ยท ์ฐจ๋Ÿ‰ ยท ์‚ฌ๋žŒ\n9 px ํŒฝ์ฐฝํ•ด ์ œ์™ธ"), ("4 ยท ์ƒ‰ ๋งž์ถค", "์ฐจ๋„ (๋ฐ์€ ์ƒ์œ„ 20% ์ œ์™ธ)\nํ‰๊ท  ยท ํ‘œ์ค€ํŽธ์ฐจ๋ฅผ\nArtiFixer ์ชฝ์œผ๋กœ (๋Œ€๋น„ 0.75)"), ("5 ยท ํ•ฉ์„ฑ", "์˜์—ญ ์•ˆ์ชฝ 12 px\n๊ฑฐ๋ฆฌ ๊ธฐ๋ฐ˜ ํŽ˜๋”\n+ ๊ฐ€์šฐ์‹œ์•ˆ ๋ธ”๋Ÿฌ 1.5"), ], h=1.25) table(s, 0.85, y + 2.3, 11.8, [["ํ•ญ๋ชฉ", "๋‚ด์šฉ"], ["๋ชจ๋“œ", "road (๊ถŒ์žฅ) = ์ฐจ๋„ ์ „์ฒด๋ฅผ ์‹ค์ œ ์‚ฌ์ง„์œผ๋กœ ยท band = HD ๋งต ์ฐจ์„  (lane ยท road divider, ํšก๋‹จ๋ณด๋„, ์ •์ง€์„ ) ยฑ0.6 m ๋ ๋งŒ"], ["๋ณด๋„๋ฅผ ๋นผ๋Š” ์ด์œ ", "๋ณด๋„๋Š” ์•ฝ 15 cm ๋†’์•„ ํ‰๋ฉด ๊ฐ€์ •์ด ๊นจ์ง โ€” ์˜† 1 m ์‹œ์ ์—์„œ ๋ช‡ ํ”ฝ์…€์”ฉ ์–ด๊ธ‹๋‚จ"], ["๋งต์„ ์ง์ ‘ ๊ทธ๋ฆฌ์ง€ ์•Š๋Š” ์ด์œ ", "HD ๋งต์—๋Š” ์ ์„  ๊ฐ„๊ฒฉ ยท ํญ์ด ์—†๊ณ  ์˜์ƒ๊ณผ 10~30 cm ์–ด๊ธ‹๋‚จ โ†’ ๋งต์€ '์–ด๋””์—' ๋งŒ, ๋ชจ์–‘์€ ์‹ค์ œ ์‚ฌ์ง„์—์„œ"], ["๊ตฌํ˜„", "nusim/aug/lane_fix.py (LaneFixConfig), nusim aug artifixer ์˜ lanefix ๋‹จ๊ณ„"]], [0.2, 0.8], size=10, rowh=0.34) notes(s, "์ฐธ๊ณ : ์—ญ์›๊ทผ ๋ณ€ํ™˜(IPM) โ€” Mallot et al. 1991, Bertozzi & Broggi GOLD 1998. ์„ธ๊ทธ๋ฉ˜ํ…Œ์ด์…˜ โ€” SegFormer (Xie et al., NeurIPS 2021), Cityscapes (Cordts et al., CVPR 2016). " "ํ‰๋ฉด ํ˜ธ๋ชจ๊ทธ๋ž˜ํ”ผ๋Š” ํ‰ํ‰ํ•œ ๋…ธ๋ฉด์—์„œ ๊ธฐํ•˜๊ฐ€ ์ •ํ™•ํ•˜๋ฏ€๋กœ ํ•™์Šต ์—†์ด ์‹ค์ œ ์‚ฌ์ง„์˜ ํ•ด์ƒ๋„๋ฅผ ๊ทธ๋Œ€๋กœ ๊ฐ€์ ธ์˜จ๋‹ค.") # ------------------------------------------------------------------ ๋ชจ๋“ˆ โ‘ฅ 3DGS ๋˜๋จน์ž„ (์ƒˆ) s = slides[42] y = body(s, "๋ชจ๋ธ ๊ตฌ์กฐ", "๋ชจ๋“ˆ โ‘ฅ 3DGS ๋˜๋จน์ž„ ๋ฏธ์„ธ์กฐ์ • (ArtiFixer3D ์‹ ์ฆ๋ฅ˜)", [ "๋ณด์ • ์˜์ƒ์„ ๋ณ€ํ˜• ์ž์„ธ์˜ ์˜์‚ฌ ์ •๋‹ต์œผ๋กœ ์‚ผ์•„ ๊ตฌ๊ฐ„ 3DGS ๋ชจ๋ธ์„ ์ด์–ด ํ•™์Šต โ†’ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ๊ฐ€ ์‹ค์‹œ๊ฐ„ ๋ Œ๋”ํ•˜๋Š” 3D ๋ชจ๋ธ ์ž์ฒด๋ฅผ ๊ณ ์นจ", "์‹ค์ œ ๋ทฐ ๊ฐ๋… (์‚ฌ์ง„ ยท ๋ผ์ด๋‹ค ๊นŠ์ด ยท ํ•˜๋Š˜ ๋งˆ์Šคํฌ) ์€ ๊ทธ๋Œ€๋กœ ๋‘๊ณ , ์˜์‚ฌ ๋ทฐ๋ฅผ 30% ํ™•๋ฅ  ยท ๊ฐ€์ค‘ 0.5 ๋กœ ์„ž์Œ", ]) table(s, 0.85, y + 0.15, 5.6, [["์„ค์ • (scripts/artifixer_distill.py)", "๊ฐ’"], ["์‹œ์ž‘์ ", "๊ตฌ๊ฐ„ ๋ชจ๋ธ (ํ•˜๋Š˜ ยท ์ƒ‰ ๋ณด์ • ยท ์™ธ๋ถ€ ๋ณด์ • ์ด์–ด๋ฐ›์Œ)"], ["์˜์‚ฌ ๋ทฐ", "lanefix ํ‚คํ”„๋ ˆ์ž„ 640ร—360 โ†’ ํ•™์Šต ํ•ด์ƒ๋„๋กœ ์—…์Šค์ผ€์ผ"], ["์Šคํ… ยท ํ™•๋ฅ  ยท ๊ฐ€์ค‘", "3,000 ยท 0.3 ยท 0.5"], ["lr ์œ„์น˜", "1.6e-4 (๊ธฐํ•˜๋„ ์›€์ง์ด๋„๋ก)"], ["์žฌ๋ฐฐ์น˜", "500 ~ 1,500 ์Šคํ…, ์ƒํ•œ 200๋งŒ ์œ ์ง€"], ["๊ฒฐ๊ณผ", "7์”ฌ 18๊ตฌ๊ฐ„ โ†’ outputs/gs_day_afx"], ["์‹œ๊ฐ„ ยท VRAM", "๊ตฌ๊ฐ„๋‹น ์•ฝ 3.7๋ถ„ ยท 2.3 GB"], ["์ •์  PSNR (์ค‘์•™๊ฐ’)", "23.92 โ†’ 23.65 dB (์›๋ž˜ ๊ถค์ , โˆ’0.27)"]], [0.42, 0.58], size=10, rowh=0.36) image(s, A + "afx_distill.jpg", 6.65, y + 0.15, w=6.0, h=3.4) caption(s, 6.65, y + 3.6, 6.0, "์˜† 1 m ์‹œ์  โ€” ์œ„: ์›๋ž˜ ๋ชจ๋ธ, ์•„๋ž˜: ๋˜๋จน์ž„ ํ›„ (scene-0001)") notes(s, "์›๋ž˜ ๊ถค์  PSNR ์€ 0.27 dB ๋‚ด๋ ค๊ฐ€์ง€๋งŒ ์˜† ์ฐจ์„  ์‹œ์ ์—์„œ ์ฐจ ์ž”์ƒ ยท floater ๊ฐ€ ์‚ฌ๋ผ์ง„๋‹ค. ๋‹ค๋งŒ ์ฐจ์„  ์„ ๋ช…๋„๋Š” ๊ฑฐ์˜ ๊ทธ๋Œ€๋กœ โ€” ์›์ธ ๋ถ„์„์€ ์ง„ํ–‰ ํ˜„ํ™ฉ์˜ '์ฐจ์„  ํ’ˆ์งˆ ์›์ธ ๋ถ„์„' ์žฅ.") # ------------------------------------------------------------------ ArtiFixer ์ฆ๊ฐ• ๊ฒฐ๊ณผ (์ƒˆ) s = slides[43] y = body(s, "์ฆ๊ฐ•", "ArtiFixer + ์ฐจ์„  ํ›„์ฒ˜๋ฆฌ ์ฆ๊ฐ• ๊ฒฐ๊ณผ", [ "์˜† 1 m ๋ณ€ํ˜• ์‹œ์  (scene-0001) โ€” ๊ธฐ์กด 3DGS ์ฆ๊ฐ•์˜ ๋ฒˆ์ง ยท ์ฐจ ์ž”์ƒ ยท ๋Š๊ธด ์ฐจ์„ ์ด ArtiFixer ๋กœ ์ •๋ฆฌ๋˜๊ณ , ๋…ธ๋ฉด์€ ์‹ค์ œ ์‚ฌ์ง„์˜ ์ฐจ์„ ์œผ๋กœ ๋ฐ”๋€œ", ]) pic = image(s, A + "afx_compare.jpg", 0.85, y + 0.12, h=3.2) pw = pic.width / 914400 for k, n in enumerate(["๊ธฐ์กด 3DGS ์ฆ๊ฐ•", "ArtiFixer", "ArtiFixer + ์ฐจ์„  ํ›„์ฒ˜๋ฆฌ"]): caption(s, 0.85 + k * pw / 3, y + 3.35, pw / 3, n + " โ†‘") bx = 0.85 + pw + 0.2 bw = 12.65 - bx for k, (t, d) in enumerate([("์ง„ํ–‰", "10์”ฌ ์™„๋ฃŒ ยท 3,584์žฅ\n์ •๋ฉด ์นด๋ฉ”๋ผ ยท ๋ณ€ํ˜• 9์ข… ยท ํ‚คํ”„๋ ˆ์ž„\n๋‚จ์€ ์•ฝ 84์”ฌ (์•ฝ 2์ผ)"), ("๊ฒฐ๊ณผ ๊ฒฝ๋กœ", "outputs/aug/aug_artfixer/\n<scene>_lanefix/<variant>/CAM_FRONT/"), ("ํ•œ๊ณ„", "์ง€์šด ์ฐจ๋Ÿ‰ ์ž๋ฆฌ์— ํšŒ์ƒ‰ ์•ˆ๊ฐœ (์•„๋ž˜ ์ค„)\n์ •๋ฉด ์นด๋ฉ”๋ผ๋งŒ (6์บ ์€ ์‹œ๊ฐ„ 6๋ฐฐ)")]): box(s, bx, y + 0.12 + k * 1.1, bw, 1.0, d, title=t, fill=PALE if k < 2 else WHITE, line=BLUE if k < 2 else ORANGE, size=10) notes(s, "๊ธฐ์กด ์ฆ๊ฐ•(outputs/aug/map, 94์”ฌ ยท 20๋งŒ ์žฅ)์€ ๊ทธ๋Œ€๋กœ ๋‘๊ณ , ArtiFixer ์ฆ๊ฐ•์„ ๋ณ„๋„ ๊ฒฝ๋กœ์— ๋งŒ๋“ ๋‹ค. ๋๋‚œ ์”ฌ์€ done.json ์œผ๋กœ ํ‘œ์‹œํ•ด ๋Š์—ˆ๋‹ค ๋‹ค์‹œ ๋Œ๋ ค๋„ ์ด์–ด์ง„๋‹ค.") # ------------------------------------------------------------------ ์ฐจ์„  ํ’ˆ์งˆ ์›์ธ ๋ถ„์„ (์ƒˆ) s = slides[44] y = body(s, "์ง„ํ–‰ ํ˜„ํ™ฉ", "์ฐจ์„  ํ’ˆ์งˆ ์›์ธ ๋ถ„์„ โ€” ์‹œ๋ฎฌ ๋ Œ๋”๊ฐ€ 2D ํ›„์ฒ˜๋ฆฌ๋ณด๋‹ค ํ๋ฆฐ ์ด์œ ", [ "2D ํ›„์ฒ˜๋ฆฌ๋Š” ์‹ค์ œ ์‚ฌ์ง„ ํ”ฝ์…€ (1600ร—900) ์„ ์ •ํ™•ํ•œ ๋…ธ๋ฉด ํ‰๋ฉด์œผ๋กœ ์˜ฎ๊ธฐ์ง€๋งŒ, ์‹œ๋ฎฌ์€ 3DGS ๊ฐ€์šฐ์‹œ์•ˆ์ด ๊ทธ๋ฆฐ ๋…ธ๋ฉด์„ ๋ Œ๋” โ€” ํ•™์Šต ์ž์„ธ์—์„œ๋„ ๋…ธ๋ฉด ๊ณ ์ฃผํŒŒ๊ฐ€ ์‚ฌ์ง„์˜ 17~18% ๋ฟ", ]) fx = [("85 cm", "๋…ธ๋ฉด ํ”ฝ์…€์„ ๊ทธ๋ฆฌ๋Š” ๊ฐ€์šฐ์‹œ์•ˆ\nํฐ์ถ• (๊ฐ€์ค‘ ์ค‘์•™๊ฐ’)"), ("3.8%", "200๋งŒ ๊ฐœ ์ค‘ ๋…ธ๋ฉด ๋ชซ\n(๊ฑด๋ฌผ 51 ยท ํ•˜๋Š˜ 19 ยท ์‹์ƒ 18%)"), ("โˆ’45 cm", "๋…ธ๋ฉด ๊ฐ€์šฐ์‹œ์•ˆ ์ค‘์‹ฌ ๋†’์ด\n(์‹ค์ œ ๋…ธ๋ฉด โˆ’0.6 cm)"), ("0.17", "๋…ธ๋ฉด ์„ ๋ช…๋„ ๋ Œ๋”/์‚ฌ์ง„\n(ํ•™์Šต ์ž์„ธ์—์„œ๋„)")] for i, (n, l) in enumerate(fx): kpi(s, 0.85 + i * 3.0, y + 0.12, 2.75, n, l, color=ORANGE if i == 0 else NAVY) table(s, 0.85, y + 1.38, 6.0, [["๊ด€์ฐฐ (scene-0001 seg0)", "์˜๋ฏธ"], ["30 cm ๋„˜๋Š” ๊ฐ€์šฐ์‹œ์•ˆ์ด ๋…ธ๋ฉด ๊ธฐ์—ฌ 95~96%", "10~15 cm ํญ ์ฐจ์„ ์„ ํ‘œํ˜„ ๋ชป ํ•จ"], ["|cos(์งง์€์ถ•, ๋ฒ•์„ )| 0.46~0.52", "๋…ธ๋ฉด์— ๋‚ฉ์ž‘ํ•˜์ง€ ์•Š๊ณ  ๊ธฐ์šธ์–ด์ง„ ๋ฉ์–ด๋ฆฌ"], ["์ค‘์‹ฌ โˆ’45 cm ์ธ๋ฐ ๊นŠ์ด๋Š” ํ‰๋ฉด๊ณผ 1~2% ์ผ์น˜", "์—ฌ๋Ÿฌ ๋ฉ์–ด๋ฆฌ ํ•ฉ์œผ๋กœ 'ํ‰๊ท  ๊นŠ์ด' ๋งŒ ๋งž์ถค"], ["์•ž ์ฐจ์„  ์•ฝ 25๊ฐœ/mยฒ", "3 cm ํ•ด์ƒ๋„ (1,100๊ฐœ/mยฒ) ์˜ 2%"], ["๋˜๋จน์ž„ ๋ฏธ์„ธ์กฐ์ •์œผ๋กœ ์•ˆ ๊ณ ์ณ์ง", "์ƒํ•œ์ด ์ด๋ฏธ ์ฐจ ์žˆ๊ณ  3k ์Šคํ… ยท 640ร—360 ๋ชฉํ‘œ"]], [0.55, 0.45], size=9.5, rowh=0.36) line_chart(s, 7.05, y + 1.38, 5.6, 2.6, ["โˆ’1.0 m", "0 m", "+0.5 m", "+1.0 m", "+1.5 m"], [("์›๋ž˜ ๋ชจ๋ธ", (24.46, 26.73, 25.81, 25.14, 24.86)), ("๋˜๋จน์ž„ ํ›„ (afx)", (25.47, 27.63, 26.94, 26.22, 25.76))], "๋…ธ๋ฉด PSNR (dB) vs ์˜† ์ด๋™ โ€” ์‹ค์ œ ์‚ฌ์ง„ ํ‰๋ฉด ์›Œํ”„ ๊ธฐ์ค€", [BLUE, ORANGE], ymin=23.5, ymax=28.5, fmt='0.0') notes(s, "์ธก์ •: ํ‚คํ”„๋ ˆ์ž„ 8์žฅ, ์ฐจ๋„(SegFormer) ์ค‘ ํ‰๋ฉด ์›Œํ”„๊ฐ€ ์œ ํšจํ•œ ํ”ฝ์…€๋งŒ. ๋˜๋จน์ž„์€ PSNR ์„ ์•ฝ 1 dB ์˜ฌ๋ฆฌ์ง€๋งŒ ์„ ๋ช…๋„(๋ผํ”Œ๋ผ์‹œ์•ˆ ๋น„)๋Š” 0.15~0.17 ๋กœ ๊ทธ๋Œ€๋กœ๋‹ค โ€” ์ƒ‰์€ ๋งž์ถ”์ง€๋งŒ ์ฐจ์„  ๋ชจ์–‘์€ ๋ชป ๋งŒ๋“ ๋‹ค. " "๊ฒฐ๋ก : ๋…ธ๋ฉด์„ ๊ฐ€์šฐ์‹œ์•ˆ์— ๋งก๊ธฐ์ง€ ๋ง๊ณ  ๋”ฐ๋กœ ํ‘œํ˜„ํ•ด์•ผ ํ•œ๋‹ค (๋‹ค์Œ ์žฅ).") # ------------------------------------------------------------------ ๋…ธ๋ฉด ํ…์Šค์ฒ˜ ๋ ˆ์ด์–ด ์‹œํ—˜ (์ƒˆ) s = slides[45] y = body(s, "์ง„ํ–‰ ํ˜„ํ™ฉ", "ํ•ด๊ฒฐ ๋ฐฉํ–ฅ โ€” ๋…ธ๋ฉด ํ…์Šค์ฒ˜ ๋ ˆ์ด์–ด ์‹œํ—˜ (scene-0001 seg0)", [ "์ •๋ฉด ์นด๋ฉ”๋ผ 142์žฅ (์Šค์œ• ํฌํ•จ) ์„ ํ‰๋ฉด ํ˜ธ๋ชจ๊ทธ๋ž˜ํ”ผ๋กœ ๋…ธ๋ฉด ์ •์‚ฌ์˜์ƒ (3 cm/px, 2,257 mยฒ) ์— ๋ชจ์œผ๊ณ , ๋…ธ๋ฉด ยท ๋•…์† ๊ฐ€์šฐ์‹œ์•ˆ์„ ๋นผ๊ณ  ๊ทธ ์•„๋ž˜ ํ…์Šค์ฒ˜ ํ‰๋ฉด์„ ๊น”์•„ ๋ Œ๋”", ]) image(s, A + "roadtex_bev.jpg", 0.85, y + 0.1, w=4.6, h=1.75) caption(s, 0.85, y + 1.86, 4.6, "๋…ธ๋ฉด ํ…์Šค์ฒ˜ (BEV, ์…€๋งˆ๋‹ค ๊ฐ€์žฅ ๊ฐ€๊นŒ์ด์„œ ๋ณธ ์‚ฌ์ง„)") pp_ = image(s, A + "roadtex_panel.jpg", 5.6, y + 0.35, w=7.05) cw3 = 7.05 / 3 for k, n in enumerate(["3DGS (+1 m)", "3DGS + ๋…ธ๋ฉด ํ…์Šค์ฒ˜ (+1 m)", "์‹ค์ œ ์‚ฌ์ง„ ํ‰๋ฉด ์›Œํ”„"]): caption(s, 5.6 + k * cw3, y + 0.38 + pp_.height / 914400, cw3, n) line_chart(s, 0.85, y + 2.25, 5.85, 2.15, ["โˆ’1.0 m", "0 m", "+0.5 m", "+1.0 m", "+1.5 m"], [("3DGS", (0.17, 0.18, 0.17, 0.16, 0.16)), ("3DGS + ๋…ธ๋ฉด ํ…์Šค์ฒ˜", (0.96, 1.02, 1.00, 0.93, 0.89))], "๋…ธ๋ฉด ์„ ๋ช…๋„ (๋ Œ๋” / ์‚ฌ์ง„) vs ์˜† ์ด๋™", [BLUE, ORANGE], ymin=0, ymax=1.2, fmt='0.00') table(s, 6.85, y + 2.3, 5.8, [["", "3DGS", "+ ๋…ธ๋ฉด ํ…์Šค์ฒ˜"], ["๋…ธ๋ฉด PSNR, โˆ’1 m", "24.46", "25.63"], ["๋…ธ๋ฉด PSNR, 0 m", "26.73", "25.87"], ["๋…ธ๋ฉด PSNR, +1 m", "25.14", "26.13"], ["๋บ€ ๊ฐ€์šฐ์‹œ์•ˆ", "โ€”", "67๋งŒ (34%)"], [" ๊ทธ์ค‘ ๋•…์† 1.5 m ์•„๋ž˜", "โ€”", "43๋งŒ (22%)"]], [0.46, 0.24, 0.3], size=10, rowh=0.32, align_right=(1, 2)) notes(s, "๊ฐ€์šฐ์‹œ์•ˆ์„ ๋นผ๋Š” ๊ธฐ์ค€: ํ…์Šค์ฒ˜ ์œ„ ๋…ธ๋ฉด๋ณด๋‹ค 0.3 m ์•„๋ž˜, ์ฐจ๋„ ์…€ ์œ„ 2 m ์•„๋ž˜, ํ…์Šค์ฒ˜ ๋‘˜๋ ˆ 15 m ์•ˆ 0.5 m ์•„๋ž˜, ๊ทธ๋ฆฌ๊ณ  ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์ž์ฐจ ๋…ธ๋ฉด๋ณด๋‹ค 1.5 m ๋„˜๊ฒŒ ์•„๋ž˜. " "๋•…์† ๊ฐ€์šฐ์‹œ์•ˆ 43๋งŒ ๊ฐœ(์˜ˆ์‚ฐ์˜ 22%)๋Š” ๋…ธ๋ฉด์„ ์•„๋ž˜์—์„œ ๋ฎ์–ด ์ฐจ์„ ์„ ํ๋ฆฌ๋˜ ๊ฒƒ์ด๋‹ค โ€” ์—”์ง„์—์„œ๋Š” ๊นŠ์ด ํ…Œ์ŠคํŠธํ•˜๋Š” ๋…ธ๋ฉด ๋ฉ”์‹œ๊ฐ€ ๊ฐ€๋ฆฐ๋‹ค. " "0 m ์—์„œ PSNR ์ด 0.9 dB ๋‚ฎ์€ ๊ฒƒ์€ ํ”„๋ ˆ์ž„ ์‚ฌ์ด ๋…ธ์ถœ ์ด์Œ๋งค ยท 1~2 px ์ •๋ ฌ ์˜ค์ฐจ. ๋‹ค์Œ: ์—”์ง„ ๋ฉ”์‹œ ํŒจ์Šค๋กœ ์ด์‹, 6์บ  ยท ์ „ ์”ฌ ํ…์Šค์ฒ˜.") # ------------------------------------------------------------------ ๊ธฐ์กด ์žฅ ๊ฐฑ์‹  s = slides[22] for gf in s.shapes: if gf.has_table: c = gf.table.cell(2, 1) c.text_frame.paragraphs[0].runs[0].text = "์˜† 1 m ์—์„œ ๋…ธ๋ฉด ๋ฒˆ์ง ยท ์ง€์šด ์ฐจ๋Ÿ‰ ์ž๋ฆฌ๊ฐ€ ํ๋ฆฟํ•˜๊ฒŒ ๋‚จ์Œ โ†’ ArtiFixer + ์ฐจ์„  ํ›„์ฒ˜๋ฆฌ ์ฆ๊ฐ•์œผ๋กœ ๋ณด์™„ (๋‹ค์Œ ์žฅ)" s = slides[22] for sh in s.shapes: if sh.name == "TextBox 9": for para in sh.text_frame.paragraphs: if para.runs and "32์”ฌ" in "".join(r.text for r in para.runs): para.runs[0].text = "ํ˜„์žฌ 94์”ฌ ์™„๋ฃŒ: 205,331์žฅ (40 GB) โ€” 284์”ฌ ์™„๋ฃŒ ์‹œ ์•ฝ 61๋งŒ ์žฅ์œผ๋กœ ๋‚ฎ ๋ฐ์ดํ„ฐ๊ฐ€ 9๋ฐฐ๊ฐ€ ๋จ" for r in para.runs[1:]: r.text = "" s = slides[36] for sh in list(s.shapes): if sh.name not in KEEP: sh._element.getparent().remove(sh._element) y = body(s, "์ง„ํ–‰ ํ˜„ํ™ฉ", "์‹ฑ๊ฐ€ํฌ๋ฅด ๋‚ฎ ๋งต ๊ตฌ์ถ• ํ˜„ํ™ฉ (2026-10-14)", [ "ํ•™์Šต ๋‹จ์œ„ 696๊ฐœ ์ค‘ 313๊ฐœ (45%) ์™„๋ฃŒ โ€” 10์›” 13์ผ๋ถ€ํ„ฐ ์ผ๊ด„ ํ•™์Šต์„ ์ž ์‹œ ๋ฉˆ์ถ”๊ณ  ArtiFixer ์ฆ๊ฐ•์„ ๋จผ์ € ์ง„ํ–‰ (GPU 8 GB ๋ฅผ ํ•จ๊ป˜ ๋ชป ์”€)", "ArtiFixer ์ฆ๊ฐ•์ด ๋๋‚œ ์”ฌ๊นŒ์ง€ ๋งˆ์น˜๋ฉด ๊ฐ™์€ ์ž‘์—…์ด day_map ์ผ๊ด„ ํ•™์Šต์„ ์ž๋™ ์žฌ๊ฐœํ•จ (nusim run aug_artifixer) โ€” ์ „์ฒด ๋งต ํ•™์Šต์€ ๊ณ„์†", ]) for i, (n, l) in enumerate([("313 / 696", "ํ•™์Šต ๋‹จ์œ„ (45%)"), ("94", "3DGS ์ฆ๊ฐ• ์”ฌ (205k์žฅ ยท 40 GB)"), ("10์”ฌ", "ArtiFixer + ์ฐจ์„  ํ›„์ฒ˜๋ฆฌ (3.6k์žฅ)"), ("313", "์‹œ๋งจํ‹ฑ ๋ผ๋ฒจ (๋ชจ๋“  ๊ตฌ๊ฐ„)")]): kpi(s, 0.85 + i * 3.0, y + 0.15, 2.75, n, l) table(s, 0.85, y + 1.5, 11.75, [["ํ•ญ๋ชฉ", "10์›” 12์ผ", "10์›” 14์ผ"], ["์™„๋ฃŒ ํ•™์Šต ๋‹จ์œ„", "253", "313"], ["3DGS ์ฆ๊ฐ• ์”ฌ ยท ์ด๋ฏธ์ง€", "75์”ฌ ยท 160.9k", "94์”ฌ ยท 205.3k"], ["ArtiFixer ์ฆ๊ฐ• ยท ๋˜๋จน์ž„", "โ€”", "10์”ฌ 3,584์žฅ ยท 7์”ฌ 18๊ตฌ๊ฐ„ ๋ฏธ์„ธ์กฐ์ • (gs_day_afx)"], ["์‹œ๋งจํ‹ฑ ์นด๋ฉ”๋ผ", "์ผ๋ถ€ ๊ตฌ๊ฐ„๋งŒ ๋ผ๋ฒจ (๋‚˜๋จธ์ง€ ๊ฒ€๊ฒŒ ๋ณด์ž„)", "๋ชจ๋“  ๊ตฌ๊ฐ„ ๋ผ๋ฒจ ยท render view/map ์ด ์—†์œผ๋ฉด ์ž๋™ ์ƒ์„ฑ"]], [0.3, 0.3, 0.4], size=12, rowh=0.4) notes(s, "์‹œ๋งจํ‹ฑ ์นด๋ฉ”๋ผ๊ฐ€ ํ‘๋ฐฑ์œผ๋กœ ๋ณด์ด๋˜ ๊ฒƒ์€ 313๊ฐœ ์ค‘ 170๊ฐœ ๊ตฌ๊ฐ„์— semantic.rgba ๊ฐ€ ์—†์–ด์„œ์˜€๋‹ค (๋ผ๋ฒจ์ด ์—†์œผ๋ฉด ํ•˜๋Š˜๋งŒ ํŒŒ๋ž—๊ณ  ๋‚˜๋จธ์ง€๊ฐ€ ๊ฒ€๋‹ค). ์ง€๊ธˆ์€ ๋ชจ๋‘ ์ฑ„์› ๋‹ค.") s = slides[37] for sh in list(s.shapes): if sh.name not in KEEP: sh._element.getparent().remove(sh._element) y = body(s, "ํ–ฅํ›„ ๊ณ„ํš", "ํ–ฅํ›„ ์—ฐ๊ตฌ ๊ณ„ํš", [ "๋…ธ๋ฉด ํ…์Šค์ฒ˜ ๋ ˆ์ด์–ด๋ฅผ ์—”์ง„์— ๋„ฃ์–ด ์ฐจ์„  ํ’ˆ์งˆ์„ ์‹œ๋ฎฌ์—์„œ๋„ ํ™•๋ณดํ•˜๊ณ , ์ง€์—ญ ๋งต์„ ์™„์„ฑํ•œ ๋’ค ์ฃผํ–‰ ๋ชจ๋ธ์„ ํƒœ์šฐ๋Š” ์ˆœ์„œ๋กœ ์ง„ํ–‰ํ•จ", ]) plans = [("๋…ธ๋ฉด ํ…์Šค์ฒ˜ ๋ ˆ์ด์–ด (ํ•ต์‹ฌ ๊ณผ์ œ)", "์‹œํ—˜์—์„œ ์ฐจ์„  ์„ ๋ช…๋„ 0.16 โ†’ 0.93 (์˜† 1 m) โ€” ๋ Œ๋” ๊ทธ๋ž˜ํ”„์— ๋…ธ๋ฉด ๋ฉ”์‹œ ํŒจ์Šค ์ถ”๊ฐ€, 6์บ  ยท ์ „ ์”ฌ ํ…์Šค์ฒ˜, ๋•…์† ๊ฐ€์šฐ์‹œ์•ˆ ์ •๋ฆฌ"), ("ArtiFixer ์ฆ๊ฐ• ยท ๋งต ์™„์„ฑ", "๋‚จ์€ ์•ฝ 84์”ฌ ArtiFixer ์ฆ๊ฐ• (์•ฝ 2์ผ) โ†’ day_map ์ผ๊ด„ ํ•™์Šต ์žฌ๊ฐœ (383๋‹จ์œ„ ๋‚จ์Œ)"), ("VLA ์—ฐ๊ฒฐ ยท ํ‰๊ฐ€", "closed-loop ์—ฐ๊ฒฐ (--serve + Gym) ๊ณผ HD-Score ์ง€ํ‘œ๋Š” ๊ตฌํ˜„๋จ โ€” VLM/VLA ์ •์ฑ…์„ ์ง€์—ญ ๋งต ์œ„์—์„œ ํ‰๊ฐ€"), ("๊ตํ†ต ์ฐธ๊ฐ€์ž ยท ์žฅ์• ๋ฌผ", "3DRealCar ์ฐจ๋Ÿ‰ ์—์…‹ ์‚ฝ์ž…, ์ง€์—ญ ๋‹จ์œ„ ์žฅ์• ๋ฌผ ์ง€๋„ (๊ฑด๋ฌผ ยท ๊ธฐ๋‘ฅ ์ถฉ๋Œ), queenstown ยท holland village ์ง€์—ญ ๋งต")] for i, (t, d) in enumerate(plans): r, c = divmod(i, 2) box(s, 0.85 + c * 6.0, y + 0.2 + r * 1.75, 5.75, 1.55, d, title=t, fill=NAVY if i == 0 else PALE, color=WHITE if i == 0 else GRAY, line=None if i == 0 else BLUE, size=12) notes(s, "๋…ธ๋ฉด ํ…์Šค์ฒ˜๋Š” ํ”„๋ ˆ์ž„ ์‚ฌ์ด ๋…ธ์ถœ ์ด์Œ๋งค์™€ ์ฐจ๋Ÿ‰ ๊ฐ€๋ฆผ ๊ตฌ๋ฉ ์ฒ˜๋ฆฌ๊ฐ€ ๋‚จ์•˜๋‹ค. ๋Œ€์•ˆ์œผ๋กœ๋Š” ๋ผ์ด๋‹ค ์ง€๋ฉด์— ๋‚ฉ์ž‘ํ•œ ๋…ธ๋ฉด ๊ฐ€์šฐ์‹œ์•ˆ์„ ๋”ฐ๋กœ ๋‘๊ณ  ๋‹ค์‹œ ํ•™์Šตํ•˜๋Š” ๋ฐฉ๋ฒ•(2DGS ยท RoGS ์‹)์ด ์žˆ๋‹ค.") # ------------------------------------------------------------------ ์ˆœ์„œ: ์ƒˆ ์žฅ์„ ์ œ์ž๋ฆฌ๋กœ lst = prs.slides._sldIdLst ids = list(lst) order = list(range(0, 18)) + [40, 41, 42] + list(range(18, 23)) + [43] + list(range(23, 37)) + [44, 45] + list(range(37, 40)) assert sorted(order) == list(range(len(ids))) for e in ids: lst.remove(e) for k in order: lst.append(ids[k]) prs.save(sys.argv[2]) print("saved", sys.argv[2], len(prs.slides))
import copy
import os
import json
from PIL import Image
from pptx import Presentation
from pptx.chart.data import CategoryChartData
from pptx.dml.color import RGBColor
from pptx.enum.chart import XL_CHART_TYPE, XL_LABEL_POSITION
from pptx.enum.shapes import MSO_SHAPE
from pptx.enum.text import MSO_ANCHOR, PP_ALIGN
from pptx.oxml.ns import qn
from pptx.util import Inches, Pt
A = "/tmp/claude-1000/-home-mm-Downloads-vkgs-sim/8bf0e66c-975d-4257-af27-61bc25ee4316/scratchpad/deck/"
NAVY, BLUE, LIGHT, PALE, GRAY, ORANGE, WHITE = (RGBColor(0x1F, 0x3B, 0x70), RGBColor(0x44, 0x72, 0xC4), RGBColor(0xDC, 0xE6, 0xF4),
RGBColor(0xF2, 0xF5, 0xFA), RGBColor(0x40, 0x40, 0x40), RGBColor(0xED, 0x7D, 0x31),
RGBColor(0xFF, 0xFF, 0xFF))
FONT = "๋ง‘์€ ๊ณ ๋”•"
KEEP = {"์Šฌ๋ผ์ด๋“œ ๋ฒˆํ˜ธ ๊ฐœ์ฒด ํ‹€ 1", "์ œ๋ชฉ 1", "๊ทธ๋ฃน 6", "TextBox 9", "TextBox 4"}
def shape(sl, name):
for sh in sl.shapes:
if sh.name == name:
return sh
raise KeyError(name)
def set_runs_text(tf, text):
"""์ฒซ ๋ฌธ๋‹จ ์ฒซ run ์˜ ์„œ์‹์œผ๋กœ text ๋งŒ ๋‚จ๊ธด๋‹ค."""
p0 = tf.paragraphs[0]
for p in tf.paragraphs[1:]:
p._p.getparent().remove(p._p)
runs = p0.runs
if not runs:
p0.text = text
return
runs[0].text = text
for r in runs[1:]:
r._r.getparent().remove(r._r)
def set_paragraphs(tf, items):
"""์ฒซ ๋ฌธ๋‹จ์„ ๋ณธ์œผ๋กœ ๋ฌธ๋‹จ๋งˆ๋‹ค ๋ณต์‚ฌ (๊ธ€๋จธ๋ฆฌํ‘œยท๊ฐ„๊ฒฉ ์œ ์ง€)."""
p0 = tf.paragraphs[0]._p
for p in tf.paragraphs[1:]:
p._p.getparent().remove(p._p)
parent = p0.getparent()
proto = copy.deepcopy(p0)
parent.remove(p0)
for it in items:
p = copy.deepcopy(proto)
rs = p.findall(qn("a:r"))
for r in rs[1:]:
p.remove(r)
if rs:
rs[0].find(qn("a:t")).text = it
parent.append(p)
def body(sl, tab, heading, bullets):
for sh in list(sl.shapes):
if sh.name not in KEEP:
sh._element.getparent().remove(sh._element)
set_runs_text(shape(sl, "์ œ๋ชฉ 1").text_frame, "VKGS-Sim")
set_runs_text(shape(sl, "TextBox 4").text_frame, tab)
grp = shape(sl, "๊ทธ๋ฃน 6")
for c in grp.shapes:
if c.has_text_frame and c.text_frame.text.strip():
set_runs_text(c.text_frame, heading)
set_paragraphs(shape(sl, "TextBox 9").text_frame, bullets)
return 1.82 + 0.28 * sum(1 + len(b) // 95 for b in bullets) + 0.15 # ๋ณธ๋ฌธ ๋‹ค์Œ y (12pt, ์ค„๊ฐ„๊ฒฉ 150%)
def notes(sl, text):
sl.notes_slide.notes_text_frame.text = text
def tb(sl, x, y, w, h, text, size=12, bold=False, color=GRAY, align=PP_ALIGN.LEFT, anchor=MSO_ANCHOR.TOP, font=FONT):
t = sl.shapes.add_textbox(Inches(x), Inches(y), Inches(w), Inches(h))
tf = t.text_frame
tf.word_wrap = True
tf.margin_left = tf.margin_right = Inches(0.04)
tf.margin_top = tf.margin_bottom = Inches(0.02)
tf.vertical_anchor = anchor
for i, line in enumerate(text.split("\n")):
p = tf.paragraphs[0] if i == 0 else tf.add_paragraph()
p.alignment = align
r = p.add_run()
r.text = line
r.font.size, r.font.bold, r.font.color.rgb, r.font.name = Pt(size), bold, color, font
return t
def box(sl, x, y, w, h, text, fill=LIGHT, color=GRAY, size=12, bold=False, line=None, align=PP_ALIGN.CENTER, title=None):
s = sl.shapes.add_shape(MSO_SHAPE.ROUNDED_RECTANGLE, Inches(x), Inches(y), Inches(w), Inches(h))
s.adjustments[0] = 0.08
s.fill.solid()