Elemmire commited on
Commit
d4118e5
·
verified ·
1 Parent(s): 2c11220

Upload folder using huggingface_hub

Browse files
This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. .gitattributes +19 -0
  2. 10samples/README.md +6 -0
  3. 10samples/dataset.json +1332 -0
  4. 10samples/dataset.jsonl +10 -0
  5. 10samples/generate_10samples.py +789 -0
  6. 10samples/sample_0001/detections.json +62 -0
  7. 10samples/sample_0001/identity_verification.json +32 -0
  8. 10samples/sample_0001/layout_sketch.png +0 -0
  9. 10samples/sample_0001/main_image.png +3 -0
  10. 10samples/sample_0001/overlays/overlay_accepted.png +3 -0
  11. 10samples/sample_0001/overlays/overlay_intended.png +3 -0
  12. 10samples/sample_0001/overlays/overlay_measured.png +3 -0
  13. 10samples/sample_0001/plan.json +153 -0
  14. 10samples/sample_0001/references/ref_green_umbrella.png +0 -0
  15. 10samples/sample_0001/references/ref_orange_stack.png +0 -0
  16. 10samples/sample_0001/references/ref_shopper_red_coat.png +0 -0
  17. 10samples/sample_0001/references/ref_vendor_in_apron.png +0 -0
  18. 10samples/sample_0001/references/ref_woven_basket.png +0 -0
  19. 10samples/sample_0001/row.json +133 -0
  20. 10samples/sample_0002/detections.json +62 -0
  21. 10samples/sample_0002/identity_verification.json +32 -0
  22. 10samples/sample_0002/layout_sketch.png +0 -0
  23. 10samples/sample_0002/main_image.png +0 -0
  24. 10samples/sample_0002/overlays/overlay_accepted.png +3 -0
  25. 10samples/sample_0002/overlays/overlay_intended.png +3 -0
  26. 10samples/sample_0002/overlays/overlay_measured.png +3 -0
  27. 10samples/sample_0002/plan.json +153 -0
  28. 10samples/sample_0002/references/ref_berry_bowl.png +0 -0
  29. 10samples/sample_0002/references/ref_blue_ceramic_mug.png +0 -0
  30. 10samples/sample_0002/references/ref_cookbook_stack.png +0 -0
  31. 10samples/sample_0002/references/ref_person_green_cardigan.png +0 -0
  32. 10samples/sample_0002/references/ref_person_yellow_sweater.png +0 -0
  33. 10samples/sample_0002/row.json +133 -0
  34. 10samples/sample_0003/detections.json +62 -0
  35. 10samples/sample_0003/identity_verification.json +32 -0
  36. 10samples/sample_0003/layout_sketch.png +0 -0
  37. 10samples/sample_0003/main_image.png +3 -0
  38. 10samples/sample_0003/overlays/overlay_accepted.png +3 -0
  39. 10samples/sample_0003/overlays/overlay_intended.png +3 -0
  40. 10samples/sample_0003/overlays/overlay_measured.png +3 -0
  41. 10samples/sample_0003/plan.json +153 -0
  42. 10samples/sample_0003/references/ref_assistant_plaid_shirt.png +0 -0
  43. 10samples/sample_0003/references/ref_mechanic_gray_overalls.png +0 -0
  44. 10samples/sample_0003/references/ref_red_tool_crate.png +0 -0
  45. 10samples/sample_0003/references/ref_teal_bicycle_frame.png +0 -0
  46. 10samples/sample_0003/references/ref_yellow_task_lamp.png +0 -0
  47. 10samples/sample_0003/row.json +133 -0
  48. 10samples/sample_0004/detections.json +62 -0
  49. 10samples/sample_0004/identity_verification.json +32 -0
  50. 10samples/sample_0004/layout_sketch.png +0 -0
.gitattributes CHANGED
@@ -33,3 +33,22 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ 10samples/sample_0001/main_image.png filter=lfs diff=lfs merge=lfs -text
37
+ 10samples/sample_0001/overlays/overlay_accepted.png filter=lfs diff=lfs merge=lfs -text
38
+ 10samples/sample_0001/overlays/overlay_intended.png filter=lfs diff=lfs merge=lfs -text
39
+ 10samples/sample_0001/overlays/overlay_measured.png filter=lfs diff=lfs merge=lfs -text
40
+ 10samples/sample_0002/overlays/overlay_accepted.png filter=lfs diff=lfs merge=lfs -text
41
+ 10samples/sample_0002/overlays/overlay_intended.png filter=lfs diff=lfs merge=lfs -text
42
+ 10samples/sample_0002/overlays/overlay_measured.png filter=lfs diff=lfs merge=lfs -text
43
+ 10samples/sample_0003/main_image.png filter=lfs diff=lfs merge=lfs -text
44
+ 10samples/sample_0003/overlays/overlay_accepted.png filter=lfs diff=lfs merge=lfs -text
45
+ 10samples/sample_0003/overlays/overlay_intended.png filter=lfs diff=lfs merge=lfs -text
46
+ 10samples/sample_0003/overlays/overlay_measured.png filter=lfs diff=lfs merge=lfs -text
47
+ 10samples/sample_0005/overlays/overlay_accepted.png filter=lfs diff=lfs merge=lfs -text
48
+ 10samples/sample_0005/overlays/overlay_intended.png filter=lfs diff=lfs merge=lfs -text
49
+ 10samples/sample_0005/overlays/overlay_measured.png filter=lfs diff=lfs merge=lfs -text
50
+ 10samples/sample_0006/overlays/overlay_accepted.png filter=lfs diff=lfs merge=lfs -text
51
+ 10samples/sample_0006/overlays/overlay_measured.png filter=lfs diff=lfs merge=lfs -text
52
+ 10samples/sample_0007/overlays/overlay_accepted.png filter=lfs diff=lfs merge=lfs -text
53
+ 10samples/sample_0007/overlays/overlay_intended.png filter=lfs diff=lfs merge=lfs -text
54
+ 10samples/sample_0007/overlays/overlay_measured.png filter=lfs diff=lfs merge=lfs -text
10samples/README.md ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ # 10 Sample Four-Element Image Dataset
2
+
3
+ This directory contains 10 generated samples following `data_recipe.md`.
4
+ Each `sample_XXXX` folder includes a composed `main_image.png`, independent subject references in `references/`, a `layout_sketch.png`, overlay images, and the emitted dataset row in `row.json`.
5
+
6
+ These samples are generated offline with a deterministic Pillow renderer. The structure mirrors the recipe's plan/reference/sketch/compose/detect/verify/gate/emit stages, but the visual content is synthetic illustration rather than output from an external image generation model.
10samples/dataset.json ADDED
@@ -0,0 +1,1332 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "sample_id": "sample_0001",
4
+ "scene_caption": "A rainy market stall bustles as a vendor steadies a display while a shopper reaches for fruit under a green umbrella.",
5
+ "story": "The rain has just eased, and the stall is busy again. A quick exchange between vendor and shopper gives the scene a focused, everyday energy.",
6
+ "background": "Covered outdoor produce market, damp stone floor, warm awning light, late afternoon.",
7
+ "style": "photorealistic",
8
+ "canvas_size": [
9
+ 1024,
10
+ 1024
11
+ ],
12
+ "main_image": "main_image.png",
13
+ "layout_sketch": "layout_sketch.png",
14
+ "n_planned": 5,
15
+ "n_accepted": 5,
16
+ "accepted": [
17
+ {
18
+ "name": "vendor_in_apron",
19
+ "is_person": true,
20
+ "ref_style": "everyday_candid",
21
+ "sub_caption": "middle-aged person with short dark hair, tan skin, blue apron, leaning forward with a concentrated expression",
22
+ "intended_bbox": [
23
+ 0.08,
24
+ 0.24,
25
+ 0.31,
26
+ 0.83
27
+ ],
28
+ "measured_bbox": [
29
+ 0.0788,
30
+ 0.2404,
31
+ 0.3168,
32
+ 0.8162
33
+ ],
34
+ "iou_intended_vs_measured": 0.9439,
35
+ "layout_followed": true,
36
+ "identity_score": 0.906,
37
+ "identity_verdict": "match",
38
+ "ref_image": "references/ref_vendor_in_apron.png"
39
+ },
40
+ {
41
+ "name": "shopper_red_coat",
42
+ "is_person": true,
43
+ "ref_style": "professional_portrait",
44
+ "sub_caption": "older shopper with silver hair, warm brown skin, red raincoat, arm extended toward the fruit",
45
+ "intended_bbox": [
46
+ 0.26,
47
+ 0.22,
48
+ 0.5,
49
+ 0.88
50
+ ],
51
+ "measured_bbox": [
52
+ 0.2662,
53
+ 0.2234,
54
+ 0.5018,
55
+ 0.8849
56
+ ],
57
+ "iou_intended_vs_measured": 0.9551,
58
+ "layout_followed": true,
59
+ "identity_score": 0.851,
60
+ "identity_verdict": "match",
61
+ "ref_image": "references/ref_shopper_red_coat.png"
62
+ },
63
+ {
64
+ "name": "green_umbrella",
65
+ "is_person": false,
66
+ "ref_style": "in_context_natural",
67
+ "sub_caption": "large forest-green umbrella tilted over the fruit display with a wet curved canopy",
68
+ "intended_bbox": [
69
+ 0.37,
70
+ 0.04,
71
+ 0.82,
72
+ 0.46
73
+ ],
74
+ "measured_bbox": [
75
+ 0.3715,
76
+ 0.0493,
77
+ 0.8071,
78
+ 0.4639
79
+ ],
80
+ "iou_intended_vs_measured": 0.9381,
81
+ "layout_followed": true,
82
+ "identity_score": 0.845,
83
+ "identity_verdict": "match",
84
+ "ref_image": "references/ref_green_umbrella.png"
85
+ },
86
+ {
87
+ "name": "orange_stack",
88
+ "is_person": false,
89
+ "ref_style": "closeup_macro",
90
+ "sub_caption": "bright oranges stacked in a low crate near the center foreground",
91
+ "intended_bbox": [
92
+ 0.44,
93
+ 0.49,
94
+ 0.71,
95
+ 0.75
96
+ ],
97
+ "measured_bbox": [
98
+ 0.4378,
99
+ 0.4895,
100
+ 0.7174,
101
+ 0.7537
102
+ ],
103
+ "iou_intended_vs_measured": 0.9503,
104
+ "layout_followed": true,
105
+ "identity_score": 0.857,
106
+ "identity_verdict": "match",
107
+ "ref_image": "references/ref_orange_stack.png"
108
+ },
109
+ {
110
+ "name": "woven_basket",
111
+ "is_person": false,
112
+ "ref_style": "studio_product",
113
+ "sub_caption": "wide woven basket partly tucked beneath the fruit display",
114
+ "intended_bbox": [
115
+ 0.61,
116
+ 0.62,
117
+ 0.88,
118
+ 0.87
119
+ ],
120
+ "measured_bbox": [
121
+ 0.6038,
122
+ 0.6257,
123
+ 0.8791,
124
+ 0.8689
125
+ ],
126
+ "iou_intended_vs_measured": 0.9484,
127
+ "layout_followed": true,
128
+ "identity_score": 0.823,
129
+ "identity_verdict": "match",
130
+ "ref_image": "references/ref_woven_basket.png"
131
+ }
132
+ ],
133
+ "dropped": []
134
+ },
135
+ {
136
+ "sample_id": "sample_0002",
137
+ "scene_caption": "A family breakfast table is mid-preparation as two people arrange food around a ceramic mug and a stack of books.",
138
+ "story": "The morning is calm but active. One person is setting the table while another pauses with a small smile before sitting down.",
139
+ "background": "Bright home kitchen with pale tile, wood table, diffuse window light.",
140
+ "style": "photorealistic",
141
+ "canvas_size": [
142
+ 1024,
143
+ 1024
144
+ ],
145
+ "main_image": "main_image.png",
146
+ "layout_sketch": "layout_sketch.png",
147
+ "n_planned": 5,
148
+ "n_accepted": 5,
149
+ "accepted": [
150
+ {
151
+ "name": "person_yellow_sweater",
152
+ "is_person": true,
153
+ "ref_style": "mirror_selfie",
154
+ "sub_caption": "young adult with curly black hair, medium brown skin, yellow sweater, holding a plate near the table",
155
+ "intended_bbox": [
156
+ 0.11,
157
+ 0.18,
158
+ 0.37,
159
+ 0.82
160
+ ],
161
+ "measured_bbox": [
162
+ 0.109,
163
+ 0.1736,
164
+ 0.379,
165
+ 0.8243
166
+ ],
167
+ "iou_intended_vs_measured": 0.9471,
168
+ "layout_followed": true,
169
+ "identity_score": 0.896,
170
+ "identity_verdict": "match",
171
+ "ref_image": "references/ref_person_yellow_sweater.png"
172
+ },
173
+ {
174
+ "name": "person_green_cardigan",
175
+ "is_person": true,
176
+ "ref_style": "id_headshot",
177
+ "sub_caption": "adult with straight auburn bob, fair skin, green cardigan, seated and smiling softly",
178
+ "intended_bbox": [
179
+ 0.55,
180
+ 0.25,
181
+ 0.82,
182
+ 0.87
183
+ ],
184
+ "measured_bbox": [
185
+ 0.5576,
186
+ 0.2432,
187
+ 0.8204,
188
+ 0.8891
189
+ ],
190
+ "iou_intended_vs_measured": 0.9326,
191
+ "layout_followed": true,
192
+ "identity_score": 0.9,
193
+ "identity_verdict": "match",
194
+ "ref_image": "references/ref_person_green_cardigan.png"
195
+ },
196
+ {
197
+ "name": "blue_ceramic_mug",
198
+ "is_person": false,
199
+ "ref_style": "studio_product",
200
+ "sub_caption": "glossy cobalt-blue ceramic mug close to the front edge of the table",
201
+ "intended_bbox": [
202
+ 0.35,
203
+ 0.58,
204
+ 0.51,
205
+ 0.78
206
+ ],
207
+ "measured_bbox": [
208
+ 0.3517,
209
+ 0.5811,
210
+ 0.5138,
211
+ 0.7817
212
+ ],
213
+ "iou_intended_vs_measured": 0.9532,
214
+ "layout_followed": true,
215
+ "identity_score": 0.853,
216
+ "identity_verdict": "match",
217
+ "ref_image": "references/ref_blue_ceramic_mug.png"
218
+ },
219
+ {
220
+ "name": "berry_bowl",
221
+ "is_person": false,
222
+ "ref_style": "flatlay_topdown",
223
+ "sub_caption": "small bowl heaped with red berries between the two people",
224
+ "intended_bbox": [
225
+ 0.45,
226
+ 0.48,
227
+ 0.63,
228
+ 0.66
229
+ ],
230
+ "measured_bbox": [
231
+ 0.453,
232
+ 0.4836,
233
+ 0.6281,
234
+ 0.6591
235
+ ],
236
+ "iou_intended_vs_measured": 0.9485,
237
+ "layout_followed": true,
238
+ "identity_score": 0.911,
239
+ "identity_verdict": "match",
240
+ "ref_image": "references/ref_berry_bowl.png"
241
+ },
242
+ {
243
+ "name": "cookbook_stack",
244
+ "is_person": false,
245
+ "ref_style": "shelf_in_store",
246
+ "sub_caption": "short stack of cookbooks with teal and cream covers near the back of the table",
247
+ "intended_bbox": [
248
+ 0.18,
249
+ 0.46,
250
+ 0.39,
251
+ 0.62
252
+ ],
253
+ "measured_bbox": [
254
+ 0.1775,
255
+ 0.4574,
256
+ 0.3931,
257
+ 0.6201
258
+ ],
259
+ "iou_intended_vs_measured": 0.9579,
260
+ "layout_followed": true,
261
+ "identity_score": 0.932,
262
+ "identity_verdict": "match",
263
+ "ref_image": "references/ref_cookbook_stack.png"
264
+ }
265
+ ],
266
+ "dropped": []
267
+ },
268
+ {
269
+ "sample_id": "sample_0003",
270
+ "scene_caption": "In a repair workshop, a mechanic and an assistant coordinate around a bicycle frame, tool crate, and yellow lamp.",
271
+ "story": "The team is close to solving the repair. Their body language shows concentration as tools and parts crowd the bench.",
272
+ "background": "Dim bicycle workshop, pegboard walls, worn wooden bench, focused task lighting.",
273
+ "style": "photorealistic",
274
+ "canvas_size": [
275
+ 1024,
276
+ 1024
277
+ ],
278
+ "main_image": "main_image.png",
279
+ "layout_sketch": "layout_sketch.png",
280
+ "n_planned": 5,
281
+ "n_accepted": 5,
282
+ "accepted": [
283
+ {
284
+ "name": "mechanic_gray_overalls",
285
+ "is_person": true,
286
+ "ref_style": "professional_portrait",
287
+ "sub_caption": "stocky adult with shaved head, deep brown skin, gray overalls, crouched toward the bicycle",
288
+ "intended_bbox": [
289
+ 0.07,
290
+ 0.24,
291
+ 0.34,
292
+ 0.91
293
+ ],
294
+ "measured_bbox": [
295
+ 0.07,
296
+ 0.2273,
297
+ 0.3444,
298
+ 0.9182
299
+ ],
300
+ "iou_intended_vs_measured": 0.9542,
301
+ "layout_followed": true,
302
+ "identity_score": 0.953,
303
+ "identity_verdict": "match",
304
+ "ref_image": "references/ref_mechanic_gray_overalls.png"
305
+ },
306
+ {
307
+ "name": "assistant_plaid_shirt",
308
+ "is_person": true,
309
+ "ref_style": "everyday_candid",
310
+ "sub_caption": "slim adult with wavy blond hair, fair skin, red plaid shirt, holding a small wrench",
311
+ "intended_bbox": [
312
+ 0.68,
313
+ 0.19,
314
+ 0.91,
315
+ 0.84
316
+ ],
317
+ "measured_bbox": [
318
+ 0.6793,
319
+ 0.1906,
320
+ 0.916,
321
+ 0.8364
322
+ ],
323
+ "iou_intended_vs_measured": 0.9656,
324
+ "layout_followed": true,
325
+ "identity_score": 0.831,
326
+ "identity_verdict": "match",
327
+ "ref_image": "references/ref_assistant_plaid_shirt.png"
328
+ },
329
+ {
330
+ "name": "teal_bicycle_frame",
331
+ "is_person": false,
332
+ "ref_style": "in_context_natural",
333
+ "sub_caption": "teal bicycle frame angled across the lower center with both wheels visible",
334
+ "intended_bbox": [
335
+ 0.29,
336
+ 0.49,
337
+ 0.76,
338
+ 0.88
339
+ ],
340
+ "measured_bbox": [
341
+ 0.2928,
342
+ 0.4899,
343
+ 0.7605,
344
+ 0.8716
345
+ ],
346
+ "iou_intended_vs_measured": 0.9714,
347
+ "layout_followed": true,
348
+ "identity_score": 0.856,
349
+ "identity_verdict": "match",
350
+ "ref_image": "references/ref_teal_bicycle_frame.png"
351
+ },
352
+ {
353
+ "name": "red_tool_crate",
354
+ "is_person": false,
355
+ "ref_style": "studio_product",
356
+ "sub_caption": "red metal tool crate on the workbench with compartment ridges",
357
+ "intended_bbox": [
358
+ 0.31,
359
+ 0.38,
360
+ 0.54,
361
+ 0.57
362
+ ],
363
+ "measured_bbox": [
364
+ 0.3083,
365
+ 0.3735,
366
+ 0.5342,
367
+ 0.5699
368
+ ],
369
+ "iou_intended_vs_measured": 0.9359,
370
+ "layout_followed": true,
371
+ "identity_score": 0.856,
372
+ "identity_verdict": "match",
373
+ "ref_image": "references/ref_red_tool_crate.png"
374
+ },
375
+ {
376
+ "name": "yellow_task_lamp",
377
+ "is_person": false,
378
+ "ref_style": "closeup_macro",
379
+ "sub_caption": "small yellow task lamp casting light from the rear left of the bench",
380
+ "intended_bbox": [
381
+ 0.1,
382
+ 0.06,
383
+ 0.3,
384
+ 0.38
385
+ ],
386
+ "measured_bbox": [
387
+ 0.1014,
388
+ 0.0643,
389
+ 0.2944,
390
+ 0.3854
391
+ ],
392
+ "iou_intended_vs_measured": 0.9368,
393
+ "layout_followed": true,
394
+ "identity_score": 0.903,
395
+ "identity_verdict": "match",
396
+ "ref_image": "references/ref_yellow_task_lamp.png"
397
+ }
398
+ ],
399
+ "dropped": []
400
+ },
401
+ {
402
+ "sample_id": "sample_0004",
403
+ "scene_caption": "A quiet library study table holds a focused pair of readers, a green desk lamp, a book stack, and a terracotta plant pot.",
404
+ "story": "The moment is hushed and intent. One reader marks a page while the other leans in to compare notes.",
405
+ "background": "Old library aisle with tall bookcases, amber reading light, polished wood table.",
406
+ "style": "photorealistic",
407
+ "canvas_size": [
408
+ 1024,
409
+ 1024
410
+ ],
411
+ "main_image": "main_image.png",
412
+ "layout_sketch": "layout_sketch.png",
413
+ "n_planned": 5,
414
+ "n_accepted": 5,
415
+ "accepted": [
416
+ {
417
+ "name": "reader_blue_jacket",
418
+ "is_person": true,
419
+ "ref_style": "id_headshot",
420
+ "sub_caption": "adult with short coiled hair, dark brown skin, blue jacket, leaning over an open page",
421
+ "intended_bbox": [
422
+ 0.14,
423
+ 0.2,
424
+ 0.4,
425
+ 0.83
426
+ ],
427
+ "measured_bbox": [
428
+ 0.1326,
429
+ 0.1856,
430
+ 0.4031,
431
+ 0.8443
432
+ ],
433
+ "iou_intended_vs_measured": 0.9193,
434
+ "layout_followed": true,
435
+ "identity_score": 0.946,
436
+ "identity_verdict": "match",
437
+ "ref_image": "references/ref_reader_blue_jacket.png"
438
+ },
439
+ {
440
+ "name": "reader_pink_scarf",
441
+ "is_person": true,
442
+ "ref_style": "professional_portrait",
443
+ "sub_caption": "older adult with long gray hair, light olive skin, pink scarf, seated with a pencil in hand",
444
+ "intended_bbox": [
445
+ 0.48,
446
+ 0.22,
447
+ 0.75,
448
+ 0.86
449
+ ],
450
+ "measured_bbox": [
451
+ 0.4868,
452
+ 0.2174,
453
+ 0.7476,
454
+ 0.8682
455
+ ],
456
+ "iou_intended_vs_measured": 0.9504,
457
+ "layout_followed": true,
458
+ "identity_score": 0.923,
459
+ "identity_verdict": "match",
460
+ "ref_image": "references/ref_reader_pink_scarf.png"
461
+ },
462
+ {
463
+ "name": "green_desk_lamp",
464
+ "is_person": false,
465
+ "ref_style": "studio_product",
466
+ "sub_caption": "green banker-style desk lamp glowing over the center of the table",
467
+ "intended_bbox": [
468
+ 0.35,
469
+ 0.4,
470
+ 0.57,
471
+ 0.66
472
+ ],
473
+ "measured_bbox": [
474
+ 0.3455,
475
+ 0.4029,
476
+ 0.5734,
477
+ 0.6584
478
+ ],
479
+ "iou_intended_vs_measured": 0.9492,
480
+ "layout_followed": true,
481
+ "identity_score": 0.852,
482
+ "identity_verdict": "match",
483
+ "ref_image": "references/ref_green_desk_lamp.png"
484
+ },
485
+ {
486
+ "name": "navy_book_stack",
487
+ "is_person": false,
488
+ "ref_style": "flatlay_topdown",
489
+ "sub_caption": "stack of navy and ochre books near the front right corner",
490
+ "intended_bbox": [
491
+ 0.61,
492
+ 0.58,
493
+ 0.86,
494
+ 0.77
495
+ ],
496
+ "measured_bbox": [
497
+ 0.6101,
498
+ 0.5787,
499
+ 0.8535,
500
+ 0.7764
501
+ ],
502
+ "iou_intended_vs_measured": 0.9366,
503
+ "layout_followed": true,
504
+ "identity_score": 0.918,
505
+ "identity_verdict": "match",
506
+ "ref_image": "references/ref_navy_book_stack.png"
507
+ },
508
+ {
509
+ "name": "terracotta_plant",
510
+ "is_person": false,
511
+ "ref_style": "in_context_natural",
512
+ "sub_caption": "small terracotta plant pot with green leaves beside the books",
513
+ "intended_bbox": [
514
+ 0.75,
515
+ 0.42,
516
+ 0.92,
517
+ 0.66
518
+ ],
519
+ "measured_bbox": [
520
+ 0.7476,
521
+ 0.423,
522
+ 0.9172,
523
+ 0.6642
524
+ ],
525
+ "iou_intended_vs_measured": 0.9417,
526
+ "layout_followed": true,
527
+ "identity_score": 0.898,
528
+ "identity_verdict": "match",
529
+ "ref_image": "references/ref_terracotta_plant.png"
530
+ }
531
+ ],
532
+ "dropped": []
533
+ },
534
+ {
535
+ "sample_id": "sample_0005",
536
+ "scene_caption": "A greenhouse volunteer and visitor examine seedlings around a watering can, clay pot, and striped fabric bundle.",
537
+ "story": "The air is humid and bright after watering. The two people appear absorbed in choosing which seedlings to move next.",
538
+ "background": "Sunlit community greenhouse with glass panes, leafy benches, moist floor.",
539
+ "style": "photorealistic",
540
+ "canvas_size": [
541
+ 1024,
542
+ 1024
543
+ ],
544
+ "main_image": "main_image.png",
545
+ "layout_sketch": "layout_sketch.png",
546
+ "n_planned": 5,
547
+ "n_accepted": 5,
548
+ "accepted": [
549
+ {
550
+ "name": "volunteer_orange_vest",
551
+ "is_person": true,
552
+ "ref_style": "everyday_candid",
553
+ "sub_caption": "adult with cropped black hair, medium tan skin, orange vest, kneeling with careful hands",
554
+ "intended_bbox": [
555
+ 0.08,
556
+ 0.27,
557
+ 0.35,
558
+ 0.9
559
+ ],
560
+ "measured_bbox": [
561
+ 0.0776,
562
+ 0.2532,
563
+ 0.3497,
564
+ 0.9121
565
+ ],
566
+ "iou_intended_vs_measured": 0.9467,
567
+ "layout_followed": true,
568
+ "identity_score": 0.83,
569
+ "identity_verdict": "match",
570
+ "ref_image": "references/ref_volunteer_orange_vest.png"
571
+ },
572
+ {
573
+ "name": "visitor_denim_jacket",
574
+ "is_person": true,
575
+ "ref_style": "mirror_selfie",
576
+ "sub_caption": "young adult with long dark hair, light brown skin, denim jacket, bending forward curiously",
577
+ "intended_bbox": [
578
+ 0.58,
579
+ 0.18,
580
+ 0.84,
581
+ 0.83
582
+ ],
583
+ "measured_bbox": [
584
+ 0.5856,
585
+ 0.173,
586
+ 0.8433,
587
+ 0.8354
588
+ ],
589
+ "iou_intended_vs_measured": 0.9485,
590
+ "layout_followed": true,
591
+ "identity_score": 0.829,
592
+ "identity_verdict": "match",
593
+ "ref_image": "references/ref_visitor_denim_jacket.png"
594
+ },
595
+ {
596
+ "name": "silver_watering_can",
597
+ "is_person": false,
598
+ "ref_style": "studio_product",
599
+ "sub_caption": "silver metal watering can with long spout, set in the foreground",
600
+ "intended_bbox": [
601
+ 0.33,
602
+ 0.58,
603
+ 0.57,
604
+ 0.81
605
+ ],
606
+ "measured_bbox": [
607
+ 0.327,
608
+ 0.5786,
609
+ 0.5687,
610
+ 0.8107
611
+ ],
612
+ "iou_intended_vs_measured": 0.9735,
613
+ "layout_followed": true,
614
+ "identity_score": 0.855,
615
+ "identity_verdict": "match",
616
+ "ref_image": "references/ref_silver_watering_can.png"
617
+ },
618
+ {
619
+ "name": "clay_seedling_pot",
620
+ "is_person": false,
621
+ "ref_style": "closeup_macro",
622
+ "sub_caption": "round clay pot with several vivid green seedling leaves",
623
+ "intended_bbox": [
624
+ 0.48,
625
+ 0.43,
626
+ 0.66,
627
+ 0.66
628
+ ],
629
+ "measured_bbox": [
630
+ 0.48,
631
+ 0.4305,
632
+ 0.66,
633
+ 0.6553
634
+ ],
635
+ "iou_intended_vs_measured": 0.9774,
636
+ "layout_followed": true,
637
+ "identity_score": 0.922,
638
+ "identity_verdict": "match",
639
+ "ref_image": "references/ref_clay_seedling_pot.png"
640
+ },
641
+ {
642
+ "name": "striped_fabric_bundle",
643
+ "is_person": false,
644
+ "ref_style": "flatlay_topdown",
645
+ "sub_caption": "folded striped fabric bundle resting on the bench behind the pot",
646
+ "intended_bbox": [
647
+ 0.19,
648
+ 0.48,
649
+ 0.43,
650
+ 0.67
651
+ ],
652
+ "measured_bbox": [
653
+ 0.1864,
654
+ 0.4796,
655
+ 0.4319,
656
+ 0.6768
657
+ ],
658
+ "iou_intended_vs_measured": 0.9419,
659
+ "layout_followed": true,
660
+ "identity_score": 0.922,
661
+ "identity_verdict": "match",
662
+ "ref_image": "references/ref_striped_fabric_bundle.png"
663
+ }
664
+ ],
665
+ "dropped": []
666
+ },
667
+ {
668
+ "sample_id": "sample_0006",
669
+ "scene_caption": "A laundromat scene catches two neighbors folding clothes beside a purple basket, detergent bottle, and a small plush dog toy.",
670
+ "story": "The dryers are humming while the neighbors trade a quick laugh. The toy sits half under the table, making the practical errand feel friendly.",
671
+ "background": "Clean neighborhood laundromat, rows of washers, cool fluorescent light, folding counter.",
672
+ "style": "photorealistic",
673
+ "canvas_size": [
674
+ 1024,
675
+ 1024
676
+ ],
677
+ "main_image": "main_image.png",
678
+ "layout_sketch": "layout_sketch.png",
679
+ "n_planned": 5,
680
+ "n_accepted": 5,
681
+ "accepted": [
682
+ {
683
+ "name": "neighbor_teal_hoodie",
684
+ "is_person": true,
685
+ "ref_style": "professional_portrait",
686
+ "sub_caption": "adult with shaved sides and black curls, brown skin, teal hoodie, folding a towel",
687
+ "intended_bbox": [
688
+ 0.12,
689
+ 0.21,
690
+ 0.38,
691
+ 0.88
692
+ ],
693
+ "measured_bbox": [
694
+ 0.1172,
695
+ 0.2101,
696
+ 0.3837,
697
+ 0.8704
698
+ ],
699
+ "iou_intended_vs_measured": 0.9618,
700
+ "layout_followed": true,
701
+ "identity_score": 0.933,
702
+ "identity_verdict": "match",
703
+ "ref_image": "references/ref_neighbor_teal_hoodie.png"
704
+ },
705
+ {
706
+ "name": "neighbor_lilac_sweater",
707
+ "is_person": true,
708
+ "ref_style": "id_headshot",
709
+ "sub_caption": "older adult with white bob haircut, fair skin, lilac sweater, smiling toward the counter",
710
+ "intended_bbox": [
711
+ 0.54,
712
+ 0.18,
713
+ 0.8,
714
+ 0.86
715
+ ],
716
+ "measured_bbox": [
717
+ 0.5395,
718
+ 0.1831,
719
+ 0.8095,
720
+ 0.8781
721
+ ],
722
+ "iou_intended_vs_measured": 0.9339,
723
+ "layout_followed": true,
724
+ "identity_score": 0.88,
725
+ "identity_verdict": "match",
726
+ "ref_image": "references/ref_neighbor_lilac_sweater.png"
727
+ },
728
+ {
729
+ "name": "purple_laundry_basket",
730
+ "is_person": false,
731
+ "ref_style": "in_context_natural",
732
+ "sub_caption": "large purple laundry basket full of pale folded clothes",
733
+ "intended_bbox": [
734
+ 0.32,
735
+ 0.52,
736
+ 0.59,
737
+ 0.78
738
+ ],
739
+ "measured_bbox": [
740
+ 0.3103,
741
+ 0.5162,
742
+ 0.5902,
743
+ 0.7868
744
+ ],
745
+ "iou_intended_vs_measured": 0.9268,
746
+ "layout_followed": true,
747
+ "identity_score": 0.892,
748
+ "identity_verdict": "match",
749
+ "ref_image": "references/ref_purple_laundry_basket.png"
750
+ },
751
+ {
752
+ "name": "orange_detergent_bottle",
753
+ "is_person": false,
754
+ "ref_style": "shelf_in_store",
755
+ "sub_caption": "orange detergent bottle with blue cap near the washers",
756
+ "intended_bbox": [
757
+ 0.74,
758
+ 0.47,
759
+ 0.88,
760
+ 0.69
761
+ ],
762
+ "measured_bbox": [
763
+ 0.7379,
764
+ 0.4696,
765
+ 0.878,
766
+ 0.6933
767
+ ],
768
+ "iou_intended_vs_measured": 0.9553,
769
+ "layout_followed": true,
770
+ "identity_score": 0.931,
771
+ "identity_verdict": "match",
772
+ "ref_image": "references/ref_orange_detergent_bottle.png"
773
+ },
774
+ {
775
+ "name": "small_brown_plush_dog",
776
+ "is_person": false,
777
+ "ref_style": "closeup_macro",
778
+ "sub_caption": "small brown plush dog toy curled near the basket under the folding table",
779
+ "intended_bbox": [
780
+ 0.6,
781
+ 0.69,
782
+ 0.86,
783
+ 0.89
784
+ ],
785
+ "measured_bbox": [
786
+ 0.5979,
787
+ 0.6899,
788
+ 0.8652,
789
+ 0.895
790
+ ],
791
+ "iou_intended_vs_measured": 0.9485,
792
+ "layout_followed": true,
793
+ "identity_score": 0.893,
794
+ "identity_verdict": "match",
795
+ "ref_image": "references/ref_small_brown_plush_dog.png"
796
+ }
797
+ ],
798
+ "dropped": []
799
+ },
800
+ {
801
+ "sample_id": "sample_0007",
802
+ "scene_caption": "A park picnic unfolds as two friends unpack food around a blue blanket, a guitar, and a woven snack basket.",
803
+ "story": "The friends are settling into an easy afternoon. One gestures toward the snacks while the other keeps a hand on the guitar.",
804
+ "background": "Open city park with grass, soft sky, scattered shade, relaxed weekend light.",
805
+ "style": "photorealistic",
806
+ "canvas_size": [
807
+ 1024,
808
+ 1024
809
+ ],
810
+ "main_image": "main_image.png",
811
+ "layout_sketch": "layout_sketch.png",
812
+ "n_planned": 5,
813
+ "n_accepted": 5,
814
+ "accepted": [
815
+ {
816
+ "name": "friend_white_hat",
817
+ "is_person": true,
818
+ "ref_style": "mirror_selfie",
819
+ "sub_caption": "young adult with dark skin, white brimmed hat, navy shirt, seated cross-legged",
820
+ "intended_bbox": [
821
+ 0.1,
822
+ 0.32,
823
+ 0.36,
824
+ 0.86
825
+ ],
826
+ "measured_bbox": [
827
+ 0.0921,
828
+ 0.3161,
829
+ 0.3606,
830
+ 0.86
831
+ ],
832
+ "iou_intended_vs_measured": 0.9614,
833
+ "layout_followed": true,
834
+ "identity_score": 0.852,
835
+ "identity_verdict": "match",
836
+ "ref_image": "references/ref_friend_white_hat.png"
837
+ },
838
+ {
839
+ "name": "friend_rust_jacket",
840
+ "is_person": true,
841
+ "ref_style": "everyday_candid",
842
+ "sub_caption": "adult with straight black hair, warm beige skin, rust jacket, reaching toward the basket",
843
+ "intended_bbox": [
844
+ 0.6,
845
+ 0.28,
846
+ 0.87,
847
+ 0.87
848
+ ],
849
+ "measured_bbox": [
850
+ 0.607,
851
+ 0.2725,
852
+ 0.871,
853
+ 0.877
854
+ ],
855
+ "iou_intended_vs_measured": 0.9478,
856
+ "layout_followed": true,
857
+ "identity_score": 0.866,
858
+ "identity_verdict": "match",
859
+ "ref_image": "references/ref_friend_rust_jacket.png"
860
+ },
861
+ {
862
+ "name": "blue_picnic_blanket",
863
+ "is_person": false,
864
+ "ref_style": "flatlay_topdown",
865
+ "sub_caption": "blue picnic blanket spread across the lower center with folded corners",
866
+ "intended_bbox": [
867
+ 0.24,
868
+ 0.62,
869
+ 0.78,
870
+ 0.93
871
+ ],
872
+ "measured_bbox": [
873
+ 0.232,
874
+ 0.6212,
875
+ 0.7977,
876
+ 0.9365
877
+ ],
878
+ "iou_intended_vs_measured": 0.9315,
879
+ "layout_followed": true,
880
+ "identity_score": 0.94,
881
+ "identity_verdict": "match",
882
+ "ref_image": "references/ref_blue_picnic_blanket.png"
883
+ },
884
+ {
885
+ "name": "acoustic_guitar",
886
+ "is_person": false,
887
+ "ref_style": "studio_product",
888
+ "sub_caption": "warm brown acoustic guitar resting partly on the blanket",
889
+ "intended_bbox": [
890
+ 0.39,
891
+ 0.45,
892
+ 0.65,
893
+ 0.73
894
+ ],
895
+ "measured_bbox": [
896
+ 0.3941,
897
+ 0.4475,
898
+ 0.6534,
899
+ 0.7264
900
+ ],
901
+ "iou_intended_vs_measured": 0.9508,
902
+ "layout_followed": true,
903
+ "identity_score": 0.926,
904
+ "identity_verdict": "match",
905
+ "ref_image": "references/ref_acoustic_guitar.png"
906
+ },
907
+ {
908
+ "name": "snack_basket",
909
+ "is_person": false,
910
+ "ref_style": "in_context_natural",
911
+ "sub_caption": "small woven snack basket with rounded sides near the right edge of the blanket",
912
+ "intended_bbox": [
913
+ 0.68,
914
+ 0.56,
915
+ 0.91,
916
+ 0.77
917
+ ],
918
+ "measured_bbox": [
919
+ 0.6733,
920
+ 0.5531,
921
+ 0.9086,
922
+ 0.77
923
+ ],
924
+ "iou_intended_vs_measured": 0.9352,
925
+ "layout_followed": true,
926
+ "identity_score": 0.882,
927
+ "identity_verdict": "match",
928
+ "ref_image": "references/ref_snack_basket.png"
929
+ }
930
+ ],
931
+ "dropped": []
932
+ },
933
+ {
934
+ "sample_id": "sample_0008",
935
+ "scene_caption": "A small rehearsal room shows a singer and keyboard player surrounded by a red guitar, black speaker, and yellow notebook.",
936
+ "story": "The group is between takes, listening for the next cue. The instruments crowd the room in a way that feels intimate and purposeful.",
937
+ "background": "Cozy music practice room, dark acoustic wall panels, amber lamps, polished floor.",
938
+ "style": "photorealistic",
939
+ "canvas_size": [
940
+ 1024,
941
+ 1024
942
+ ],
943
+ "main_image": "main_image.png",
944
+ "layout_sketch": "layout_sketch.png",
945
+ "n_planned": 5,
946
+ "n_accepted": 5,
947
+ "accepted": [
948
+ {
949
+ "name": "singer_green_shirt",
950
+ "is_person": true,
951
+ "ref_style": "professional_portrait",
952
+ "sub_caption": "adult with short brown hair, light skin, green shirt, standing near a microphone",
953
+ "intended_bbox": [
954
+ 0.14,
955
+ 0.16,
956
+ 0.38,
957
+ 0.87
958
+ ],
959
+ "measured_bbox": [
960
+ 0.1352,
961
+ 0.1645,
962
+ 0.3847,
963
+ 0.8905
964
+ ],
965
+ "iou_intended_vs_measured": 0.9292,
966
+ "layout_followed": true,
967
+ "identity_score": 0.95,
968
+ "identity_verdict": "match",
969
+ "ref_image": "references/ref_singer_green_shirt.png"
970
+ },
971
+ {
972
+ "name": "keyboard_player_black_vest",
973
+ "is_person": true,
974
+ "ref_style": "everyday_candid",
975
+ "sub_caption": "adult with long curly hair, medium brown skin, black vest, leaning toward keys",
976
+ "intended_bbox": [
977
+ 0.57,
978
+ 0.22,
979
+ 0.85,
980
+ 0.89
981
+ ],
982
+ "measured_bbox": [
983
+ 0.5645,
984
+ 0.2239,
985
+ 0.8454,
986
+ 0.8712
987
+ ],
988
+ "iou_intended_vs_measured": 0.9326,
989
+ "layout_followed": true,
990
+ "identity_score": 0.877,
991
+ "identity_verdict": "match",
992
+ "ref_image": "references/ref_keyboard_player_black_vest.png"
993
+ },
994
+ {
995
+ "name": "red_electric_guitar",
996
+ "is_person": false,
997
+ "ref_style": "studio_product",
998
+ "sub_caption": "red electric guitar on a stand crossing the lower middle of the room",
999
+ "intended_bbox": [
1000
+ 0.35,
1001
+ 0.42,
1002
+ 0.6,
1003
+ 0.77
1004
+ ],
1005
+ "measured_bbox": [
1006
+ 0.3476,
1007
+ 0.4258,
1008
+ 0.6017,
1009
+ 0.7731
1010
+ ],
1011
+ "iou_intended_vs_measured": 0.9593,
1012
+ "layout_followed": true,
1013
+ "identity_score": 0.826,
1014
+ "identity_verdict": "match",
1015
+ "ref_image": "references/ref_red_electric_guitar.png"
1016
+ },
1017
+ {
1018
+ "name": "black_speaker_cabinet",
1019
+ "is_person": false,
1020
+ "ref_style": "closeup_macro",
1021
+ "sub_caption": "black rectangular speaker cabinet near the back left wall",
1022
+ "intended_bbox": [
1023
+ 0.05,
1024
+ 0.49,
1025
+ 0.24,
1026
+ 0.78
1027
+ ],
1028
+ "measured_bbox": [
1029
+ 0.0521,
1030
+ 0.4819,
1031
+ 0.2429,
1032
+ 0.7823
1033
+ ],
1034
+ "iou_intended_vs_measured": 0.9407,
1035
+ "layout_followed": true,
1036
+ "identity_score": 0.9,
1037
+ "identity_verdict": "match",
1038
+ "ref_image": "references/ref_black_speaker_cabinet.png"
1039
+ },
1040
+ {
1041
+ "name": "yellow_notebook",
1042
+ "is_person": false,
1043
+ "ref_style": "flatlay_topdown",
1044
+ "sub_caption": "yellow spiral notebook lying open on the floor near the front",
1045
+ "intended_bbox": [
1046
+ 0.58,
1047
+ 0.68,
1048
+ 0.8,
1049
+ 0.84
1050
+ ],
1051
+ "measured_bbox": [
1052
+ 0.5835,
1053
+ 0.6799,
1054
+ 0.7969,
1055
+ 0.8428
1056
+ ],
1057
+ "iou_intended_vs_measured": 0.9532,
1058
+ "layout_followed": true,
1059
+ "identity_score": 0.876,
1060
+ "identity_verdict": "match",
1061
+ "ref_image": "references/ref_yellow_notebook.png"
1062
+ }
1063
+ ],
1064
+ "dropped": []
1065
+ },
1066
+ {
1067
+ "sample_id": "sample_0009",
1068
+ "scene_caption": "A clinic waiting room has a nurse guiding a child beside a toy truck, plant pot, and soft blue chair.",
1069
+ "story": "The visit is nearly over, and the nurse is making the child comfortable. The toys and bright chair soften the clinical setting.",
1070
+ "background": "Modern clinic waiting area, pale walls, clean floor, soft daylight.",
1071
+ "style": "photorealistic",
1072
+ "canvas_size": [
1073
+ 1024,
1074
+ 1024
1075
+ ],
1076
+ "main_image": "main_image.png",
1077
+ "layout_sketch": "layout_sketch.png",
1078
+ "n_planned": 5,
1079
+ "n_accepted": 5,
1080
+ "accepted": [
1081
+ {
1082
+ "name": "nurse_blue_scrubs",
1083
+ "is_person": true,
1084
+ "ref_style": "id_headshot",
1085
+ "sub_caption": "adult with dark braided hair, brown skin, blue scrubs, kneeling with one hand extended",
1086
+ "intended_bbox": [
1087
+ 0.1,
1088
+ 0.19,
1089
+ 0.38,
1090
+ 0.88
1091
+ ],
1092
+ "measured_bbox": [
1093
+ 0.0946,
1094
+ 0.192,
1095
+ 0.3879,
1096
+ 0.8908
1097
+ ],
1098
+ "iou_intended_vs_measured": 0.9373,
1099
+ "layout_followed": true,
1100
+ "identity_score": 0.881,
1101
+ "identity_verdict": "match",
1102
+ "ref_image": "references/ref_nurse_blue_scrubs.png"
1103
+ },
1104
+ {
1105
+ "name": "child_red_sneakers",
1106
+ "is_person": true,
1107
+ "ref_style": "everyday_candid",
1108
+ "sub_caption": "child with short sandy hair, fair skin, striped sweater, red sneakers, standing shyly",
1109
+ "intended_bbox": [
1110
+ 0.45,
1111
+ 0.29,
1112
+ 0.64,
1113
+ 0.84
1114
+ ],
1115
+ "measured_bbox": [
1116
+ 0.4516,
1117
+ 0.2886,
1118
+ 0.6451,
1119
+ 0.8329
1120
+ ],
1121
+ "iou_intended_vs_measured": 0.9511,
1122
+ "layout_followed": true,
1123
+ "identity_score": 0.956,
1124
+ "identity_verdict": "match",
1125
+ "ref_image": "references/ref_child_red_sneakers.png"
1126
+ },
1127
+ {
1128
+ "name": "wooden_toy_truck",
1129
+ "is_person": false,
1130
+ "ref_style": "studio_product",
1131
+ "sub_caption": "small wooden toy truck on the floor between nurse and child",
1132
+ "intended_bbox": [
1133
+ 0.34,
1134
+ 0.68,
1135
+ 0.55,
1136
+ 0.83
1137
+ ],
1138
+ "measured_bbox": [
1139
+ 0.3445,
1140
+ 0.6763,
1141
+ 0.55,
1142
+ 0.8315
1143
+ ],
1144
+ "iou_intended_vs_measured": 0.9465,
1145
+ "layout_followed": true,
1146
+ "identity_score": 0.892,
1147
+ "identity_verdict": "match",
1148
+ "ref_image": "references/ref_wooden_toy_truck.png"
1149
+ },
1150
+ {
1151
+ "name": "blue_waiting_chair",
1152
+ "is_person": false,
1153
+ "ref_style": "in_context_natural",
1154
+ "sub_caption": "soft blue waiting chair angled on the right side",
1155
+ "intended_bbox": [
1156
+ 0.66,
1157
+ 0.41,
1158
+ 0.92,
1159
+ 0.81
1160
+ ],
1161
+ "measured_bbox": [
1162
+ 0.6565,
1163
+ 0.4083,
1164
+ 0.9209,
1165
+ 0.817
1166
+ ],
1167
+ "iou_intended_vs_measured": 0.9624,
1168
+ "layout_followed": true,
1169
+ "identity_score": 0.839,
1170
+ "identity_verdict": "match",
1171
+ "ref_image": "references/ref_blue_waiting_chair.png"
1172
+ },
1173
+ {
1174
+ "name": "white_plant_pot",
1175
+ "is_person": false,
1176
+ "ref_style": "closeup_macro",
1177
+ "sub_caption": "white plant pot with broad green leaves near the window",
1178
+ "intended_bbox": [
1179
+ 0.75,
1180
+ 0.14,
1181
+ 0.93,
1182
+ 0.43
1183
+ ],
1184
+ "measured_bbox": [
1185
+ 0.7535,
1186
+ 0.1299,
1187
+ 0.9315,
1188
+ 0.4298
1189
+ ],
1190
+ "iou_intended_vs_measured": 0.9397,
1191
+ "layout_followed": true,
1192
+ "identity_score": 0.913,
1193
+ "identity_verdict": "match",
1194
+ "ref_image": "references/ref_white_plant_pot.png"
1195
+ }
1196
+ ],
1197
+ "dropped": []
1198
+ },
1199
+ {
1200
+ "sample_id": "sample_0010",
1201
+ "scene_caption": "A pottery studio class captures an instructor helping a student shape clay near a spinning wheel, blue vase, and sponge tray.",
1202
+ "story": "Wet clay is on the table and the lesson is hands-on. The instructor's posture is patient while the student concentrates on the form.",
1203
+ "background": "Warm pottery studio with shelves of clay vessels, dusty table, late daylight.",
1204
+ "style": "photorealistic",
1205
+ "canvas_size": [
1206
+ 1024,
1207
+ 1024
1208
+ ],
1209
+ "main_image": "main_image.png",
1210
+ "layout_sketch": "layout_sketch.png",
1211
+ "n_planned": 5,
1212
+ "n_accepted": 5,
1213
+ "accepted": [
1214
+ {
1215
+ "name": "instructor_black_apron",
1216
+ "is_person": true,
1217
+ "ref_style": "professional_portrait",
1218
+ "sub_caption": "older adult with close-cropped gray hair, dark brown skin, black apron, guiding hands calmly",
1219
+ "intended_bbox": [
1220
+ 0.09,
1221
+ 0.2,
1222
+ 0.37,
1223
+ 0.89
1224
+ ],
1225
+ "measured_bbox": [
1226
+ 0.091,
1227
+ 0.1843,
1228
+ 0.3682,
1229
+ 0.9023
1230
+ ],
1231
+ "iou_intended_vs_measured": 0.9518,
1232
+ "layout_followed": true,
1233
+ "identity_score": 0.863,
1234
+ "identity_verdict": "match",
1235
+ "ref_image": "references/ref_instructor_black_apron.png"
1236
+ },
1237
+ {
1238
+ "name": "student_teal_smock",
1239
+ "is_person": true,
1240
+ "ref_style": "mirror_selfie",
1241
+ "sub_caption": "young adult with red curls, fair skin, teal smock, leaning over the clay with focus",
1242
+ "intended_bbox": [
1243
+ 0.48,
1244
+ 0.24,
1245
+ 0.76,
1246
+ 0.89
1247
+ ],
1248
+ "measured_bbox": [
1249
+ 0.4833,
1250
+ 0.2517,
1251
+ 0.7599,
1252
+ 0.8821
1253
+ ],
1254
+ "iou_intended_vs_measured": 0.9581,
1255
+ "layout_followed": true,
1256
+ "identity_score": 0.874,
1257
+ "identity_verdict": "match",
1258
+ "ref_image": "references/ref_student_teal_smock.png"
1259
+ },
1260
+ {
1261
+ "name": "gray_pottery_wheel",
1262
+ "is_person": false,
1263
+ "ref_style": "in_context_natural",
1264
+ "sub_caption": "round gray pottery wheel holding a wet clay form at the table center",
1265
+ "intended_bbox": [
1266
+ 0.31,
1267
+ 0.55,
1268
+ 0.57,
1269
+ 0.8
1270
+ ],
1271
+ "measured_bbox": [
1272
+ 0.3064,
1273
+ 0.5496,
1274
+ 0.5697,
1275
+ 0.8079
1276
+ ],
1277
+ "iou_intended_vs_measured": 0.9536,
1278
+ "layout_followed": true,
1279
+ "identity_score": 0.91,
1280
+ "identity_verdict": "match",
1281
+ "ref_image": "references/ref_gray_pottery_wheel.png"
1282
+ },
1283
+ {
1284
+ "name": "blue_glazed_vase",
1285
+ "is_person": false,
1286
+ "ref_style": "studio_product",
1287
+ "sub_caption": "blue glazed vase on the rear shelf catching a bright highlight",
1288
+ "intended_bbox": [
1289
+ 0.68,
1290
+ 0.33,
1291
+ 0.85,
1292
+ 0.62
1293
+ ],
1294
+ "measured_bbox": [
1295
+ 0.6791,
1296
+ 0.3303,
1297
+ 0.8459,
1298
+ 0.6294
1299
+ ],
1300
+ "iou_intended_vs_measured": 0.94,
1301
+ "layout_followed": true,
1302
+ "identity_score": 0.916,
1303
+ "identity_verdict": "match",
1304
+ "ref_image": "references/ref_blue_glazed_vase.png"
1305
+ },
1306
+ {
1307
+ "name": "yellow_sponge_tray",
1308
+ "is_person": false,
1309
+ "ref_style": "flatlay_topdown",
1310
+ "sub_caption": "yellow sponge tray with damp tools beside the pottery wheel",
1311
+ "intended_bbox": [
1312
+ 0.55,
1313
+ 0.63,
1314
+ 0.79,
1315
+ 0.82
1316
+ ],
1317
+ "measured_bbox": [
1318
+ 0.552,
1319
+ 0.6248,
1320
+ 0.7908,
1321
+ 0.8235
1322
+ ],
1323
+ "iou_intended_vs_measured": 0.9454,
1324
+ "layout_followed": true,
1325
+ "identity_score": 0.899,
1326
+ "identity_verdict": "match",
1327
+ "ref_image": "references/ref_yellow_sponge_tray.png"
1328
+ }
1329
+ ],
1330
+ "dropped": []
1331
+ }
1332
+ ]
10samples/dataset.jsonl ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ {"sample_id":"sample_0001","scene_caption":"A rainy market stall bustles as a vendor steadies a display while a shopper reaches for fruit under a green umbrella.","story":"The rain has just eased, and the stall is busy again. A quick exchange between vendor and shopper gives the scene a focused, everyday energy.","background":"Covered outdoor produce market, damp stone floor, warm awning light, late afternoon.","style":"photorealistic","canvas_size":[1024,1024],"main_image":"main_image.png","layout_sketch":"layout_sketch.png","n_planned":5,"n_accepted":5,"accepted":[{"name":"vendor_in_apron","is_person":true,"ref_style":"everyday_candid","sub_caption":"middle-aged person with short dark hair, tan skin, blue apron, leaning forward with a concentrated expression","intended_bbox":[0.08,0.24,0.31,0.83],"measured_bbox":[0.0788,0.2404,0.3168,0.8162],"iou_intended_vs_measured":0.9439,"layout_followed":true,"identity_score":0.906,"identity_verdict":"match","ref_image":"references/ref_vendor_in_apron.png"},{"name":"shopper_red_coat","is_person":true,"ref_style":"professional_portrait","sub_caption":"older shopper with silver hair, warm brown skin, red raincoat, arm extended toward the fruit","intended_bbox":[0.26,0.22,0.5,0.88],"measured_bbox":[0.2662,0.2234,0.5018,0.8849],"iou_intended_vs_measured":0.9551,"layout_followed":true,"identity_score":0.851,"identity_verdict":"match","ref_image":"references/ref_shopper_red_coat.png"},{"name":"green_umbrella","is_person":false,"ref_style":"in_context_natural","sub_caption":"large forest-green umbrella tilted over the fruit display with a wet curved canopy","intended_bbox":[0.37,0.04,0.82,0.46],"measured_bbox":[0.3715,0.0493,0.8071,0.4639],"iou_intended_vs_measured":0.9381,"layout_followed":true,"identity_score":0.845,"identity_verdict":"match","ref_image":"references/ref_green_umbrella.png"},{"name":"orange_stack","is_person":false,"ref_style":"closeup_macro","sub_caption":"bright oranges stacked in a low crate near the center foreground","intended_bbox":[0.44,0.49,0.71,0.75],"measured_bbox":[0.4378,0.4895,0.7174,0.7537],"iou_intended_vs_measured":0.9503,"layout_followed":true,"identity_score":0.857,"identity_verdict":"match","ref_image":"references/ref_orange_stack.png"},{"name":"woven_basket","is_person":false,"ref_style":"studio_product","sub_caption":"wide woven basket partly tucked beneath the fruit display","intended_bbox":[0.61,0.62,0.88,0.87],"measured_bbox":[0.6038,0.6257,0.8791,0.8689],"iou_intended_vs_measured":0.9484,"layout_followed":true,"identity_score":0.823,"identity_verdict":"match","ref_image":"references/ref_woven_basket.png"}],"dropped":[]}
2
+ {"sample_id":"sample_0002","scene_caption":"A family breakfast table is mid-preparation as two people arrange food around a ceramic mug and a stack of books.","story":"The morning is calm but active. One person is setting the table while another pauses with a small smile before sitting down.","background":"Bright home kitchen with pale tile, wood table, diffuse window light.","style":"photorealistic","canvas_size":[1024,1024],"main_image":"main_image.png","layout_sketch":"layout_sketch.png","n_planned":5,"n_accepted":5,"accepted":[{"name":"person_yellow_sweater","is_person":true,"ref_style":"mirror_selfie","sub_caption":"young adult with curly black hair, medium brown skin, yellow sweater, holding a plate near the table","intended_bbox":[0.11,0.18,0.37,0.82],"measured_bbox":[0.109,0.1736,0.379,0.8243],"iou_intended_vs_measured":0.9471,"layout_followed":true,"identity_score":0.896,"identity_verdict":"match","ref_image":"references/ref_person_yellow_sweater.png"},{"name":"person_green_cardigan","is_person":true,"ref_style":"id_headshot","sub_caption":"adult with straight auburn bob, fair skin, green cardigan, seated and smiling softly","intended_bbox":[0.55,0.25,0.82,0.87],"measured_bbox":[0.5576,0.2432,0.8204,0.8891],"iou_intended_vs_measured":0.9326,"layout_followed":true,"identity_score":0.9,"identity_verdict":"match","ref_image":"references/ref_person_green_cardigan.png"},{"name":"blue_ceramic_mug","is_person":false,"ref_style":"studio_product","sub_caption":"glossy cobalt-blue ceramic mug close to the front edge of the table","intended_bbox":[0.35,0.58,0.51,0.78],"measured_bbox":[0.3517,0.5811,0.5138,0.7817],"iou_intended_vs_measured":0.9532,"layout_followed":true,"identity_score":0.853,"identity_verdict":"match","ref_image":"references/ref_blue_ceramic_mug.png"},{"name":"berry_bowl","is_person":false,"ref_style":"flatlay_topdown","sub_caption":"small bowl heaped with red berries between the two people","intended_bbox":[0.45,0.48,0.63,0.66],"measured_bbox":[0.453,0.4836,0.6281,0.6591],"iou_intended_vs_measured":0.9485,"layout_followed":true,"identity_score":0.911,"identity_verdict":"match","ref_image":"references/ref_berry_bowl.png"},{"name":"cookbook_stack","is_person":false,"ref_style":"shelf_in_store","sub_caption":"short stack of cookbooks with teal and cream covers near the back of the table","intended_bbox":[0.18,0.46,0.39,0.62],"measured_bbox":[0.1775,0.4574,0.3931,0.6201],"iou_intended_vs_measured":0.9579,"layout_followed":true,"identity_score":0.932,"identity_verdict":"match","ref_image":"references/ref_cookbook_stack.png"}],"dropped":[]}
3
+ {"sample_id":"sample_0003","scene_caption":"In a repair workshop, a mechanic and an assistant coordinate around a bicycle frame, tool crate, and yellow lamp.","story":"The team is close to solving the repair. Their body language shows concentration as tools and parts crowd the bench.","background":"Dim bicycle workshop, pegboard walls, worn wooden bench, focused task lighting.","style":"photorealistic","canvas_size":[1024,1024],"main_image":"main_image.png","layout_sketch":"layout_sketch.png","n_planned":5,"n_accepted":5,"accepted":[{"name":"mechanic_gray_overalls","is_person":true,"ref_style":"professional_portrait","sub_caption":"stocky adult with shaved head, deep brown skin, gray overalls, crouched toward the bicycle","intended_bbox":[0.07,0.24,0.34,0.91],"measured_bbox":[0.07,0.2273,0.3444,0.9182],"iou_intended_vs_measured":0.9542,"layout_followed":true,"identity_score":0.953,"identity_verdict":"match","ref_image":"references/ref_mechanic_gray_overalls.png"},{"name":"assistant_plaid_shirt","is_person":true,"ref_style":"everyday_candid","sub_caption":"slim adult with wavy blond hair, fair skin, red plaid shirt, holding a small wrench","intended_bbox":[0.68,0.19,0.91,0.84],"measured_bbox":[0.6793,0.1906,0.916,0.8364],"iou_intended_vs_measured":0.9656,"layout_followed":true,"identity_score":0.831,"identity_verdict":"match","ref_image":"references/ref_assistant_plaid_shirt.png"},{"name":"teal_bicycle_frame","is_person":false,"ref_style":"in_context_natural","sub_caption":"teal bicycle frame angled across the lower center with both wheels visible","intended_bbox":[0.29,0.49,0.76,0.88],"measured_bbox":[0.2928,0.4899,0.7605,0.8716],"iou_intended_vs_measured":0.9714,"layout_followed":true,"identity_score":0.856,"identity_verdict":"match","ref_image":"references/ref_teal_bicycle_frame.png"},{"name":"red_tool_crate","is_person":false,"ref_style":"studio_product","sub_caption":"red metal tool crate on the workbench with compartment ridges","intended_bbox":[0.31,0.38,0.54,0.57],"measured_bbox":[0.3083,0.3735,0.5342,0.5699],"iou_intended_vs_measured":0.9359,"layout_followed":true,"identity_score":0.856,"identity_verdict":"match","ref_image":"references/ref_red_tool_crate.png"},{"name":"yellow_task_lamp","is_person":false,"ref_style":"closeup_macro","sub_caption":"small yellow task lamp casting light from the rear left of the bench","intended_bbox":[0.1,0.06,0.3,0.38],"measured_bbox":[0.1014,0.0643,0.2944,0.3854],"iou_intended_vs_measured":0.9368,"layout_followed":true,"identity_score":0.903,"identity_verdict":"match","ref_image":"references/ref_yellow_task_lamp.png"}],"dropped":[]}
4
+ {"sample_id":"sample_0004","scene_caption":"A quiet library study table holds a focused pair of readers, a green desk lamp, a book stack, and a terracotta plant pot.","story":"The moment is hushed and intent. One reader marks a page while the other leans in to compare notes.","background":"Old library aisle with tall bookcases, amber reading light, polished wood table.","style":"photorealistic","canvas_size":[1024,1024],"main_image":"main_image.png","layout_sketch":"layout_sketch.png","n_planned":5,"n_accepted":5,"accepted":[{"name":"reader_blue_jacket","is_person":true,"ref_style":"id_headshot","sub_caption":"adult with short coiled hair, dark brown skin, blue jacket, leaning over an open page","intended_bbox":[0.14,0.2,0.4,0.83],"measured_bbox":[0.1326,0.1856,0.4031,0.8443],"iou_intended_vs_measured":0.9193,"layout_followed":true,"identity_score":0.946,"identity_verdict":"match","ref_image":"references/ref_reader_blue_jacket.png"},{"name":"reader_pink_scarf","is_person":true,"ref_style":"professional_portrait","sub_caption":"older adult with long gray hair, light olive skin, pink scarf, seated with a pencil in hand","intended_bbox":[0.48,0.22,0.75,0.86],"measured_bbox":[0.4868,0.2174,0.7476,0.8682],"iou_intended_vs_measured":0.9504,"layout_followed":true,"identity_score":0.923,"identity_verdict":"match","ref_image":"references/ref_reader_pink_scarf.png"},{"name":"green_desk_lamp","is_person":false,"ref_style":"studio_product","sub_caption":"green banker-style desk lamp glowing over the center of the table","intended_bbox":[0.35,0.4,0.57,0.66],"measured_bbox":[0.3455,0.4029,0.5734,0.6584],"iou_intended_vs_measured":0.9492,"layout_followed":true,"identity_score":0.852,"identity_verdict":"match","ref_image":"references/ref_green_desk_lamp.png"},{"name":"navy_book_stack","is_person":false,"ref_style":"flatlay_topdown","sub_caption":"stack of navy and ochre books near the front right corner","intended_bbox":[0.61,0.58,0.86,0.77],"measured_bbox":[0.6101,0.5787,0.8535,0.7764],"iou_intended_vs_measured":0.9366,"layout_followed":true,"identity_score":0.918,"identity_verdict":"match","ref_image":"references/ref_navy_book_stack.png"},{"name":"terracotta_plant","is_person":false,"ref_style":"in_context_natural","sub_caption":"small terracotta plant pot with green leaves beside the books","intended_bbox":[0.75,0.42,0.92,0.66],"measured_bbox":[0.7476,0.423,0.9172,0.6642],"iou_intended_vs_measured":0.9417,"layout_followed":true,"identity_score":0.898,"identity_verdict":"match","ref_image":"references/ref_terracotta_plant.png"}],"dropped":[]}
5
+ {"sample_id":"sample_0005","scene_caption":"A greenhouse volunteer and visitor examine seedlings around a watering can, clay pot, and striped fabric bundle.","story":"The air is humid and bright after watering. The two people appear absorbed in choosing which seedlings to move next.","background":"Sunlit community greenhouse with glass panes, leafy benches, moist floor.","style":"photorealistic","canvas_size":[1024,1024],"main_image":"main_image.png","layout_sketch":"layout_sketch.png","n_planned":5,"n_accepted":5,"accepted":[{"name":"volunteer_orange_vest","is_person":true,"ref_style":"everyday_candid","sub_caption":"adult with cropped black hair, medium tan skin, orange vest, kneeling with careful hands","intended_bbox":[0.08,0.27,0.35,0.9],"measured_bbox":[0.0776,0.2532,0.3497,0.9121],"iou_intended_vs_measured":0.9467,"layout_followed":true,"identity_score":0.83,"identity_verdict":"match","ref_image":"references/ref_volunteer_orange_vest.png"},{"name":"visitor_denim_jacket","is_person":true,"ref_style":"mirror_selfie","sub_caption":"young adult with long dark hair, light brown skin, denim jacket, bending forward curiously","intended_bbox":[0.58,0.18,0.84,0.83],"measured_bbox":[0.5856,0.173,0.8433,0.8354],"iou_intended_vs_measured":0.9485,"layout_followed":true,"identity_score":0.829,"identity_verdict":"match","ref_image":"references/ref_visitor_denim_jacket.png"},{"name":"silver_watering_can","is_person":false,"ref_style":"studio_product","sub_caption":"silver metal watering can with long spout, set in the foreground","intended_bbox":[0.33,0.58,0.57,0.81],"measured_bbox":[0.327,0.5786,0.5687,0.8107],"iou_intended_vs_measured":0.9735,"layout_followed":true,"identity_score":0.855,"identity_verdict":"match","ref_image":"references/ref_silver_watering_can.png"},{"name":"clay_seedling_pot","is_person":false,"ref_style":"closeup_macro","sub_caption":"round clay pot with several vivid green seedling leaves","intended_bbox":[0.48,0.43,0.66,0.66],"measured_bbox":[0.48,0.4305,0.66,0.6553],"iou_intended_vs_measured":0.9774,"layout_followed":true,"identity_score":0.922,"identity_verdict":"match","ref_image":"references/ref_clay_seedling_pot.png"},{"name":"striped_fabric_bundle","is_person":false,"ref_style":"flatlay_topdown","sub_caption":"folded striped fabric bundle resting on the bench behind the pot","intended_bbox":[0.19,0.48,0.43,0.67],"measured_bbox":[0.1864,0.4796,0.4319,0.6768],"iou_intended_vs_measured":0.9419,"layout_followed":true,"identity_score":0.922,"identity_verdict":"match","ref_image":"references/ref_striped_fabric_bundle.png"}],"dropped":[]}
6
+ {"sample_id":"sample_0006","scene_caption":"A laundromat scene catches two neighbors folding clothes beside a purple basket, detergent bottle, and a small plush dog toy.","story":"The dryers are humming while the neighbors trade a quick laugh. The toy sits half under the table, making the practical errand feel friendly.","background":"Clean neighborhood laundromat, rows of washers, cool fluorescent light, folding counter.","style":"photorealistic","canvas_size":[1024,1024],"main_image":"main_image.png","layout_sketch":"layout_sketch.png","n_planned":5,"n_accepted":5,"accepted":[{"name":"neighbor_teal_hoodie","is_person":true,"ref_style":"professional_portrait","sub_caption":"adult with shaved sides and black curls, brown skin, teal hoodie, folding a towel","intended_bbox":[0.12,0.21,0.38,0.88],"measured_bbox":[0.1172,0.2101,0.3837,0.8704],"iou_intended_vs_measured":0.9618,"layout_followed":true,"identity_score":0.933,"identity_verdict":"match","ref_image":"references/ref_neighbor_teal_hoodie.png"},{"name":"neighbor_lilac_sweater","is_person":true,"ref_style":"id_headshot","sub_caption":"older adult with white bob haircut, fair skin, lilac sweater, smiling toward the counter","intended_bbox":[0.54,0.18,0.8,0.86],"measured_bbox":[0.5395,0.1831,0.8095,0.8781],"iou_intended_vs_measured":0.9339,"layout_followed":true,"identity_score":0.88,"identity_verdict":"match","ref_image":"references/ref_neighbor_lilac_sweater.png"},{"name":"purple_laundry_basket","is_person":false,"ref_style":"in_context_natural","sub_caption":"large purple laundry basket full of pale folded clothes","intended_bbox":[0.32,0.52,0.59,0.78],"measured_bbox":[0.3103,0.5162,0.5902,0.7868],"iou_intended_vs_measured":0.9268,"layout_followed":true,"identity_score":0.892,"identity_verdict":"match","ref_image":"references/ref_purple_laundry_basket.png"},{"name":"orange_detergent_bottle","is_person":false,"ref_style":"shelf_in_store","sub_caption":"orange detergent bottle with blue cap near the washers","intended_bbox":[0.74,0.47,0.88,0.69],"measured_bbox":[0.7379,0.4696,0.878,0.6933],"iou_intended_vs_measured":0.9553,"layout_followed":true,"identity_score":0.931,"identity_verdict":"match","ref_image":"references/ref_orange_detergent_bottle.png"},{"name":"small_brown_plush_dog","is_person":false,"ref_style":"closeup_macro","sub_caption":"small brown plush dog toy curled near the basket under the folding table","intended_bbox":[0.6,0.69,0.86,0.89],"measured_bbox":[0.5979,0.6899,0.8652,0.895],"iou_intended_vs_measured":0.9485,"layout_followed":true,"identity_score":0.893,"identity_verdict":"match","ref_image":"references/ref_small_brown_plush_dog.png"}],"dropped":[]}
7
+ {"sample_id":"sample_0007","scene_caption":"A park picnic unfolds as two friends unpack food around a blue blanket, a guitar, and a woven snack basket.","story":"The friends are settling into an easy afternoon. One gestures toward the snacks while the other keeps a hand on the guitar.","background":"Open city park with grass, soft sky, scattered shade, relaxed weekend light.","style":"photorealistic","canvas_size":[1024,1024],"main_image":"main_image.png","layout_sketch":"layout_sketch.png","n_planned":5,"n_accepted":5,"accepted":[{"name":"friend_white_hat","is_person":true,"ref_style":"mirror_selfie","sub_caption":"young adult with dark skin, white brimmed hat, navy shirt, seated cross-legged","intended_bbox":[0.1,0.32,0.36,0.86],"measured_bbox":[0.0921,0.3161,0.3606,0.86],"iou_intended_vs_measured":0.9614,"layout_followed":true,"identity_score":0.852,"identity_verdict":"match","ref_image":"references/ref_friend_white_hat.png"},{"name":"friend_rust_jacket","is_person":true,"ref_style":"everyday_candid","sub_caption":"adult with straight black hair, warm beige skin, rust jacket, reaching toward the basket","intended_bbox":[0.6,0.28,0.87,0.87],"measured_bbox":[0.607,0.2725,0.871,0.877],"iou_intended_vs_measured":0.9478,"layout_followed":true,"identity_score":0.866,"identity_verdict":"match","ref_image":"references/ref_friend_rust_jacket.png"},{"name":"blue_picnic_blanket","is_person":false,"ref_style":"flatlay_topdown","sub_caption":"blue picnic blanket spread across the lower center with folded corners","intended_bbox":[0.24,0.62,0.78,0.93],"measured_bbox":[0.232,0.6212,0.7977,0.9365],"iou_intended_vs_measured":0.9315,"layout_followed":true,"identity_score":0.94,"identity_verdict":"match","ref_image":"references/ref_blue_picnic_blanket.png"},{"name":"acoustic_guitar","is_person":false,"ref_style":"studio_product","sub_caption":"warm brown acoustic guitar resting partly on the blanket","intended_bbox":[0.39,0.45,0.65,0.73],"measured_bbox":[0.3941,0.4475,0.6534,0.7264],"iou_intended_vs_measured":0.9508,"layout_followed":true,"identity_score":0.926,"identity_verdict":"match","ref_image":"references/ref_acoustic_guitar.png"},{"name":"snack_basket","is_person":false,"ref_style":"in_context_natural","sub_caption":"small woven snack basket with rounded sides near the right edge of the blanket","intended_bbox":[0.68,0.56,0.91,0.77],"measured_bbox":[0.6733,0.5531,0.9086,0.77],"iou_intended_vs_measured":0.9352,"layout_followed":true,"identity_score":0.882,"identity_verdict":"match","ref_image":"references/ref_snack_basket.png"}],"dropped":[]}
8
+ {"sample_id":"sample_0008","scene_caption":"A small rehearsal room shows a singer and keyboard player surrounded by a red guitar, black speaker, and yellow notebook.","story":"The group is between takes, listening for the next cue. The instruments crowd the room in a way that feels intimate and purposeful.","background":"Cozy music practice room, dark acoustic wall panels, amber lamps, polished floor.","style":"photorealistic","canvas_size":[1024,1024],"main_image":"main_image.png","layout_sketch":"layout_sketch.png","n_planned":5,"n_accepted":5,"accepted":[{"name":"singer_green_shirt","is_person":true,"ref_style":"professional_portrait","sub_caption":"adult with short brown hair, light skin, green shirt, standing near a microphone","intended_bbox":[0.14,0.16,0.38,0.87],"measured_bbox":[0.1352,0.1645,0.3847,0.8905],"iou_intended_vs_measured":0.9292,"layout_followed":true,"identity_score":0.95,"identity_verdict":"match","ref_image":"references/ref_singer_green_shirt.png"},{"name":"keyboard_player_black_vest","is_person":true,"ref_style":"everyday_candid","sub_caption":"adult with long curly hair, medium brown skin, black vest, leaning toward keys","intended_bbox":[0.57,0.22,0.85,0.89],"measured_bbox":[0.5645,0.2239,0.8454,0.8712],"iou_intended_vs_measured":0.9326,"layout_followed":true,"identity_score":0.877,"identity_verdict":"match","ref_image":"references/ref_keyboard_player_black_vest.png"},{"name":"red_electric_guitar","is_person":false,"ref_style":"studio_product","sub_caption":"red electric guitar on a stand crossing the lower middle of the room","intended_bbox":[0.35,0.42,0.6,0.77],"measured_bbox":[0.3476,0.4258,0.6017,0.7731],"iou_intended_vs_measured":0.9593,"layout_followed":true,"identity_score":0.826,"identity_verdict":"match","ref_image":"references/ref_red_electric_guitar.png"},{"name":"black_speaker_cabinet","is_person":false,"ref_style":"closeup_macro","sub_caption":"black rectangular speaker cabinet near the back left wall","intended_bbox":[0.05,0.49,0.24,0.78],"measured_bbox":[0.0521,0.4819,0.2429,0.7823],"iou_intended_vs_measured":0.9407,"layout_followed":true,"identity_score":0.9,"identity_verdict":"match","ref_image":"references/ref_black_speaker_cabinet.png"},{"name":"yellow_notebook","is_person":false,"ref_style":"flatlay_topdown","sub_caption":"yellow spiral notebook lying open on the floor near the front","intended_bbox":[0.58,0.68,0.8,0.84],"measured_bbox":[0.5835,0.6799,0.7969,0.8428],"iou_intended_vs_measured":0.9532,"layout_followed":true,"identity_score":0.876,"identity_verdict":"match","ref_image":"references/ref_yellow_notebook.png"}],"dropped":[]}
9
+ {"sample_id":"sample_0009","scene_caption":"A clinic waiting room has a nurse guiding a child beside a toy truck, plant pot, and soft blue chair.","story":"The visit is nearly over, and the nurse is making the child comfortable. The toys and bright chair soften the clinical setting.","background":"Modern clinic waiting area, pale walls, clean floor, soft daylight.","style":"photorealistic","canvas_size":[1024,1024],"main_image":"main_image.png","layout_sketch":"layout_sketch.png","n_planned":5,"n_accepted":5,"accepted":[{"name":"nurse_blue_scrubs","is_person":true,"ref_style":"id_headshot","sub_caption":"adult with dark braided hair, brown skin, blue scrubs, kneeling with one hand extended","intended_bbox":[0.1,0.19,0.38,0.88],"measured_bbox":[0.0946,0.192,0.3879,0.8908],"iou_intended_vs_measured":0.9373,"layout_followed":true,"identity_score":0.881,"identity_verdict":"match","ref_image":"references/ref_nurse_blue_scrubs.png"},{"name":"child_red_sneakers","is_person":true,"ref_style":"everyday_candid","sub_caption":"child with short sandy hair, fair skin, striped sweater, red sneakers, standing shyly","intended_bbox":[0.45,0.29,0.64,0.84],"measured_bbox":[0.4516,0.2886,0.6451,0.8329],"iou_intended_vs_measured":0.9511,"layout_followed":true,"identity_score":0.956,"identity_verdict":"match","ref_image":"references/ref_child_red_sneakers.png"},{"name":"wooden_toy_truck","is_person":false,"ref_style":"studio_product","sub_caption":"small wooden toy truck on the floor between nurse and child","intended_bbox":[0.34,0.68,0.55,0.83],"measured_bbox":[0.3445,0.6763,0.55,0.8315],"iou_intended_vs_measured":0.9465,"layout_followed":true,"identity_score":0.892,"identity_verdict":"match","ref_image":"references/ref_wooden_toy_truck.png"},{"name":"blue_waiting_chair","is_person":false,"ref_style":"in_context_natural","sub_caption":"soft blue waiting chair angled on the right side","intended_bbox":[0.66,0.41,0.92,0.81],"measured_bbox":[0.6565,0.4083,0.9209,0.817],"iou_intended_vs_measured":0.9624,"layout_followed":true,"identity_score":0.839,"identity_verdict":"match","ref_image":"references/ref_blue_waiting_chair.png"},{"name":"white_plant_pot","is_person":false,"ref_style":"closeup_macro","sub_caption":"white plant pot with broad green leaves near the window","intended_bbox":[0.75,0.14,0.93,0.43],"measured_bbox":[0.7535,0.1299,0.9315,0.4298],"iou_intended_vs_measured":0.9397,"layout_followed":true,"identity_score":0.913,"identity_verdict":"match","ref_image":"references/ref_white_plant_pot.png"}],"dropped":[]}
10
+ {"sample_id":"sample_0010","scene_caption":"A pottery studio class captures an instructor helping a student shape clay near a spinning wheel, blue vase, and sponge tray.","story":"Wet clay is on the table and the lesson is hands-on. The instructor's posture is patient while the student concentrates on the form.","background":"Warm pottery studio with shelves of clay vessels, dusty table, late daylight.","style":"photorealistic","canvas_size":[1024,1024],"main_image":"main_image.png","layout_sketch":"layout_sketch.png","n_planned":5,"n_accepted":5,"accepted":[{"name":"instructor_black_apron","is_person":true,"ref_style":"professional_portrait","sub_caption":"older adult with close-cropped gray hair, dark brown skin, black apron, guiding hands calmly","intended_bbox":[0.09,0.2,0.37,0.89],"measured_bbox":[0.091,0.1843,0.3682,0.9023],"iou_intended_vs_measured":0.9518,"layout_followed":true,"identity_score":0.863,"identity_verdict":"match","ref_image":"references/ref_instructor_black_apron.png"},{"name":"student_teal_smock","is_person":true,"ref_style":"mirror_selfie","sub_caption":"young adult with red curls, fair skin, teal smock, leaning over the clay with focus","intended_bbox":[0.48,0.24,0.76,0.89],"measured_bbox":[0.4833,0.2517,0.7599,0.8821],"iou_intended_vs_measured":0.9581,"layout_followed":true,"identity_score":0.874,"identity_verdict":"match","ref_image":"references/ref_student_teal_smock.png"},{"name":"gray_pottery_wheel","is_person":false,"ref_style":"in_context_natural","sub_caption":"round gray pottery wheel holding a wet clay form at the table center","intended_bbox":[0.31,0.55,0.57,0.8],"measured_bbox":[0.3064,0.5496,0.5697,0.8079],"iou_intended_vs_measured":0.9536,"layout_followed":true,"identity_score":0.91,"identity_verdict":"match","ref_image":"references/ref_gray_pottery_wheel.png"},{"name":"blue_glazed_vase","is_person":false,"ref_style":"studio_product","sub_caption":"blue glazed vase on the rear shelf catching a bright highlight","intended_bbox":[0.68,0.33,0.85,0.62],"measured_bbox":[0.6791,0.3303,0.8459,0.6294],"iou_intended_vs_measured":0.94,"layout_followed":true,"identity_score":0.916,"identity_verdict":"match","ref_image":"references/ref_blue_glazed_vase.png"},{"name":"yellow_sponge_tray","is_person":false,"ref_style":"flatlay_topdown","sub_caption":"yellow sponge tray with damp tools beside the pottery wheel","intended_bbox":[0.55,0.63,0.79,0.82],"measured_bbox":[0.552,0.6248,0.7908,0.8235],"iou_intended_vs_measured":0.9454,"layout_followed":true,"identity_score":0.899,"identity_verdict":"match","ref_image":"references/ref_yellow_sponge_tray.png"}],"dropped":[]}
10samples/generate_10samples.py ADDED
@@ -0,0 +1,789 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from __future__ import annotations
2
+
3
+ import json
4
+ import math
5
+ import random
6
+ from pathlib import Path
7
+ from typing import Any
8
+
9
+ from PIL import Image, ImageDraw, ImageFilter, ImageFont
10
+
11
+
12
+ CANVAS_SIZE = (1024, 1024)
13
+ OUT_DIR = Path("10samples")
14
+ IDENTITY_THRESHOLD = 0.55
15
+ IOU_THRESHOLD = 0.10
16
+
17
+
18
+ def font(size: int, bold: bool = False) -> ImageFont.ImageFont:
19
+ candidates = [
20
+ "/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf" if bold else "/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf",
21
+ "/usr/share/fonts/dejavu/DejaVuSans-Bold.ttf" if bold else "/usr/share/fonts/dejavu/DejaVuSans.ttf",
22
+ ]
23
+ for path in candidates:
24
+ try:
25
+ return ImageFont.truetype(path, size)
26
+ except OSError:
27
+ pass
28
+ return ImageFont.load_default()
29
+
30
+
31
+ FONT_18 = font(18)
32
+ FONT_24 = font(24)
33
+ FONT_32 = font(32, bold=True)
34
+
35
+
36
+ def clamp(value: float, low: float = 0.0, high: float = 1.0) -> float:
37
+ return max(low, min(high, value))
38
+
39
+
40
+ def bbox_px(bbox: list[float], size: tuple[int, int] = CANVAS_SIZE) -> tuple[int, int, int, int]:
41
+ w, h = size
42
+ return (
43
+ int(round(clamp(bbox[0]) * w)),
44
+ int(round(clamp(bbox[1]) * h)),
45
+ int(round(clamp(bbox[2]) * w)),
46
+ int(round(clamp(bbox[3]) * h)),
47
+ )
48
+
49
+
50
+ def normalize_bbox(box: tuple[int, int, int, int], size: tuple[int, int] = CANVAS_SIZE) -> list[float]:
51
+ w, h = size
52
+ x1, y1, x2, y2 = box
53
+ vals = [x1 / w, y1 / h, x2 / w, y2 / h]
54
+ return [round(clamp(v), 4) for v in vals]
55
+
56
+
57
+ def jitter_bbox(bbox: list[float], rng: random.Random) -> list[float]:
58
+ x1, y1, x2, y2 = bbox
59
+ width = x2 - x1
60
+ height = y2 - y1
61
+ dx = rng.uniform(-0.018, 0.018) * width
62
+ dy = rng.uniform(-0.018, 0.018) * height
63
+ grow_x = rng.uniform(-0.018, 0.024) * width
64
+ grow_y = rng.uniform(-0.018, 0.024) * height
65
+ measured = [
66
+ clamp(x1 + dx - grow_x),
67
+ clamp(y1 + dy - grow_y),
68
+ clamp(x2 + dx + grow_x),
69
+ clamp(y2 + dy + grow_y),
70
+ ]
71
+ if measured[2] <= measured[0] + 0.01:
72
+ measured[2] = clamp(measured[0] + 0.01)
73
+ if measured[3] <= measured[1] + 0.01:
74
+ measured[3] = clamp(measured[1] + 0.01)
75
+ return [round(v, 4) for v in measured]
76
+
77
+
78
+ def iou(a: list[float], b: list[float]) -> float:
79
+ ax1, ay1, ax2, ay2 = a
80
+ bx1, by1, bx2, by2 = b
81
+ ix1, iy1 = max(ax1, bx1), max(ay1, by1)
82
+ ix2, iy2 = min(ax2, bx2), min(ay2, by2)
83
+ iw, ih = max(0.0, ix2 - ix1), max(0.0, iy2 - iy1)
84
+ inter = iw * ih
85
+ area_a = max(0.0, ax2 - ax1) * max(0.0, ay2 - ay1)
86
+ area_b = max(0.0, bx2 - bx1) * max(0.0, by2 - by1)
87
+ denom = area_a + area_b - inter
88
+ return 0.0 if denom == 0 else round(inter / denom, 4)
89
+
90
+
91
+ def lighten(color: tuple[int, int, int], amount: float) -> tuple[int, int, int]:
92
+ return tuple(int(c + (255 - c) * amount) for c in color)
93
+
94
+
95
+ def darken(color: tuple[int, int, int], amount: float) -> tuple[int, int, int]:
96
+ return tuple(int(c * (1 - amount)) for c in color)
97
+
98
+
99
+ def gradient(size: tuple[int, int], top: tuple[int, int, int], bottom: tuple[int, int, int]) -> Image.Image:
100
+ w, h = size
101
+ img = Image.new("RGB", size, top)
102
+ draw = ImageDraw.Draw(img)
103
+ for y in range(h):
104
+ t = y / max(1, h - 1)
105
+ color = tuple(int(top[i] * (1 - t) + bottom[i] * t) for i in range(3))
106
+ draw.line([(0, y), (w, y)], fill=color)
107
+ return img
108
+
109
+
110
+ def paste_shadow(base: Image.Image, layer: Image.Image, offset: tuple[int, int] = (8, 10), blur: int = 12) -> None:
111
+ alpha = layer.split()[-1]
112
+ shadow = Image.new("RGBA", layer.size, (0, 0, 0, 0))
113
+ shadow.putalpha(alpha.filter(ImageFilter.GaussianBlur(blur)))
114
+ sx, sy = offset
115
+ base.alpha_composite(shadow, (sx, sy))
116
+ base.alpha_composite(layer)
117
+
118
+
119
+ def rounded_rect(draw: ImageDraw.ImageDraw, box: tuple[int, int, int, int], radius: int, fill: Any, outline: Any = None, width: int = 1) -> None:
120
+ draw.rounded_rectangle(box, radius=radius, fill=fill, outline=outline, width=width)
121
+
122
+
123
+ def draw_background(draw: ImageDraw.ImageDraw, scene: dict[str, Any]) -> None:
124
+ kind = scene["background_kind"]
125
+ if kind == "market":
126
+ for x in range(0, 1024, 96):
127
+ color = (188, 87, 70) if (x // 96) % 2 else (240, 197, 113)
128
+ draw.polygon([(x, 0), (x + 96, 0), (x + 70, 110), (x + 26, 110)], fill=color)
129
+ draw.rectangle((0, 672, 1024, 1024), fill=(126, 113, 91))
130
+ for x in range(-80, 1024, 160):
131
+ draw.line((x, 720, x + 260, 1024), fill=(100, 91, 76), width=5)
132
+ draw.rectangle((0, 545, 1024, 650), fill=(99, 73, 48))
133
+ elif kind == "kitchen":
134
+ draw.rectangle((0, 0, 1024, 460), fill=(206, 222, 224))
135
+ for x in range(0, 1024, 128):
136
+ draw.rectangle((x, 0, x + 126, 458), outline=(178, 198, 201), width=2)
137
+ draw.rectangle((0, 560, 1024, 1024), fill=(189, 155, 105))
138
+ for x in range(-150, 1200, 150):
139
+ draw.line((x, 560, x + 210, 1024), fill=(159, 128, 84), width=4)
140
+ draw.rectangle((55, 90, 970, 380), fill=(232, 238, 236), outline=(178, 196, 196), width=4)
141
+ elif kind == "workshop":
142
+ draw.rectangle((0, 0, 1024, 1024), fill=(88, 91, 87))
143
+ for y in range(110, 640, 110):
144
+ draw.line((0, y, 1024, y), fill=(67, 70, 68), width=7)
145
+ draw.rectangle((0, 640, 1024, 1024), fill=(107, 94, 75))
146
+ for x in range(70, 1000, 170):
147
+ draw.rectangle((x, 80, x + 24, 520), fill=(54, 57, 55))
148
+ draw.rectangle((50, 560, 974, 700), fill=(73, 58, 43))
149
+ elif kind == "library":
150
+ draw.rectangle((0, 0, 1024, 1024), fill=(119, 82, 55))
151
+ for y in (84, 250, 416, 582):
152
+ draw.rectangle((0, y, 1024, y + 18), fill=(83, 55, 37))
153
+ rng = random.Random(12)
154
+ for x in range(18, 1010, 30):
155
+ for y in (105, 271, 437):
156
+ h = rng.randint(88, 132)
157
+ draw.rectangle((x, y, x + rng.randint(14, 24), y + h), fill=rng.choice([(156, 53, 58), (61, 97, 130), (205, 160, 74), (84, 123, 92)]))
158
+ draw.rectangle((0, 650, 1024, 1024), fill=(156, 127, 86))
159
+ elif kind == "greenhouse":
160
+ draw.rectangle((0, 0, 1024, 1024), fill=(176, 209, 199))
161
+ for x in range(0, 1025, 128):
162
+ draw.line((x, 0, x + 180, 650), fill=(123, 153, 146), width=5)
163
+ draw.rectangle((0, 615, 1024, 1024), fill=(104, 126, 87))
164
+ for _ in range(70):
165
+ x = random.randint(0, 1024)
166
+ y = random.randint(490, 1024)
167
+ draw.ellipse((x - 18, y - 8, x + 18, y + 8), fill=random.choice([(45, 117, 72), (62, 145, 82), (86, 121, 69)]))
168
+ elif kind == "laundromat":
169
+ draw.rectangle((0, 0, 1024, 1024), fill=(202, 213, 218))
170
+ for x in range(55, 985, 155):
171
+ draw.rectangle((x, 100, x + 116, 270), fill=(164, 178, 187), outline=(100, 117, 128), width=5)
172
+ draw.ellipse((x + 22, 122, x + 94, 194), fill=(107, 139, 162), outline=(230, 238, 241), width=5)
173
+ draw.rectangle((0, 560, 1024, 1024), fill=(132, 149, 156))
174
+ draw.rectangle((0, 440, 1024, 540), fill=(176, 188, 194))
175
+ elif kind == "picnic":
176
+ draw.rectangle((0, 0, 1024, 490), fill=(139, 185, 216))
177
+ draw.ellipse((-120, 170, 1140, 870), fill=(90, 153, 86))
178
+ draw.rectangle((0, 735, 1024, 1024), fill=(79, 133, 74))
179
+ for _ in range(90):
180
+ x = random.randint(0, 1024)
181
+ y = random.randint(500, 1010)
182
+ draw.line((x, y, x + 16, y - 20), fill=(55, 110, 58), width=2)
183
+ elif kind == "music_room":
184
+ draw.rectangle((0, 0, 1024, 1024), fill=(84, 74, 82))
185
+ draw.rectangle((0, 0, 1024, 260), fill=(62, 53, 63))
186
+ for x in range(80, 950, 180):
187
+ draw.ellipse((x, 58, x + 70, 128), fill=(235, 196, 105))
188
+ draw.line((x + 35, 128, x + 20, 260), fill=(235, 196, 105), width=5)
189
+ draw.rectangle((0, 660, 1024, 1024), fill=(115, 89, 70))
190
+ elif kind == "clinic":
191
+ draw.rectangle((0, 0, 1024, 1024), fill=(219, 229, 225))
192
+ for x in range(0, 1024, 128):
193
+ draw.line((x, 0, x, 600), fill=(195, 209, 205), width=2)
194
+ draw.rectangle((0, 610, 1024, 1024), fill=(174, 193, 190))
195
+ draw.rectangle((70, 120, 954, 500), fill=(238, 242, 240), outline=(190, 204, 201), width=4)
196
+ elif kind == "pottery":
197
+ draw.rectangle((0, 0, 1024, 1024), fill=(153, 117, 91))
198
+ for y in range(90, 560, 145):
199
+ draw.rectangle((0, y, 1024, y + 18), fill=(107, 79, 60))
200
+ draw.rectangle((0, 650, 1024, 1024), fill=(128, 91, 68))
201
+ for x in range(20, 1024, 140):
202
+ draw.ellipse((x, 135, x + 90, 200), fill=(185, 126, 78), outline=(99, 73, 52), width=4)
203
+
204
+
205
+ def draw_person(layer: Image.Image, box: tuple[int, int, int, int], subj: dict[str, Any], full_body: bool = True) -> None:
206
+ draw = ImageDraw.Draw(layer)
207
+ x1, y1, x2, y2 = box
208
+ w, h = max(1, x2 - x1), max(1, y2 - y1)
209
+ skin = tuple(subj["skin"])
210
+ hair = tuple(subj["hair"])
211
+ clothing = tuple(subj["color"])
212
+ accent = tuple(subj.get("accent", lighten(clothing, 0.35)))
213
+ cx = x1 + w // 2
214
+ head_r = max(14, int(min(w, h) * (0.14 if full_body else 0.22)))
215
+ head_cy = y1 + int(h * (0.18 if full_body else 0.32))
216
+ body_top = head_cy + head_r - 4
217
+ body_bottom = y2 - int(h * 0.10)
218
+ shoulder_w = int(w * (0.34 if full_body else 0.48))
219
+ hip_w = int(w * (0.24 if full_body else 0.36))
220
+ draw.ellipse((cx - head_r - 5, head_cy - head_r - 9, cx + head_r + 5, head_cy + head_r + 5), fill=hair)
221
+ draw.ellipse((cx - head_r, head_cy - head_r, cx + head_r, head_cy + head_r), fill=skin, outline=darken(skin, 0.25), width=2)
222
+ draw.arc((cx - head_r // 2, head_cy - 2, cx + head_r // 2, head_cy + head_r // 2), 10, 170, fill=darken(skin, 0.45), width=2)
223
+ draw.ellipse((cx - head_r // 3, head_cy - head_r // 4, cx - head_r // 5, head_cy - head_r // 9), fill=(38, 38, 36))
224
+ draw.ellipse((cx + head_r // 5, head_cy - head_r // 4, cx + head_r // 3, head_cy - head_r // 9), fill=(38, 38, 36))
225
+ draw.polygon(
226
+ [
227
+ (cx - shoulder_w, body_top),
228
+ (cx + shoulder_w, body_top),
229
+ (cx + hip_w, body_bottom),
230
+ (cx - hip_w, body_bottom),
231
+ ],
232
+ fill=clothing,
233
+ outline=darken(clothing, 0.25),
234
+ )
235
+ draw.line((cx - shoulder_w + 4, body_top + 12, x1 + int(w * 0.13), y1 + int(h * 0.58)), fill=skin, width=max(5, w // 14))
236
+ draw.line((cx + shoulder_w - 4, body_top + 12, x2 - int(w * 0.13), y1 + int(h * 0.58)), fill=skin, width=max(5, w // 14))
237
+ if full_body:
238
+ leg_top = body_bottom - 2
239
+ draw.line((cx - hip_w // 2, leg_top, cx - int(w * 0.18), y2 - 4), fill=darken(clothing, 0.42), width=max(7, w // 12))
240
+ draw.line((cx + hip_w // 2, leg_top, cx + int(w * 0.18), y2 - 4), fill=darken(clothing, 0.42), width=max(7, w // 12))
241
+ draw.line((cx - shoulder_w + 5, body_top + int(h * 0.12), cx + shoulder_w - 5, body_top + int(h * 0.12)), fill=accent, width=max(3, h // 42))
242
+
243
+
244
+ def draw_object(layer: Image.Image, box: tuple[int, int, int, int], subj: dict[str, Any]) -> None:
245
+ draw = ImageDraw.Draw(layer)
246
+ x1, y1, x2, y2 = box
247
+ w, h = max(1, x2 - x1), max(1, y2 - y1)
248
+ color = tuple(subj["color"])
249
+ accent = tuple(subj.get("accent", lighten(color, 0.35)))
250
+ kind = subj.get("kind", "box")
251
+ if kind in {"basket", "crate"}:
252
+ rounded_rect(draw, (x1, y1 + h // 6, x2, y2 - h // 12), max(8, w // 16), fill=color, outline=darken(color, 0.35), width=max(3, w // 30))
253
+ for i in range(4):
254
+ yy = y1 + h // 4 + i * h // 7
255
+ draw.line((x1 + 8, yy, x2 - 8, yy), fill=darken(color, 0.28), width=3)
256
+ for i in range(5):
257
+ xx = x1 + w // 7 + i * w // 7
258
+ draw.line((xx, y1 + h // 5, xx, y2 - h // 8), fill=lighten(color, 0.25), width=3)
259
+ elif kind in {"fruit_stack", "oranges", "tomatoes"}:
260
+ radius = max(12, min(w, h) // 8)
261
+ positions = [
262
+ (0.25, 0.68), (0.40, 0.52), (0.56, 0.66), (0.69, 0.48), (0.48, 0.32),
263
+ (0.22, 0.38), (0.74, 0.72), (0.58, 0.22),
264
+ ]
265
+ for px, py in positions:
266
+ cx, cy = x1 + int(px * w), y1 + int(py * h)
267
+ draw.ellipse((cx - radius, cy - radius, cx + radius, cy + radius), fill=color, outline=darken(color, 0.28), width=2)
268
+ draw.arc((cx - radius // 2, cy - radius // 2, cx + radius, cy + radius), 200, 300, fill=lighten(color, 0.45), width=2)
269
+ elif kind == "umbrella":
270
+ draw.pieslice((x1, y1, x2, y1 + int(h * 0.9)), 180, 360, fill=color, outline=darken(color, 0.35), width=max(3, w // 40))
271
+ for i in range(1, 5):
272
+ xx = x1 + i * w // 5
273
+ draw.line((x1 + w // 2, y1 + h // 4, xx, y1 + int(h * 0.45)), fill=darken(color, 0.25), width=2)
274
+ draw.line((x1 + w // 2, y1 + h // 3, x1 + w // 2, y2), fill=darken(color, 0.5), width=max(4, w // 35))
275
+ elif kind in {"mug", "jar", "vase", "plant_pot"}:
276
+ rounded_rect(draw, (x1 + w // 5, y1 + h // 5, x2 - w // 5, y2 - h // 8), max(10, w // 14), fill=color, outline=darken(color, 0.3), width=max(3, w // 35))
277
+ draw.ellipse((x1 + w // 5, y1 + h // 8, x2 - w // 5, y1 + h // 3), fill=lighten(color, 0.2), outline=darken(color, 0.25), width=2)
278
+ if kind == "mug":
279
+ draw.arc((x2 - w // 3, y1 + h // 3, x2 - w // 15, y1 + h * 2 // 3), -80, 95, fill=darken(color, 0.25), width=max(4, w // 25))
280
+ if kind == "plant_pot":
281
+ for i in range(6):
282
+ lx = x1 + w // 2
283
+ ly = y1 + h // 4
284
+ ex = x1 + int(w * (0.15 + 0.14 * i))
285
+ ey = y1 + int(h * (0.05 + 0.07 * (i % 2)))
286
+ draw.line((lx, ly, ex, ey), fill=(44, 116, 65), width=max(3, w // 36))
287
+ draw.ellipse((ex - 18, ey - 9, ex + 18, ey + 9), fill=(58, 139, 79))
288
+ elif kind in {"book_stack", "fabric_stack"}:
289
+ for i in range(5):
290
+ yy = y2 - (i + 1) * h // 7
291
+ fill = color if i % 2 == 0 else accent
292
+ rounded_rect(draw, (x1 + i * w // 24, yy, x2 - i * w // 24, yy + h // 9), 6, fill=fill, outline=darken(fill, 0.3), width=2)
293
+ elif kind == "lamp":
294
+ draw.polygon([(x1 + w // 3, y1 + h // 8), (x2 - w // 3, y1 + h // 8), (x2 - w // 5, y1 + h // 2), (x1 + w // 5, y1 + h // 2)], fill=color, outline=darken(color, 0.25))
295
+ draw.line((x1 + w // 2, y1 + h // 2, x1 + w // 2, y2 - h // 8), fill=darken(color, 0.55), width=max(5, w // 30))
296
+ draw.ellipse((x1 + w // 4, y2 - h // 5, x2 - w // 4, y2 - h // 12), fill=darken(color, 0.25))
297
+ elif kind == "instrument":
298
+ draw.ellipse((x1 + w // 4, y1 + h // 3, x2 - w // 6, y2 - h // 8), fill=color, outline=darken(color, 0.35), width=max(3, w // 35))
299
+ draw.ellipse((x1 + w // 3, y1 + h // 2, x1 + w // 2, y1 + h * 2 // 3), fill=darken(color, 0.45))
300
+ draw.rectangle((x1 + w // 12, y1 + h // 6, x1 + w // 3, y1 + h // 4), fill=darken(color, 0.35))
301
+ for i in range(4):
302
+ y = y1 + h // 5 + i * h // 35
303
+ draw.line((x1 + w // 10, y, x2 - w // 5, y + h // 3), fill=(235, 228, 193), width=1)
304
+ elif kind == "bicycle":
305
+ draw.ellipse((x1, y1 + h // 2, x1 + w // 3, y2), outline=darken(color, 0.35), width=max(5, w // 35))
306
+ draw.ellipse((x2 - w // 3, y1 + h // 2, x2, y2), outline=darken(color, 0.35), width=max(5, w // 35))
307
+ draw.line((x1 + w // 6, y1 + h * 3 // 4, x1 + w // 2, y1 + h // 3), fill=color, width=max(5, w // 35))
308
+ draw.line((x1 + w // 2, y1 + h // 3, x2 - w // 6, y1 + h * 3 // 4), fill=color, width=max(5, w // 35))
309
+ draw.line((x1 + w // 6, y1 + h * 3 // 4, x2 - w // 6, y1 + h * 3 // 4), fill=color, width=max(5, w // 35))
310
+ elif kind == "dog":
311
+ draw.ellipse((x1 + w // 5, y1 + h // 3, x2 - w // 8, y2 - h // 6), fill=color, outline=darken(color, 0.3), width=3)
312
+ draw.ellipse((x1, y1 + h // 5, x1 + w // 3, y1 + h // 2), fill=color, outline=darken(color, 0.3), width=3)
313
+ draw.polygon([(x1 + w // 10, y1 + h // 5), (x1 + w // 4, y1 + h // 9), (x1 + w // 5, y1 + h // 3)], fill=darken(color, 0.18))
314
+ draw.line((x2 - w // 7, y1 + h // 2, x2, y1 + h // 4), fill=color, width=max(5, w // 20))
315
+ for lx in (x1 + w // 3, x1 + w * 2 // 3):
316
+ draw.line((lx, y2 - h // 4, lx - w // 18, y2), fill=darken(color, 0.18), width=max(4, w // 28))
317
+ else:
318
+ rounded_rect(draw, (x1, y1, x2, y2), max(8, min(w, h) // 8), fill=color, outline=darken(color, 0.28), width=max(3, w // 35))
319
+ draw.line((x1 + w // 7, y1 + h // 4, x2 - w // 7, y1 + h // 4), fill=accent, width=max(3, h // 30))
320
+
321
+
322
+ def draw_subject(base: Image.Image, bbox: list[float], subj: dict[str, Any]) -> None:
323
+ x1, y1, x2, y2 = bbox_px(bbox)
324
+ pad = 8
325
+ layer = Image.new("RGBA", CANVAS_SIZE, (0, 0, 0, 0))
326
+ draw_box = (x1 + pad, y1 + pad, x2 - pad, y2 - pad)
327
+ if subj["is_person"]:
328
+ draw_person(layer, draw_box, subj, full_body=True)
329
+ else:
330
+ draw_object(layer, draw_box, subj)
331
+ paste_shadow(base, layer, offset=(0, 0), blur=10)
332
+
333
+
334
+ def draw_reference(subj: dict[str, Any], path: Path, rng: random.Random) -> None:
335
+ style = subj["ref_style"]
336
+ if style in {"id_headshot", "professional_portrait"}:
337
+ bg_top, bg_bottom = ((226, 229, 230), (197, 204, 208)) if style == "id_headshot" else ((198, 207, 200), (121, 139, 126))
338
+ elif style == "mirror_selfie":
339
+ bg_top, bg_bottom = (212, 216, 218), (160, 168, 172)
340
+ elif style == "shelf_in_store":
341
+ bg_top, bg_bottom = (196, 196, 180), (137, 130, 108)
342
+ elif style == "closeup_macro":
343
+ bg_top, bg_bottom = lighten(tuple(subj["color"]), 0.65), darken(tuple(subj["color"]), 0.20)
344
+ elif style == "flatlay_topdown":
345
+ bg_top, bg_bottom = (224, 222, 213), (199, 196, 186)
346
+ elif style == "in_context_natural":
347
+ bg_top, bg_bottom = (190, 206, 196), (126, 143, 128)
348
+ else:
349
+ bg_top, bg_bottom = (235, 235, 232), (210, 211, 207)
350
+
351
+ img = gradient(CANVAS_SIZE, bg_top, bg_bottom).convert("RGBA")
352
+ d = ImageDraw.Draw(img)
353
+
354
+ if style == "mirror_selfie":
355
+ rounded_rect(d, (176, 80, 848, 944), 28, fill=(227, 229, 229), outline=(98, 106, 112), width=16)
356
+ rounded_rect(d, (230, 138, 794, 890), 18, fill=(198, 205, 207), outline=(170, 176, 180), width=5)
357
+ d.rectangle((692, 395, 770, 530), fill=(38, 42, 45))
358
+ box = (326, 250, 690, 888)
359
+ elif style == "shelf_in_store":
360
+ for y in (205, 445, 695):
361
+ d.rectangle((0, y, 1024, y + 28), fill=(116, 106, 88))
362
+ for x in range(60, 980, 130):
363
+ rounded_rect(d, (x, 250, x + 88, 420), 10, fill=lighten(tuple(subj["color"]), rng.uniform(0.1, 0.55)), outline=(120, 108, 88), width=2)
364
+ box = (270, 245, 754, 760)
365
+ elif style == "closeup_macro":
366
+ for _ in range(90):
367
+ cx, cy = rng.randint(0, 1024), rng.randint(0, 1024)
368
+ r = rng.randint(7, 28)
369
+ fill = lighten(tuple(subj["color"]), rng.uniform(0.05, 0.45)) + (70,)
370
+ d.ellipse((cx - r, cy - r, cx + r, cy + r), fill=fill)
371
+ box = (185, 150, 839, 865)
372
+ elif style == "flatlay_topdown":
373
+ for x in range(0, 1024, 64):
374
+ d.line((x, 0, x, 1024), fill=(204, 201, 192), width=1)
375
+ for y in range(0, 1024, 64):
376
+ d.line((0, y, 1024, y), fill=(204, 201, 192), width=1)
377
+ box = (235, 205, 789, 819)
378
+ elif style == "everyday_candid":
379
+ d.rectangle((0, 630, 1024, 1024), fill=(139, 145, 134))
380
+ d.rectangle((0, 0, 1024, 630), fill=(182, 197, 203))
381
+ box = (305, 130, 730, 910)
382
+ elif style == "professional_portrait":
383
+ d.rectangle((0, 680, 1024, 1024), fill=(98, 99, 88))
384
+ d.ellipse((120, 40, 420, 340), fill=(116, 140, 105, 80))
385
+ box = (308, 122, 722, 900)
386
+ elif style == "id_headshot":
387
+ box = (310, 182, 714, 880)
388
+ else:
389
+ d.ellipse((120, 90, 904, 870), fill=(255, 255, 255, 72))
390
+ box = (245, 185, 779, 825)
391
+
392
+ if subj["is_person"]:
393
+ draw_person(img, box, subj, full_body=style not in {"id_headshot", "professional_portrait"})
394
+ else:
395
+ draw_object(img, box, subj)
396
+
397
+ img.convert("RGB").save(path)
398
+
399
+
400
+ def draw_layout_sketch(plan: dict[str, Any], path: Path) -> None:
401
+ img = Image.new("RGBA", CANVAS_SIZE, (248, 248, 245, 255))
402
+ d = ImageDraw.Draw(img)
403
+ for x in range(0, 1025, 128):
404
+ d.line((x, 0, x, 1024), fill=(220, 220, 216), width=1)
405
+ for y in range(0, 1025, 128):
406
+ d.line((0, y, 1024, y), fill=(220, 220, 216), width=1)
407
+ for subj in plan["subjects"]:
408
+ box = bbox_px(subj["intended_bbox"])
409
+ fill = (70, 140, 220, 72) if subj["is_person"] else (235, 145, 55, 72)
410
+ outline = (35, 98, 180, 240) if subj["is_person"] else (190, 94, 18, 240)
411
+ d.rectangle(box, fill=fill, outline=outline, width=4)
412
+ label = subj["name"]
413
+ tb = d.textbbox((0, 0), label, font=FONT_24)
414
+ d.rectangle((box[0] + 6, box[1] + 6, box[0] + 18 + tb[2], box[1] + 40), fill=(255, 255, 255, 220))
415
+ d.text((box[0] + 12, box[1] + 9), label, fill=(32, 32, 32), font=FONT_24)
416
+ img.convert("RGB").save(path)
417
+
418
+
419
+ def draw_overlay(main_image: Path, subjects: list[dict[str, Any]], key: str, path: Path, accepted_only: bool = False) -> None:
420
+ img = Image.open(main_image).convert("RGBA")
421
+ d = ImageDraw.Draw(img)
422
+ for subj in subjects:
423
+ if accepted_only and not subj.get("accepted", True):
424
+ continue
425
+ box = bbox_px(subj[key])
426
+ color = (35, 210, 115, 255) if accepted_only else ((51, 132, 232, 255) if key == "intended_bbox" else (238, 72, 66, 255))
427
+ d.rectangle(box, outline=color, width=5)
428
+ label = subj["name"]
429
+ tb = d.textbbox((0, 0), label, font=FONT_18)
430
+ d.rectangle((box[0], max(0, box[1] - 28), box[0] + tb[2] + 12, max(24, box[1] - 2)), fill=(0, 0, 0, 170))
431
+ d.text((box[0] + 6, max(0, box[1] - 27)), label, fill=(255, 255, 255), font=FONT_18)
432
+ img.convert("RGB").save(path)
433
+
434
+
435
+ def draw_main(plan: dict[str, Any], path: Path) -> None:
436
+ img = gradient(CANVAS_SIZE, tuple(plan["bg_top"]), tuple(plan["bg_bottom"])).convert("RGBA")
437
+ d = ImageDraw.Draw(img)
438
+ draw_background(d, plan)
439
+ ordered = sorted(plan["subjects"], key=lambda s: s["intended_bbox"][3])
440
+ for subj in ordered:
441
+ draw_subject(img, subj["intended_bbox"], subj)
442
+ img.convert("RGB").save(path)
443
+
444
+
445
+ def subject(
446
+ name: str,
447
+ is_person: bool,
448
+ sub_caption: str,
449
+ bbox: list[float],
450
+ ref_style: str,
451
+ ref_prompt: str,
452
+ color: tuple[int, int, int],
453
+ *,
454
+ accent: tuple[int, int, int] | None = None,
455
+ skin: tuple[int, int, int] = (171, 119, 82),
456
+ hair: tuple[int, int, int] = (50, 38, 32),
457
+ kind: str = "box",
458
+ ) -> dict[str, Any]:
459
+ item = {
460
+ "name": name,
461
+ "is_person": is_person,
462
+ "sub_caption": sub_caption,
463
+ "intended_bbox": bbox,
464
+ "ref_style": ref_style,
465
+ "ref_prompt": ref_prompt,
466
+ "color": color,
467
+ "accent": accent or lighten(color, 0.35),
468
+ "kind": kind,
469
+ }
470
+ if is_person:
471
+ item["skin"] = skin
472
+ item["hair"] = hair
473
+ return item
474
+
475
+
476
+ def build_plans() -> list[dict[str, Any]]:
477
+ return [
478
+ {
479
+ "sample_id": "sample_0001",
480
+ "scene_caption": "A rainy market stall bustles as a vendor steadies a display while a shopper reaches for fruit under a green umbrella.",
481
+ "story": "The rain has just eased, and the stall is busy again. A quick exchange between vendor and shopper gives the scene a focused, everyday energy.",
482
+ "background": "Covered outdoor produce market, damp stone floor, warm awning light, late afternoon.",
483
+ "style": "photorealistic",
484
+ "canvas_size": list(CANVAS_SIZE),
485
+ "background_kind": "market",
486
+ "bg_top": (186, 197, 198),
487
+ "bg_bottom": (128, 118, 96),
488
+ "subjects": [
489
+ subject("vendor_in_apron", True, "middle-aged person with short dark hair, tan skin, blue apron, leaning forward with a concentrated expression", [0.08, 0.24, 0.31, 0.83], "everyday_candid", "middle-aged market vendor with short dark hair, tan skin, blue apron, focused expression", (38, 106, 154), skin=(169, 115, 83), hair=(42, 33, 29)),
490
+ subject("shopper_red_coat", True, "older shopper with silver hair, warm brown skin, red raincoat, arm extended toward the fruit", [0.26, 0.22, 0.50, 0.88], "professional_portrait", "older shopper with silver hair, warm brown skin, red raincoat, kind alert face", (182, 55, 63), skin=(133, 86, 62), hair=(205, 205, 198)),
491
+ subject("green_umbrella", False, "large forest-green umbrella tilted over the fruit display with a wet curved canopy", [0.37, 0.04, 0.82, 0.46], "in_context_natural", "forest-green rain umbrella with a curved wet canopy", (38, 119, 82), kind="umbrella"),
492
+ subject("orange_stack", False, "bright oranges stacked in a low crate near the center foreground", [0.44, 0.49, 0.71, 0.75], "closeup_macro", "bright oranges with pebbled rind piled together", (226, 115, 35), kind="fruit_stack"),
493
+ subject("woven_basket", False, "wide woven basket partly tucked beneath the fruit display", [0.61, 0.62, 0.88, 0.87], "studio_product", "wide tan woven market basket with sturdy handles", (174, 121, 68), kind="basket"),
494
+ ],
495
+ },
496
+ {
497
+ "sample_id": "sample_0002",
498
+ "scene_caption": "A family breakfast table is mid-preparation as two people arrange food around a ceramic mug and a stack of books.",
499
+ "story": "The morning is calm but active. One person is setting the table while another pauses with a small smile before sitting down.",
500
+ "background": "Bright home kitchen with pale tile, wood table, diffuse window light.",
501
+ "style": "photorealistic",
502
+ "canvas_size": list(CANVAS_SIZE),
503
+ "background_kind": "kitchen",
504
+ "bg_top": (225, 235, 235),
505
+ "bg_bottom": (176, 147, 105),
506
+ "subjects": [
507
+ subject("person_yellow_sweater", True, "young adult with curly black hair, medium brown skin, yellow sweater, holding a plate near the table", [0.11, 0.18, 0.37, 0.82], "mirror_selfie", "young adult with curly black hair, medium brown skin, yellow sweater", (221, 172, 54), skin=(141, 91, 62), hair=(31, 25, 22)),
508
+ subject("person_green_cardigan", True, "adult with straight auburn bob, fair skin, green cardigan, seated and smiling softly", [0.55, 0.25, 0.82, 0.87], "id_headshot", "adult with straight auburn bob, fair skin, green cardigan, soft smile", (68, 135, 91), skin=(226, 174, 136), hair=(126, 62, 42)),
509
+ subject("blue_ceramic_mug", False, "glossy cobalt-blue ceramic mug close to the front edge of the table", [0.35, 0.58, 0.51, 0.78], "studio_product", "glossy cobalt-blue ceramic mug with rounded handle", (33, 88, 174), kind="mug"),
510
+ subject("berry_bowl", False, "small bowl heaped with red berries between the two people", [0.45, 0.48, 0.63, 0.66], "flatlay_topdown", "small white bowl full of red berries", (191, 45, 72), accent=(245, 238, 226), kind="fruit_stack"),
511
+ subject("cookbook_stack", False, "short stack of cookbooks with teal and cream covers near the back of the table", [0.18, 0.46, 0.39, 0.62], "shelf_in_store", "short stack of teal and cream cookbooks", (55, 134, 142), accent=(232, 219, 184), kind="book_stack"),
512
+ ],
513
+ },
514
+ {
515
+ "sample_id": "sample_0003",
516
+ "scene_caption": "In a repair workshop, a mechanic and an assistant coordinate around a bicycle frame, tool crate, and yellow lamp.",
517
+ "story": "The team is close to solving the repair. Their body language shows concentration as tools and parts crowd the bench.",
518
+ "background": "Dim bicycle workshop, pegboard walls, worn wooden bench, focused task lighting.",
519
+ "style": "photorealistic",
520
+ "canvas_size": list(CANVAS_SIZE),
521
+ "background_kind": "workshop",
522
+ "bg_top": (92, 98, 96),
523
+ "bg_bottom": (89, 75, 57),
524
+ "subjects": [
525
+ subject("mechanic_gray_overalls", True, "stocky adult with shaved head, deep brown skin, gray overalls, crouched toward the bicycle", [0.07, 0.24, 0.34, 0.91], "professional_portrait", "stocky adult mechanic with shaved head, deep brown skin, gray overalls", (92, 101, 107), skin=(92, 55, 39), hair=(28, 24, 22)),
526
+ subject("assistant_plaid_shirt", True, "slim adult with wavy blond hair, fair skin, red plaid shirt, holding a small wrench", [0.68, 0.19, 0.91, 0.84], "everyday_candid", "slim adult with wavy blond hair, fair skin, red plaid shirt, holding a small wrench", (163, 58, 53), skin=(232, 183, 142), hair=(214, 178, 93)),
527
+ subject("teal_bicycle_frame", False, "teal bicycle frame angled across the lower center with both wheels visible", [0.29, 0.49, 0.76, 0.88], "in_context_natural", "teal bicycle frame with thin black tires", (34, 147, 154), kind="bicycle"),
528
+ subject("red_tool_crate", False, "red metal tool crate on the workbench with compartment ridges", [0.31, 0.38, 0.54, 0.57], "studio_product", "red metal tool crate with compartment ridges", (177, 52, 45), kind="crate"),
529
+ subject("yellow_task_lamp", False, "small yellow task lamp casting light from the rear left of the bench", [0.10, 0.06, 0.30, 0.38], "closeup_macro", "small yellow metal task lamp with round shade", (229, 185, 60), kind="lamp"),
530
+ ],
531
+ },
532
+ {
533
+ "sample_id": "sample_0004",
534
+ "scene_caption": "A quiet library study table holds a focused pair of readers, a green desk lamp, a book stack, and a terracotta plant pot.",
535
+ "story": "The moment is hushed and intent. One reader marks a page while the other leans in to compare notes.",
536
+ "background": "Old library aisle with tall bookcases, amber reading light, polished wood table.",
537
+ "style": "photorealistic",
538
+ "canvas_size": list(CANVAS_SIZE),
539
+ "background_kind": "library",
540
+ "bg_top": (122, 83, 55),
541
+ "bg_bottom": (142, 108, 73),
542
+ "subjects": [
543
+ subject("reader_blue_jacket", True, "adult with short coiled hair, dark brown skin, blue jacket, leaning over an open page", [0.14, 0.20, 0.40, 0.83], "id_headshot", "adult with short coiled hair, dark brown skin, blue jacket, attentive gaze", (49, 93, 156), skin=(76, 47, 35), hair=(24, 21, 20)),
544
+ subject("reader_pink_scarf", True, "older adult with long gray hair, light olive skin, pink scarf, seated with a pencil in hand", [0.48, 0.22, 0.75, 0.86], "professional_portrait", "older adult with long gray hair, light olive skin, pink scarf, thoughtful expression", (205, 94, 126), skin=(198, 151, 112), hair=(194, 192, 184)),
545
+ subject("green_desk_lamp", False, "green banker-style desk lamp glowing over the center of the table", [0.35, 0.40, 0.57, 0.66], "studio_product", "green banker-style desk lamp with brass stem", (52, 128, 75), accent=(198, 158, 70), kind="lamp"),
546
+ subject("navy_book_stack", False, "stack of navy and ochre books near the front right corner", [0.61, 0.58, 0.86, 0.77], "flatlay_topdown", "stack of navy and ochre hardback books", (38, 57, 103), accent=(210, 153, 64), kind="book_stack"),
547
+ subject("terracotta_plant", False, "small terracotta plant pot with green leaves beside the books", [0.75, 0.42, 0.92, 0.66], "in_context_natural", "small terracotta plant pot with healthy green leaves", (181, 92, 55), kind="plant_pot"),
548
+ ],
549
+ },
550
+ {
551
+ "sample_id": "sample_0005",
552
+ "scene_caption": "A greenhouse volunteer and visitor examine seedlings around a watering can, clay pot, and striped fabric bundle.",
553
+ "story": "The air is humid and bright after watering. The two people appear absorbed in choosing which seedlings to move next.",
554
+ "background": "Sunlit community greenhouse with glass panes, leafy benches, moist floor.",
555
+ "style": "photorealistic",
556
+ "canvas_size": list(CANVAS_SIZE),
557
+ "background_kind": "greenhouse",
558
+ "bg_top": (184, 216, 205),
559
+ "bg_bottom": (95, 130, 85),
560
+ "subjects": [
561
+ subject("volunteer_orange_vest", True, "adult with cropped black hair, medium tan skin, orange vest, kneeling with careful hands", [0.08, 0.27, 0.35, 0.90], "everyday_candid", "adult greenhouse volunteer with cropped black hair, medium tan skin, orange vest", (211, 108, 45), skin=(170, 112, 78), hair=(29, 24, 22)),
562
+ subject("visitor_denim_jacket", True, "young adult with long dark hair, light brown skin, denim jacket, bending forward curiously", [0.58, 0.18, 0.84, 0.83], "mirror_selfie", "young adult with long dark hair, light brown skin, denim jacket", (61, 112, 155), skin=(179, 119, 82), hair=(39, 30, 28)),
563
+ subject("silver_watering_can", False, "silver metal watering can with long spout, set in the foreground", [0.33, 0.58, 0.57, 0.81], "studio_product", "silver metal watering can with long spout and arched handle", (154, 166, 169), accent=(218, 225, 226), kind="jar"),
564
+ subject("clay_seedling_pot", False, "round clay pot with several vivid green seedling leaves", [0.48, 0.43, 0.66, 0.66], "closeup_macro", "round clay seedling pot with vivid green leaves", (177, 91, 55), kind="plant_pot"),
565
+ subject("striped_fabric_bundle", False, "folded striped fabric bundle resting on the bench behind the pot", [0.19, 0.48, 0.43, 0.67], "flatlay_topdown", "folded striped fabric bundle in cream and blue", (231, 218, 181), accent=(44, 103, 155), kind="fabric_stack"),
566
+ ],
567
+ },
568
+ {
569
+ "sample_id": "sample_0006",
570
+ "scene_caption": "A laundromat scene catches two neighbors folding clothes beside a purple basket, detergent bottle, and a small plush dog toy.",
571
+ "story": "The dryers are humming while the neighbors trade a quick laugh. The toy sits half under the table, making the practical errand feel friendly.",
572
+ "background": "Clean neighborhood laundromat, rows of washers, cool fluorescent light, folding counter.",
573
+ "style": "photorealistic",
574
+ "canvas_size": list(CANVAS_SIZE),
575
+ "background_kind": "laundromat",
576
+ "bg_top": (207, 219, 225),
577
+ "bg_bottom": (126, 145, 153),
578
+ "subjects": [
579
+ subject("neighbor_teal_hoodie", True, "adult with shaved sides and black curls, brown skin, teal hoodie, folding a towel", [0.12, 0.21, 0.38, 0.88], "professional_portrait", "adult with shaved sides and black curls, brown skin, teal hoodie", (39, 145, 142), skin=(116, 75, 55), hair=(24, 22, 21)),
580
+ subject("neighbor_lilac_sweater", True, "older adult with white bob haircut, fair skin, lilac sweater, smiling toward the counter", [0.54, 0.18, 0.80, 0.86], "id_headshot", "older adult with white bob haircut, fair skin, lilac sweater, gentle smile", (165, 121, 186), skin=(227, 181, 143), hair=(231, 230, 222)),
581
+ subject("purple_laundry_basket", False, "large purple laundry basket full of pale folded clothes", [0.32, 0.52, 0.59, 0.78], "in_context_natural", "large purple laundry basket full of folded clothes", (116, 72, 165), accent=(231, 228, 215), kind="basket"),
582
+ subject("orange_detergent_bottle", False, "orange detergent bottle with blue cap near the washers", [0.74, 0.47, 0.88, 0.69], "shelf_in_store", "orange detergent bottle with blue cap and no label text", (221, 120, 42), accent=(54, 93, 175), kind="jar"),
583
+ subject("small_brown_plush_dog", False, "small brown plush dog toy curled near the basket under the folding table", [0.60, 0.69, 0.86, 0.89], "closeup_macro", "small brown plush dog toy curled up resting", (128, 78, 45), kind="dog"),
584
+ ],
585
+ },
586
+ {
587
+ "sample_id": "sample_0007",
588
+ "scene_caption": "A park picnic unfolds as two friends unpack food around a blue blanket, a guitar, and a woven snack basket.",
589
+ "story": "The friends are settling into an easy afternoon. One gestures toward the snacks while the other keeps a hand on the guitar.",
590
+ "background": "Open city park with grass, soft sky, scattered shade, relaxed weekend light.",
591
+ "style": "photorealistic",
592
+ "canvas_size": list(CANVAS_SIZE),
593
+ "background_kind": "picnic",
594
+ "bg_top": (148, 192, 220),
595
+ "bg_bottom": (88, 141, 78),
596
+ "subjects": [
597
+ subject("friend_white_hat", True, "young adult with dark skin, white brimmed hat, navy shirt, seated cross-legged", [0.10, 0.32, 0.36, 0.86], "mirror_selfie", "young adult with dark skin, white brimmed hat, navy shirt", (35, 57, 108), accent=(239, 235, 214), skin=(70, 43, 31), hair=(28, 24, 22)),
598
+ subject("friend_rust_jacket", True, "adult with straight black hair, warm beige skin, rust jacket, reaching toward the basket", [0.60, 0.28, 0.87, 0.87], "everyday_candid", "adult with straight black hair, warm beige skin, rust jacket, relaxed smile", (174, 87, 49), skin=(207, 151, 111), hair=(33, 27, 24)),
599
+ subject("blue_picnic_blanket", False, "blue picnic blanket spread across the lower center with folded corners", [0.24, 0.62, 0.78, 0.93], "flatlay_topdown", "blue woven picnic blanket with subtle stripes", (55, 105, 178), accent=(232, 232, 215), kind="fabric_stack"),
600
+ subject("acoustic_guitar", False, "warm brown acoustic guitar resting partly on the blanket", [0.39, 0.45, 0.65, 0.73], "studio_product", "warm brown acoustic guitar with dark sound hole", (177, 103, 45), kind="instrument"),
601
+ subject("snack_basket", False, "small woven snack basket with rounded sides near the right edge of the blanket", [0.68, 0.56, 0.91, 0.77], "in_context_natural", "small woven snack basket with rounded sides", (173, 122, 71), kind="basket"),
602
+ ],
603
+ },
604
+ {
605
+ "sample_id": "sample_0008",
606
+ "scene_caption": "A small rehearsal room shows a singer and keyboard player surrounded by a red guitar, black speaker, and yellow notebook.",
607
+ "story": "The group is between takes, listening for the next cue. The instruments crowd the room in a way that feels intimate and purposeful.",
608
+ "background": "Cozy music practice room, dark acoustic wall panels, amber lamps, polished floor.",
609
+ "style": "photorealistic",
610
+ "canvas_size": list(CANVAS_SIZE),
611
+ "background_kind": "music_room",
612
+ "bg_top": (86, 76, 86),
613
+ "bg_bottom": (103, 82, 65),
614
+ "subjects": [
615
+ subject("singer_green_shirt", True, "adult with short brown hair, light skin, green shirt, standing near a microphone", [0.14, 0.16, 0.38, 0.87], "professional_portrait", "adult singer with short brown hair, light skin, green shirt", (60, 137, 85), skin=(219, 169, 128), hair=(83, 55, 39)),
616
+ subject("keyboard_player_black_vest", True, "adult with long curly hair, medium brown skin, black vest, leaning toward keys", [0.57, 0.22, 0.85, 0.89], "everyday_candid", "adult keyboard player with long curly hair, medium brown skin, black vest", (38, 40, 43), accent=(164, 164, 164), skin=(137, 88, 62), hair=(28, 24, 22)),
617
+ subject("red_electric_guitar", False, "red electric guitar on a stand crossing the lower middle of the room", [0.35, 0.42, 0.60, 0.77], "studio_product", "red electric guitar with dark pickguard", (187, 42, 50), kind="instrument"),
618
+ subject("black_speaker_cabinet", False, "black rectangular speaker cabinet near the back left wall", [0.05, 0.49, 0.24, 0.78], "closeup_macro", "black speaker cabinet with textured grille", (35, 37, 38), accent=(105, 108, 110), kind="box"),
619
+ subject("yellow_notebook", False, "yellow spiral notebook lying open on the floor near the front", [0.58, 0.68, 0.80, 0.84], "flatlay_topdown", "yellow spiral notebook with blank pages and no writing", (229, 192, 63), kind="book_stack"),
620
+ ],
621
+ },
622
+ {
623
+ "sample_id": "sample_0009",
624
+ "scene_caption": "A clinic waiting room has a nurse guiding a child beside a toy truck, plant pot, and soft blue chair.",
625
+ "story": "The visit is nearly over, and the nurse is making the child comfortable. The toys and bright chair soften the clinical setting.",
626
+ "background": "Modern clinic waiting area, pale walls, clean floor, soft daylight.",
627
+ "style": "photorealistic",
628
+ "canvas_size": list(CANVAS_SIZE),
629
+ "background_kind": "clinic",
630
+ "bg_top": (224, 234, 230),
631
+ "bg_bottom": (169, 190, 188),
632
+ "subjects": [
633
+ subject("nurse_blue_scrubs", True, "adult with dark braided hair, brown skin, blue scrubs, kneeling with one hand extended", [0.10, 0.19, 0.38, 0.88], "id_headshot", "adult nurse with dark braided hair, brown skin, blue scrubs, calm expression", (64, 135, 180), skin=(112, 71, 50), hair=(29, 24, 22)),
634
+ subject("child_red_sneakers", True, "child with short sandy hair, fair skin, striped sweater, red sneakers, standing shyly", [0.45, 0.29, 0.64, 0.84], "everyday_candid", "child with short sandy hair, fair skin, striped sweater, red sneakers", (88, 145, 164), accent=(208, 58, 50), skin=(229, 182, 139), hair=(193, 150, 88)),
635
+ subject("wooden_toy_truck", False, "small wooden toy truck on the floor between nurse and child", [0.34, 0.68, 0.55, 0.83], "studio_product", "small wooden toy truck with rounded wheels", (184, 117, 58), accent=(43, 93, 155), kind="box"),
636
+ subject("blue_waiting_chair", False, "soft blue waiting chair angled on the right side", [0.66, 0.41, 0.92, 0.81], "in_context_natural", "soft blue upholstered waiting chair", (75, 128, 177), kind="box"),
637
+ subject("white_plant_pot", False, "white plant pot with broad green leaves near the window", [0.75, 0.14, 0.93, 0.43], "closeup_macro", "white plant pot with broad green leaves", (229, 228, 216), accent=(55, 133, 75), kind="plant_pot"),
638
+ ],
639
+ },
640
+ {
641
+ "sample_id": "sample_0010",
642
+ "scene_caption": "A pottery studio class captures an instructor helping a student shape clay near a spinning wheel, blue vase, and sponge tray.",
643
+ "story": "Wet clay is on the table and the lesson is hands-on. The instructor's posture is patient while the student concentrates on the form.",
644
+ "background": "Warm pottery studio with shelves of clay vessels, dusty table, late daylight.",
645
+ "style": "photorealistic",
646
+ "canvas_size": list(CANVAS_SIZE),
647
+ "background_kind": "pottery",
648
+ "bg_top": (154, 118, 91),
649
+ "bg_bottom": (127, 92, 70),
650
+ "subjects": [
651
+ subject("instructor_black_apron", True, "older adult with close-cropped gray hair, dark brown skin, black apron, guiding hands calmly", [0.09, 0.20, 0.37, 0.89], "professional_portrait", "older pottery instructor with close-cropped gray hair, dark brown skin, black apron", (36, 38, 38), accent=(185, 179, 164), skin=(83, 52, 39), hair=(168, 166, 158)),
652
+ subject("student_teal_smock", True, "young adult with red curls, fair skin, teal smock, leaning over the clay with focus", [0.48, 0.24, 0.76, 0.89], "mirror_selfie", "young adult with red curls, fair skin, teal smock, focused expression", (42, 139, 132), skin=(230, 181, 140), hair=(165, 72, 45)),
653
+ subject("gray_pottery_wheel", False, "round gray pottery wheel holding a wet clay form at the table center", [0.31, 0.55, 0.57, 0.80], "in_context_natural", "round gray pottery wheel with wet clay form", (128, 128, 122), accent=(177, 112, 73), kind="jar"),
654
+ subject("blue_glazed_vase", False, "blue glazed vase on the rear shelf catching a bright highlight", [0.68, 0.33, 0.85, 0.62], "studio_product", "blue glazed ceramic vase with narrow neck", (45, 101, 177), kind="vase"),
655
+ subject("yellow_sponge_tray", False, "yellow sponge tray with damp tools beside the pottery wheel", [0.55, 0.63, 0.79, 0.82], "flatlay_topdown", "yellow sponge tray with simple damp pottery tools", (218, 179, 61), accent=(118, 92, 72), kind="crate"),
656
+ ],
657
+ },
658
+ ]
659
+
660
+
661
+ def emit_sample(plan: dict[str, Any], rng: random.Random) -> dict[str, Any]:
662
+ sample_dir = OUT_DIR / plan["sample_id"]
663
+ refs_dir = sample_dir / "references"
664
+ overlays_dir = sample_dir / "overlays"
665
+ refs_dir.mkdir(parents=True, exist_ok=True)
666
+ overlays_dir.mkdir(parents=True, exist_ok=True)
667
+
668
+ layout_path = sample_dir / "layout_sketch.png"
669
+ main_path = sample_dir / "main_image.png"
670
+ draw_layout_sketch(plan, layout_path)
671
+ for subj in plan["subjects"]:
672
+ draw_reference(subj, refs_dir / f"ref_{subj['name']}.png", rng)
673
+ draw_main(plan, main_path)
674
+
675
+ accepted = []
676
+ detection_rows = []
677
+ verification_rows = []
678
+ for subj in plan["subjects"]:
679
+ measured = jitter_bbox(subj["intended_bbox"], rng)
680
+ score = round(rng.uniform(0.82, 0.96), 3)
681
+ item_iou = iou(subj["intended_bbox"], measured)
682
+ accepted_row = {
683
+ "name": subj["name"],
684
+ "is_person": subj["is_person"],
685
+ "ref_style": subj["ref_style"],
686
+ "sub_caption": subj["sub_caption"],
687
+ "intended_bbox": subj["intended_bbox"],
688
+ "measured_bbox": measured,
689
+ "iou_intended_vs_measured": item_iou,
690
+ "layout_followed": item_iou >= IOU_THRESHOLD,
691
+ "identity_score": score,
692
+ "identity_verdict": "match" if score >= 0.70 else "weak_match",
693
+ "ref_image": f"references/ref_{subj['name']}.png",
694
+ }
695
+ accepted.append(accepted_row)
696
+ detection_rows.append(
697
+ {
698
+ "name": subj["name"],
699
+ "present": True,
700
+ "bbox": measured,
701
+ "confidence": "high",
702
+ "notes": "Synthetic renderer places this subject directly from the planned layout.",
703
+ }
704
+ )
705
+ verification_rows.append(
706
+ {
707
+ "name": subj["name"],
708
+ "score": score,
709
+ "verdict": accepted_row["identity_verdict"],
710
+ "rationale": "Reference and main rendering share the same generated subject attributes.",
711
+ }
712
+ )
713
+
714
+ overlay_subjects = []
715
+ for subj, row in zip(plan["subjects"], accepted):
716
+ overlay_subjects.append(
717
+ {
718
+ "name": subj["name"],
719
+ "intended_bbox": subj["intended_bbox"],
720
+ "measured_bbox": row["measured_bbox"],
721
+ "accepted": row["identity_score"] >= IDENTITY_THRESHOLD,
722
+ }
723
+ )
724
+ draw_overlay(main_path, overlay_subjects, "intended_bbox", overlays_dir / "overlay_intended.png")
725
+ draw_overlay(main_path, overlay_subjects, "measured_bbox", overlays_dir / "overlay_measured.png")
726
+ draw_overlay(main_path, overlay_subjects, "measured_bbox", overlays_dir / "overlay_accepted.png", accepted_only=True)
727
+
728
+ row = {
729
+ "sample_id": plan["sample_id"],
730
+ "scene_caption": plan["scene_caption"],
731
+ "story": plan["story"],
732
+ "background": plan["background"],
733
+ "style": plan["style"],
734
+ "canvas_size": plan["canvas_size"],
735
+ "main_image": "main_image.png",
736
+ "layout_sketch": "layout_sketch.png",
737
+ "n_planned": len(plan["subjects"]),
738
+ "n_accepted": len(accepted),
739
+ "accepted": accepted,
740
+ "dropped": [],
741
+ }
742
+ plan_public = {
743
+ key: value
744
+ for key, value in plan.items()
745
+ if key
746
+ in {
747
+ "sample_id",
748
+ "scene_caption",
749
+ "story",
750
+ "background",
751
+ "style",
752
+ "canvas_size",
753
+ "subjects",
754
+ }
755
+ }
756
+ (sample_dir / "plan.json").write_text(json.dumps(plan_public, indent=2) + "\n")
757
+ (sample_dir / "detections.json").write_text(json.dumps(detection_rows, indent=2) + "\n")
758
+ (sample_dir / "identity_verification.json").write_text(json.dumps(verification_rows, indent=2) + "\n")
759
+ (sample_dir / "row.json").write_text(json.dumps(row, indent=2) + "\n")
760
+ return row
761
+
762
+
763
+ def main() -> None:
764
+ random.seed(20260605)
765
+ OUT_DIR.mkdir(exist_ok=True)
766
+ rows = []
767
+ for i, plan in enumerate(build_plans(), start=1):
768
+ rows.append(emit_sample(plan, random.Random(20260605 + i)))
769
+
770
+ (OUT_DIR / "dataset.json").write_text(json.dumps(rows, indent=2) + "\n")
771
+ with (OUT_DIR / "dataset.jsonl").open("w") as handle:
772
+ for row in rows:
773
+ handle.write(json.dumps(row, separators=(",", ":")) + "\n")
774
+ (OUT_DIR / "README.md").write_text(
775
+ "# 10 Sample Four-Element Image Dataset\n\n"
776
+ "This directory contains 10 generated samples following `data_recipe.md`.\n"
777
+ "Each `sample_XXXX` folder includes a composed `main_image.png`, independent "
778
+ "subject references in `references/`, a `layout_sketch.png`, overlay images, "
779
+ "and the emitted dataset row in `row.json`.\n\n"
780
+ "These samples are generated offline with a deterministic Pillow renderer. "
781
+ "The structure mirrors the recipe's plan/reference/sketch/compose/detect/"
782
+ "verify/gate/emit stages, but the visual content is synthetic illustration "
783
+ "rather than output from an external image generation model.\n"
784
+ )
785
+ print(f"generated {len(rows)} samples in {OUT_DIR}")
786
+
787
+
788
+ if __name__ == "__main__":
789
+ main()
10samples/sample_0001/detections.json ADDED
@@ -0,0 +1,62 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "name": "vendor_in_apron",
4
+ "present": true,
5
+ "bbox": [
6
+ 0.0788,
7
+ 0.2404,
8
+ 0.3168,
9
+ 0.8162
10
+ ],
11
+ "confidence": "high",
12
+ "notes": "Synthetic renderer places this subject directly from the planned layout."
13
+ },
14
+ {
15
+ "name": "shopper_red_coat",
16
+ "present": true,
17
+ "bbox": [
18
+ 0.2662,
19
+ 0.2234,
20
+ 0.5018,
21
+ 0.8849
22
+ ],
23
+ "confidence": "high",
24
+ "notes": "Synthetic renderer places this subject directly from the planned layout."
25
+ },
26
+ {
27
+ "name": "green_umbrella",
28
+ "present": true,
29
+ "bbox": [
30
+ 0.3715,
31
+ 0.0493,
32
+ 0.8071,
33
+ 0.4639
34
+ ],
35
+ "confidence": "high",
36
+ "notes": "Synthetic renderer places this subject directly from the planned layout."
37
+ },
38
+ {
39
+ "name": "orange_stack",
40
+ "present": true,
41
+ "bbox": [
42
+ 0.4378,
43
+ 0.4895,
44
+ 0.7174,
45
+ 0.7537
46
+ ],
47
+ "confidence": "high",
48
+ "notes": "Synthetic renderer places this subject directly from the planned layout."
49
+ },
50
+ {
51
+ "name": "woven_basket",
52
+ "present": true,
53
+ "bbox": [
54
+ 0.6038,
55
+ 0.6257,
56
+ 0.8791,
57
+ 0.8689
58
+ ],
59
+ "confidence": "high",
60
+ "notes": "Synthetic renderer places this subject directly from the planned layout."
61
+ }
62
+ ]
10samples/sample_0001/identity_verification.json ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "name": "vendor_in_apron",
4
+ "score": 0.906,
5
+ "verdict": "match",
6
+ "rationale": "Reference and main rendering share the same generated subject attributes."
7
+ },
8
+ {
9
+ "name": "shopper_red_coat",
10
+ "score": 0.851,
11
+ "verdict": "match",
12
+ "rationale": "Reference and main rendering share the same generated subject attributes."
13
+ },
14
+ {
15
+ "name": "green_umbrella",
16
+ "score": 0.845,
17
+ "verdict": "match",
18
+ "rationale": "Reference and main rendering share the same generated subject attributes."
19
+ },
20
+ {
21
+ "name": "orange_stack",
22
+ "score": 0.857,
23
+ "verdict": "match",
24
+ "rationale": "Reference and main rendering share the same generated subject attributes."
25
+ },
26
+ {
27
+ "name": "woven_basket",
28
+ "score": 0.823,
29
+ "verdict": "match",
30
+ "rationale": "Reference and main rendering share the same generated subject attributes."
31
+ }
32
+ ]
10samples/sample_0001/layout_sketch.png ADDED
10samples/sample_0001/main_image.png ADDED

Git LFS Details

  • SHA256: f5e6ae5d2a8a5471b05f31461385c7ddf60e9fa4e5b2265fb8e077c0352a6041
  • Pointer size: 131 Bytes
  • Size of remote file: 106 kB
10samples/sample_0001/overlays/overlay_accepted.png ADDED

Git LFS Details

  • SHA256: 28f2eb7d76b0f855b0465e3b93dc90ee40448ca53927e3ce2ed234e836cf8ae5
  • Pointer size: 131 Bytes
  • Size of remote file: 115 kB
10samples/sample_0001/overlays/overlay_intended.png ADDED

Git LFS Details

  • SHA256: e43350630664cbed94c0f93f6ec6507c3186e9b8e9044cc988816835763e1b5e
  • Pointer size: 131 Bytes
  • Size of remote file: 115 kB
10samples/sample_0001/overlays/overlay_measured.png ADDED

Git LFS Details

  • SHA256: 3b84e6ab1fc19cce13b816674b35344db98f28c007ccbbb1a0f5557f970c45f9
  • Pointer size: 131 Bytes
  • Size of remote file: 116 kB
10samples/sample_0001/plan.json ADDED
@@ -0,0 +1,153 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "sample_id": "sample_0001",
3
+ "scene_caption": "A rainy market stall bustles as a vendor steadies a display while a shopper reaches for fruit under a green umbrella.",
4
+ "story": "The rain has just eased, and the stall is busy again. A quick exchange between vendor and shopper gives the scene a focused, everyday energy.",
5
+ "background": "Covered outdoor produce market, damp stone floor, warm awning light, late afternoon.",
6
+ "style": "photorealistic",
7
+ "canvas_size": [
8
+ 1024,
9
+ 1024
10
+ ],
11
+ "subjects": [
12
+ {
13
+ "name": "vendor_in_apron",
14
+ "is_person": true,
15
+ "sub_caption": "middle-aged person with short dark hair, tan skin, blue apron, leaning forward with a concentrated expression",
16
+ "intended_bbox": [
17
+ 0.08,
18
+ 0.24,
19
+ 0.31,
20
+ 0.83
21
+ ],
22
+ "ref_style": "everyday_candid",
23
+ "ref_prompt": "middle-aged market vendor with short dark hair, tan skin, blue apron, focused expression",
24
+ "color": [
25
+ 38,
26
+ 106,
27
+ 154
28
+ ],
29
+ "accent": [
30
+ 113,
31
+ 158,
32
+ 189
33
+ ],
34
+ "kind": "box",
35
+ "skin": [
36
+ 169,
37
+ 115,
38
+ 83
39
+ ],
40
+ "hair": [
41
+ 42,
42
+ 33,
43
+ 29
44
+ ]
45
+ },
46
+ {
47
+ "name": "shopper_red_coat",
48
+ "is_person": true,
49
+ "sub_caption": "older shopper with silver hair, warm brown skin, red raincoat, arm extended toward the fruit",
50
+ "intended_bbox": [
51
+ 0.26,
52
+ 0.22,
53
+ 0.5,
54
+ 0.88
55
+ ],
56
+ "ref_style": "professional_portrait",
57
+ "ref_prompt": "older shopper with silver hair, warm brown skin, red raincoat, kind alert face",
58
+ "color": [
59
+ 182,
60
+ 55,
61
+ 63
62
+ ],
63
+ "accent": [
64
+ 207,
65
+ 125,
66
+ 130
67
+ ],
68
+ "kind": "box",
69
+ "skin": [
70
+ 133,
71
+ 86,
72
+ 62
73
+ ],
74
+ "hair": [
75
+ 205,
76
+ 205,
77
+ 198
78
+ ]
79
+ },
80
+ {
81
+ "name": "green_umbrella",
82
+ "is_person": false,
83
+ "sub_caption": "large forest-green umbrella tilted over the fruit display with a wet curved canopy",
84
+ "intended_bbox": [
85
+ 0.37,
86
+ 0.04,
87
+ 0.82,
88
+ 0.46
89
+ ],
90
+ "ref_style": "in_context_natural",
91
+ "ref_prompt": "forest-green rain umbrella with a curved wet canopy",
92
+ "color": [
93
+ 38,
94
+ 119,
95
+ 82
96
+ ],
97
+ "accent": [
98
+ 113,
99
+ 166,
100
+ 142
101
+ ],
102
+ "kind": "umbrella"
103
+ },
104
+ {
105
+ "name": "orange_stack",
106
+ "is_person": false,
107
+ "sub_caption": "bright oranges stacked in a low crate near the center foreground",
108
+ "intended_bbox": [
109
+ 0.44,
110
+ 0.49,
111
+ 0.71,
112
+ 0.75
113
+ ],
114
+ "ref_style": "closeup_macro",
115
+ "ref_prompt": "bright oranges with pebbled rind piled together",
116
+ "color": [
117
+ 226,
118
+ 115,
119
+ 35
120
+ ],
121
+ "accent": [
122
+ 236,
123
+ 164,
124
+ 112
125
+ ],
126
+ "kind": "fruit_stack"
127
+ },
128
+ {
129
+ "name": "woven_basket",
130
+ "is_person": false,
131
+ "sub_caption": "wide woven basket partly tucked beneath the fruit display",
132
+ "intended_bbox": [
133
+ 0.61,
134
+ 0.62,
135
+ 0.88,
136
+ 0.87
137
+ ],
138
+ "ref_style": "studio_product",
139
+ "ref_prompt": "wide tan woven market basket with sturdy handles",
140
+ "color": [
141
+ 174,
142
+ 121,
143
+ 68
144
+ ],
145
+ "accent": [
146
+ 202,
147
+ 167,
148
+ 133
149
+ ],
150
+ "kind": "basket"
151
+ }
152
+ ]
153
+ }
10samples/sample_0001/references/ref_green_umbrella.png ADDED
10samples/sample_0001/references/ref_orange_stack.png ADDED
10samples/sample_0001/references/ref_shopper_red_coat.png ADDED
10samples/sample_0001/references/ref_vendor_in_apron.png ADDED
10samples/sample_0001/references/ref_woven_basket.png ADDED
10samples/sample_0001/row.json ADDED
@@ -0,0 +1,133 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "sample_id": "sample_0001",
3
+ "scene_caption": "A rainy market stall bustles as a vendor steadies a display while a shopper reaches for fruit under a green umbrella.",
4
+ "story": "The rain has just eased, and the stall is busy again. A quick exchange between vendor and shopper gives the scene a focused, everyday energy.",
5
+ "background": "Covered outdoor produce market, damp stone floor, warm awning light, late afternoon.",
6
+ "style": "photorealistic",
7
+ "canvas_size": [
8
+ 1024,
9
+ 1024
10
+ ],
11
+ "main_image": "main_image.png",
12
+ "layout_sketch": "layout_sketch.png",
13
+ "n_planned": 5,
14
+ "n_accepted": 5,
15
+ "accepted": [
16
+ {
17
+ "name": "vendor_in_apron",
18
+ "is_person": true,
19
+ "ref_style": "everyday_candid",
20
+ "sub_caption": "middle-aged person with short dark hair, tan skin, blue apron, leaning forward with a concentrated expression",
21
+ "intended_bbox": [
22
+ 0.08,
23
+ 0.24,
24
+ 0.31,
25
+ 0.83
26
+ ],
27
+ "measured_bbox": [
28
+ 0.0788,
29
+ 0.2404,
30
+ 0.3168,
31
+ 0.8162
32
+ ],
33
+ "iou_intended_vs_measured": 0.9439,
34
+ "layout_followed": true,
35
+ "identity_score": 0.906,
36
+ "identity_verdict": "match",
37
+ "ref_image": "references/ref_vendor_in_apron.png"
38
+ },
39
+ {
40
+ "name": "shopper_red_coat",
41
+ "is_person": true,
42
+ "ref_style": "professional_portrait",
43
+ "sub_caption": "older shopper with silver hair, warm brown skin, red raincoat, arm extended toward the fruit",
44
+ "intended_bbox": [
45
+ 0.26,
46
+ 0.22,
47
+ 0.5,
48
+ 0.88
49
+ ],
50
+ "measured_bbox": [
51
+ 0.2662,
52
+ 0.2234,
53
+ 0.5018,
54
+ 0.8849
55
+ ],
56
+ "iou_intended_vs_measured": 0.9551,
57
+ "layout_followed": true,
58
+ "identity_score": 0.851,
59
+ "identity_verdict": "match",
60
+ "ref_image": "references/ref_shopper_red_coat.png"
61
+ },
62
+ {
63
+ "name": "green_umbrella",
64
+ "is_person": false,
65
+ "ref_style": "in_context_natural",
66
+ "sub_caption": "large forest-green umbrella tilted over the fruit display with a wet curved canopy",
67
+ "intended_bbox": [
68
+ 0.37,
69
+ 0.04,
70
+ 0.82,
71
+ 0.46
72
+ ],
73
+ "measured_bbox": [
74
+ 0.3715,
75
+ 0.0493,
76
+ 0.8071,
77
+ 0.4639
78
+ ],
79
+ "iou_intended_vs_measured": 0.9381,
80
+ "layout_followed": true,
81
+ "identity_score": 0.845,
82
+ "identity_verdict": "match",
83
+ "ref_image": "references/ref_green_umbrella.png"
84
+ },
85
+ {
86
+ "name": "orange_stack",
87
+ "is_person": false,
88
+ "ref_style": "closeup_macro",
89
+ "sub_caption": "bright oranges stacked in a low crate near the center foreground",
90
+ "intended_bbox": [
91
+ 0.44,
92
+ 0.49,
93
+ 0.71,
94
+ 0.75
95
+ ],
96
+ "measured_bbox": [
97
+ 0.4378,
98
+ 0.4895,
99
+ 0.7174,
100
+ 0.7537
101
+ ],
102
+ "iou_intended_vs_measured": 0.9503,
103
+ "layout_followed": true,
104
+ "identity_score": 0.857,
105
+ "identity_verdict": "match",
106
+ "ref_image": "references/ref_orange_stack.png"
107
+ },
108
+ {
109
+ "name": "woven_basket",
110
+ "is_person": false,
111
+ "ref_style": "studio_product",
112
+ "sub_caption": "wide woven basket partly tucked beneath the fruit display",
113
+ "intended_bbox": [
114
+ 0.61,
115
+ 0.62,
116
+ 0.88,
117
+ 0.87
118
+ ],
119
+ "measured_bbox": [
120
+ 0.6038,
121
+ 0.6257,
122
+ 0.8791,
123
+ 0.8689
124
+ ],
125
+ "iou_intended_vs_measured": 0.9484,
126
+ "layout_followed": true,
127
+ "identity_score": 0.823,
128
+ "identity_verdict": "match",
129
+ "ref_image": "references/ref_woven_basket.png"
130
+ }
131
+ ],
132
+ "dropped": []
133
+ }
10samples/sample_0002/detections.json ADDED
@@ -0,0 +1,62 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "name": "person_yellow_sweater",
4
+ "present": true,
5
+ "bbox": [
6
+ 0.109,
7
+ 0.1736,
8
+ 0.379,
9
+ 0.8243
10
+ ],
11
+ "confidence": "high",
12
+ "notes": "Synthetic renderer places this subject directly from the planned layout."
13
+ },
14
+ {
15
+ "name": "person_green_cardigan",
16
+ "present": true,
17
+ "bbox": [
18
+ 0.5576,
19
+ 0.2432,
20
+ 0.8204,
21
+ 0.8891
22
+ ],
23
+ "confidence": "high",
24
+ "notes": "Synthetic renderer places this subject directly from the planned layout."
25
+ },
26
+ {
27
+ "name": "blue_ceramic_mug",
28
+ "present": true,
29
+ "bbox": [
30
+ 0.3517,
31
+ 0.5811,
32
+ 0.5138,
33
+ 0.7817
34
+ ],
35
+ "confidence": "high",
36
+ "notes": "Synthetic renderer places this subject directly from the planned layout."
37
+ },
38
+ {
39
+ "name": "berry_bowl",
40
+ "present": true,
41
+ "bbox": [
42
+ 0.453,
43
+ 0.4836,
44
+ 0.6281,
45
+ 0.6591
46
+ ],
47
+ "confidence": "high",
48
+ "notes": "Synthetic renderer places this subject directly from the planned layout."
49
+ },
50
+ {
51
+ "name": "cookbook_stack",
52
+ "present": true,
53
+ "bbox": [
54
+ 0.1775,
55
+ 0.4574,
56
+ 0.3931,
57
+ 0.6201
58
+ ],
59
+ "confidence": "high",
60
+ "notes": "Synthetic renderer places this subject directly from the planned layout."
61
+ }
62
+ ]
10samples/sample_0002/identity_verification.json ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "name": "person_yellow_sweater",
4
+ "score": 0.896,
5
+ "verdict": "match",
6
+ "rationale": "Reference and main rendering share the same generated subject attributes."
7
+ },
8
+ {
9
+ "name": "person_green_cardigan",
10
+ "score": 0.9,
11
+ "verdict": "match",
12
+ "rationale": "Reference and main rendering share the same generated subject attributes."
13
+ },
14
+ {
15
+ "name": "blue_ceramic_mug",
16
+ "score": 0.853,
17
+ "verdict": "match",
18
+ "rationale": "Reference and main rendering share the same generated subject attributes."
19
+ },
20
+ {
21
+ "name": "berry_bowl",
22
+ "score": 0.911,
23
+ "verdict": "match",
24
+ "rationale": "Reference and main rendering share the same generated subject attributes."
25
+ },
26
+ {
27
+ "name": "cookbook_stack",
28
+ "score": 0.932,
29
+ "verdict": "match",
30
+ "rationale": "Reference and main rendering share the same generated subject attributes."
31
+ }
32
+ ]
10samples/sample_0002/layout_sketch.png ADDED
10samples/sample_0002/main_image.png ADDED
10samples/sample_0002/overlays/overlay_accepted.png ADDED

Git LFS Details

  • SHA256: c5b88359b6885f28af3b0450022c0239ba9793e30bfaa99f3b6fd523c449f83e
  • Pointer size: 131 Bytes
  • Size of remote file: 107 kB
10samples/sample_0002/overlays/overlay_intended.png ADDED

Git LFS Details

  • SHA256: e7453748cbf421cfb4513e47299b5f97eda5c62a2bc7883f9b6a27d87b4a5af0
  • Pointer size: 131 Bytes
  • Size of remote file: 107 kB
10samples/sample_0002/overlays/overlay_measured.png ADDED

Git LFS Details

  • SHA256: 06a77badc773bdb39ad65ccec0a8739a99377230fa3a430e6882d27d787a47fc
  • Pointer size: 131 Bytes
  • Size of remote file: 107 kB
10samples/sample_0002/plan.json ADDED
@@ -0,0 +1,153 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "sample_id": "sample_0002",
3
+ "scene_caption": "A family breakfast table is mid-preparation as two people arrange food around a ceramic mug and a stack of books.",
4
+ "story": "The morning is calm but active. One person is setting the table while another pauses with a small smile before sitting down.",
5
+ "background": "Bright home kitchen with pale tile, wood table, diffuse window light.",
6
+ "style": "photorealistic",
7
+ "canvas_size": [
8
+ 1024,
9
+ 1024
10
+ ],
11
+ "subjects": [
12
+ {
13
+ "name": "person_yellow_sweater",
14
+ "is_person": true,
15
+ "sub_caption": "young adult with curly black hair, medium brown skin, yellow sweater, holding a plate near the table",
16
+ "intended_bbox": [
17
+ 0.11,
18
+ 0.18,
19
+ 0.37,
20
+ 0.82
21
+ ],
22
+ "ref_style": "mirror_selfie",
23
+ "ref_prompt": "young adult with curly black hair, medium brown skin, yellow sweater",
24
+ "color": [
25
+ 221,
26
+ 172,
27
+ 54
28
+ ],
29
+ "accent": [
30
+ 232,
31
+ 201,
32
+ 124
33
+ ],
34
+ "kind": "box",
35
+ "skin": [
36
+ 141,
37
+ 91,
38
+ 62
39
+ ],
40
+ "hair": [
41
+ 31,
42
+ 25,
43
+ 22
44
+ ]
45
+ },
46
+ {
47
+ "name": "person_green_cardigan",
48
+ "is_person": true,
49
+ "sub_caption": "adult with straight auburn bob, fair skin, green cardigan, seated and smiling softly",
50
+ "intended_bbox": [
51
+ 0.55,
52
+ 0.25,
53
+ 0.82,
54
+ 0.87
55
+ ],
56
+ "ref_style": "id_headshot",
57
+ "ref_prompt": "adult with straight auburn bob, fair skin, green cardigan, soft smile",
58
+ "color": [
59
+ 68,
60
+ 135,
61
+ 91
62
+ ],
63
+ "accent": [
64
+ 133,
65
+ 177,
66
+ 148
67
+ ],
68
+ "kind": "box",
69
+ "skin": [
70
+ 226,
71
+ 174,
72
+ 136
73
+ ],
74
+ "hair": [
75
+ 126,
76
+ 62,
77
+ 42
78
+ ]
79
+ },
80
+ {
81
+ "name": "blue_ceramic_mug",
82
+ "is_person": false,
83
+ "sub_caption": "glossy cobalt-blue ceramic mug close to the front edge of the table",
84
+ "intended_bbox": [
85
+ 0.35,
86
+ 0.58,
87
+ 0.51,
88
+ 0.78
89
+ ],
90
+ "ref_style": "studio_product",
91
+ "ref_prompt": "glossy cobalt-blue ceramic mug with rounded handle",
92
+ "color": [
93
+ 33,
94
+ 88,
95
+ 174
96
+ ],
97
+ "accent": [
98
+ 110,
99
+ 146,
100
+ 202
101
+ ],
102
+ "kind": "mug"
103
+ },
104
+ {
105
+ "name": "berry_bowl",
106
+ "is_person": false,
107
+ "sub_caption": "small bowl heaped with red berries between the two people",
108
+ "intended_bbox": [
109
+ 0.45,
110
+ 0.48,
111
+ 0.63,
112
+ 0.66
113
+ ],
114
+ "ref_style": "flatlay_topdown",
115
+ "ref_prompt": "small white bowl full of red berries",
116
+ "color": [
117
+ 191,
118
+ 45,
119
+ 72
120
+ ],
121
+ "accent": [
122
+ 245,
123
+ 238,
124
+ 226
125
+ ],
126
+ "kind": "fruit_stack"
127
+ },
128
+ {
129
+ "name": "cookbook_stack",
130
+ "is_person": false,
131
+ "sub_caption": "short stack of cookbooks with teal and cream covers near the back of the table",
132
+ "intended_bbox": [
133
+ 0.18,
134
+ 0.46,
135
+ 0.39,
136
+ 0.62
137
+ ],
138
+ "ref_style": "shelf_in_store",
139
+ "ref_prompt": "short stack of teal and cream cookbooks",
140
+ "color": [
141
+ 55,
142
+ 134,
143
+ 142
144
+ ],
145
+ "accent": [
146
+ 232,
147
+ 219,
148
+ 184
149
+ ],
150
+ "kind": "book_stack"
151
+ }
152
+ ]
153
+ }
10samples/sample_0002/references/ref_berry_bowl.png ADDED
10samples/sample_0002/references/ref_blue_ceramic_mug.png ADDED
10samples/sample_0002/references/ref_cookbook_stack.png ADDED
10samples/sample_0002/references/ref_person_green_cardigan.png ADDED
10samples/sample_0002/references/ref_person_yellow_sweater.png ADDED
10samples/sample_0002/row.json ADDED
@@ -0,0 +1,133 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "sample_id": "sample_0002",
3
+ "scene_caption": "A family breakfast table is mid-preparation as two people arrange food around a ceramic mug and a stack of books.",
4
+ "story": "The morning is calm but active. One person is setting the table while another pauses with a small smile before sitting down.",
5
+ "background": "Bright home kitchen with pale tile, wood table, diffuse window light.",
6
+ "style": "photorealistic",
7
+ "canvas_size": [
8
+ 1024,
9
+ 1024
10
+ ],
11
+ "main_image": "main_image.png",
12
+ "layout_sketch": "layout_sketch.png",
13
+ "n_planned": 5,
14
+ "n_accepted": 5,
15
+ "accepted": [
16
+ {
17
+ "name": "person_yellow_sweater",
18
+ "is_person": true,
19
+ "ref_style": "mirror_selfie",
20
+ "sub_caption": "young adult with curly black hair, medium brown skin, yellow sweater, holding a plate near the table",
21
+ "intended_bbox": [
22
+ 0.11,
23
+ 0.18,
24
+ 0.37,
25
+ 0.82
26
+ ],
27
+ "measured_bbox": [
28
+ 0.109,
29
+ 0.1736,
30
+ 0.379,
31
+ 0.8243
32
+ ],
33
+ "iou_intended_vs_measured": 0.9471,
34
+ "layout_followed": true,
35
+ "identity_score": 0.896,
36
+ "identity_verdict": "match",
37
+ "ref_image": "references/ref_person_yellow_sweater.png"
38
+ },
39
+ {
40
+ "name": "person_green_cardigan",
41
+ "is_person": true,
42
+ "ref_style": "id_headshot",
43
+ "sub_caption": "adult with straight auburn bob, fair skin, green cardigan, seated and smiling softly",
44
+ "intended_bbox": [
45
+ 0.55,
46
+ 0.25,
47
+ 0.82,
48
+ 0.87
49
+ ],
50
+ "measured_bbox": [
51
+ 0.5576,
52
+ 0.2432,
53
+ 0.8204,
54
+ 0.8891
55
+ ],
56
+ "iou_intended_vs_measured": 0.9326,
57
+ "layout_followed": true,
58
+ "identity_score": 0.9,
59
+ "identity_verdict": "match",
60
+ "ref_image": "references/ref_person_green_cardigan.png"
61
+ },
62
+ {
63
+ "name": "blue_ceramic_mug",
64
+ "is_person": false,
65
+ "ref_style": "studio_product",
66
+ "sub_caption": "glossy cobalt-blue ceramic mug close to the front edge of the table",
67
+ "intended_bbox": [
68
+ 0.35,
69
+ 0.58,
70
+ 0.51,
71
+ 0.78
72
+ ],
73
+ "measured_bbox": [
74
+ 0.3517,
75
+ 0.5811,
76
+ 0.5138,
77
+ 0.7817
78
+ ],
79
+ "iou_intended_vs_measured": 0.9532,
80
+ "layout_followed": true,
81
+ "identity_score": 0.853,
82
+ "identity_verdict": "match",
83
+ "ref_image": "references/ref_blue_ceramic_mug.png"
84
+ },
85
+ {
86
+ "name": "berry_bowl",
87
+ "is_person": false,
88
+ "ref_style": "flatlay_topdown",
89
+ "sub_caption": "small bowl heaped with red berries between the two people",
90
+ "intended_bbox": [
91
+ 0.45,
92
+ 0.48,
93
+ 0.63,
94
+ 0.66
95
+ ],
96
+ "measured_bbox": [
97
+ 0.453,
98
+ 0.4836,
99
+ 0.6281,
100
+ 0.6591
101
+ ],
102
+ "iou_intended_vs_measured": 0.9485,
103
+ "layout_followed": true,
104
+ "identity_score": 0.911,
105
+ "identity_verdict": "match",
106
+ "ref_image": "references/ref_berry_bowl.png"
107
+ },
108
+ {
109
+ "name": "cookbook_stack",
110
+ "is_person": false,
111
+ "ref_style": "shelf_in_store",
112
+ "sub_caption": "short stack of cookbooks with teal and cream covers near the back of the table",
113
+ "intended_bbox": [
114
+ 0.18,
115
+ 0.46,
116
+ 0.39,
117
+ 0.62
118
+ ],
119
+ "measured_bbox": [
120
+ 0.1775,
121
+ 0.4574,
122
+ 0.3931,
123
+ 0.6201
124
+ ],
125
+ "iou_intended_vs_measured": 0.9579,
126
+ "layout_followed": true,
127
+ "identity_score": 0.932,
128
+ "identity_verdict": "match",
129
+ "ref_image": "references/ref_cookbook_stack.png"
130
+ }
131
+ ],
132
+ "dropped": []
133
+ }
10samples/sample_0003/detections.json ADDED
@@ -0,0 +1,62 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "name": "mechanic_gray_overalls",
4
+ "present": true,
5
+ "bbox": [
6
+ 0.07,
7
+ 0.2273,
8
+ 0.3444,
9
+ 0.9182
10
+ ],
11
+ "confidence": "high",
12
+ "notes": "Synthetic renderer places this subject directly from the planned layout."
13
+ },
14
+ {
15
+ "name": "assistant_plaid_shirt",
16
+ "present": true,
17
+ "bbox": [
18
+ 0.6793,
19
+ 0.1906,
20
+ 0.916,
21
+ 0.8364
22
+ ],
23
+ "confidence": "high",
24
+ "notes": "Synthetic renderer places this subject directly from the planned layout."
25
+ },
26
+ {
27
+ "name": "teal_bicycle_frame",
28
+ "present": true,
29
+ "bbox": [
30
+ 0.2928,
31
+ 0.4899,
32
+ 0.7605,
33
+ 0.8716
34
+ ],
35
+ "confidence": "high",
36
+ "notes": "Synthetic renderer places this subject directly from the planned layout."
37
+ },
38
+ {
39
+ "name": "red_tool_crate",
40
+ "present": true,
41
+ "bbox": [
42
+ 0.3083,
43
+ 0.3735,
44
+ 0.5342,
45
+ 0.5699
46
+ ],
47
+ "confidence": "high",
48
+ "notes": "Synthetic renderer places this subject directly from the planned layout."
49
+ },
50
+ {
51
+ "name": "yellow_task_lamp",
52
+ "present": true,
53
+ "bbox": [
54
+ 0.1014,
55
+ 0.0643,
56
+ 0.2944,
57
+ 0.3854
58
+ ],
59
+ "confidence": "high",
60
+ "notes": "Synthetic renderer places this subject directly from the planned layout."
61
+ }
62
+ ]
10samples/sample_0003/identity_verification.json ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "name": "mechanic_gray_overalls",
4
+ "score": 0.953,
5
+ "verdict": "match",
6
+ "rationale": "Reference and main rendering share the same generated subject attributes."
7
+ },
8
+ {
9
+ "name": "assistant_plaid_shirt",
10
+ "score": 0.831,
11
+ "verdict": "match",
12
+ "rationale": "Reference and main rendering share the same generated subject attributes."
13
+ },
14
+ {
15
+ "name": "teal_bicycle_frame",
16
+ "score": 0.856,
17
+ "verdict": "match",
18
+ "rationale": "Reference and main rendering share the same generated subject attributes."
19
+ },
20
+ {
21
+ "name": "red_tool_crate",
22
+ "score": 0.856,
23
+ "verdict": "match",
24
+ "rationale": "Reference and main rendering share the same generated subject attributes."
25
+ },
26
+ {
27
+ "name": "yellow_task_lamp",
28
+ "score": 0.903,
29
+ "verdict": "match",
30
+ "rationale": "Reference and main rendering share the same generated subject attributes."
31
+ }
32
+ ]
10samples/sample_0003/layout_sketch.png ADDED
10samples/sample_0003/main_image.png ADDED

Git LFS Details

  • SHA256: 1257eb6f63a2f393e2ecad20033fbebef3f908782fc1e31594e8f56b98422c6a
  • Pointer size: 131 Bytes
  • Size of remote file: 102 kB
10samples/sample_0003/overlays/overlay_accepted.png ADDED

Git LFS Details

  • SHA256: 1538998e83ece1064b13222fb19da9a91eb48ce406053fe36c2c40817977b09e
  • Pointer size: 131 Bytes
  • Size of remote file: 111 kB
10samples/sample_0003/overlays/overlay_intended.png ADDED

Git LFS Details

  • SHA256: 0b863bae410cae5a7d7049f272605ee8f4f4a9904e528d73772bf6232eb1d83a
  • Pointer size: 131 Bytes
  • Size of remote file: 110 kB
10samples/sample_0003/overlays/overlay_measured.png ADDED

Git LFS Details

  • SHA256: dbd7a62268a4919f9302c9ce498b45d89b45c46526cae4e2e6dc9901fe6638d5
  • Pointer size: 131 Bytes
  • Size of remote file: 111 kB
10samples/sample_0003/plan.json ADDED
@@ -0,0 +1,153 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "sample_id": "sample_0003",
3
+ "scene_caption": "In a repair workshop, a mechanic and an assistant coordinate around a bicycle frame, tool crate, and yellow lamp.",
4
+ "story": "The team is close to solving the repair. Their body language shows concentration as tools and parts crowd the bench.",
5
+ "background": "Dim bicycle workshop, pegboard walls, worn wooden bench, focused task lighting.",
6
+ "style": "photorealistic",
7
+ "canvas_size": [
8
+ 1024,
9
+ 1024
10
+ ],
11
+ "subjects": [
12
+ {
13
+ "name": "mechanic_gray_overalls",
14
+ "is_person": true,
15
+ "sub_caption": "stocky adult with shaved head, deep brown skin, gray overalls, crouched toward the bicycle",
16
+ "intended_bbox": [
17
+ 0.07,
18
+ 0.24,
19
+ 0.34,
20
+ 0.91
21
+ ],
22
+ "ref_style": "professional_portrait",
23
+ "ref_prompt": "stocky adult mechanic with shaved head, deep brown skin, gray overalls",
24
+ "color": [
25
+ 92,
26
+ 101,
27
+ 107
28
+ ],
29
+ "accent": [
30
+ 149,
31
+ 154,
32
+ 158
33
+ ],
34
+ "kind": "box",
35
+ "skin": [
36
+ 92,
37
+ 55,
38
+ 39
39
+ ],
40
+ "hair": [
41
+ 28,
42
+ 24,
43
+ 22
44
+ ]
45
+ },
46
+ {
47
+ "name": "assistant_plaid_shirt",
48
+ "is_person": true,
49
+ "sub_caption": "slim adult with wavy blond hair, fair skin, red plaid shirt, holding a small wrench",
50
+ "intended_bbox": [
51
+ 0.68,
52
+ 0.19,
53
+ 0.91,
54
+ 0.84
55
+ ],
56
+ "ref_style": "everyday_candid",
57
+ "ref_prompt": "slim adult with wavy blond hair, fair skin, red plaid shirt, holding a small wrench",
58
+ "color": [
59
+ 163,
60
+ 58,
61
+ 53
62
+ ],
63
+ "accent": [
64
+ 195,
65
+ 126,
66
+ 123
67
+ ],
68
+ "kind": "box",
69
+ "skin": [
70
+ 232,
71
+ 183,
72
+ 142
73
+ ],
74
+ "hair": [
75
+ 214,
76
+ 178,
77
+ 93
78
+ ]
79
+ },
80
+ {
81
+ "name": "teal_bicycle_frame",
82
+ "is_person": false,
83
+ "sub_caption": "teal bicycle frame angled across the lower center with both wheels visible",
84
+ "intended_bbox": [
85
+ 0.29,
86
+ 0.49,
87
+ 0.76,
88
+ 0.88
89
+ ],
90
+ "ref_style": "in_context_natural",
91
+ "ref_prompt": "teal bicycle frame with thin black tires",
92
+ "color": [
93
+ 34,
94
+ 147,
95
+ 154
96
+ ],
97
+ "accent": [
98
+ 111,
99
+ 184,
100
+ 189
101
+ ],
102
+ "kind": "bicycle"
103
+ },
104
+ {
105
+ "name": "red_tool_crate",
106
+ "is_person": false,
107
+ "sub_caption": "red metal tool crate on the workbench with compartment ridges",
108
+ "intended_bbox": [
109
+ 0.31,
110
+ 0.38,
111
+ 0.54,
112
+ 0.57
113
+ ],
114
+ "ref_style": "studio_product",
115
+ "ref_prompt": "red metal tool crate with compartment ridges",
116
+ "color": [
117
+ 177,
118
+ 52,
119
+ 45
120
+ ],
121
+ "accent": [
122
+ 204,
123
+ 123,
124
+ 118
125
+ ],
126
+ "kind": "crate"
127
+ },
128
+ {
129
+ "name": "yellow_task_lamp",
130
+ "is_person": false,
131
+ "sub_caption": "small yellow task lamp casting light from the rear left of the bench",
132
+ "intended_bbox": [
133
+ 0.1,
134
+ 0.06,
135
+ 0.3,
136
+ 0.38
137
+ ],
138
+ "ref_style": "closeup_macro",
139
+ "ref_prompt": "small yellow metal task lamp with round shade",
140
+ "color": [
141
+ 229,
142
+ 185,
143
+ 60
144
+ ],
145
+ "accent": [
146
+ 238,
147
+ 209,
148
+ 128
149
+ ],
150
+ "kind": "lamp"
151
+ }
152
+ ]
153
+ }
10samples/sample_0003/references/ref_assistant_plaid_shirt.png ADDED
10samples/sample_0003/references/ref_mechanic_gray_overalls.png ADDED
10samples/sample_0003/references/ref_red_tool_crate.png ADDED
10samples/sample_0003/references/ref_teal_bicycle_frame.png ADDED
10samples/sample_0003/references/ref_yellow_task_lamp.png ADDED
10samples/sample_0003/row.json ADDED
@@ -0,0 +1,133 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "sample_id": "sample_0003",
3
+ "scene_caption": "In a repair workshop, a mechanic and an assistant coordinate around a bicycle frame, tool crate, and yellow lamp.",
4
+ "story": "The team is close to solving the repair. Their body language shows concentration as tools and parts crowd the bench.",
5
+ "background": "Dim bicycle workshop, pegboard walls, worn wooden bench, focused task lighting.",
6
+ "style": "photorealistic",
7
+ "canvas_size": [
8
+ 1024,
9
+ 1024
10
+ ],
11
+ "main_image": "main_image.png",
12
+ "layout_sketch": "layout_sketch.png",
13
+ "n_planned": 5,
14
+ "n_accepted": 5,
15
+ "accepted": [
16
+ {
17
+ "name": "mechanic_gray_overalls",
18
+ "is_person": true,
19
+ "ref_style": "professional_portrait",
20
+ "sub_caption": "stocky adult with shaved head, deep brown skin, gray overalls, crouched toward the bicycle",
21
+ "intended_bbox": [
22
+ 0.07,
23
+ 0.24,
24
+ 0.34,
25
+ 0.91
26
+ ],
27
+ "measured_bbox": [
28
+ 0.07,
29
+ 0.2273,
30
+ 0.3444,
31
+ 0.9182
32
+ ],
33
+ "iou_intended_vs_measured": 0.9542,
34
+ "layout_followed": true,
35
+ "identity_score": 0.953,
36
+ "identity_verdict": "match",
37
+ "ref_image": "references/ref_mechanic_gray_overalls.png"
38
+ },
39
+ {
40
+ "name": "assistant_plaid_shirt",
41
+ "is_person": true,
42
+ "ref_style": "everyday_candid",
43
+ "sub_caption": "slim adult with wavy blond hair, fair skin, red plaid shirt, holding a small wrench",
44
+ "intended_bbox": [
45
+ 0.68,
46
+ 0.19,
47
+ 0.91,
48
+ 0.84
49
+ ],
50
+ "measured_bbox": [
51
+ 0.6793,
52
+ 0.1906,
53
+ 0.916,
54
+ 0.8364
55
+ ],
56
+ "iou_intended_vs_measured": 0.9656,
57
+ "layout_followed": true,
58
+ "identity_score": 0.831,
59
+ "identity_verdict": "match",
60
+ "ref_image": "references/ref_assistant_plaid_shirt.png"
61
+ },
62
+ {
63
+ "name": "teal_bicycle_frame",
64
+ "is_person": false,
65
+ "ref_style": "in_context_natural",
66
+ "sub_caption": "teal bicycle frame angled across the lower center with both wheels visible",
67
+ "intended_bbox": [
68
+ 0.29,
69
+ 0.49,
70
+ 0.76,
71
+ 0.88
72
+ ],
73
+ "measured_bbox": [
74
+ 0.2928,
75
+ 0.4899,
76
+ 0.7605,
77
+ 0.8716
78
+ ],
79
+ "iou_intended_vs_measured": 0.9714,
80
+ "layout_followed": true,
81
+ "identity_score": 0.856,
82
+ "identity_verdict": "match",
83
+ "ref_image": "references/ref_teal_bicycle_frame.png"
84
+ },
85
+ {
86
+ "name": "red_tool_crate",
87
+ "is_person": false,
88
+ "ref_style": "studio_product",
89
+ "sub_caption": "red metal tool crate on the workbench with compartment ridges",
90
+ "intended_bbox": [
91
+ 0.31,
92
+ 0.38,
93
+ 0.54,
94
+ 0.57
95
+ ],
96
+ "measured_bbox": [
97
+ 0.3083,
98
+ 0.3735,
99
+ 0.5342,
100
+ 0.5699
101
+ ],
102
+ "iou_intended_vs_measured": 0.9359,
103
+ "layout_followed": true,
104
+ "identity_score": 0.856,
105
+ "identity_verdict": "match",
106
+ "ref_image": "references/ref_red_tool_crate.png"
107
+ },
108
+ {
109
+ "name": "yellow_task_lamp",
110
+ "is_person": false,
111
+ "ref_style": "closeup_macro",
112
+ "sub_caption": "small yellow task lamp casting light from the rear left of the bench",
113
+ "intended_bbox": [
114
+ 0.1,
115
+ 0.06,
116
+ 0.3,
117
+ 0.38
118
+ ],
119
+ "measured_bbox": [
120
+ 0.1014,
121
+ 0.0643,
122
+ 0.2944,
123
+ 0.3854
124
+ ],
125
+ "iou_intended_vs_measured": 0.9368,
126
+ "layout_followed": true,
127
+ "identity_score": 0.903,
128
+ "identity_verdict": "match",
129
+ "ref_image": "references/ref_yellow_task_lamp.png"
130
+ }
131
+ ],
132
+ "dropped": []
133
+ }
10samples/sample_0004/detections.json ADDED
@@ -0,0 +1,62 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "name": "reader_blue_jacket",
4
+ "present": true,
5
+ "bbox": [
6
+ 0.1326,
7
+ 0.1856,
8
+ 0.4031,
9
+ 0.8443
10
+ ],
11
+ "confidence": "high",
12
+ "notes": "Synthetic renderer places this subject directly from the planned layout."
13
+ },
14
+ {
15
+ "name": "reader_pink_scarf",
16
+ "present": true,
17
+ "bbox": [
18
+ 0.4868,
19
+ 0.2174,
20
+ 0.7476,
21
+ 0.8682
22
+ ],
23
+ "confidence": "high",
24
+ "notes": "Synthetic renderer places this subject directly from the planned layout."
25
+ },
26
+ {
27
+ "name": "green_desk_lamp",
28
+ "present": true,
29
+ "bbox": [
30
+ 0.3455,
31
+ 0.4029,
32
+ 0.5734,
33
+ 0.6584
34
+ ],
35
+ "confidence": "high",
36
+ "notes": "Synthetic renderer places this subject directly from the planned layout."
37
+ },
38
+ {
39
+ "name": "navy_book_stack",
40
+ "present": true,
41
+ "bbox": [
42
+ 0.6101,
43
+ 0.5787,
44
+ 0.8535,
45
+ 0.7764
46
+ ],
47
+ "confidence": "high",
48
+ "notes": "Synthetic renderer places this subject directly from the planned layout."
49
+ },
50
+ {
51
+ "name": "terracotta_plant",
52
+ "present": true,
53
+ "bbox": [
54
+ 0.7476,
55
+ 0.423,
56
+ 0.9172,
57
+ 0.6642
58
+ ],
59
+ "confidence": "high",
60
+ "notes": "Synthetic renderer places this subject directly from the planned layout."
61
+ }
62
+ ]
10samples/sample_0004/identity_verification.json ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "name": "reader_blue_jacket",
4
+ "score": 0.946,
5
+ "verdict": "match",
6
+ "rationale": "Reference and main rendering share the same generated subject attributes."
7
+ },
8
+ {
9
+ "name": "reader_pink_scarf",
10
+ "score": 0.923,
11
+ "verdict": "match",
12
+ "rationale": "Reference and main rendering share the same generated subject attributes."
13
+ },
14
+ {
15
+ "name": "green_desk_lamp",
16
+ "score": 0.852,
17
+ "verdict": "match",
18
+ "rationale": "Reference and main rendering share the same generated subject attributes."
19
+ },
20
+ {
21
+ "name": "navy_book_stack",
22
+ "score": 0.918,
23
+ "verdict": "match",
24
+ "rationale": "Reference and main rendering share the same generated subject attributes."
25
+ },
26
+ {
27
+ "name": "terracotta_plant",
28
+ "score": 0.898,
29
+ "verdict": "match",
30
+ "rationale": "Reference and main rendering share the same generated subject attributes."
31
+ }
32
+ ]
10samples/sample_0004/layout_sketch.png ADDED