dzakybd commited on
Commit
474c21f
·
verified ·
1 Parent(s): 5630eea

Add --chain and the lines -> walls -> rooms step

Browse files
.gitattributes CHANGED
@@ -40,3 +40,4 @@ data/synth-2-diagonal/vector.png filter=lfs diff=lfs merge=lfs -text
40
  data/synth-4-stair/raster-150.png filter=lfs diff=lfs merge=lfs -text
41
  data/synth-4-stair/raster-300.png filter=lfs diff=lfs merge=lfs -text
42
  data/synth-4-stair/raster-600.png filter=lfs diff=lfs merge=lfs -text
 
 
40
  data/synth-4-stair/raster-150.png filter=lfs diff=lfs merge=lfs -text
41
  data/synth-4-stair/raster-300.png filter=lfs diff=lfs merge=lfs -text
42
  data/synth-4-stair/raster-600.png filter=lfs diff=lfs merge=lfs -text
43
+ data/synth-2-diagonal/vector-chained.png filter=lfs diff=lfs merge=lfs -text
README.md CHANGED
@@ -13,7 +13,7 @@ short_description: "Read lines from a drawing PDF: vector paths vs pixels"
13
 
14
  Do you need computer vision to read construction drawings? floorplan-parser pulls line geometry out of a drawing PDF two ways: by reading the vector paths the PDF already stores (PyMuPDF), and by rendering the page to pixels and finding the lines with classic computer vision (OpenCV threshold and Hough lines). Both are scored against the drawing's own geometry.
15
 
16
- The pictures are synthetic drawings made for this project; pick a drawing and a method to see what was found (blue), missed (red) and added (orange). The table also lists measured results on ten held-out FloorPlanCAD drawings, as numbers only. Everything was computed ahead of time; the page runs no model and no server.
17
 
18
  Code (MIT): [github.com/dzakybd/floorplan-parser](https://github.com/dzakybd/floorplan-parser). Write-up: [dzaky.ai.id](https://dzaky.ai.id/en/blog/floorplan-parser-vector-vs-raster).
19
 
 
13
 
14
  Do you need computer vision to read construction drawings? floorplan-parser pulls line geometry out of a drawing PDF two ways: by reading the vector paths the PDF already stores (PyMuPDF), and by rendering the page to pixels and finding the lines with classic computer vision (OpenCV threshold and Hough lines). Both are scored against the drawing's own geometry.
15
 
16
+ The pictures are synthetic drawings made for this project; pick a drawing and a method to see what was found (blue), missed (red) and added (orange). The table also lists measured results on ten held-out FloorPlanCAD drawings, as numbers only, including `--chain`, which joins the pieces of each curve. A last panel shows the lines → walls → rooms step on a synthetic plan, with its scores on synthetic plans and on real CubiCasa5K layouts. Everything was computed ahead of time; the page runs no model and no server.
17
 
18
  Code (MIT): [github.com/dzakybd/floorplan-parser](https://github.com/dzakybd/floorplan-parser). Write-up: [dzaky.ai.id](https://dzaky.ai.id/en/blog/floorplan-parser-vector-vs-raster).
19
 
data/results.json CHANGED
@@ -14,8 +14,37 @@
14
  "length_error_pct": 0.0,
15
  "gt_length": 8376.0,
16
  "pred_length": 8376.0,
 
 
 
17
  "elements": 20,
18
- "seconds": 0.0021
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
19
  },
20
  "raster-150": {
21
  "precision": 1.0,
@@ -27,8 +56,16 @@
27
  "length_error_pct": 0.5814,
28
  "gt_length": 8376.0,
29
  "pred_length": 8327.306,
 
 
 
30
  "elements": 25,
31
- "seconds": 0.0323
 
 
 
 
 
32
  },
33
  "raster-300": {
34
  "precision": 1.0,
@@ -40,8 +77,16 @@
40
  "length_error_pct": 0.1171,
41
  "gt_length": 8376.0,
42
  "pred_length": 8366.192,
 
 
 
43
  "elements": 20,
44
- "seconds": 0.1233
 
 
 
 
 
45
  },
46
  "raster-600": {
47
  "precision": 1.0,
@@ -53,8 +98,16 @@
53
  "length_error_pct": 0.0811,
54
  "gt_length": 8376.0,
55
  "pred_length": 8382.797,
 
 
 
56
  "elements": 21,
57
- "seconds": 0.5643
 
 
 
 
 
58
  }
59
  }
60
  },
@@ -72,8 +125,37 @@
72
  "length_error_pct": 0.0,
73
  "gt_length": 9919.9999,
74
  "pred_length": 9919.9999,
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
75
  "elements": 16,
76
- "seconds": 0.0021
 
 
 
 
 
77
  },
78
  "raster-150": {
79
  "precision": 1.0,
@@ -85,8 +167,16 @@
85
  "length_error_pct": 0.1074,
86
  "gt_length": 9919.9999,
87
  "pred_length": 9909.3425,
 
 
 
88
  "elements": 16,
89
- "seconds": 0.0381
 
 
 
 
 
90
  },
91
  "raster-300": {
92
  "precision": 1.0,
@@ -98,8 +188,16 @@
98
  "length_error_pct": 0.0623,
99
  "gt_length": 9919.9999,
100
  "pred_length": 9913.8201,
 
 
 
101
  "elements": 16,
102
- "seconds": 0.1311
 
 
 
 
 
103
  },
104
  "raster-600": {
105
  "precision": 1.0,
@@ -111,8 +209,16 @@
111
  "length_error_pct": 0.0188,
112
  "gt_length": 9919.9999,
113
  "pred_length": 9918.13,
 
 
 
114
  "elements": 16,
115
- "seconds": 0.7226
 
 
 
 
 
116
  }
117
  }
118
  },
@@ -130,8 +236,37 @@
130
  "length_error_pct": 0.0075,
131
  "gt_length": 8492.2482,
132
  "pred_length": 8492.8824,
 
 
 
133
  "elements": 307,
134
- "seconds": 0.0101
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
135
  },
136
  "raster-150": {
137
  "precision": 0.9826,
@@ -143,8 +278,16 @@
143
  "length_error_pct": 1.7599,
144
  "gt_length": 8492.2482,
145
  "pred_length": 8342.7971,
 
 
 
146
  "elements": 119,
147
- "seconds": 0.0416
 
 
 
 
 
148
  },
149
  "raster-300": {
150
  "precision": 0.968,
@@ -156,8 +299,16 @@
156
  "length_error_pct": 4.7551,
157
  "gt_length": 8492.2482,
158
  "pred_length": 8896.0626,
 
 
 
159
  "elements": 160,
160
- "seconds": 0.1353
 
 
 
 
 
161
  },
162
  "raster-600": {
163
  "precision": 0.9502,
@@ -169,8 +320,16 @@
169
  "length_error_pct": 8.9647,
170
  "gt_length": 8492.2482,
171
  "pred_length": 9253.5532,
 
 
 
172
  "elements": 175,
173
- "seconds": 0.6254
 
 
 
 
 
174
  }
175
  }
176
  },
@@ -188,8 +347,37 @@
188
  "length_error_pct": 0.0,
189
  "gt_length": 22766.3376,
190
  "pred_length": 22766.3376,
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
191
  "elements": 96,
192
- "seconds": 0.0046
 
 
 
 
 
193
  },
194
  "raster-150": {
195
  "precision": 1.0,
@@ -201,8 +389,16 @@
201
  "length_error_pct": 0.2037,
202
  "gt_length": 22766.3376,
203
  "pred_length": 22719.9517,
 
 
 
204
  "elements": 96,
205
- "seconds": 0.0876
 
 
 
 
 
206
  },
207
  "raster-300": {
208
  "precision": 1.0,
@@ -214,8 +410,16 @@
214
  "length_error_pct": 0.0425,
215
  "gt_length": 22766.3376,
216
  "pred_length": 22756.6599,
 
 
 
217
  "elements": 96,
218
- "seconds": 0.2858
 
 
 
 
 
219
  },
220
  "raster-600": {
221
  "precision": 1.0,
@@ -227,8 +431,16 @@
227
  "length_error_pct": 0.1824,
228
  "gt_length": 22766.3376,
229
  "pred_length": 22807.8533,
 
 
 
230
  "elements": 97,
231
- "seconds": 1.2312
 
 
 
 
 
232
  }
233
  }
234
  },
@@ -246,8 +458,37 @@
246
  "length_error_pct": 0.0,
247
  "gt_length": 14720.0,
248
  "pred_length": 14720.0,
 
 
 
249
  "elements": 24,
250
- "seconds": 0.0021
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
251
  },
252
  "raster-150": {
253
  "precision": 1.0,
@@ -259,8 +500,16 @@
259
  "length_error_pct": 0.2125,
260
  "gt_length": 14720.0,
261
  "pred_length": 14751.2871,
 
 
 
262
  "elements": 25,
263
- "seconds": 0.048
 
 
 
 
 
264
  },
265
  "raster-300": {
266
  "precision": 1.0,
@@ -272,8 +521,16 @@
272
  "length_error_pct": 0.0743,
273
  "gt_length": 14720.0,
274
  "pred_length": 14709.0582,
 
 
 
275
  "elements": 24,
276
- "seconds": 0.1606
 
 
 
 
 
277
  },
278
  "raster-600": {
279
  "precision": 1.0,
@@ -285,8 +542,16 @@
285
  "length_error_pct": 0.0047,
286
  "gt_length": 14720.0,
287
  "pred_length": 14719.304,
 
 
 
288
  "elements": 25,
289
- "seconds": 0.7727
 
 
 
 
 
290
  }
291
  }
292
  },
@@ -304,8 +569,37 @@
304
  "length_error_pct": 3.8971,
305
  "gt_length": 7744.0,
306
  "pred_length": 8045.789,
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
307
  "elements": 37,
308
- "seconds": 0.0023
 
 
 
 
 
309
  },
310
  "raster-150": {
311
  "precision": 0.9722,
@@ -317,8 +611,16 @@
317
  "length_error_pct": 2.7573,
318
  "gt_length": 7744.0,
319
  "pred_length": 7957.5247,
 
 
 
320
  "elements": 28,
321
- "seconds": 0.0323
 
 
 
 
 
322
  },
323
  "raster-300": {
324
  "precision": 0.9636,
@@ -330,8 +632,16 @@
330
  "length_error_pct": 3.7096,
331
  "gt_length": 7744.0,
332
  "pred_length": 8031.275,
 
 
 
333
  "elements": 35,
334
- "seconds": 0.1132
 
 
 
 
 
335
  },
336
  "raster-600": {
337
  "precision": 0.966,
@@ -343,8 +653,16 @@
343
  "length_error_pct": 3.5056,
344
  "gt_length": 7744.0,
345
  "pred_length": 8015.4756,
 
 
 
346
  "elements": 30,
347
- "seconds": 0.5419
 
 
 
 
 
348
  }
349
  }
350
  }
@@ -361,10 +679,39 @@
361
  "endpoint_err_median": 0.0,
362
  "endpoint_match_rate": 1.0,
363
  "length_error_pct": 0.0,
364
- "gt_length": 19279.7168,
365
- "pred_length": 19279.7165,
 
 
 
366
  "elements": 114,
367
- "seconds": 0.0051
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
368
  },
369
  "raster-150": {
370
  "precision": 0.9997,
@@ -373,37 +720,61 @@
373
  "endpoint_err_mean": 0.3278,
374
  "endpoint_err_median": 0.2426,
375
  "endpoint_match_rate": 0.9649,
376
- "length_error_pct": 1.3194,
377
- "gt_length": 19279.7168,
378
  "pred_length": 19025.3308,
 
 
 
379
  "elements": 110,
380
- "seconds": 0.0568
 
 
 
 
 
381
  },
382
  "raster-300": {
383
  "precision": 0.9999,
384
  "recall": 0.9996,
385
  "f1": 0.9998,
386
- "endpoint_err_mean": 0.2776,
387
- "endpoint_err_median": 0.235,
388
  "endpoint_match_rate": 0.9386,
389
- "length_error_pct": 0.5922,
390
- "gt_length": 19279.7168,
391
- "pred_length": 19165.5487,
 
 
 
392
  "elements": 102,
393
- "seconds": 0.2468
 
 
 
 
 
394
  },
395
  "raster-600": {
396
  "precision": 0.9995,
397
  "recall": 0.9996,
398
  "f1": 0.9996,
399
- "endpoint_err_mean": 0.3271,
400
- "endpoint_err_median": 0.331,
401
  "endpoint_match_rate": 0.9123,
402
- "length_error_pct": 0.0006,
403
- "gt_length": 19279.7168,
404
- "pred_length": 19279.837,
 
 
 
405
  "elements": 104,
406
- "seconds": 1.2957
 
 
 
 
 
407
  }
408
  },
409
  {
@@ -416,11 +787,40 @@
416
  "endpoint_err_mean": 0.0,
417
  "endpoint_err_median": 0.0,
418
  "endpoint_match_rate": 1.0,
419
- "length_error_pct": 0.0798,
420
- "gt_length": 15796.2999,
421
- "pred_length": 15783.6873,
 
 
 
422
  "elements": 667,
423
- "seconds": 0.0207
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
424
  },
425
  "raster-150": {
426
  "precision": 0.8418,
@@ -429,11 +829,19 @@
429
  "endpoint_err_mean": 0.677,
430
  "endpoint_err_median": 0.5329,
431
  "endpoint_match_rate": 0.9105,
432
- "length_error_pct": 2.8209,
433
- "gt_length": 15796.2999,
434
  "pred_length": 15350.6952,
 
 
 
435
  "elements": 1217,
436
- "seconds": 0.1521
 
 
 
 
 
437
  },
438
  "raster-300": {
439
  "precision": 0.8382,
@@ -442,11 +850,19 @@
442
  "endpoint_err_mean": 0.6401,
443
  "endpoint_err_median": 0.4498,
444
  "endpoint_match_rate": 0.9192,
445
- "length_error_pct": 11.3764,
446
- "gt_length": 15796.2999,
447
  "pred_length": 17593.3446,
 
 
 
448
  "elements": 1371,
449
- "seconds": 0.3888
 
 
 
 
 
450
  },
451
  "raster-600": {
452
  "precision": 0.8174,
@@ -455,11 +871,19 @@
455
  "endpoint_err_mean": 0.6173,
456
  "endpoint_err_median": 0.4727,
457
  "endpoint_match_rate": 0.9148,
458
- "length_error_pct": 25.142,
459
- "gt_length": 15796.2999,
460
  "pred_length": 19767.8109,
 
 
 
461
  "elements": 1675,
462
- "seconds": 1.4362
 
 
 
 
 
463
  }
464
  },
465
  {
@@ -472,11 +896,40 @@
472
  "endpoint_err_mean": 0.0156,
473
  "endpoint_err_median": 0.0,
474
  "endpoint_match_rate": 0.9994,
475
- "length_error_pct": 0.1407,
476
- "gt_length": 28516.7645,
477
- "pred_length": 28476.6349,
 
 
 
478
  "elements": 7967,
479
- "seconds": 0.3848
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
480
  },
481
  "raster-150": {
482
  "precision": 0.9983,
@@ -485,11 +938,19 @@
485
  "endpoint_err_mean": 1.3126,
486
  "endpoint_err_median": 0.7283,
487
  "endpoint_match_rate": 0.7807,
488
- "length_error_pct": 9.0432,
489
- "gt_length": 28516.7645,
490
  "pred_length": 25937.9321,
 
 
 
491
  "elements": 439,
492
- "seconds": 0.1111
 
 
 
 
 
493
  },
494
  "raster-300": {
495
  "precision": 0.9949,
@@ -498,11 +959,19 @@
498
  "endpoint_err_mean": 1.2637,
499
  "endpoint_err_median": 0.6476,
500
  "endpoint_match_rate": 0.8383,
501
- "length_error_pct": 4.1195,
502
- "gt_length": 28516.7645,
503
  "pred_length": 27342.0243,
 
 
 
504
  "elements": 515,
505
- "seconds": 0.4006
 
 
 
 
 
506
  },
507
  "raster-600": {
508
  "precision": 0.989,
@@ -511,11 +980,782 @@
511
  "endpoint_err_mean": 1.1791,
512
  "endpoint_err_median": 0.6151,
513
  "endpoint_match_rate": 0.9182,
514
- "length_error_pct": 0.8456,
515
- "gt_length": 28516.7645,
516
  "pred_length": 28275.6325,
 
 
 
517
  "elements": 641,
518
- "seconds": 1.9175
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
519
  }
520
  }
521
  ],
@@ -730,6 +1970,19 @@
730
  "pred_length": 8045.789
731
  }
732
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
733
  "raster-150": {
734
  "vs_drawing_without_text": {
735
  "precision": 0.9722,
@@ -771,7 +2024,156 @@
771
  },
772
  "glyph_stroke_length_pt": 301.79
773
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
774
  "config": {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
775
  "page_pt": 800.0,
776
  "dpis": [
777
  150,
@@ -781,7 +2183,14 @@
781
  "held_out": [
782
  "0674-0822",
783
  "1010-0022",
784
- "0393-0004"
 
 
 
 
 
 
 
785
  ],
786
  "synthetic_tuning": [
787
  "synth-1-walls",
@@ -813,7 +2222,7 @@
813
  "max_gap_pt": 1.0,
814
  "merge_gap_pt": 2.0
815
  },
816
- "timing": "median of 3 runs of the extract call (open + read/decode + detect + clean-up); PDF preparation is not timed",
817
  "packages": {
818
  "pymupdf": "1.28.2",
819
  "opencv-python-headless": "5.0.0.93",
 
14
  "length_error_pct": 0.0,
15
  "gt_length": 8376.0,
16
  "pred_length": 8376.0,
17
+ "pieces_per_ref": 1.0,
18
+ "refs_split_share": 0.0,
19
+ "pieces_merging_refs_share": 0.0,
20
  "elements": 20,
21
+ "seconds": 0.0039,
22
+ "timing_s": {
23
+ "read_s": 0.003482,
24
+ "extract_s": 6.3e-05,
25
+ "normalize_s": 0.000198
26
+ }
27
+ },
28
+ "vector-chained": {
29
+ "precision": 1.0,
30
+ "recall": 1.0,
31
+ "f1": 1.0,
32
+ "endpoint_err_mean": 0.0,
33
+ "endpoint_err_median": 0.0,
34
+ "endpoint_match_rate": 1.0,
35
+ "length_error_pct": 0.0,
36
+ "gt_length": 8376.0,
37
+ "pred_length": 8376.0,
38
+ "pieces_per_ref": 1.0,
39
+ "refs_split_share": 0.0,
40
+ "pieces_merging_refs_share": 0.0,
41
+ "elements": 20,
42
+ "seconds": 0.0018,
43
+ "timing_s": {
44
+ "read_s": 0.001232,
45
+ "extract_s": 6.2e-05,
46
+ "normalize_s": 0.0004
47
+ }
48
  },
49
  "raster-150": {
50
  "precision": 1.0,
 
56
  "length_error_pct": 0.5814,
57
  "gt_length": 8376.0,
58
  "pred_length": 8327.306,
59
+ "pieces_per_ref": 1.25,
60
+ "refs_split_share": 0.1,
61
+ "pieces_merging_refs_share": 0.0,
62
  "elements": 25,
63
+ "seconds": 0.0287,
64
+ "timing_s": {
65
+ "read_s": 0.011586,
66
+ "extract_s": 0.015488,
67
+ "normalize_s": 0.001668
68
+ }
69
  },
70
  "raster-300": {
71
  "precision": 1.0,
 
77
  "length_error_pct": 0.1171,
78
  "gt_length": 8376.0,
79
  "pred_length": 8366.192,
80
+ "pieces_per_ref": 1.0,
81
+ "refs_split_share": 0.0,
82
+ "pieces_merging_refs_share": 0.0,
83
  "elements": 20,
84
+ "seconds": 0.1116,
85
+ "timing_s": {
86
+ "read_s": 0.042323,
87
+ "extract_s": 0.064775,
88
+ "normalize_s": 0.002723
89
+ }
90
  },
91
  "raster-600": {
92
  "precision": 1.0,
 
98
  "length_error_pct": 0.0811,
99
  "gt_length": 8376.0,
100
  "pred_length": 8382.797,
101
+ "pieces_per_ref": 1.05,
102
+ "refs_split_share": 0.05,
103
+ "pieces_merging_refs_share": 0.0,
104
  "elements": 21,
105
+ "seconds": 0.4532,
106
+ "timing_s": {
107
+ "read_s": 0.146528,
108
+ "extract_s": 0.302332,
109
+ "normalize_s": 0.004276
110
+ }
111
  }
112
  }
113
  },
 
125
  "length_error_pct": 0.0,
126
  "gt_length": 9919.9999,
127
  "pred_length": 9919.9999,
128
+ "pieces_per_ref": 1.0,
129
+ "refs_split_share": 0.0,
130
+ "pieces_merging_refs_share": 0.0,
131
+ "elements": 16,
132
+ "seconds": 0.0019,
133
+ "timing_s": {
134
+ "read_s": 0.001499,
135
+ "extract_s": 5.1e-05,
136
+ "normalize_s": 0.000194
137
+ }
138
+ },
139
+ "vector-chained": {
140
+ "precision": 1.0,
141
+ "recall": 1.0,
142
+ "f1": 1.0,
143
+ "endpoint_err_mean": 0.0,
144
+ "endpoint_err_median": 0.0,
145
+ "endpoint_match_rate": 1.0,
146
+ "length_error_pct": 0.0,
147
+ "gt_length": 9919.9999,
148
+ "pred_length": 9919.9999,
149
+ "pieces_per_ref": 1.0,
150
+ "refs_split_share": 0.0,
151
+ "pieces_merging_refs_share": 0.0,
152
  "elements": 16,
153
+ "seconds": 0.0019,
154
+ "timing_s": {
155
+ "read_s": 0.001338,
156
+ "extract_s": 5.1e-05,
157
+ "normalize_s": 0.000378
158
+ }
159
  },
160
  "raster-150": {
161
  "precision": 1.0,
 
167
  "length_error_pct": 0.1074,
168
  "gt_length": 9919.9999,
169
  "pred_length": 9909.3425,
170
+ "pieces_per_ref": 1.0,
171
+ "refs_split_share": 0.0,
172
+ "pieces_merging_refs_share": 0.0,
173
  "elements": 16,
174
+ "seconds": 0.0347,
175
+ "timing_s": {
176
+ "read_s": 0.011656,
177
+ "extract_s": 0.020918,
178
+ "normalize_s": 0.001668
179
+ }
180
  },
181
  "raster-300": {
182
  "precision": 1.0,
 
188
  "length_error_pct": 0.0623,
189
  "gt_length": 9919.9999,
190
  "pred_length": 9913.8201,
191
+ "pieces_per_ref": 1.0,
192
+ "refs_split_share": 0.0,
193
+ "pieces_merging_refs_share": 0.0,
194
  "elements": 16,
195
+ "seconds": 0.114,
196
+ "timing_s": {
197
+ "read_s": 0.039935,
198
+ "extract_s": 0.071524,
199
+ "normalize_s": 0.002314
200
+ }
201
  },
202
  "raster-600": {
203
  "precision": 1.0,
 
209
  "length_error_pct": 0.0188,
210
  "gt_length": 9919.9999,
211
  "pred_length": 9918.13,
212
+ "pieces_per_ref": 1.0,
213
+ "refs_split_share": 0.0,
214
+ "pieces_merging_refs_share": 0.0,
215
  "elements": 16,
216
+ "seconds": 0.5878,
217
+ "timing_s": {
218
+ "read_s": 0.151764,
219
+ "extract_s": 0.432997,
220
+ "normalize_s": 0.005315
221
+ }
222
  }
223
  }
224
  },
 
236
  "length_error_pct": 0.0075,
237
  "gt_length": 8492.2482,
238
  "pred_length": 8492.8824,
239
+ "pieces_per_ref": 12.28,
240
+ "refs_split_share": 0.32,
241
+ "pieces_merging_refs_share": 0.0,
242
  "elements": 307,
243
+ "seconds": 0.0096,
244
+ "timing_s": {
245
+ "read_s": 0.002155,
246
+ "extract_s": 0.002886,
247
+ "normalize_s": 0.003441
248
+ }
249
+ },
250
+ "vector-chained": {
251
+ "precision": 1.0,
252
+ "recall": 1.0,
253
+ "f1": 1.0,
254
+ "endpoint_err_mean": 0.0,
255
+ "endpoint_err_median": 0.0,
256
+ "endpoint_match_rate": 1.0,
257
+ "length_error_pct": 0.0075,
258
+ "gt_length": 8492.2482,
259
+ "pred_length": 8492.8824,
260
+ "pieces_per_ref": 1.0,
261
+ "refs_split_share": 0.0,
262
+ "pieces_merging_refs_share": 0.0,
263
+ "elements": 25,
264
+ "seconds": 0.0123,
265
+ "timing_s": {
266
+ "read_s": 0.00201,
267
+ "extract_s": 0.002911,
268
+ "normalize_s": 0.007103
269
+ }
270
  },
271
  "raster-150": {
272
  "precision": 0.9826,
 
278
  "length_error_pct": 1.7599,
279
  "gt_length": 8492.2482,
280
  "pred_length": 8342.7971,
281
+ "pieces_per_ref": 4.76,
282
+ "refs_split_share": 0.4,
283
+ "pieces_merging_refs_share": 0.0,
284
  "elements": 119,
285
+ "seconds": 0.0395,
286
+ "timing_s": {
287
+ "read_s": 0.012439,
288
+ "extract_s": 0.019249,
289
+ "normalize_s": 0.007342
290
+ }
291
  },
292
  "raster-300": {
293
  "precision": 0.968,
 
299
  "length_error_pct": 4.7551,
300
  "gt_length": 8492.2482,
301
  "pred_length": 8896.0626,
302
+ "pieces_per_ref": 6.4,
303
+ "refs_split_share": 0.32,
304
+ "pieces_merging_refs_share": 0.0,
305
  "elements": 160,
306
+ "seconds": 0.1242,
307
+ "timing_s": {
308
+ "read_s": 0.040262,
309
+ "extract_s": 0.064446,
310
+ "normalize_s": 0.013779
311
+ }
312
  },
313
  "raster-600": {
314
  "precision": 0.9502,
 
320
  "length_error_pct": 8.9647,
321
  "gt_length": 8492.2482,
322
  "pred_length": 9253.5532,
323
+ "pieces_per_ref": 7.0,
324
+ "refs_split_share": 0.32,
325
+ "pieces_merging_refs_share": 0.0,
326
  "elements": 175,
327
+ "seconds": 0.5466,
328
+ "timing_s": {
329
+ "read_s": 0.15833,
330
+ "extract_s": 0.363274,
331
+ "normalize_s": 0.024387
332
+ }
333
  }
334
  }
335
  },
 
347
  "length_error_pct": 0.0,
348
  "gt_length": 22766.3376,
349
  "pred_length": 22766.3376,
350
+ "pieces_per_ref": 1.0,
351
+ "refs_split_share": 0.0,
352
+ "pieces_merging_refs_share": 0.0,
353
+ "elements": 96,
354
+ "seconds": 0.0048,
355
+ "timing_s": {
356
+ "read_s": 0.002133,
357
+ "extract_s": 0.000311,
358
+ "normalize_s": 0.001815
359
+ }
360
+ },
361
+ "vector-chained": {
362
+ "precision": 1.0,
363
+ "recall": 1.0,
364
+ "f1": 1.0,
365
+ "endpoint_err_mean": 0.0,
366
+ "endpoint_err_median": 0.0,
367
+ "endpoint_match_rate": 1.0,
368
+ "length_error_pct": 0.0,
369
+ "gt_length": 22766.3376,
370
+ "pred_length": 22766.3376,
371
+ "pieces_per_ref": 1.0,
372
+ "refs_split_share": 0.0,
373
+ "pieces_merging_refs_share": 0.0,
374
  "elements": 96,
375
+ "seconds": 0.0053,
376
+ "timing_s": {
377
+ "read_s": 0.001992,
378
+ "extract_s": 0.000278,
379
+ "normalize_s": 0.002669
380
+ }
381
  },
382
  "raster-150": {
383
  "precision": 1.0,
 
389
  "length_error_pct": 0.2037,
390
  "gt_length": 22766.3376,
391
  "pred_length": 22719.9517,
392
+ "pieces_per_ref": 1.0,
393
+ "refs_split_share": 0.0,
394
+ "pieces_merging_refs_share": 0.0,
395
  "elements": 96,
396
+ "seconds": 0.0784,
397
+ "timing_s": {
398
+ "read_s": 0.011941,
399
+ "extract_s": 0.046653,
400
+ "normalize_s": 0.018108
401
+ }
402
  },
403
  "raster-300": {
404
  "precision": 1.0,
 
410
  "length_error_pct": 0.0425,
411
  "gt_length": 22766.3376,
412
  "pred_length": 22756.6599,
413
+ "pieces_per_ref": 1.0,
414
+ "refs_split_share": 0.0,
415
+ "pieces_merging_refs_share": 0.0,
416
  "elements": 96,
417
+ "seconds": 0.2477,
418
+ "timing_s": {
419
+ "read_s": 0.041119,
420
+ "extract_s": 0.170803,
421
+ "normalize_s": 0.034952
422
+ }
423
  },
424
  "raster-600": {
425
  "precision": 1.0,
 
431
  "length_error_pct": 0.1824,
432
  "gt_length": 22766.3376,
433
  "pred_length": 22807.8533,
434
+ "pieces_per_ref": 1.0104,
435
+ "refs_split_share": 0.0104,
436
+ "pieces_merging_refs_share": 0.0,
437
  "elements": 97,
438
+ "seconds": 1.0516,
439
+ "timing_s": {
440
+ "read_s": 0.153047,
441
+ "extract_s": 0.797105,
442
+ "normalize_s": 0.097912
443
+ }
444
  }
445
  }
446
  },
 
458
  "length_error_pct": 0.0,
459
  "gt_length": 14720.0,
460
  "pred_length": 14720.0,
461
+ "pieces_per_ref": 1.0,
462
+ "refs_split_share": 0.0,
463
+ "pieces_merging_refs_share": 0.0,
464
  "elements": 24,
465
+ "seconds": 0.002,
466
+ "timing_s": {
467
+ "read_s": 0.001647,
468
+ "extract_s": 8.2e-05,
469
+ "normalize_s": 0.000167
470
+ }
471
+ },
472
+ "vector-chained": {
473
+ "precision": 1.0,
474
+ "recall": 1.0,
475
+ "f1": 1.0,
476
+ "endpoint_err_mean": 0.0,
477
+ "endpoint_err_median": 0.0,
478
+ "endpoint_match_rate": 1.0,
479
+ "length_error_pct": 0.0,
480
+ "gt_length": 14720.0,
481
+ "pred_length": 14720.0,
482
+ "pieces_per_ref": 1.0,
483
+ "refs_split_share": 0.0,
484
+ "pieces_merging_refs_share": 0.0,
485
+ "elements": 24,
486
+ "seconds": 0.0022,
487
+ "timing_s": {
488
+ "read_s": 0.001516,
489
+ "extract_s": 7.3e-05,
490
+ "normalize_s": 0.000421
491
+ }
492
  },
493
  "raster-150": {
494
  "precision": 1.0,
 
500
  "length_error_pct": 0.2125,
501
  "gt_length": 14720.0,
502
  "pred_length": 14751.2871,
503
+ "pieces_per_ref": 1.0417,
504
+ "refs_split_share": 0.0417,
505
+ "pieces_merging_refs_share": 0.0,
506
  "elements": 25,
507
+ "seconds": 0.0436,
508
+ "timing_s": {
509
+ "read_s": 0.011732,
510
+ "extract_s": 0.029884,
511
+ "normalize_s": 0.001842
512
+ }
513
  },
514
  "raster-300": {
515
  "precision": 1.0,
 
521
  "length_error_pct": 0.0743,
522
  "gt_length": 14720.0,
523
  "pred_length": 14709.0582,
524
+ "pieces_per_ref": 1.0,
525
+ "refs_split_share": 0.0,
526
+ "pieces_merging_refs_share": 0.0,
527
  "elements": 24,
528
+ "seconds": 0.1431,
529
+ "timing_s": {
530
+ "read_s": 0.039668,
531
+ "extract_s": 0.098404,
532
+ "normalize_s": 0.001919
533
+ }
534
  },
535
  "raster-600": {
536
  "precision": 1.0,
 
542
  "length_error_pct": 0.0047,
543
  "gt_length": 14720.0,
544
  "pred_length": 14719.304,
545
+ "pieces_per_ref": 1.0417,
546
+ "refs_split_share": 0.0417,
547
+ "pieces_merging_refs_share": 0.0,
548
  "elements": 25,
549
+ "seconds": 0.675,
550
+ "timing_s": {
551
+ "read_s": 0.153721,
552
+ "extract_s": 0.508392,
553
+ "normalize_s": 0.003531
554
+ }
555
  }
556
  }
557
  },
 
569
  "length_error_pct": 3.8971,
570
  "gt_length": 7744.0,
571
  "pred_length": 8045.789,
572
+ "pieces_per_ref": 1.0,
573
+ "refs_split_share": 0.0,
574
+ "pieces_merging_refs_share": 0.0,
575
+ "elements": 37,
576
+ "seconds": 0.0054,
577
+ "timing_s": {
578
+ "read_s": 0.004687,
579
+ "extract_s": 0.000116,
580
+ "normalize_s": 0.000395
581
+ }
582
+ },
583
+ "vector-chained": {
584
+ "precision": 0.9625,
585
+ "recall": 1.0,
586
+ "f1": 0.9809,
587
+ "endpoint_err_mean": 0.0,
588
+ "endpoint_err_median": 0.0,
589
+ "endpoint_match_rate": 1.0,
590
+ "length_error_pct": 3.8971,
591
+ "gt_length": 7744.0,
592
+ "pred_length": 8045.789,
593
+ "pieces_per_ref": 1.0,
594
+ "refs_split_share": 0.0,
595
+ "pieces_merging_refs_share": 0.0,
596
  "elements": 37,
597
+ "seconds": 0.0027,
598
+ "timing_s": {
599
+ "read_s": 0.00139,
600
+ "extract_s": 0.000129,
601
+ "normalize_s": 0.001024
602
+ }
603
  },
604
  "raster-150": {
605
  "precision": 0.9722,
 
611
  "length_error_pct": 2.7573,
612
  "gt_length": 7744.0,
613
  "pred_length": 7957.5247,
614
+ "pieces_per_ref": 1.0,
615
+ "refs_split_share": 0.0,
616
+ "pieces_merging_refs_share": 0.0,
617
  "elements": 28,
618
+ "seconds": 0.0343,
619
+ "timing_s": {
620
+ "read_s": 0.014043,
621
+ "extract_s": 0.017116,
622
+ "normalize_s": 0.001789
623
+ }
624
  },
625
  "raster-300": {
626
  "precision": 0.9636,
 
632
  "length_error_pct": 3.7096,
633
  "gt_length": 7744.0,
634
  "pred_length": 8031.275,
635
+ "pieces_per_ref": 1.0,
636
+ "refs_split_share": 0.0,
637
+ "pieces_merging_refs_share": 0.0,
638
  "elements": 35,
639
+ "seconds": 0.1541,
640
+ "timing_s": {
641
+ "read_s": 0.043348,
642
+ "extract_s": 0.107341,
643
+ "normalize_s": 0.003303
644
+ }
645
  },
646
  "raster-600": {
647
  "precision": 0.966,
 
653
  "length_error_pct": 3.5056,
654
  "gt_length": 7744.0,
655
  "pred_length": 8015.4756,
656
+ "pieces_per_ref": 1.0,
657
+ "refs_split_share": 0.0,
658
+ "pieces_merging_refs_share": 0.0,
659
  "elements": 30,
660
+ "seconds": 0.5468,
661
+ "timing_s": {
662
+ "read_s": 0.153149,
663
+ "extract_s": 0.384846,
664
+ "normalize_s": 0.005434
665
+ }
666
  }
667
  }
668
  }
 
679
  "endpoint_err_median": 0.0,
680
  "endpoint_match_rate": 1.0,
681
  "length_error_pct": 0.0,
682
+ "gt_length": 19182.1968,
683
+ "pred_length": 19182.1965,
684
+ "pieces_per_ref": 1.0,
685
+ "refs_split_share": 0.0088,
686
+ "pieces_merging_refs_share": 0.0175,
687
  "elements": 114,
688
+ "seconds": 0.0047,
689
+ "timing_s": {
690
+ "read_s": 0.001648,
691
+ "extract_s": 0.000421,
692
+ "normalize_s": 0.002219
693
+ }
694
+ },
695
+ "vector-chained": {
696
+ "precision": 1.0,
697
+ "recall": 1.0,
698
+ "f1": 1.0,
699
+ "endpoint_err_mean": 0.0,
700
+ "endpoint_err_median": 0.0,
701
+ "endpoint_match_rate": 1.0,
702
+ "length_error_pct": 0.0,
703
+ "gt_length": 19182.1968,
704
+ "pred_length": 19182.1965,
705
+ "pieces_per_ref": 1.0,
706
+ "refs_split_share": 0.0088,
707
+ "pieces_merging_refs_share": 0.0175,
708
+ "elements": 114,
709
+ "seconds": 0.0067,
710
+ "timing_s": {
711
+ "read_s": 0.002226,
712
+ "extract_s": 0.000371,
713
+ "normalize_s": 0.003654
714
+ }
715
  },
716
  "raster-150": {
717
  "precision": 0.9997,
 
720
  "endpoint_err_mean": 0.3278,
721
  "endpoint_err_median": 0.2426,
722
  "endpoint_match_rate": 0.9649,
723
+ "length_error_pct": 0.8178,
724
+ "gt_length": 19182.1968,
725
  "pred_length": 19025.3308,
726
+ "pieces_per_ref": 0.9649,
727
+ "refs_split_share": 0.0439,
728
+ "pieces_merging_refs_share": 0.0727,
729
  "elements": 110,
730
+ "seconds": 0.0531,
731
+ "timing_s": {
732
+ "read_s": 0.01179,
733
+ "extract_s": 0.032418,
734
+ "normalize_s": 0.008485
735
+ }
736
  },
737
  "raster-300": {
738
  "precision": 0.9999,
739
  "recall": 0.9996,
740
  "f1": 0.9998,
741
+ "endpoint_err_mean": 0.2792,
742
+ "endpoint_err_median": 0.2357,
743
  "endpoint_match_rate": 0.9386,
744
+ "length_error_pct": 0.0898,
745
+ "gt_length": 19182.1968,
746
+ "pred_length": 19164.971,
747
+ "pieces_per_ref": 0.8947,
748
+ "refs_split_share": 0.0175,
749
+ "pieces_merging_refs_share": 0.1078,
750
  "elements": 102,
751
+ "seconds": 0.2145,
752
+ "timing_s": {
753
+ "read_s": 0.038818,
754
+ "extract_s": 0.152443,
755
+ "normalize_s": 0.014146
756
+ }
757
  },
758
  "raster-600": {
759
  "precision": 0.9995,
760
  "recall": 0.9996,
761
  "f1": 0.9996,
762
+ "endpoint_err_mean": 0.3302,
763
+ "endpoint_err_median": 0.3325,
764
  "endpoint_match_rate": 0.9123,
765
+ "length_error_pct": 0.504,
766
+ "gt_length": 19182.1968,
767
+ "pred_length": 19278.8834,
768
+ "pieces_per_ref": 0.9123,
769
+ "refs_split_share": 0.0439,
770
+ "pieces_merging_refs_share": 0.1154,
771
  "elements": 104,
772
+ "seconds": 1.1143,
773
+ "timing_s": {
774
+ "read_s": 0.150594,
775
+ "extract_s": 0.922937,
776
+ "normalize_s": 0.030619
777
+ }
778
  }
779
  },
780
  {
 
787
  "endpoint_err_mean": 0.0,
788
  "endpoint_err_median": 0.0,
789
  "endpoint_match_rate": 1.0,
790
+ "length_error_pct": 0.0802,
791
+ "gt_length": 15720.2999,
792
+ "pred_length": 15707.6873,
793
+ "pieces_per_ref": 2.9127,
794
+ "refs_split_share": 0.0262,
795
+ "pieces_merging_refs_share": 0.0045,
796
  "elements": 667,
797
+ "seconds": 0.0193,
798
+ "timing_s": {
799
+ "read_s": 0.003704,
800
+ "extract_s": 0.002576,
801
+ "normalize_s": 0.010733
802
+ }
803
+ },
804
+ "vector-chained": {
805
+ "precision": 1.0,
806
+ "recall": 1.0,
807
+ "f1": 1.0,
808
+ "endpoint_err_mean": 0.0305,
809
+ "endpoint_err_median": 0.0,
810
+ "endpoint_match_rate": 0.9825,
811
+ "length_error_pct": 0.0802,
812
+ "gt_length": 15720.2999,
813
+ "pred_length": 15707.6873,
814
+ "pieces_per_ref": 0.9607,
815
+ "refs_split_share": 0.0044,
816
+ "pieces_merging_refs_share": 0.0227,
817
+ "elements": 220,
818
+ "seconds": 0.0258,
819
+ "timing_s": {
820
+ "read_s": 0.003394,
821
+ "extract_s": 0.002561,
822
+ "normalize_s": 0.018811
823
+ }
824
  },
825
  "raster-150": {
826
  "precision": 0.8418,
 
829
  "endpoint_err_mean": 0.677,
830
  "endpoint_err_median": 0.5329,
831
  "endpoint_match_rate": 0.9105,
832
+ "length_error_pct": 2.3511,
833
+ "gt_length": 15720.2999,
834
  "pred_length": 15350.6952,
835
+ "pieces_per_ref": 5.3144,
836
+ "refs_split_share": 0.441,
837
+ "pieces_merging_refs_share": 0.014,
838
  "elements": 1217,
839
+ "seconds": 0.1467,
840
+ "timing_s": {
841
+ "read_s": 0.01192,
842
+ "extract_s": 0.036868,
843
+ "normalize_s": 0.094387
844
+ }
845
  },
846
  "raster-300": {
847
  "precision": 0.8382,
 
850
  "endpoint_err_mean": 0.6401,
851
  "endpoint_err_median": 0.4498,
852
  "endpoint_match_rate": 0.9192,
853
+ "length_error_pct": 11.9148,
854
+ "gt_length": 15720.2999,
855
  "pred_length": 17593.3446,
856
+ "pieces_per_ref": 5.9869,
857
+ "refs_split_share": 0.4541,
858
+ "pieces_merging_refs_share": 0.0109,
859
  "elements": 1371,
860
+ "seconds": 0.3835,
861
+ "timing_s": {
862
+ "read_s": 0.040427,
863
+ "extract_s": 0.167173,
864
+ "normalize_s": 0.160671
865
+ }
866
  },
867
  "raster-600": {
868
  "precision": 0.8174,
 
871
  "endpoint_err_mean": 0.6173,
872
  "endpoint_err_median": 0.4727,
873
  "endpoint_match_rate": 0.9148,
874
+ "length_error_pct": 25.747,
875
+ "gt_length": 15720.2999,
876
  "pred_length": 19767.8109,
877
+ "pieces_per_ref": 7.3144,
878
+ "refs_split_share": 0.4978,
879
+ "pieces_merging_refs_share": 0.0072,
880
  "elements": 1675,
881
+ "seconds": 1.208,
882
+ "timing_s": {
883
+ "read_s": 0.157514,
884
+ "extract_s": 0.722418,
885
+ "normalize_s": 0.322469
886
+ }
887
  }
888
  },
889
  {
 
896
  "endpoint_err_mean": 0.0156,
897
  "endpoint_err_median": 0.0,
898
  "endpoint_match_rate": 0.9994,
899
+ "length_error_pct": 0.1432,
900
+ "gt_length": 28020.7197,
901
+ "pred_length": 27980.59,
902
+ "pieces_per_ref": 9.8724,
903
+ "refs_split_share": 0.3185,
904
+ "pieces_merging_refs_share": 0.0015,
905
  "elements": 7967,
906
+ "seconds": 0.3694,
907
+ "timing_s": {
908
+ "read_s": 0.013838,
909
+ "extract_s": 0.031574,
910
+ "normalize_s": 0.274991
911
+ }
912
+ },
913
+ "vector-chained": {
914
+ "precision": 1.0,
915
+ "recall": 1.0,
916
+ "f1": 1.0,
917
+ "endpoint_err_mean": 0.7282,
918
+ "endpoint_err_median": 0.0,
919
+ "endpoint_match_rate": 0.8123,
920
+ "length_error_pct": 0.1435,
921
+ "gt_length": 28020.7197,
922
+ "pred_length": 27980.5043,
923
+ "pieces_per_ref": 0.6568,
924
+ "refs_split_share": 0.0161,
925
+ "pieces_merging_refs_share": 0.0604,
926
+ "elements": 530,
927
+ "seconds": 0.4445,
928
+ "timing_s": {
929
+ "read_s": 0.014386,
930
+ "extract_s": 0.031846,
931
+ "normalize_s": 0.392288
932
+ }
933
  },
934
  "raster-150": {
935
  "precision": 0.9983,
 
938
  "endpoint_err_mean": 1.3126,
939
  "endpoint_err_median": 0.7283,
940
  "endpoint_match_rate": 0.7807,
941
+ "length_error_pct": 7.433,
942
+ "gt_length": 28020.7197,
943
  "pred_length": 25937.9321,
944
+ "pieces_per_ref": 0.544,
945
+ "refs_split_share": 0.052,
946
+ "pieces_merging_refs_share": 0.1048,
947
  "elements": 439,
948
+ "seconds": 0.1047,
949
+ "timing_s": {
950
+ "read_s": 0.012167,
951
+ "extract_s": 0.061615,
952
+ "normalize_s": 0.029133
953
+ }
954
  },
955
  "raster-300": {
956
  "precision": 0.9949,
 
959
  "endpoint_err_mean": 1.2637,
960
  "endpoint_err_median": 0.6476,
961
  "endpoint_match_rate": 0.8383,
962
+ "length_error_pct": 2.4221,
963
+ "gt_length": 28020.7197,
964
  "pred_length": 27342.0243,
965
+ "pieces_per_ref": 0.6382,
966
+ "refs_split_share": 0.0706,
967
+ "pieces_merging_refs_share": 0.0971,
968
  "elements": 515,
969
+ "seconds": 0.3516,
970
+ "timing_s": {
971
+ "read_s": 0.045245,
972
+ "extract_s": 0.249985,
973
+ "normalize_s": 0.051597
974
+ }
975
  },
976
  "raster-600": {
977
  "precision": 0.989,
 
980
  "endpoint_err_mean": 1.1791,
981
  "endpoint_err_median": 0.6151,
982
  "endpoint_match_rate": 0.9182,
983
+ "length_error_pct": 0.9097,
984
+ "gt_length": 28020.7197,
985
  "pred_length": 28275.6325,
986
+ "pieces_per_ref": 0.7943,
987
+ "refs_split_share": 0.1115,
988
+ "pieces_merging_refs_share": 0.0811,
989
  "elements": 641,
990
+ "seconds": 1.5251,
991
+ "timing_s": {
992
+ "read_s": 0.144133,
993
+ "extract_s": 1.274973,
994
+ "normalize_s": 0.103873
995
+ }
996
+ }
997
+ },
998
+ {
999
+ "drawing": "0721-0004",
1000
+ "gt_lines": 123,
1001
+ "vector": {
1002
+ "precision": 1.0,
1003
+ "recall": 1.0,
1004
+ "f1": 1.0,
1005
+ "endpoint_err_mean": 0.0405,
1006
+ "endpoint_err_median": 0.0,
1007
+ "endpoint_match_rate": 1.0,
1008
+ "length_error_pct": 0.0971,
1009
+ "gt_length": 13210.4513,
1010
+ "pred_length": 13197.6255,
1011
+ "pieces_per_ref": 14.3008,
1012
+ "refs_split_share": 0.1545,
1013
+ "pieces_merging_refs_share": 0.0023,
1014
+ "elements": 1759,
1015
+ "seconds": 0.0834,
1016
+ "timing_s": {
1017
+ "read_s": 0.00487,
1018
+ "extract_s": 0.007083,
1019
+ "normalize_s": 0.060708
1020
+ }
1021
+ },
1022
+ "vector-chained": {
1023
+ "precision": 1.0,
1024
+ "recall": 1.0,
1025
+ "f1": 1.0,
1026
+ "endpoint_err_mean": 0.3148,
1027
+ "endpoint_err_median": 0.0,
1028
+ "endpoint_match_rate": 0.8943,
1029
+ "length_error_pct": 0.0971,
1030
+ "gt_length": 13210.4513,
1031
+ "pred_length": 13197.6255,
1032
+ "pieces_per_ref": 0.8455,
1033
+ "refs_split_share": 0.0488,
1034
+ "pieces_merging_refs_share": 0.0769,
1035
+ "elements": 104,
1036
+ "seconds": 0.0981,
1037
+ "timing_s": {
1038
+ "read_s": 0.004715,
1039
+ "extract_s": 0.007462,
1040
+ "normalize_s": 0.084548
1041
+ }
1042
+ },
1043
+ "raster-150": {
1044
+ "precision": 0.996,
1045
+ "recall": 0.9849,
1046
+ "f1": 0.9904,
1047
+ "endpoint_err_mean": 0.8249,
1048
+ "endpoint_err_median": 0.3949,
1049
+ "endpoint_match_rate": 0.8333,
1050
+ "length_error_pct": 2.111,
1051
+ "gt_length": 13210.4513,
1052
+ "pred_length": 12931.5733,
1053
+ "pieces_per_ref": 1.0976,
1054
+ "refs_split_share": 0.0813,
1055
+ "pieces_merging_refs_share": 0.0667,
1056
+ "elements": 135,
1057
+ "seconds": 0.0474,
1058
+ "timing_s": {
1059
+ "read_s": 0.011977,
1060
+ "extract_s": 0.025929,
1061
+ "normalize_s": 0.009097
1062
+ }
1063
+ },
1064
+ "raster-300": {
1065
+ "precision": 0.9886,
1066
+ "recall": 0.986,
1067
+ "f1": 0.9873,
1068
+ "endpoint_err_mean": 0.853,
1069
+ "endpoint_err_median": 0.4261,
1070
+ "endpoint_match_rate": 0.8415,
1071
+ "length_error_pct": 0.8407,
1072
+ "gt_length": 13210.4513,
1073
+ "pred_length": 13321.5079,
1074
+ "pieces_per_ref": 1.0813,
1075
+ "refs_split_share": 0.0407,
1076
+ "pieces_merging_refs_share": 0.0752,
1077
+ "elements": 133,
1078
+ "seconds": 0.1658,
1079
+ "timing_s": {
1080
+ "read_s": 0.038127,
1081
+ "extract_s": 0.107624,
1082
+ "normalize_s": 0.013205
1083
+ }
1084
+ },
1085
+ "raster-600": {
1086
+ "precision": 0.9862,
1087
+ "recall": 0.9899,
1088
+ "f1": 0.988,
1089
+ "endpoint_err_mean": 0.7642,
1090
+ "endpoint_err_median": 0.3709,
1091
+ "endpoint_match_rate": 0.8374,
1092
+ "length_error_pct": 2.0108,
1093
+ "gt_length": 13210.4513,
1094
+ "pred_length": 13476.0901,
1095
+ "pieces_per_ref": 1.1789,
1096
+ "refs_split_share": 0.0813,
1097
+ "pieces_merging_refs_share": 0.0621,
1098
+ "elements": 145,
1099
+ "seconds": 0.8766,
1100
+ "timing_s": {
1101
+ "read_s": 0.154657,
1102
+ "extract_s": 0.684739,
1103
+ "normalize_s": 0.026844
1104
+ }
1105
+ }
1106
+ },
1107
+ {
1108
+ "drawing": "1261-0083",
1109
+ "gt_lines": 91,
1110
+ "vector": {
1111
+ "precision": 1.0,
1112
+ "recall": 1.0,
1113
+ "f1": 1.0,
1114
+ "endpoint_err_mean": 0.0,
1115
+ "endpoint_err_median": 0.0,
1116
+ "endpoint_match_rate": 1.0,
1117
+ "length_error_pct": 0.0,
1118
+ "gt_length": 21145.909,
1119
+ "pred_length": 21145.909,
1120
+ "pieces_per_ref": 1.0,
1121
+ "refs_split_share": 0.011,
1122
+ "pieces_merging_refs_share": 0.022,
1123
+ "elements": 91,
1124
+ "seconds": 0.0048,
1125
+ "timing_s": {
1126
+ "read_s": 0.002106,
1127
+ "extract_s": 0.000317,
1128
+ "normalize_s": 0.001923
1129
+ }
1130
+ },
1131
+ "vector-chained": {
1132
+ "precision": 1.0,
1133
+ "recall": 1.0,
1134
+ "f1": 1.0,
1135
+ "endpoint_err_mean": 0.0,
1136
+ "endpoint_err_median": 0.0,
1137
+ "endpoint_match_rate": 1.0,
1138
+ "length_error_pct": 0.0,
1139
+ "gt_length": 21145.909,
1140
+ "pred_length": 21145.909,
1141
+ "pieces_per_ref": 1.0,
1142
+ "refs_split_share": 0.011,
1143
+ "pieces_merging_refs_share": 0.022,
1144
+ "elements": 91,
1145
+ "seconds": 0.0057,
1146
+ "timing_s": {
1147
+ "read_s": 0.002017,
1148
+ "extract_s": 0.00031,
1149
+ "normalize_s": 0.002982
1150
+ }
1151
+ },
1152
+ "raster-150": {
1153
+ "precision": 0.9998,
1154
+ "recall": 0.9982,
1155
+ "f1": 0.999,
1156
+ "endpoint_err_mean": 0.5322,
1157
+ "endpoint_err_median": 0.4649,
1158
+ "endpoint_match_rate": 0.8681,
1159
+ "length_error_pct": 0.5175,
1160
+ "gt_length": 21145.909,
1161
+ "pred_length": 21036.4876,
1162
+ "pieces_per_ref": 0.8352,
1163
+ "refs_split_share": 0.0659,
1164
+ "pieces_merging_refs_share": 0.25,
1165
+ "elements": 76,
1166
+ "seconds": 0.061,
1167
+ "timing_s": {
1168
+ "read_s": 0.011565,
1169
+ "extract_s": 0.040481,
1170
+ "normalize_s": 0.008738
1171
+ }
1172
+ },
1173
+ "raster-300": {
1174
+ "precision": 1.0,
1175
+ "recall": 1.0,
1176
+ "f1": 1.0,
1177
+ "endpoint_err_mean": 0.3935,
1178
+ "endpoint_err_median": 0.3694,
1179
+ "endpoint_match_rate": 0.8791,
1180
+ "length_error_pct": 0.2463,
1181
+ "gt_length": 21145.909,
1182
+ "pred_length": 21197.9843,
1183
+ "pieces_per_ref": 0.7253,
1184
+ "refs_split_share": 0.011,
1185
+ "pieces_merging_refs_share": 0.2879,
1186
+ "elements": 66,
1187
+ "seconds": 0.2167,
1188
+ "timing_s": {
1189
+ "read_s": 0.038147,
1190
+ "extract_s": 0.164711,
1191
+ "normalize_s": 0.014169
1192
+ }
1193
+ },
1194
+ "raster-600": {
1195
+ "precision": 1.0,
1196
+ "recall": 1.0,
1197
+ "f1": 1.0,
1198
+ "endpoint_err_mean": 0.3908,
1199
+ "endpoint_err_median": 0.3924,
1200
+ "endpoint_match_rate": 0.8791,
1201
+ "length_error_pct": 2.5974,
1202
+ "gt_length": 21145.909,
1203
+ "pred_length": 21695.146,
1204
+ "pieces_per_ref": 0.7473,
1205
+ "refs_split_share": 0.033,
1206
+ "pieces_merging_refs_share": 0.2794,
1207
+ "elements": 68,
1208
+ "seconds": 1.3061,
1209
+ "timing_s": {
1210
+ "read_s": 0.153512,
1211
+ "extract_s": 1.125814,
1212
+ "normalize_s": 0.033467
1213
+ }
1214
+ }
1215
+ },
1216
+ {
1217
+ "drawing": "0175-0005",
1218
+ "gt_lines": 155,
1219
+ "vector": {
1220
+ "precision": 1.0,
1221
+ "recall": 1.0,
1222
+ "f1": 1.0,
1223
+ "endpoint_err_mean": 0.0,
1224
+ "endpoint_err_median": 0.0,
1225
+ "endpoint_match_rate": 1.0,
1226
+ "length_error_pct": 0.0665,
1227
+ "gt_length": 10834.5574,
1228
+ "pred_length": 10827.3502,
1229
+ "pieces_per_ref": 1.5484,
1230
+ "refs_split_share": 0.0516,
1231
+ "pieces_merging_refs_share": 0.025,
1232
+ "elements": 240,
1233
+ "seconds": 0.0076,
1234
+ "timing_s": {
1235
+ "read_s": 0.002408,
1236
+ "extract_s": 0.000814,
1237
+ "normalize_s": 0.003452
1238
+ }
1239
+ },
1240
+ "vector-chained": {
1241
+ "precision": 1.0,
1242
+ "recall": 1.0,
1243
+ "f1": 1.0,
1244
+ "endpoint_err_mean": 0.0303,
1245
+ "endpoint_err_median": 0.0,
1246
+ "endpoint_match_rate": 0.871,
1247
+ "length_error_pct": 0.0665,
1248
+ "gt_length": 10834.5574,
1249
+ "pred_length": 10827.3502,
1250
+ "pieces_per_ref": 0.871,
1251
+ "refs_split_share": 0.0452,
1252
+ "pieces_merging_refs_share": 0.0519,
1253
+ "elements": 135,
1254
+ "seconds": 0.0103,
1255
+ "timing_s": {
1256
+ "read_s": 0.002731,
1257
+ "extract_s": 0.000787,
1258
+ "normalize_s": 0.006117
1259
+ }
1260
+ },
1261
+ "raster-150": {
1262
+ "precision": 0.9959,
1263
+ "recall": 0.9912,
1264
+ "f1": 0.9935,
1265
+ "endpoint_err_mean": 0.6395,
1266
+ "endpoint_err_median": 0.3344,
1267
+ "endpoint_match_rate": 0.7903,
1268
+ "length_error_pct": 1.1159,
1269
+ "gt_length": 10834.5574,
1270
+ "pred_length": 10713.6521,
1271
+ "pieces_per_ref": 0.7161,
1272
+ "refs_split_share": 0.0258,
1273
+ "pieces_merging_refs_share": 0.1892,
1274
+ "elements": 111,
1275
+ "seconds": 0.0387,
1276
+ "timing_s": {
1277
+ "read_s": 0.01127,
1278
+ "extract_s": 0.019232,
1279
+ "normalize_s": 0.007725
1280
+ }
1281
+ },
1282
+ "raster-300": {
1283
+ "precision": 0.9942,
1284
+ "recall": 0.9938,
1285
+ "f1": 0.994,
1286
+ "endpoint_err_mean": 0.6269,
1287
+ "endpoint_err_median": 0.3647,
1288
+ "endpoint_match_rate": 0.8387,
1289
+ "length_error_pct": 0.9299,
1290
+ "gt_length": 10834.5574,
1291
+ "pred_length": 10935.3116,
1292
+ "pieces_per_ref": 0.7484,
1293
+ "refs_split_share": 0.0323,
1294
+ "pieces_merging_refs_share": 0.1897,
1295
+ "elements": 116,
1296
+ "seconds": 0.1444,
1297
+ "timing_s": {
1298
+ "read_s": 0.039075,
1299
+ "extract_s": 0.09175,
1300
+ "normalize_s": 0.013416
1301
+ }
1302
+ },
1303
+ "raster-600": {
1304
+ "precision": 0.992,
1305
+ "recall": 0.9963,
1306
+ "f1": 0.9942,
1307
+ "endpoint_err_mean": 0.6737,
1308
+ "endpoint_err_median": 0.3686,
1309
+ "endpoint_match_rate": 0.8774,
1310
+ "length_error_pct": 2.5788,
1311
+ "gt_length": 10834.5574,
1312
+ "pred_length": 11113.9612,
1313
+ "pieces_per_ref": 0.7806,
1314
+ "refs_split_share": 0.0452,
1315
+ "pieces_merging_refs_share": 0.1901,
1316
+ "elements": 121,
1317
+ "seconds": 0.7322,
1318
+ "timing_s": {
1319
+ "read_s": 0.158885,
1320
+ "extract_s": 0.546645,
1321
+ "normalize_s": 0.026807
1322
+ }
1323
+ }
1324
+ },
1325
+ {
1326
+ "drawing": "0515-0016",
1327
+ "gt_lines": 195,
1328
+ "vector": {
1329
+ "precision": 1.0,
1330
+ "recall": 1.0,
1331
+ "f1": 1.0,
1332
+ "endpoint_err_mean": 0.0,
1333
+ "endpoint_err_median": 0.0,
1334
+ "endpoint_match_rate": 1.0,
1335
+ "length_error_pct": 0.0147,
1336
+ "gt_length": 24658.5146,
1337
+ "pred_length": 24654.9,
1338
+ "pieces_per_ref": 4.2615,
1339
+ "refs_split_share": 0.0718,
1340
+ "pieces_merging_refs_share": 0.0096,
1341
+ "elements": 831,
1342
+ "seconds": 0.0324,
1343
+ "timing_s": {
1344
+ "read_s": 0.003732,
1345
+ "extract_s": 0.002738,
1346
+ "normalize_s": 0.022544
1347
+ }
1348
+ },
1349
+ "vector-chained": {
1350
+ "precision": 1.0,
1351
+ "recall": 1.0,
1352
+ "f1": 1.0,
1353
+ "endpoint_err_mean": 0.0218,
1354
+ "endpoint_err_median": 0.0,
1355
+ "endpoint_match_rate": 0.9692,
1356
+ "length_error_pct": 0.0147,
1357
+ "gt_length": 24658.5146,
1358
+ "pred_length": 24654.9,
1359
+ "pieces_per_ref": 0.9641,
1360
+ "refs_split_share": 0.041,
1361
+ "pieces_merging_refs_share": 0.0532,
1362
+ "elements": 188,
1363
+ "seconds": 0.0387,
1364
+ "timing_s": {
1365
+ "read_s": 0.003227,
1366
+ "extract_s": 0.00267,
1367
+ "normalize_s": 0.031836
1368
+ }
1369
+ },
1370
+ "raster-150": {
1371
+ "precision": 1.0,
1372
+ "recall": 0.9949,
1373
+ "f1": 0.9975,
1374
+ "endpoint_err_mean": 0.6014,
1375
+ "endpoint_err_median": 0.4132,
1376
+ "endpoint_match_rate": 0.7795,
1377
+ "length_error_pct": 1.1557,
1378
+ "gt_length": 24658.5146,
1379
+ "pred_length": 24373.5305,
1380
+ "pieces_per_ref": 0.7949,
1381
+ "refs_split_share": 0.0564,
1382
+ "pieces_merging_refs_share": 0.1161,
1383
+ "elements": 155,
1384
+ "seconds": 0.0707,
1385
+ "timing_s": {
1386
+ "read_s": 0.011385,
1387
+ "extract_s": 0.045401,
1388
+ "normalize_s": 0.012894
1389
+ }
1390
+ },
1391
+ "raster-300": {
1392
+ "precision": 1.0,
1393
+ "recall": 0.9982,
1394
+ "f1": 0.9991,
1395
+ "endpoint_err_mean": 0.584,
1396
+ "endpoint_err_median": 0.4037,
1397
+ "endpoint_match_rate": 0.8026,
1398
+ "length_error_pct": 0.3836,
1399
+ "gt_length": 24658.5146,
1400
+ "pred_length": 24563.9124,
1401
+ "pieces_per_ref": 0.7333,
1402
+ "refs_split_share": 0.0103,
1403
+ "pieces_merging_refs_share": 0.1259,
1404
+ "elements": 143,
1405
+ "seconds": 0.2763,
1406
+ "timing_s": {
1407
+ "read_s": 0.041365,
1408
+ "extract_s": 0.214728,
1409
+ "normalize_s": 0.016901
1410
+ }
1411
+ },
1412
+ "raster-600": {
1413
+ "precision": 1.0,
1414
+ "recall": 0.999,
1415
+ "f1": 0.9995,
1416
+ "endpoint_err_mean": 0.5454,
1417
+ "endpoint_err_median": 0.3608,
1418
+ "endpoint_match_rate": 0.8026,
1419
+ "length_error_pct": 0.48,
1420
+ "gt_length": 24658.5146,
1421
+ "pred_length": 24776.8753,
1422
+ "pieces_per_ref": 0.7436,
1423
+ "refs_split_share": 0.0103,
1424
+ "pieces_merging_refs_share": 0.131,
1425
+ "elements": 145,
1426
+ "seconds": 1.3006,
1427
+ "timing_s": {
1428
+ "read_s": 0.15404,
1429
+ "extract_s": 1.105248,
1430
+ "normalize_s": 0.036413
1431
+ }
1432
+ }
1433
+ },
1434
+ {
1435
+ "drawing": "1083-0018",
1436
+ "gt_lines": 135,
1437
+ "vector": {
1438
+ "precision": 1.0,
1439
+ "recall": 1.0,
1440
+ "f1": 1.0,
1441
+ "endpoint_err_mean": 0.0,
1442
+ "endpoint_err_median": 0.0,
1443
+ "endpoint_match_rate": 1.0,
1444
+ "length_error_pct": 0.0,
1445
+ "gt_length": 17130.0009,
1446
+ "pred_length": 17130.0007,
1447
+ "pieces_per_ref": 1.0,
1448
+ "refs_split_share": 0.0444,
1449
+ "pieces_merging_refs_share": 0.1778,
1450
+ "elements": 135,
1451
+ "seconds": 0.0078,
1452
+ "timing_s": {
1453
+ "read_s": 0.002766,
1454
+ "extract_s": 0.000765,
1455
+ "normalize_s": 0.003664
1456
+ }
1457
+ },
1458
+ "vector-chained": {
1459
+ "precision": 1.0,
1460
+ "recall": 1.0,
1461
+ "f1": 1.0,
1462
+ "endpoint_err_mean": 0.0,
1463
+ "endpoint_err_median": 0.0,
1464
+ "endpoint_match_rate": 1.0,
1465
+ "length_error_pct": 0.0,
1466
+ "gt_length": 17130.0009,
1467
+ "pred_length": 17130.0007,
1468
+ "pieces_per_ref": 1.0,
1469
+ "refs_split_share": 0.0444,
1470
+ "pieces_merging_refs_share": 0.1778,
1471
+ "elements": 135,
1472
+ "seconds": 0.0097,
1473
+ "timing_s": {
1474
+ "read_s": 0.002613,
1475
+ "extract_s": 0.000815,
1476
+ "normalize_s": 0.005549
1477
+ }
1478
+ },
1479
+ "raster-150": {
1480
+ "precision": 1.0,
1481
+ "recall": 0.9983,
1482
+ "f1": 0.9991,
1483
+ "endpoint_err_mean": 0.4912,
1484
+ "endpoint_err_median": 0.428,
1485
+ "endpoint_match_rate": 0.6667,
1486
+ "length_error_pct": 1.1911,
1487
+ "gt_length": 17130.0009,
1488
+ "pred_length": 17334.0394,
1489
+ "pieces_per_ref": 0.5926,
1490
+ "refs_split_share": 0.0444,
1491
+ "pieces_merging_refs_share": 0.375,
1492
+ "elements": 80,
1493
+ "seconds": 0.0569,
1494
+ "timing_s": {
1495
+ "read_s": 0.012306,
1496
+ "extract_s": 0.034742,
1497
+ "normalize_s": 0.007476
1498
+ }
1499
+ },
1500
+ "raster-300": {
1501
+ "precision": 1.0,
1502
+ "recall": 1.0,
1503
+ "f1": 1.0,
1504
+ "endpoint_err_mean": 0.5229,
1505
+ "endpoint_err_median": 0.3682,
1506
+ "endpoint_match_rate": 0.6741,
1507
+ "length_error_pct": 0.9056,
1508
+ "gt_length": 17130.0009,
1509
+ "pred_length": 17285.1326,
1510
+ "pieces_per_ref": 0.5556,
1511
+ "refs_split_share": 0.0148,
1512
+ "pieces_merging_refs_share": 0.4133,
1513
+ "elements": 75,
1514
+ "seconds": 0.1944,
1515
+ "timing_s": {
1516
+ "read_s": 0.039222,
1517
+ "extract_s": 0.145704,
1518
+ "normalize_s": 0.010107
1519
+ }
1520
+ },
1521
+ "raster-600": {
1522
+ "precision": 1.0,
1523
+ "recall": 1.0,
1524
+ "f1": 1.0,
1525
+ "endpoint_err_mean": 0.365,
1526
+ "endpoint_err_median": 0.3694,
1527
+ "endpoint_match_rate": 0.6519,
1528
+ "length_error_pct": 0.425,
1529
+ "gt_length": 17130.0009,
1530
+ "pred_length": 17202.8063,
1531
+ "pieces_per_ref": 0.5481,
1532
+ "refs_split_share": 0.0222,
1533
+ "pieces_merging_refs_share": 0.3919,
1534
+ "elements": 74,
1535
+ "seconds": 1.2988,
1536
+ "timing_s": {
1537
+ "read_s": 0.16253,
1538
+ "extract_s": 1.120422,
1539
+ "normalize_s": 0.020935
1540
+ }
1541
+ }
1542
+ },
1543
+ {
1544
+ "drawing": "0298-0026",
1545
+ "gt_lines": 751,
1546
+ "vector": {
1547
+ "precision": 1.0,
1548
+ "recall": 1.0,
1549
+ "f1": 1.0,
1550
+ "endpoint_err_mean": 0.019,
1551
+ "endpoint_err_median": 0.0,
1552
+ "endpoint_match_rate": 0.998,
1553
+ "length_error_pct": 0.1981,
1554
+ "gt_length": 28215.0918,
1555
+ "pred_length": 28159.2041,
1556
+ "pieces_per_ref": 7.8016,
1557
+ "refs_split_share": 0.2264,
1558
+ "pieces_merging_refs_share": 0.0007,
1559
+ "elements": 5859,
1560
+ "seconds": 0.2363,
1561
+ "timing_s": {
1562
+ "read_s": 0.01227,
1563
+ "extract_s": 0.025724,
1564
+ "normalize_s": 0.172087
1565
+ }
1566
+ },
1567
+ "vector-chained": {
1568
+ "precision": 1.0,
1569
+ "recall": 1.0,
1570
+ "f1": 1.0,
1571
+ "endpoint_err_mean": 0.4898,
1572
+ "endpoint_err_median": 0.0,
1573
+ "endpoint_match_rate": 0.8063,
1574
+ "length_error_pct": 0.1982,
1575
+ "gt_length": 28215.0918,
1576
+ "pred_length": 28159.1756,
1577
+ "pieces_per_ref": 0.7004,
1578
+ "refs_split_share": 0.004,
1579
+ "pieces_merging_refs_share": 0.0399,
1580
+ "elements": 526,
1581
+ "seconds": 0.3282,
1582
+ "timing_s": {
1583
+ "read_s": 0.013511,
1584
+ "extract_s": 0.025456,
1585
+ "normalize_s": 0.278678
1586
+ }
1587
+ },
1588
+ "raster-150": {
1589
+ "precision": 0.9946,
1590
+ "recall": 0.9525,
1591
+ "f1": 0.9731,
1592
+ "endpoint_err_mean": 1.3238,
1593
+ "endpoint_err_median": 0.7201,
1594
+ "endpoint_match_rate": 0.7983,
1595
+ "length_error_pct": 7.0463,
1596
+ "gt_length": 28215.0918,
1597
+ "pred_length": 26226.9732,
1598
+ "pieces_per_ref": 0.6112,
1599
+ "refs_split_share": 0.0573,
1600
+ "pieces_merging_refs_share": 0.1155,
1601
+ "elements": 459,
1602
+ "seconds": 0.1085,
1603
+ "timing_s": {
1604
+ "read_s": 0.012331,
1605
+ "extract_s": 0.06126,
1606
+ "normalize_s": 0.031401
1607
+ }
1608
+ },
1609
+ "raster-300": {
1610
+ "precision": 0.992,
1611
+ "recall": 0.9618,
1612
+ "f1": 0.9767,
1613
+ "endpoint_err_mean": 1.2975,
1614
+ "endpoint_err_median": 0.6084,
1615
+ "endpoint_match_rate": 0.8422,
1616
+ "length_error_pct": 3.1944,
1617
+ "gt_length": 28215.0918,
1618
+ "pred_length": 27313.7795,
1619
+ "pieces_per_ref": 0.6644,
1620
+ "refs_split_share": 0.0639,
1621
+ "pieces_merging_refs_share": 0.1062,
1622
+ "elements": 499,
1623
+ "seconds": 0.3705,
1624
+ "timing_s": {
1625
+ "read_s": 0.039183,
1626
+ "extract_s": 0.273647,
1627
+ "normalize_s": 0.0562
1628
+ }
1629
+ },
1630
+ "raster-600": {
1631
+ "precision": 0.9871,
1632
+ "recall": 0.9777,
1633
+ "f1": 0.9824,
1634
+ "endpoint_err_mean": 1.1475,
1635
+ "endpoint_err_median": 0.5444,
1636
+ "endpoint_match_rate": 0.8695,
1637
+ "length_error_pct": 1.1084,
1638
+ "gt_length": 28215.0918,
1639
+ "pred_length": 28527.8331,
1640
+ "pieces_per_ref": 0.8895,
1641
+ "refs_split_share": 0.1079,
1642
+ "pieces_merging_refs_share": 0.0868,
1643
+ "elements": 668,
1644
+ "seconds": 2.028,
1645
+ "timing_s": {
1646
+ "read_s": 0.164762,
1647
+ "extract_s": 1.752795,
1648
+ "normalize_s": 0.11773
1649
+ }
1650
+ }
1651
+ },
1652
+ {
1653
+ "drawing": "0672-0021",
1654
+ "gt_lines": 732,
1655
+ "vector": {
1656
+ "precision": 1.0,
1657
+ "recall": 1.0,
1658
+ "f1": 1.0,
1659
+ "endpoint_err_mean": 0.0169,
1660
+ "endpoint_err_median": 0.0,
1661
+ "endpoint_match_rate": 0.9993,
1662
+ "length_error_pct": 0.1109,
1663
+ "gt_length": 37144.7637,
1664
+ "pred_length": 37185.9589,
1665
+ "pieces_per_ref": 9.653,
1666
+ "refs_split_share": 0.127,
1667
+ "pieces_merging_refs_share": 0.003,
1668
+ "elements": 7066,
1669
+ "seconds": 0.6074,
1670
+ "timing_s": {
1671
+ "read_s": 0.014948,
1672
+ "extract_s": 0.031642,
1673
+ "normalize_s": 0.527321
1674
+ }
1675
+ },
1676
+ "vector-chained": {
1677
+ "precision": 1.0,
1678
+ "recall": 1.0,
1679
+ "f1": 1.0,
1680
+ "endpoint_err_mean": 0.0952,
1681
+ "endpoint_err_median": 0.0,
1682
+ "endpoint_match_rate": 0.9611,
1683
+ "length_error_pct": 0.0245,
1684
+ "gt_length": 37144.7637,
1685
+ "pred_length": 37135.6673,
1686
+ "pieces_per_ref": 1.2746,
1687
+ "refs_split_share": 0.0628,
1688
+ "pieces_merging_refs_share": 0.0279,
1689
+ "elements": 933,
1690
+ "seconds": 0.6857,
1691
+ "timing_s": {
1692
+ "read_s": 0.014662,
1693
+ "extract_s": 0.031399,
1694
+ "normalize_s": 0.633986
1695
+ }
1696
+ },
1697
+ "raster-150": {
1698
+ "precision": 0.9978,
1699
+ "recall": 0.9583,
1700
+ "f1": 0.9777,
1701
+ "endpoint_err_mean": 0.9119,
1702
+ "endpoint_err_median": 0.536,
1703
+ "endpoint_match_rate": 0.8641,
1704
+ "length_error_pct": 5.669,
1705
+ "gt_length": 37144.7637,
1706
+ "pred_length": 35039.01,
1707
+ "pieces_per_ref": 0.7131,
1708
+ "refs_split_share": 0.0874,
1709
+ "pieces_merging_refs_share": 0.092,
1710
+ "elements": 522,
1711
+ "seconds": 0.1329,
1712
+ "timing_s": {
1713
+ "read_s": 0.01184,
1714
+ "extract_s": 0.074561,
1715
+ "normalize_s": 0.04063
1716
+ }
1717
+ },
1718
+ "raster-300": {
1719
+ "precision": 0.9957,
1720
+ "recall": 0.9703,
1721
+ "f1": 0.9828,
1722
+ "endpoint_err_mean": 0.9727,
1723
+ "endpoint_err_median": 0.4809,
1724
+ "endpoint_match_rate": 0.8757,
1725
+ "length_error_pct": 2.046,
1726
+ "gt_length": 37144.7637,
1727
+ "pred_length": 36384.7842,
1728
+ "pieces_per_ref": 0.776,
1729
+ "refs_split_share": 0.0874,
1730
+ "pieces_merging_refs_share": 0.0827,
1731
+ "elements": 568,
1732
+ "seconds": 0.4757,
1733
+ "timing_s": {
1734
+ "read_s": 0.04196,
1735
+ "extract_s": 0.36321,
1736
+ "normalize_s": 0.066707
1737
+ }
1738
+ },
1739
+ "raster-600": {
1740
+ "precision": 0.993,
1741
+ "recall": 0.9778,
1742
+ "f1": 0.9853,
1743
+ "endpoint_err_mean": 0.9481,
1744
+ "endpoint_err_median": 0.4421,
1745
+ "endpoint_match_rate": 0.9126,
1746
+ "length_error_pct": 1.3529,
1747
+ "gt_length": 37144.7637,
1748
+ "pred_length": 37647.2929,
1749
+ "pieces_per_ref": 0.8839,
1750
+ "refs_split_share": 0.1325,
1751
+ "pieces_merging_refs_share": 0.0773,
1752
+ "elements": 647,
1753
+ "seconds": 2.1077,
1754
+ "timing_s": {
1755
+ "read_s": 0.145813,
1756
+ "extract_s": 1.78222,
1757
+ "normalize_s": 0.126121
1758
+ }
1759
  }
1760
  }
1761
  ],
 
1970
  "pred_length": 8045.789
1971
  }
1972
  },
1973
+ "vector-chained": {
1974
+ "vs_drawing_without_text": {
1975
+ "precision": 0.9625,
1976
+ "recall": 1.0,
1977
+ "f1": 0.9809,
1978
+ "endpoint_err_mean": 0.0,
1979
+ "endpoint_err_median": 0.0,
1980
+ "endpoint_match_rate": 1.0,
1981
+ "length_error_pct": 3.8971,
1982
+ "gt_length": 7744.0,
1983
+ "pred_length": 8045.789
1984
+ }
1985
+ },
1986
  "raster-150": {
1987
  "vs_drawing_without_text": {
1988
  "precision": 0.9722,
 
2024
  },
2025
  "glyph_stroke_length_pt": 301.79
2026
  },
2027
+ "rooms": {
2028
+ "synthetic_held_out": {
2029
+ "room_f1": {
2030
+ "n": 20,
2031
+ "mean": 0.9765085638998683,
2032
+ "median": 1.0,
2033
+ "min": 0.8695652173913043,
2034
+ "max": 1.0
2035
+ },
2036
+ "area_abs_err_pct_median": {
2037
+ "n": 20,
2038
+ "mean": 0.1864518657074808,
2039
+ "median": 0.00022252729957677528,
2040
+ "min": 8.342206787273696e-05,
2041
+ "max": 2.8229108608877223
2042
+ },
2043
+ "total_area_err_pct": {
2044
+ "n": 20,
2045
+ "mean": -0.2859115281930333,
2046
+ "median": -0.058432547993235905,
2047
+ "min": -4.475973671518905,
2048
+ "max": 1.1778116258588247
2049
+ },
2050
+ "matched_iou_mean": {
2051
+ "n": 20,
2052
+ "mean": 0.9767865205192425,
2053
+ "median": 0.9955741975654971,
2054
+ "min": 0.9002836083889268,
2055
+ "max": 0.9999983689075559
2056
+ }
2057
+ },
2058
+ "thickness_exact_within_0.5pt": 20,
2059
+ "cubicasa_layouts": {
2060
+ "room_f1": {
2061
+ "n": 10,
2062
+ "mean": 0.5471234467287099,
2063
+ "median": 0.525,
2064
+ "min": 0.0,
2065
+ "max": 0.9696969696969697
2066
+ },
2067
+ "area_abs_err_pct_median": {
2068
+ "n": 9,
2069
+ "mean": 4.620285709734463,
2070
+ "median": 1.5656374697785425,
2071
+ "min": 9.062384008322252e-06,
2072
+ "max": 21.31480136105169
2073
+ },
2074
+ "total_area_err_pct": {
2075
+ "n": 10,
2076
+ "mean": -34.37504255145022,
2077
+ "median": -22.321321514354583,
2078
+ "min": -93.23776113680137,
2079
+ "max": -0.030068656178611004
2080
+ },
2081
+ "matched_iou_mean": {
2082
+ "n": 9,
2083
+ "mean": 0.9007145156483749,
2084
+ "median": 0.895539215609844,
2085
+ "min": 0.7799843935094988,
2086
+ "max": 0.9968721681098381
2087
+ }
2088
+ },
2089
+ "real_label_audit_inside": {
2090
+ "n": 10,
2091
+ "mean": 0.78557,
2092
+ "median": 1.0,
2093
+ "min": 0.1592,
2094
+ "max": 1.0
2095
+ },
2096
+ "real_label_audit_edge": {
2097
+ "n": 10,
2098
+ "mean": 0.08444,
2099
+ "median": 0.051250000000000004,
2100
+ "min": 0.0,
2101
+ "max": 0.4098
2102
+ }
2103
+ },
2104
  "config": {
2105
+ "params_sha256": "226a175ff6878dc81b5d2fcfe7e579fc445c7e2a6af9e40193134a34ed3a8f59",
2106
+ "source_sha256": {
2107
+ "0674-0822": "9a4db8df1c2de4e7cadda2fc16d25d7e7177bdf875d3b4d8170cb8e8d9238d82",
2108
+ "1010-0022": "428b947783d3f4d80a209a989ada6b45f6f3ae3148ffebce61494e2c2dea756b",
2109
+ "0393-0004": "0d3dc463b62a626954944aca1930cd2bb17c2822c756af6a13a9750b16473776",
2110
+ "0721-0004": "0af0cab11fa0258747074fe307f970674bc1b277d9dc09429dfdc75bad9424f7",
2111
+ "1261-0083": "122529d9f288ca9773b4bd26b6a33c75d24941dd7abd2250eae5634ff1ae5577",
2112
+ "0175-0005": "20b666d031d8e522e1b9db7a284b0df00b3d6e0a08bdec39acfb7adbf4b80bc5",
2113
+ "0515-0016": "c47dd2d1b89d6669825e6fa1fd7f43826774137692a01ccda4578829b0dda12a",
2114
+ "1083-0018": "5b2255107eaa81caaae08d4b593669d4562eb2af8eff05b6717f8541fef15b27",
2115
+ "0298-0026": "61cbed163985a51d4992b79233203c42cf93a08686d01e4a0e92cf75f99b8060",
2116
+ "0672-0021": "4d5d93ff915c32fdab725db28d080ad7ddcf75e75b9726db09dbca1d9d85823d"
2117
+ },
2118
+ "sample_manifest": {
2119
+ "source": "https://floorplancad.github.io/ (original test-00.tar.xz)",
2120
+ "selection_seed": 20261019,
2121
+ "retained": [
2122
+ "0674-0822",
2123
+ "1010-0022",
2124
+ "0393-0004"
2125
+ ],
2126
+ "additional": [
2127
+ {
2128
+ "drawing": "0721-0004",
2129
+ "svg_bytes": 28199,
2130
+ "stratum": "simple"
2131
+ },
2132
+ {
2133
+ "drawing": "1261-0083",
2134
+ "svg_bytes": 18564,
2135
+ "stratum": "simple"
2136
+ },
2137
+ {
2138
+ "drawing": "0175-0005",
2139
+ "svg_bytes": 32543,
2140
+ "stratum": "simple"
2141
+ },
2142
+ {
2143
+ "drawing": "0515-0016",
2144
+ "svg_bytes": 42605,
2145
+ "stratum": "medium"
2146
+ },
2147
+ {
2148
+ "drawing": "1083-0018",
2149
+ "svg_bytes": 46447,
2150
+ "stratum": "medium"
2151
+ },
2152
+ {
2153
+ "drawing": "0298-0026",
2154
+ "svg_bytes": 160613,
2155
+ "stratum": "dense"
2156
+ },
2157
+ {
2158
+ "drawing": "0672-0021",
2159
+ "svg_bytes": 178608,
2160
+ "stratum": "dense"
2161
+ }
2162
+ ],
2163
+ "selection": "Retain three previously inspected examples; seven additional test drawings randomly sampled within SVG-byte-size terciles (3/2/2), before scoring",
2164
+ "held_out": [
2165
+ "0674-0822",
2166
+ "1010-0022",
2167
+ "0393-0004",
2168
+ "0721-0004",
2169
+ "1261-0083",
2170
+ "0175-0005",
2171
+ "0515-0016",
2172
+ "1083-0018",
2173
+ "0298-0026",
2174
+ "0672-0021"
2175
+ ]
2176
+ },
2177
  "page_pt": 800.0,
2178
  "dpis": [
2179
  150,
 
2183
  "held_out": [
2184
  "0674-0822",
2185
  "1010-0022",
2186
+ "0393-0004",
2187
+ "0721-0004",
2188
+ "1261-0083",
2189
+ "0175-0005",
2190
+ "0515-0016",
2191
+ "1083-0018",
2192
+ "0298-0026",
2193
+ "0672-0021"
2194
  ],
2195
  "synthetic_tuning": [
2196
  "synth-1-walls",
 
2222
  "max_gap_pt": 1.0,
2223
  "merge_gap_pt": 2.0
2224
  },
2225
+ "timing": "median of 3 runs of the extract call (open + read/decode + detect + clean-up); PDF preparation and scoring are excluded; read/extract/normalize stage medians are also recorded",
2226
  "packages": {
2227
  "pymupdf": "1.28.2",
2228
  "opencv-python-headless": "5.0.0.93",
data/rooms.png ADDED
data/synth-1-walls/vector-chained.png ADDED
data/synth-2-diagonal/vector-chained.png ADDED

Git LFS Details

  • SHA256: 2f87c6ffebf6e9d980240afb03a8d94b414c6a900856c721ab9cbe50a6616722
  • Pointer size: 131 Bytes
  • Size of remote file: 116 kB
data/synth-3-doors/vector-chained.png ADDED
data/synth-4-stair/vector-chained.png ADDED
data/synth-5-near-parallel/vector-chained.png ADDED
data/synth-text-paths/vector-chained.png ADDED
index.html CHANGED
@@ -51,7 +51,7 @@ footer { margin-top: 28px; font-size: 13px; color: var(--muted); }
51
  <main>
52
  <h1>Do you need computer vision to read construction drawings?</h1>
53
  <p class="muted">floorplan-parser pulls line geometry out of a drawing PDF two ways: it reads the vector paths the PDF already stores, or it renders the page to pixels and finds the lines with classic computer vision (threshold and Hough lines, no neural network). Both are scored against the drawing's own geometry. This recovers lines, not meaning: it does not know a wall from a door.</p>
54
- <pre>uv run python -m floorplan_parser --input plan.pdf --method vector --output out/plan</pre>
55
  <p class="muted" style="margin-top:8px">Code (MIT): <a href="https://github.com/dzakybd/floorplan-parser">github.com/dzakybd/floorplan-parser</a>. Write-up: <a href="https://dzaky.ai.id/en/blog/floorplan-parser-vector-vs-raster">dzaky.ai.id</a>. Results were computed ahead of time; this page runs no model.</p>
56
 
57
  <div class="row">
@@ -65,7 +65,7 @@ footer { margin-top: 28px; font-size: 13px; color: var(--muted); }
65
  <section class="panel">
66
  <h2 id="scoreTitle">Score</h2>
67
  <div class="stats" id="stats"></div>
68
- <p class="muted" style="font-size:12px;margin-top:10px">Precision and recall are measured by length: how much of the extracted linework lies on the true lines (within 2 pt and 5°), and how much of the true linework was found. Time is the extraction call on an Apple M3 Pro, median of 3 runs.</p>
69
  </section>
70
  </div>
71
 
@@ -74,6 +74,13 @@ footer { margin-top: 28px; font-size: 13px; color: var(--muted); }
74
  <p class="muted" style="font-size:13px">Ten real CAD drawings from the FloorPlanCAD test set: the original three examples plus seven selected within file-size strata using seed 20261019. The raster settings were tuned on the synthetic drawings only, then frozen and evaluated on these. F1 by length, with the number of extracted pieces in brackets.</p>
75
  <div class="scroll"><table id="heldout"></table></div>
76
  </section>
 
 
 
 
 
 
 
77
  <section class="panel">
78
  <h2>Raster under a skewed or noisy scan (synthetic, 300 DPI)</h2>
79
  <div class="scroll"><table id="robust"></table></div>
@@ -82,7 +89,7 @@ footer { margin-top: 28px; font-size: 13px; color: var(--muted); }
82
  <footer>FloorPlanCAD: Fan et al., ICCV 2021, <a href="https://floorplancad.github.io/">floorplancad.github.io</a> (annotations CC BY-NC 4.0). No FloorPlanCAD drawing is shown or included here; every picture is a synthetic drawing made for this project.</footer>
83
  </main>
84
  <script>
85
- const SETTINGS = { "vector": "Vector paths", "raster-150": "Pixels 150 DPI", "raster-300": "Pixels 300 DPI", "raster-600": "Pixels 600 DPI" };
86
  const LABELS = { "0674-0822": "Simple: structural grid", "1010-0022": "Medium: doors, stair, double lines", "0393-0004": "Dense: apartment plan" };
87
  let data, cur = { d: 0, s: "vector" };
88
  const pct = v => (v * 100).toFixed(1) + "%";
@@ -104,7 +111,8 @@ function render() {
104
  document.getElementById("scoreTitle").textContent = `${d.title} · ${SETTINGS[cur.s]}`;
105
  document.getElementById("stats").innerHTML = [
106
  [pct(sc.recall), "recall (true lines found)"], [pct(sc.precision), "precision (found lines that are real)"],
107
- [sc.elements, "pieces extracted"], [(sc.seconds * 1000).toFixed(0) + " ms", "time"],
 
108
  ].map(([b, s]) => `<div class="stat"><b>${b}</b><span>${s}</span></div>`).join("");
109
  }
110
  function tables() {
@@ -119,7 +127,14 @@ function tables() {
119
  document.getElementById("robust").innerHTML = "<tr><th>Drawing</th>" + Object.values(names).map(n => `<th>F1, ${n}</th>`).join("") + "</tr>" +
120
  Object.entries(by).map(([d, v]) => `<tr><td>${titles[d]}</td>` + Object.keys(names).map(k => `<td>${v[k].toFixed(3)}</td>`).join("") + "</tr>").join("");
121
  }
122
- fetch("data/results.json").then(r => r.json()).then(j => { data = j; render(); tables(); });
 
 
 
 
 
 
 
123
  </script>
124
  </body>
125
  </html>
 
51
  <main>
52
  <h1>Do you need computer vision to read construction drawings?</h1>
53
  <p class="muted">floorplan-parser pulls line geometry out of a drawing PDF two ways: it reads the vector paths the PDF already stores, or it renders the page to pixels and finds the lines with classic computer vision (threshold and Hough lines, no neural network). Both are scored against the drawing's own geometry. This recovers lines, not meaning: it does not know a wall from a door.</p>
54
+ <pre>uv run python -m floorplan_parser --input plan.pdf --method vector --chain --rooms --output out/plan</pre>
55
  <p class="muted" style="margin-top:8px">Code (MIT): <a href="https://github.com/dzakybd/floorplan-parser">github.com/dzakybd/floorplan-parser</a>. Write-up: <a href="https://dzaky.ai.id/en/blog/floorplan-parser-vector-vs-raster">dzaky.ai.id</a>. Results were computed ahead of time; this page runs no model.</p>
56
 
57
  <div class="row">
 
65
  <section class="panel">
66
  <h2 id="scoreTitle">Score</h2>
67
  <div class="stats" id="stats"></div>
68
+ <p class="muted" style="font-size:12px;margin-top:10px">Precision and recall are measured by length: how much of the extracted linework lies on the true lines (within 2 pt and 5°), and how much of the true linework was found. Pieces per reference line shows fragmentation, which length-based F1 cannot see. Time is the extraction call on an Apple M1 Pro, median of 3 runs.</p>
69
  </section>
70
  </div>
71
 
 
74
  <p class="muted" style="font-size:13px">Ten real CAD drawings from the FloorPlanCAD test set: the original three examples plus seven selected within file-size strata using seed 20261019. The raster settings were tuned on the synthetic drawings only, then frozen and evaluated on these. F1 by length, with the number of extracted pieces in brackets.</p>
75
  <div class="scroll"><table id="heldout"></table></div>
76
  </section>
77
+ <section class="panel">
78
+ <h2>Lines → walls → rooms (<code>--rooms</code>)</h2>
79
+ <p class="muted" style="font-size:13px">Wall thicknesses are the strongest peaks of the gaps between parallel lines; parallel pairs about that far apart become walls; doorways between collinear walls are bridged; rooms are the closed pieces of page minus walls. Geometry only (Shapely).</p>
80
+ <img src="data/rooms.png" alt="A synthetic plan in three steps: lines read from the PDF, walls with bridged doorways in orange, and rooms with their areas; two rooms with no wall between them come out as one." style="width:100%;height:auto;background:#fff;border-radius:6px;margin-top:8px">
81
+ <div class="stats" id="roomstats" style="margin-top:12px"></div>
82
+ <p class="muted" style="font-size:12px;margin-top:10px">Synthetic plans have a room answer key. Real layouts are ten CubiCasa5K test plans drawn as vector PDFs from their wall, door and room annotations (so the walls are clean); the wall-thickness rule was chosen on ten validation layouts. FloorPlanCAD has no room labels.</p>
83
+ </section>
84
  <section class="panel">
85
  <h2>Raster under a skewed or noisy scan (synthetic, 300 DPI)</h2>
86
  <div class="scroll"><table id="robust"></table></div>
 
89
  <footer>FloorPlanCAD: Fan et al., ICCV 2021, <a href="https://floorplancad.github.io/">floorplancad.github.io</a> (annotations CC BY-NC 4.0). No FloorPlanCAD drawing is shown or included here; every picture is a synthetic drawing made for this project.</footer>
90
  </main>
91
  <script>
92
+ const SETTINGS = { "vector": "Vector paths", "vector-chained": "Vector + --chain", "raster-150": "Pixels 150 DPI", "raster-300": "Pixels 300 DPI", "raster-600": "Pixels 600 DPI" };
93
  const LABELS = { "0674-0822": "Simple: structural grid", "1010-0022": "Medium: doors, stair, double lines", "0393-0004": "Dense: apartment plan" };
94
  let data, cur = { d: 0, s: "vector" };
95
  const pct = v => (v * 100).toFixed(1) + "%";
 
111
  document.getElementById("scoreTitle").textContent = `${d.title} · ${SETTINGS[cur.s]}`;
112
  document.getElementById("stats").innerHTML = [
113
  [pct(sc.recall), "recall (true lines found)"], [pct(sc.precision), "precision (found lines that are real)"],
114
+ [sc.elements, "pieces extracted"], [sc.pieces_per_ref.toFixed(2), "pieces per reference line"],
115
+ [(sc.seconds * 1000).toFixed(0) + " ms", "time"],
116
  ].map(([b, s]) => `<div class="stat"><b>${b}</b><span>${s}</span></div>`).join("");
117
  }
118
  function tables() {
 
127
  document.getElementById("robust").innerHTML = "<tr><th>Drawing</th>" + Object.values(names).map(n => `<th>F1, ${n}</th>`).join("") + "</tr>" +
128
  Object.entries(by).map(([d, v]) => `<tr><td>${titles[d]}</td>` + Object.keys(names).map(k => `<td>${v[k].toFixed(3)}</td>`).join("") + "</tr>").join("");
129
  }
130
+ function rooms() {
131
+ const r = data.rooms;
132
+ document.getElementById("roomstats").innerHTML = [
133
+ [r.synthetic_held_out.room_f1.mean.toFixed(2), "room F1, 20 synthetic plans"],
134
+ [r.cubicasa_layouts.room_f1.mean.toFixed(2), "room F1, 10 real CubiCasa5K layouts"],
135
+ ].map(([b, s]) => `<div class="stat"><b>${b}</b><span>${s}</span></div>`).join("");
136
+ }
137
+ fetch("data/results.json").then(r => r.json()).then(j => { data = j; render(); tables(); rooms(); });
138
  </script>
139
  </body>
140
  </html>