Skip to content

Commit a577668

Browse files
authored
Merge branch 'main' into add/juicefs-mounting
2 parents 07d8793 + 7e79691 commit a577668

16 files changed

Lines changed: 1615 additions & 8 deletions

package-lock.json

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@
122122
"webpack": "^5.107.2",
123123
"webpack-bundle-analyzer": "^5.3.0",
124124
"webpack-cli": "^5.1.1",
125-
"webpack-dev-server": "^5.2.4",
125+
"webpack-dev-server": "^5.2.5",
126126
"webpack-merge": "^6.0.1",
127127
"react-doctor": "^0.5.1"
128128
},
Lines changed: 334 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,334 @@
1+
import React from 'react';
2+
3+
/**
4+
* Static, theme-aware overview of the VLM-judge evaluation protocol:
5+
* a pair of meshes for the same input photo -> a fixed 24-view headless
6+
* render rig -> two *independent* VLM judge families, each queried in both
7+
* presentation orders -> keep only the order-consistent verdicts -> report
8+
* cross-model agreement. The cheap proxies are scored against the same
9+
* (de-biased) reference.
10+
*
11+
* Strokes and text use `currentColor` / Infima CSS vars so the figure adapts
12+
* to light and dark mode. The green accent marks the de-biased reference path.
13+
*/
14+
export default function JudgeProtocolDiagram(): JSX.Element {
15+
const ok = '#2e8b57';
16+
17+
// camera ring for the render rig, centred above the "24 views" label
18+
const ringCx = 270;
19+
const ringCy = 140;
20+
const ringR = 20;
21+
22+
return (
23+
<figure style={{ margin: '2rem 0' }}>
24+
<svg
25+
viewBox="0 0 820 320"
26+
role="img"
27+
aria-label="A mesh pair is rendered from 24 views, judged by two independent VLM families in both presentation orders, order-inconsistent verdicts are discarded, and cross-model agreement is reported; cheap proxies are scored against the same de-biased reference."
28+
style={{
29+
width: '100%',
30+
height: 'auto',
31+
color: 'var(--ifm-font-color-base)',
32+
}}
33+
fill="none"
34+
>
35+
{/* Stage labels */}
36+
<g
37+
fontSize="12"
38+
fontWeight={600}
39+
textAnchor="middle"
40+
fill="currentColor"
41+
opacity={0.6}
42+
>
43+
<text x="80" y="24">
44+
Mesh pair
45+
</text>
46+
<text x="270" y="24">
47+
24-view render rig
48+
</text>
49+
<text x="490" y="24">
50+
Two independent judges
51+
</text>
52+
<text x="725" y="24">
53+
De-biased verdict
54+
</text>
55+
</g>
56+
57+
{/* Mesh pair box */}
58+
<rect
59+
x="20"
60+
y="110"
61+
width="120"
62+
height="80"
63+
rx="8"
64+
stroke="currentColor"
65+
strokeWidth={1.5}
66+
/>
67+
<text
68+
x="80"
69+
y="140"
70+
fontSize="13"
71+
textAnchor="middle"
72+
fill="currentColor"
73+
>
74+
mesh A
75+
</text>
76+
<text
77+
x="80"
78+
y="157"
79+
fontSize="11"
80+
textAnchor="middle"
81+
fill="currentColor"
82+
opacity={0.5}
83+
>
84+
vs
85+
</text>
86+
<text
87+
x="80"
88+
y="176"
89+
fontSize="13"
90+
textAnchor="middle"
91+
fill="currentColor"
92+
>
93+
mesh B
94+
</text>
95+
96+
{/* arrow -> render rig */}
97+
<path
98+
d="M140 150 L196 150"
99+
stroke="currentColor"
100+
strokeWidth={1.25}
101+
opacity={0.5}
102+
markerEnd="url(#jp-arrow)"
103+
/>
104+
105+
{/* Render rig box: camera ring on top, label below */}
106+
<rect
107+
x="200"
108+
y="110"
109+
width="140"
110+
height="80"
111+
rx="8"
112+
stroke="currentColor"
113+
strokeWidth={1.5}
114+
/>
115+
{[0, 45, 90, 135, 180, 225, 270, 315].map((deg) => {
116+
const rad = (deg * Math.PI) / 180;
117+
return (
118+
<circle
119+
key={deg}
120+
cx={ringCx + ringR * Math.cos(rad)}
121+
cy={ringCy + ringR * Math.sin(rad)}
122+
r={2.5}
123+
fill="currentColor"
124+
opacity={0.55}
125+
/>
126+
);
127+
})}
128+
<text
129+
x="270"
130+
y="182"
131+
fontSize="11"
132+
textAnchor="middle"
133+
fill="currentColor"
134+
opacity={0.6}
135+
>
136+
24 views
137+
</text>
138+
139+
{/* arrow -> judges */}
140+
<path
141+
d="M340 150 L396 150"
142+
stroke="currentColor"
143+
strokeWidth={1.25}
144+
opacity={0.5}
145+
markerEnd="url(#jp-arrow)"
146+
/>
147+
148+
{/* Judge X */}
149+
<rect
150+
x="400"
151+
y="92"
152+
width="190"
153+
height="48"
154+
rx="8"
155+
stroke="currentColor"
156+
strokeWidth={1.5}
157+
/>
158+
<text
159+
x="495"
160+
y="112"
161+
fontSize="12"
162+
fontWeight={600}
163+
textAnchor="middle"
164+
fill="currentColor"
165+
>
166+
Judge X · Qwen2.5-VL-7B
167+
</text>
168+
<text
169+
x="495"
170+
y="129"
171+
fontSize="11"
172+
textAnchor="middle"
173+
fill="currentColor"
174+
opacity={0.6}
175+
>
176+
both orders: (A,B) and (B,A)
177+
</text>
178+
179+
{/* Judge Y */}
180+
<rect
181+
x="400"
182+
y="160"
183+
width="190"
184+
height="48"
185+
rx="8"
186+
stroke="currentColor"
187+
strokeWidth={1.5}
188+
/>
189+
<text
190+
x="495"
191+
y="180"
192+
fontSize="12"
193+
fontWeight={600}
194+
textAnchor="middle"
195+
fill="currentColor"
196+
>
197+
Judge Y · InternVL3-8B
198+
</text>
199+
<text
200+
x="495"
201+
y="197"
202+
fontSize="11"
203+
textAnchor="middle"
204+
fill="currentColor"
205+
opacity={0.6}
206+
>
207+
independent validation
208+
</text>
209+
210+
{/* arrows judges -> filter */}
211+
<path
212+
d="M590 116 C 626 116, 626 150, 656 150"
213+
stroke="currentColor"
214+
strokeWidth={1.25}
215+
opacity={0.5}
216+
markerEnd="url(#jp-arrow)"
217+
/>
218+
<path
219+
d="M590 184 C 626 184, 626 150, 656 150"
220+
stroke="currentColor"
221+
strokeWidth={1.25}
222+
opacity={0.5}
223+
markerEnd="url(#jp-arrow)"
224+
/>
225+
226+
{/* Keep-consistent / agreement box */}
227+
<rect
228+
x="660"
229+
y="118"
230+
width="140"
231+
height="64"
232+
rx="8"
233+
stroke={ok}
234+
strokeWidth={1.75}
235+
/>
236+
<text
237+
x="730"
238+
y="143"
239+
fontSize="12"
240+
textAnchor="middle"
241+
fill="currentColor"
242+
>
243+
keep order-consistent
244+
</text>
245+
<text
246+
x="730"
247+
y="164"
248+
fontSize="13"
249+
fontWeight={700}
250+
textAnchor="middle"
251+
fill={ok}
252+
>
253+
&#954; = 0.66
254+
</text>
255+
256+
{/* Proxy branch underneath */}
257+
<path
258+
d="M270 190 L270 250"
259+
stroke="currentColor"
260+
strokeWidth={1.25}
261+
opacity={0.4}
262+
markerEnd="url(#jp-arrow)"
263+
/>
264+
<rect
265+
x="168"
266+
y="252"
267+
width="204"
268+
height="40"
269+
rx="8"
270+
stroke="currentColor"
271+
strokeWidth={1.25}
272+
strokeDasharray="4 3"
273+
opacity={0.85}
274+
/>
275+
<text
276+
x="270"
277+
y="276"
278+
fontSize="11.5"
279+
textAnchor="middle"
280+
fill="currentColor"
281+
opacity={0.8}
282+
>
283+
cheap proxies (geometry, CLIP)
284+
</text>
285+
<path
286+
d="M372 272 C 560 272, 700 272, 724 188"
287+
stroke="currentColor"
288+
strokeWidth={1.25}
289+
opacity={0.4}
290+
markerEnd="url(#jp-arrow)"
291+
/>
292+
<text
293+
x="540"
294+
y="305"
295+
fontSize="10.5"
296+
textAnchor="middle"
297+
fill="currentColor"
298+
opacity={0.5}
299+
>
300+
scored against the de-biased judge
301+
</text>
302+
303+
<defs>
304+
<marker
305+
id="jp-arrow"
306+
viewBox="0 0 10 10"
307+
refX="8"
308+
refY="5"
309+
markerWidth="6"
310+
markerHeight="6"
311+
orient="auto-start-reverse"
312+
>
313+
<path d="M0 0 L10 5 L0 10 z" fill="currentColor" opacity={0.5} />
314+
</marker>
315+
</defs>
316+
</svg>
317+
<figcaption
318+
style={{
319+
fontSize: '0.85rem',
320+
textAlign: 'center',
321+
opacity: 0.7,
322+
marginTop: '0.5rem',
323+
}}
324+
>
325+
The protocol: render each mesh pair from a fixed 24-view rig, ask{' '}
326+
<em>two independent</em> VLM judges to pick the better one in{' '}
327+
<em>both</em> presentation orders, and keep only the verdicts that
328+
survive the swap. Cross-model agreement (Cohen&rsquo;s &#954;) is the
329+
reliability check; the cheap proxies are scored against this same
330+
reference.
331+
</figcaption>
332+
</figure>
333+
);
334+
}

0 commit comments

Comments
 (0)