File size: 6,483 Bytes
4635d45
102a1b6
4635d45
 
 
102a1b6
4635d45
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
102a1b6
 
4635d45
 
102a1b6
 
 
4635d45
 
102a1b6
4635d45
 
 
 
102a1b6
 
4635d45
 
 
102a1b6
4635d45
102a1b6
 
4635d45
 
 
 
102a1b6
4635d45
102a1b6
4635d45
102a1b6
 
 
4635d45
 
 
102a1b6
 
 
4635d45
 
102a1b6
4635d45
 
102a1b6
 
 
4635d45
 
102a1b6
 
 
 
4635d45
 
 
 
102a1b6
 
4635d45
 
 
102a1b6
 
 
 
 
 
 
4635d45
 
 
 
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
111
112
113
114
115
116
117
118
119
120
121
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Illustration Track โ€” DrawFace Live</title>
<!-- ์ •์  ์‡ผ์ผ€์ด์Šค. ์ด ํŽ˜์ด์ง€๋Š” ์ถ”๋ก ์„ ๋Œ๋ฆฌ์ง€ ์•Š๋Š”๋‹ค โ€” ๋กœ์ปฌ GPU ์—์„œ ๋ฏธ๋ฆฌ ๋ Œ๋”ํ•œ ๊ฒฐ๊ณผ๋งŒ ์žฌ์ƒํ•œ๋‹ค.
     ์‹ค์‹œ๊ฐ„ ํŠธ๋ž™(index.html)๊ณผ ๋‹ฌ๋ฆฌ LivePortrait ๋Š” TensorRT + GPU ๊ฐ€ ํ•„์š”ํ•ด ์›น์— ๋ชป ์˜ฌ๋ฆฐ๋‹ค.
     ํ•ต์‹ฌ ๋ฉ”์‹œ์ง€๋Š” "๋˜๋Š” ๊ทธ๋ฆผ / ์•ˆ ๋˜๋Š” ๊ทธ๋ฆผ" ๋Œ€์กฐ๋‹ค. ์„ฑ๊ณต ์‚ฌ๋ก€๋งŒ ๊ฑธ๋ฉด ๋‹ค์Œ ์‚ฌ๋žŒ์ด
     ์†๊ทธ๋ฆผ์— ์ด ํŠธ๋ž™์„ ๋ถ™์˜€๋‹ค๊ฐ€ ๊ฐ™์€ ์‹คํŒจ๋ฅผ ๋ฐ˜๋ณตํ•œ๋‹ค. -->
<style>
  :root { color-scheme: dark; }
  * { box-sizing: border-box; }
  body {
    margin: 0; min-height: 100vh; display: flex; flex-direction: column; align-items: center;
    font-family: 'Pretendard', 'Noto Sans KR', sans-serif; background: #16161d; color: #e8e8ef;
  }
  main { width: min(900px, 96vw); padding: 24px 0 48px; }
  h1 { font-size: 1.25rem; font-weight: 700; margin: 12px 0 4px; }
  h2 { font-size: 1.02rem; font-weight: 700; margin: 34px 0 10px; }
  p { line-height: 1.7; color: #c3c3d2; font-size: .93rem; margin: 8px 0; }
  .lede { color: #9a9ab0; font-size: .9rem; margin-bottom: 6px; }
  .tag { display: inline-block; padding: 2px 8px; border-radius: 4px; font-size: .74rem; font-weight: 700; letter-spacing: .02em; }
  .tag.ok { background: #17402c; color: #7ee0a8; }
  .tag.no { background: #431c22; color: #ff9aa5; }
  .duo { display: flex; gap: 14px; flex-wrap: wrap; }
  figure { flex: 1 1 300px; margin: 0; }
  figure video, figure img {
    width: 100%; display: block; border-radius: 14px; border: 1px solid #2a2a35; background: #0d0d12;
  }
  figcaption { color: #9a9ab0; font-size: .82rem; margin-top: 7px; line-height: 1.55; }
  .card { border: 1px solid #2a2a35; border-radius: 14px; padding: 14px 16px; background: #1b1b23; }
  table { border-collapse: collapse; width: 100%; font-size: .88rem; margin-top: 8px; }
  th, td { text-align: left; padding: 8px 10px; border-bottom: 1px solid #2a2a35; }
  th { color: #9a9ab0; font-weight: 600; }
  td strong { color: #7ee0a8; }
  a { color: inherit; text-decoration: underline; text-underline-offset: 3px; }
  .row { display: flex; gap: 8px; margin-top: 18px; align-items: center; flex-wrap: wrap; }
  .btn { padding: 10px 16px; border-radius: 6px; border: 1px solid transparent; background: #e8e8ef; color: #16161d;
         font-size: .93rem; font-weight: 600; text-decoration: none; }
  .btn.alt { background: transparent; color: #c9c9d4; border-color: #3a3f47; }
  footer { margin-top: 30px; font-size: .78rem; color: #66667a; line-height: 1.7; }
</style>
</head>
<body>
<main>
  <h1>Illustration Track โ€” the artwork follows my face</h1>
  <p class="lede">FasterLivePortrait ยท local GPU only ยท everything below is pre-rendered</p>

  <p>
    This repo has <strong>two</strong> ways to animate a face, and which one works depends entirely on the
    artwork. The same model gives opposite results on different kinds of drawings, so we measured it and
    split the pipeline into two tracks.
  </p>

  <h2><span class="tag ok">Works</span> &nbsp;Standard-proportion illustration ยท fine art</h2>
  <div class="duo">
    <figure>
      <video src="img/flp/vermeer.mp4" autoplay loop muted playsinline preload="metadata"></video>
      <figcaption>
        Vermeer, โ€œGirl with a Pearl Earringโ€ (1665, public domain).
        The brushwork and canvas craquelure stay intact while only the head pose and expression move.
      </figcaption>
    </figure>
    <figure>
      <img src="img/flp_illust_ok.png" alt="Six frames of a driven vector illustration โ€” the linework and coloring hold while only the expression changes">
      <figcaption>
        Six frames of a vector illustration. The linework and coloring are never regenerated, so the
        original style survives.
      </figcaption>
    </figure>
  </div>

  <h2><span class="tag no">Doesn't work</span> &nbsp;Hand drawings ยท doodles ยท chibi</h2>
  <figure style="max-width:660px">
    <img src="img/flp/fail_handdrawn.png" alt="LivePortrait applied to a hand drawing โ€” no face is detected, so all three frames stay unchanged">
    <figcaption>
      Same pipeline, same webcam input. On a hand drawing <strong>face detection fails outright</strong>,
      so nothing happens at all โ€” and if you force detection through, the entire head smears instead.
      Line art on white paper is outside the model's training distribution.
    </figcaption>
  </figure>
  <p>
    That is why hand drawings are handled by <a href="./">ARAP warp mirroring</a> rather than this track.
    It deforms the original strokes over a triangle mesh, so it never invents pixels that were not there,
    and it runs in real time in the browser.
  </p>

  <h2>Why this can't run in the browser</h2>
  <div class="card">
    <table>
      <tr><th>Backend</th><th>Per frame</th><th>In practice</th></tr>
      <tr><td>TensorRT (RTX 4070 Ti)</td><td><strong>27โ€“37 ms</strong></td><td>Real-time (~30 fps)</td></tr>
      <tr><td>ONNX GPU (same card)</td><td>118โ€“124 ms</td><td>~8 fps โ€” not real-time</td></tr>
    </table>
    <p style="margin-top:12px">
      Real-time is a <strong>TensorRT-only number</strong>. And a TensorRT engine is bound to the GPU and
      versions it was built on โ€” it will not load on any other machine. Free hosting is CPU-only, so it is
      slower still, and round-tripping webcam frames through a server destroys the feeling that the drawing
      is following you. That is why this page only shows <strong>pre-rendered results</strong>.
    </p>
  </div>

  <div class="row">
    <a class="btn" href="./">Try the real-time mirroring</a>
    <a class="btn alt" href="https://github.com/ingon1026/drawface-live#์ผ๋Ÿฌ์ŠคํŠธ-ํŠธ๋ž™--liveportrait-์‹ค์‹œ๊ฐ„-2026-07-23-์žฌ์‹ค์ธก">How to run it yourself</a>
  </div>

  <footer>
    The clips were pre-rendered on a local GPU (RTX 4070 Ti, TensorRT) โ€” this page runs no inference.
    There is no audio.<br>
    Source artwork โ€” Vermeer's โ€œGirl with a Pearl Earringโ€ is public domain and ships as an example image
    with <a href="https://github.com/warmshao/FasterLivePortrait">FasterLivePortrait</a> (MIT).
    The pig drawing is my own.<br>
    Reproduction steps and local patches are in
    <a href="https://github.com/ingon1026/drawface-live/blob/main/THIRD_PARTY.md">THIRD_PARTY.md</a>.
  </footer>
</main>
</body>
</html>