|
| 1 | +<!doctype html> |
| 2 | +<html lang="en"> |
| 3 | + |
| 4 | +<head> |
| 5 | + <meta charset="utf-8" /> |
| 6 | + <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" /> |
| 7 | + <title>Ghostyle Transfer — Ghostmaxxing</title> |
| 8 | + <meta name="generator" content="Hand-coded with rage against the algorithm" /> |
| 9 | + <meta name="description" |
| 10 | + content="Extract a Ghostyle from a before/after workshop pair and transfer it to another face locally in the browser." /> |
| 11 | + <meta property="og:title" content="Ghostyle Transfer - Ghostmaxxing" /> |
| 12 | + <meta property="og:description" content="Transfer adversarial makeup patterns between faces in a local browser lab." /> |
| 13 | + <meta property="og:type" content="website" /> |
| 14 | + <meta property="og:image" content="/images/social-card.svg" /> |
| 15 | + <meta name="twitter:card" content="summary_large_image" /> |
| 16 | + <meta name="twitter:title" content="Ghostyle Transfer - Ghostmaxxing" /> |
| 17 | + <meta name="twitter:description" content="Transfer adversarial makeup patterns between faces in a local browser lab." /> |
| 18 | + <meta name="twitter:image" content="/images/social-card.svg" /> |
| 19 | + <link rel="icon" type="image/svg+xml" href="/images/ghostmaxxing-favicon.svg" /> |
| 20 | + <link rel="stylesheet" href="styles/pages.css" /> |
| 21 | + <link rel="stylesheet" href="styles/content-pages.css" /> |
| 22 | + <script src="https://cdn.jsdelivr.net/npm/@vladmandic/face-api/dist/face-api.js"></script> |
| 23 | +</head> |
| 24 | + |
| 25 | +<body> |
| 26 | + <main class="editorial-homepage content-page editorial-homepage--svg-footer-band"> |
| 27 | + <div class="editorial-homepage__shell"> |
| 28 | + <header class="editorial-homepage__header"> |
| 29 | + <a class="wordmark" href="index.html" aria-label="Ghostmaxxing homepage" data-i18n-aria-label="homepage_wordmark_label"> |
| 30 | + <span class="wordmark__main"> |
| 31 | + <img class="wordmark__mark" src="images/ghostmaxxing-mark.svg" alt="" aria-hidden="true" /> |
| 32 | + <span class="wordmark__title">Ghostmaxxing</span> |
| 33 | + </span> |
| 34 | + <span class="wordmark__subtitle" data-i18n="homepage_subtitle"> |
| 35 | + A public lab for testing face-recognition camouflage |
| 36 | + </span> |
| 37 | + </a> |
| 38 | + |
| 39 | + <nav class="editorial-homepage__nav" aria-label="Project navigation" data-i18n-aria-label="prototype_navigation_label"> |
| 40 | + <a class="navlink" href="/references/" rel="noopener noreferrer" data-i18n="research_references_link">Research References</a> |
| 41 | + <a class="navlink" href="about.html" data-i18n="vision_about_link">Vision & About</a> |
| 42 | + <a class="cta-inline" href="lab.html" data-i18n-html="open_lab_link_html">Open the lab <span aria-hidden="true">↗</span></a> |
| 43 | + <span class="locale-control"> |
| 44 | + <span class="locale-control__flag" aria-hidden="true"></span> |
| 45 | + <select id="localeSelect" class="locale-select" aria-label="Language" data-i18n-aria-label="language_label"></select> |
| 46 | + </span> |
| 47 | + </nav> |
| 48 | + </header> |
| 49 | + |
| 50 | + <section class="content-page__header-area" aria-labelledby="transfer-title"> |
| 51 | + <span class="content-page__kicker" data-i18n="transfer_kicker">Lab · Ghostyle transfer</span> |
| 52 | + <h1 id="transfer-title" data-i18n="transfer_title">Lift a Ghostyle off one face, wear it on another.</h1> |
| 53 | + <p class="content-page__lead" data-i18n="transfer_lead"> |
| 54 | + Extract the paint from a workshop before / after pair and place it on a target face. |
| 55 | + </p> |
| 56 | + <p class="content-page__deck" data-i18n="transfer_deck"> |
| 57 | + Mark the face on each image with a box. The transfer runs entirely on this device, with mesh alignment when the local face engine can detect matching landmarks. |
| 58 | + </p> |
| 59 | + <span class="tool-status" id="engineBadge"> |
| 60 | + <span class="tool-status__dot" aria-hidden="true"></span> |
| 61 | + <span id="engineText" data-i18n="transfer_engine_loading">Mesh engine: loading…</span> |
| 62 | + </span> |
| 63 | + </section> |
| 64 | + |
| 65 | + <section class="tool-workbench" aria-label="Ghostyle transfer workbench" data-i18n-aria-label="transfer_workbench_label"> |
| 66 | + <div class="tool-grid"> |
| 67 | + <article class="tool-card"> |
| 68 | + <div class="tool-card__header"> |
| 69 | + <span class="tool-card__title" data-i18n="transfer_before_title">Before</span> |
| 70 | + <span class="tool-card__tag" data-i18n="transfer_before_tag">bare face · optional</span> |
| 71 | + </div> |
| 72 | + <div class="tool-stage" id="stage-before"> |
| 73 | + <span class="tool-stage__hint" id="hint-before" data-i18n="transfer_before_hint">Drop or choose the bare workshop face</span> |
| 74 | + </div> |
| 75 | + <p class="tool-note" id="note-before"></p> |
| 76 | + <label class="file-picker"> |
| 77 | + <input type="file" accept="image/*" data-slot="before" /> |
| 78 | + <span data-i18n="transfer_choose_image">Choose image</span> |
| 79 | + </label> |
| 80 | + </article> |
| 81 | + |
| 82 | + <article class="tool-card"> |
| 83 | + <div class="tool-card__header"> |
| 84 | + <span class="tool-card__title" data-i18n="transfer_after_title">After</span> |
| 85 | + <span class="tool-card__tag" data-i18n="transfer_after_tag">painted face</span> |
| 86 | + </div> |
| 87 | + <div class="tool-stage" id="stage-after"> |
| 88 | + <span class="tool-stage__hint" id="hint-after" data-i18n="transfer_after_hint">Drop or choose the painted workshop face</span> |
| 89 | + </div> |
| 90 | + <p class="tool-note" id="note-after"></p> |
| 91 | + <label class="file-picker"> |
| 92 | + <input type="file" accept="image/*" data-slot="after" /> |
| 93 | + <span data-i18n="transfer_choose_image">Choose image</span> |
| 94 | + </label> |
| 95 | + </article> |
| 96 | + |
| 97 | + <article class="tool-card"> |
| 98 | + <div class="tool-card__header"> |
| 99 | + <span class="tool-card__title" data-i18n="transfer_target_title">Target</span> |
| 100 | + <span class="tool-card__tag" data-i18n="transfer_target_tag">receives the paint</span> |
| 101 | + </div> |
| 102 | + <div class="tool-stage" id="stage-target"> |
| 103 | + <span class="tool-stage__hint" id="hint-target" data-i18n="transfer_target_hint">Drop or choose the target face / painting</span> |
| 104 | + </div> |
| 105 | + <p class="tool-note" id="note-target"></p> |
| 106 | + <label class="file-picker"> |
| 107 | + <input type="file" accept="image/*" data-slot="target" /> |
| 108 | + <span data-i18n="transfer_choose_image">Choose image</span> |
| 109 | + </label> |
| 110 | + </article> |
| 111 | + </div> |
| 112 | + |
| 113 | + <div class="tool-controls"> |
| 114 | + <div class="tool-field"> |
| 115 | + <label class="tool-label" for="thr"><span data-i18n="transfer_sensitivity_label">Paint sensitivity</span> <output id="v-thr">28</output></label> |
| 116 | + <input type="range" id="thr" min="6" max="90" value="28" /> |
| 117 | + </div> |
| 118 | + <div class="tool-field"> |
| 119 | + <label class="tool-label" for="fth"><span data-i18n="transfer_feather_label">Edge feather</span> <output id="v-fth">3</output></label> |
| 120 | + <input type="range" id="fth" min="0" max="12" value="3" /> |
| 121 | + </div> |
| 122 | + <div class="tool-field"> |
| 123 | + <label class="tool-label" for="op"><span data-i18n="transfer_opacity_label">Opacity</span> <output id="v-op">92</output>%</label> |
| 124 | + <input type="range" id="op" min="20" max="100" value="92" /> |
| 125 | + </div> |
| 126 | + <div class="tool-field"> |
| 127 | + <label class="tool-label" for="blend" data-i18n="transfer_blend_label">Blend</label> |
| 128 | + <select id="blend"> |
| 129 | + <option value="multiply" selected data-i18n="transfer_blend_multiply">Multiply (paints onto)</option> |
| 130 | + <option value="source-over" data-i18n="transfer_blend_normal">Normal</option> |
| 131 | + <option value="soft-light" data-i18n="transfer_blend_soft_light">Soft light</option> |
| 132 | + </select> |
| 133 | + </div> |
| 134 | + <div class="tool-field tool-field--check"> |
| 135 | + <input type="checkbox" id="useMesh" checked /> |
| 136 | + <label for="useMesh" data-i18n="transfer_use_mesh_label">Follow features (mesh)</label> |
| 137 | + </div> |
| 138 | + </div> |
| 139 | + |
| 140 | + <div class="tool-actions"> |
| 141 | + <button class="btn-primary" id="run" disabled data-i18n="transfer_run_button">Transfer Ghostyle</button> |
| 142 | + <button class="link-secondary" id="download" disabled data-i18n="transfer_download_button">Download result</button> |
| 143 | + <button class="link-secondary" id="reset" data-i18n="transfer_reset_button">Reset</button> |
| 144 | + <span class="tool-message" id="msg" data-i18n="transfer_msg_load_after_target">Load an after and a target, then draw a box on each face.</span> |
| 145 | + </div> |
| 146 | + |
| 147 | + <div class="tool-output"> |
| 148 | + <div class="tool-result" id="result"> |
| 149 | + <span class="tool-result__empty" data-i18n="transfer_result_empty">The transferred result will appear here.</span> |
| 150 | + </div> |
| 151 | + <aside class="tool-aside"> |
| 152 | + <section class="tool-panel"> |
| 153 | + <h2 data-i18n="transfer_matte_title">Extracted paint</h2> |
| 154 | + <canvas id="matte" width="180" height="180"></canvas> |
| 155 | + <p id="matteNote" data-i18n="transfer_matte_note">The isolated Ghostyle, in a normalized face frame.</p> |
| 156 | + </section> |
| 157 | + <section class="tool-panel"> |
| 158 | + <h2 data-i18n="transfer_mode_title">Mode</h2> |
| 159 | + <p id="modeNote" data-i18n="transfer_mode_not_run">Not run yet.</p> |
| 160 | + </section> |
| 161 | + </aside> |
| 162 | + </div> |
| 163 | + </section> |
| 164 | + |
| 165 | + <footer class="tool-disclaimer"> |
| 166 | + <p data-i18n="transfer_disclaimer"> |
| 167 | + Ghostmaxxing is a research and education tool. Transferring a Ghostyle onto a face is a visualization; it is not evidence that the pattern affects any recognition system. Face detectors are unreliable on stylized artwork. If the mesh cannot find a target face, the tool uses the box you drew. |
| 168 | + </p> |
| 169 | + </footer> |
| 170 | + </div> |
| 171 | + </main> |
| 172 | + |
| 173 | + <script type="module" src="scripts/transfer.js"></script> |
| 174 | +</body> |
| 175 | + |
| 176 | +</html> |
0 commit comments