Spaces:
Running
Running
T4 review round v2: text-only explanations, 2 labels, saves to reviews/v2/
Browse files- data/config.json +2 -1
- data/reviews/golden_alice.json +0 -0
- data/reviews/golden_bob.json +0 -0
- data/reviews/golden_carol.json +0 -0
- index.html +12 -10
data/config.json
CHANGED
|
@@ -1,8 +1,9 @@
|
|
| 1 |
{
|
| 2 |
"dataset": "Deep-Fake/mozaic-t4-review",
|
|
|
|
| 3 |
"reviewers": {
|
| 4 |
"ahmedyradwan02": "alice",
|
| 5 |
"shainaraza": "bob",
|
| 6 |
"MohamedXI": "carol"
|
| 7 |
}
|
| 8 |
-
}
|
|
|
|
| 1 |
{
|
| 2 |
"dataset": "Deep-Fake/mozaic-t4-review",
|
| 3 |
+
"round": "v2",
|
| 4 |
"reviewers": {
|
| 5 |
"ahmedyradwan02": "alice",
|
| 6 |
"shainaraza": "bob",
|
| 7 |
"MohamedXI": "carol"
|
| 8 |
}
|
| 9 |
+
}
|
data/reviews/golden_alice.json
CHANGED
|
The diff for this file is too large to render.
See raw diff
|
|
|
data/reviews/golden_bob.json
CHANGED
|
The diff for this file is too large to render.
See raw diff
|
|
|
data/reviews/golden_carol.json
CHANGED
|
The diff for this file is too large to render.
See raw diff
|
|
|
index.html
CHANGED
|
@@ -58,10 +58,12 @@
|
|
| 58 |
<p>Watch the clip, and the reference (the same person's real clip) to compare. The facts say
|
| 59 |
what is fake; they are correct. Judge only what is written, per part:</p>
|
| 60 |
<ul>
|
| 61 |
-
<li><b>accurate</b>:
|
| 62 |
-
|
| 63 |
-
|
| 64 |
-
<li><b>
|
|
|
|
|
|
|
| 65 |
</ul>
|
| 66 |
<p>Every move saves in this browser; your file goes to Hugging Face at least once a minute.
|
| 67 |
Close the tab any time: you resume at your first unfinished clip. Use one tab at a time.</p>
|
|
@@ -100,7 +102,7 @@
|
|
| 100 |
import { oauthLoginUrl, oauthHandleRedirectIfPresent, downloadFile, uploadFile }
|
| 101 |
from "https://cdn.jsdelivr.net/npm/@huggingface/hub@2.16.3/+esm";
|
| 102 |
|
| 103 |
-
const LABELS = ["accurate", "
|
| 104 |
const PUSH_EVERY_MS = 60_000; // at most one commit a minute per reviewer
|
| 105 |
const $ = (id) => document.getElementById(id);
|
| 106 |
const esc = (s) => String(s ?? "").replace(/[&<>"]/g, (c) => ({"&": "&", "<": "<", ">": ">", '"': """}[c]));
|
|
@@ -131,7 +133,7 @@ function signIn(text) {
|
|
| 131 |
}
|
| 132 |
|
| 133 |
// ---------------------------------------------------------------- load
|
| 134 |
-
const file = () => `reviews/golden_${name}.json`;
|
| 135 |
const repo = () => ({type: "dataset", name: config.dataset});
|
| 136 |
|
| 137 |
function merge(...versions) {
|
|
@@ -161,7 +163,7 @@ async function start() {
|
|
| 161 |
if (!name) return signIn(`${auth.user} is not on the reviewer list. Ask for your account to be added.`);
|
| 162 |
try {
|
| 163 |
const seed = await (await fetch(`data/reviews/golden_${name}.json`)).json();
|
| 164 |
-
const local = store.get(`t4:work:${name}`);
|
| 165 |
clips = merge(seed, await remote(), local);
|
| 166 |
dirty = Boolean(local);
|
| 167 |
} catch (e) {
|
|
@@ -185,7 +187,7 @@ function part(c, p) {
|
|
| 185 |
return `<h3>${p[0].toUpperCase() + p.slice(1)}</h3>
|
| 186 |
<div><b>Facts:</b> <span class="${fake ? "fake" : "real"}">${esc(c.facts[p])}</span></div>
|
| 187 |
<p><b>Explanation:</b> ${esc(c.explanation[p])}</p>
|
| 188 |
-
<div><b>Evidence</b> <span class="label">(artifact |
|
| 189 |
<div class="label">${p} label</div><div class="choices">${radios}</div>`;
|
| 190 |
}
|
| 191 |
|
|
@@ -212,7 +214,7 @@ function saveLocal() {
|
|
| 212 |
const r = {video: picked("video"), audio: picked("audio"), note: $("note").value.trim()};
|
| 213 |
if (r.video === c.review.video && r.audio === c.review.audio && r.note === (c.review.note || "")) return false;
|
| 214 |
c.review = {...r, time: new Date().toISOString()};
|
| 215 |
-
store.set(`t4:work:${name}`, clips);
|
| 216 |
dirty = true;
|
| 217 |
syncLabel();
|
| 218 |
return true;
|
|
@@ -227,7 +229,7 @@ function push(now) {
|
|
| 227 |
file: {path: file(), content: new Blob([JSON.stringify(clips, null, 1)])}});
|
| 228 |
dirty = false;
|
| 229 |
lastPush = Date.now();
|
| 230 |
-
store.del(`t4:work:${name}`);
|
| 231 |
} catch (e) {
|
| 232 |
const text = String(e);
|
| 233 |
if (text.includes("401") || text.includes("not found")) {
|
|
|
|
| 58 |
<p>Watch the clip, and the reference (the same person's real clip) to compare. The facts say
|
| 59 |
what is fake; they are correct. Judge only what is written, per part:</p>
|
| 60 |
<ul>
|
| 61 |
+
<li><b>accurate</b>: everything written is true of the clip. Each flaw it describes (blur,
|
| 62 |
+
warping, less movement) is there; if it says nothing looks or sounds wrong, nothing
|
| 63 |
+
obvious is wrong; for a REAL part, nothing fake is claimed.</li>
|
| 64 |
+
<li><b>inaccurate</b>: something written is not true of the clip: a flaw it describes is
|
| 65 |
+
not there, or it says nothing looks or sounds wrong while a flaw is obvious. Say what in
|
| 66 |
+
the note.</li>
|
| 67 |
</ul>
|
| 68 |
<p>Every move saves in this browser; your file goes to Hugging Face at least once a minute.
|
| 69 |
Close the tab any time: you resume at your first unfinished clip. Use one tab at a time.</p>
|
|
|
|
| 102 |
import { oauthLoginUrl, oauthHandleRedirectIfPresent, downloadFile, uploadFile }
|
| 103 |
from "https://cdn.jsdelivr.net/npm/@huggingface/hub@2.16.3/+esm";
|
| 104 |
|
| 105 |
+
const LABELS = ["accurate", "inaccurate"];
|
| 106 |
const PUSH_EVERY_MS = 60_000; // at most one commit a minute per reviewer
|
| 107 |
const $ = (id) => document.getElementById(id);
|
| 108 |
const esc = (s) => String(s ?? "").replace(/[&<>"]/g, (c) => ({"&": "&", "<": "<", ">": ">", '"': """}[c]));
|
|
|
|
| 133 |
}
|
| 134 |
|
| 135 |
// ---------------------------------------------------------------- load
|
| 136 |
+
const file = () => `reviews/${config.round}/golden_${name}.json`; // one folder per review round
|
| 137 |
const repo = () => ({type: "dataset", name: config.dataset});
|
| 138 |
|
| 139 |
function merge(...versions) {
|
|
|
|
| 163 |
if (!name) return signIn(`${auth.user} is not on the reviewer list. Ask for your account to be added.`);
|
| 164 |
try {
|
| 165 |
const seed = await (await fetch(`data/reviews/golden_${name}.json`)).json();
|
| 166 |
+
const local = store.get(`t4:work:${config.round}:${name}`);
|
| 167 |
clips = merge(seed, await remote(), local);
|
| 168 |
dirty = Boolean(local);
|
| 169 |
} catch (e) {
|
|
|
|
| 187 |
return `<h3>${p[0].toUpperCase() + p.slice(1)}</h3>
|
| 188 |
<div><b>Facts:</b> <span class="${fake ? "fake" : "real"}">${esc(c.facts[p])}</span></div>
|
| 189 |
<p><b>Explanation:</b> ${esc(c.explanation[p])}</p>
|
| 190 |
+
<div><b>Evidence</b> <span class="label">(artifact | what it means)</span></div><ul>${ev}</ul>
|
| 191 |
<div class="label">${p} label</div><div class="choices">${radios}</div>`;
|
| 192 |
}
|
| 193 |
|
|
|
|
| 214 |
const r = {video: picked("video"), audio: picked("audio"), note: $("note").value.trim()};
|
| 215 |
if (r.video === c.review.video && r.audio === c.review.audio && r.note === (c.review.note || "")) return false;
|
| 216 |
c.review = {...r, time: new Date().toISOString()};
|
| 217 |
+
store.set(`t4:work:${config.round}:${name}`, clips);
|
| 218 |
dirty = true;
|
| 219 |
syncLabel();
|
| 220 |
return true;
|
|
|
|
| 229 |
file: {path: file(), content: new Blob([JSON.stringify(clips, null, 1)])}});
|
| 230 |
dirty = false;
|
| 231 |
lastPush = Date.now();
|
| 232 |
+
store.del(`t4:work:${config.round}:${name}`);
|
| 233 |
} catch (e) {
|
| 234 |
const text = String(e);
|
| 235 |
if (text.includes("401") || text.includes("not found")) {
|