shunk031 commited on
Commit
d71d356
·
1 Parent(s): 0b1d901

deploy: 63a85616f5fc427cf1e1e7b425293131f2fce2b8

Browse files
Files changed (3) hide show
  1. README.md +150 -1
  2. layout-validity.py +2 -0
  3. requirements.txt +134 -89
README.md CHANGED
@@ -9,4 +9,153 @@ app_file: app.py
9
  pinned: false
10
  ---
11
 
12
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9
  pinned: false
10
  ---
11
 
12
+ # Layout Validity
13
+
14
+ ## Description
15
+
16
+ The Layout Validity metric evaluates the basic validity of layout elements by checking whether they meet minimum size requirements. A layout element is considered valid if its area within the canvas boundaries is greater than 0.1% of the total canvas area. This metric helps identify layouts with degenerate or nearly-invisible elements that don't contribute meaningfully to the design.
17
+
18
+ ## What It Measures
19
+
20
+ This metric computes:
21
+
22
+ - **Valid element ratio**: Proportion of elements that meet minimum size requirements
23
+ - **Layout integrity**: Whether elements are large enough to be functional
24
+ - **Degenerate element detection**: Identifies layouts with overly small or nearly-invisible elements
25
+
26
+ Higher scores indicate better layout validity with fewer problematic elements.
27
+
28
+ ## Metric Details
29
+
30
+ - Validity threshold: Element area > 0.1% of canvas area (after clamping to canvas bounds)
31
+ - Clamps element bounding boxes to canvas boundaries before computing area
32
+ - Filters out padding elements (label == 0)
33
+ - From PosterLayout (Hsu et al., CVPR 2023) for poster design evaluation
34
+ - Returns the ratio of valid elements to total non-padding elements
35
+
36
+ ## Usage
37
+
38
+ ### Installation
39
+
40
+ ```bash
41
+ pip install evaluate
42
+ ```
43
+
44
+ ### Basic Example
45
+
46
+ ```python
47
+ import evaluate
48
+ import numpy as np
49
+
50
+ # Load the metric with canvas dimensions
51
+ metric = evaluate.load(
52
+ "creative-graphic-design/layout-validity",
53
+ canvas_width=360,
54
+ canvas_height=504
55
+ )
56
+
57
+ # Prepare data (normalized ltrb coordinates)
58
+ predictions = np.random.rand(1, 25, 4)
59
+ gold_labels = np.random.randint(0, 4, size=(1, 25))
60
+ score = metric.compute(predictions=predictions, gold_labels=gold_labels)
61
+ print(score)
62
+ ```
63
+
64
+ ### Batch Processing Example
65
+
66
+ ```python
67
+ import evaluate
68
+ import numpy as np
69
+
70
+ # Load the metric
71
+ metric = evaluate.load(
72
+ "creative-graphic-design/layout-validity",
73
+ canvas_width=360,
74
+ canvas_height=504
75
+ )
76
+
77
+ # Batch processing
78
+ batch_size = 128
79
+ predictions = np.random.rand(batch_size, 25, 4)
80
+ gold_labels = np.random.randint(0, 4, size=(batch_size, 25))
81
+ score = metric.compute(predictions=predictions, gold_labels=gold_labels)
82
+ print(score)
83
+ ```
84
+
85
+ ## Parameters
86
+
87
+ ### Initialization Parameters
88
+
89
+ - **canvas_width** (`int`, required): Width of the canvas in pixels
90
+ - **canvas_height** (`int`, required): Height of the canvas in pixels
91
+
92
+ ### Computation Parameters
93
+
94
+ - **predictions** (`list` of `lists` of `float`): Normalized bounding boxes in ltrb format (0.0 to 1.0)
95
+ - **gold_labels** (`list` of `lists` of `int`): Class labels for each element (0 = padding)
96
+
97
+ **Note**:
98
+
99
+ - Elements with `gold_labels == 0` are treated as padding and excluded from computation
100
+ - Element coordinates are clamped to [0, canvas_width] × [0, canvas_height] before area calculation
101
+ - Validity threshold: area > (canvas_width × canvas_height) / 1000
102
+
103
+ ## Returns
104
+
105
+ Returns a `float` value representing the ratio of valid elements to total elements (range: 0.0 to 1.0).
106
+
107
+ ## Interpretation
108
+
109
+ - **Higher is better** (range: 0.0 to 1.0)
110
+ - **Value of 1.0**: All elements are valid (ideal)
111
+ - **Value of 0.9-1.0**: Mostly valid layout with few problematic elements
112
+ - **Value of 0.7-0.9**: Some invalid elements, may need review
113
+ - **Value of 0.5-0.7**: Many invalid elements, layout quality concerns
114
+ - **Value < 0.5**: Significant validity issues, many degenerate elements
115
+ - **Value of 0.0**: All elements invalid (critical failure)
116
+
117
+ ### Use Cases
118
+
119
+ - **Basic layout quality check**: Ensure generated layouts don't have degenerate elements
120
+ - **Generative model evaluation**: Detect models producing invalid element sizes
121
+ - **Layout post-processing**: Filter out layouts with validity issues
122
+ - **Sanity check**: Validate layout data before further evaluation
123
+
124
+ ### Key Insights
125
+
126
+ - **Minimum requirement**: This is a basic quality check, not a comprehensive quality metric
127
+ - **Threshold choice**: 0.1% of canvas is quite permissive - very small but still visible elements pass
128
+ - **Canvas boundaries matter**: Elements extending beyond canvas are clamped, which can reduce their area
129
+ - **Foundation metric**: Pass validity check before evaluating other metrics
130
+ - **Model debugging**: Low validity scores indicate fundamental generation issues
131
+
132
+ ### Common Causes of Invalidity
133
+
134
+ - **Collapsed bounding boxes**: Width or height near zero
135
+ - **Out-of-bounds elements**: Elements mostly outside canvas boundaries
136
+ - **Numerical errors**: Floating-point precision issues in generation
137
+ - **Model failure modes**: Generation model producing degenerate outputs
138
+
139
+ ## Citations
140
+
141
+ ```bibtex
142
+ @inproceedings{hsu2023posterlayout,
143
+ title={Posterlayout: A new benchmark and approach for content-aware visual-textual presentation layout},
144
+ author={Hsu, Hsiao Yuan and He, Xiangteng and Peng, Yuxin and Kong, Hao and Zhang, Qing},
145
+ booktitle={Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition},
146
+ pages={6018--6026},
147
+ year={2023}
148
+ }
149
+ ```
150
+
151
+ ## References
152
+
153
+ - **Paper**: [PosterLayout (Hsu et al., CVPR 2023)](https://arxiv.org/abs/2303.15937)
154
+ - **Reference Implementation**: [PosterLayout eval.py](https://github.com/PKU-ICST-MIPL/PosterLayout-CVPR2023/blob/main/eval.py#L105-L127)
155
+
156
+ ## Related Metrics
157
+
158
+ - [Layout Overlap](../layout_overlap/): Evaluates element spacing and collisions
159
+ - [Layout Alignment](../layout_alignment/): Measures spatial organization
160
+ - [Layout Non-Alignment](../layout_non_alignment/): Detects alignment violations
161
+ - [Layout Utility](../layout_utility/): Evaluates space utilization
layout-validity.py CHANGED
@@ -4,6 +4,7 @@ import datasets as ds
4
  import evaluate
5
  import numpy as np
6
  import numpy.typing as npt
 
7
 
8
  _DESCRIPTION = r"""\
9
  Computes the ratio of valid elements to all elements in the layout, where the area within the canvas of a valid element must be greater than 0.1% of the canvas.
@@ -24,6 +25,7 @@ _CITATION = """\
24
  """
25
 
26
 
 
27
  class LayoutValidity(evaluate.Metric):
28
  def __init__(
29
  self,
 
4
  import evaluate
5
  import numpy as np
6
  import numpy.typing as npt
7
+ from evaluate.utils.file_utils import add_start_docstrings
8
 
9
  _DESCRIPTION = r"""\
10
  Computes the ratio of valid elements to all elements in the layout, where the area within the canvas of a valid element must be greater than 0.1% of the canvas.
 
25
  """
26
 
27
 
28
+ @add_start_docstrings(_DESCRIPTION, _KWARGS_DESCRIPTION)
29
  class LayoutValidity(evaluate.Metric):
30
  def __init__(
31
  self,
requirements.txt CHANGED
@@ -1,89 +1,134 @@
1
- aiofiles==23.2.1 ; python_version >= "3.9" and python_version < "4.0"
2
- aiohttp==3.9.3 ; python_version >= "3.9" and python_version < "4.0"
3
- aiosignal==1.3.1 ; python_version >= "3.9" and python_version < "4.0"
4
- altair==5.2.0 ; python_version >= "3.9" and python_version < "4.0"
5
- annotated-types==0.6.0 ; python_version >= "3.9" and python_version < "4.0"
6
- anyio==4.2.0 ; python_version >= "3.9" and python_version < "4.0"
7
- arrow==1.3.0 ; python_version >= "3.9" and python_version < "4.0"
8
- async-timeout==4.0.3 ; python_version >= "3.9" and python_version < "3.11"
9
- attrs==23.2.0 ; python_version >= "3.9" and python_version < "4.0"
10
- binaryornot==0.4.4 ; python_version >= "3.9" and python_version < "4.0"
11
- certifi==2024.2.2 ; python_version >= "3.9" and python_version < "4.0"
12
- chardet==5.2.0 ; python_version >= "3.9" and python_version < "4.0"
13
- charset-normalizer==3.3.2 ; python_version >= "3.9" and python_version < "4.0"
14
- click==8.1.7 ; python_version >= "3.9" and python_version < "4.0"
15
- colorama==0.4.6 ; python_version >= "3.9" and python_version < "4.0"
16
- contourpy==1.2.0 ; python_version >= "3.9" and python_version < "4.0"
17
- cookiecutter==2.5.0 ; python_version >= "3.9" and python_version < "4.0"
18
- cycler==0.12.1 ; python_version >= "3.9" and python_version < "4.0"
19
- datasets==2.17.0 ; python_version >= "3.9" and python_version < "4.0"
20
- dill==0.3.8 ; python_version >= "3.9" and python_version < "4.0"
21
- evaluate[template]==0.4.1 ; python_version >= "3.9" and python_version < "4.0"
22
- exceptiongroup==1.2.0 ; python_version >= "3.9" and python_version < "3.11"
23
- fastapi==0.109.2 ; python_version >= "3.9" and python_version < "4.0"
24
- ffmpy==0.3.1 ; python_version >= "3.9" and python_version < "4.0"
25
- filelock==3.13.1 ; python_version >= "3.9" and python_version < "4.0"
26
- fonttools==4.48.1 ; python_version >= "3.9" and python_version < "4.0"
27
- frozenlist==1.4.1 ; python_version >= "3.9" and python_version < "4.0"
28
- fsspec==2023.10.0 ; python_version >= "3.9" and python_version < "4.0"
29
- fsspec[http]==2023.10.0 ; python_version >= "3.9" and python_version < "4.0"
30
- gradio-client==0.10.0 ; python_version >= "3.9" and python_version < "4.0"
31
- gradio==4.18.0 ; python_version >= "3.9" and python_version < "4.0"
32
- h11==0.14.0 ; python_version >= "3.9" and python_version < "4.0"
33
- httpcore==1.0.2 ; python_version >= "3.9" and python_version < "4.0"
34
- httpx==0.26.0 ; python_version >= "3.9" and python_version < "4.0"
35
- huggingface-hub==0.20.3 ; python_version >= "3.9" and python_version < "4.0"
36
- idna==3.6 ; python_version >= "3.9" and python_version < "4.0"
37
- importlib-resources==6.1.1 ; python_version >= "3.9" and python_version < "4.0"
38
- jinja2==3.1.3 ; python_version >= "3.9" and python_version < "4.0"
39
- jsonschema-specifications==2023.12.1 ; python_version >= "3.9" and python_version < "4.0"
40
- jsonschema==4.21.1 ; python_version >= "3.9" and python_version < "4.0"
41
- kiwisolver==1.4.5 ; python_version >= "3.9" and python_version < "4.0"
42
- markdown-it-py==3.0.0 ; python_version >= "3.9" and python_version < "4.0"
43
- markupsafe==2.1.5 ; python_version >= "3.9" and python_version < "4.0"
44
- matplotlib==3.8.2 ; python_version >= "3.9" and python_version < "4.0"
45
- mdurl==0.1.2 ; python_version >= "3.9" and python_version < "4.0"
46
- multidict==6.0.5 ; python_version >= "3.9" and python_version < "4.0"
47
- multiprocess==0.70.16 ; python_version >= "3.9" and python_version < "4.0"
48
- numpy==1.26.4 ; python_version >= "3.9" and python_version < "4.0"
49
- orjson==3.9.13 ; python_version >= "3.9" and python_version < "4.0"
50
- packaging==23.2 ; python_version >= "3.9" and python_version < "4.0"
51
- pandas==2.2.0 ; python_version >= "3.9" and python_version < "4.0"
52
- pillow==10.2.0 ; python_version >= "3.9" and python_version < "4.0"
53
- pyarrow-hotfix==0.6 ; python_version >= "3.9" and python_version < "4.0"
54
- pyarrow==15.0.0 ; python_version >= "3.9" and python_version < "4.0"
55
- pydantic-core==2.16.2 ; python_version >= "3.9" and python_version < "4.0"
56
- pydantic==2.6.1 ; python_version >= "3.9" and python_version < "4.0"
57
- pydub==0.25.1 ; python_version >= "3.9" and python_version < "4.0"
58
- pygments==2.17.2 ; python_version >= "3.9" and python_version < "4.0"
59
- pyparsing==3.1.1 ; python_version >= "3.9" and python_version < "4.0"
60
- python-dateutil==2.8.2 ; python_version >= "3.9" and python_version < "4.0"
61
- python-multipart==0.0.9 ; python_version >= "3.9" and python_version < "4.0"
62
- python-slugify==8.0.4 ; python_version >= "3.9" and python_version < "4.0"
63
- pytz==2024.1 ; python_version >= "3.9" and python_version < "4.0"
64
- pyyaml==6.0.1 ; python_version >= "3.9" and python_version < "4.0"
65
- referencing==0.33.0 ; python_version >= "3.9" and python_version < "4.0"
66
- requests==2.31.0 ; python_version >= "3.9" and python_version < "4.0"
67
- responses==0.18.0 ; python_version >= "3.9" and python_version < "4.0"
68
- rich==13.7.0 ; python_version >= "3.9" and python_version < "4.0"
69
- rpds-py==0.17.1 ; python_version >= "3.9" and python_version < "4.0"
70
- ruff==0.2.1 ; python_version >= "3.9" and python_version < "4.0"
71
- semantic-version==2.10.0 ; python_version >= "3.9" and python_version < "4.0"
72
- shellingham==1.5.4 ; python_version >= "3.9" and python_version < "4.0"
73
- six==1.16.0 ; python_version >= "3.9" and python_version < "4.0"
74
- sniffio==1.3.0 ; python_version >= "3.9" and python_version < "4.0"
75
- starlette==0.36.3 ; python_version >= "3.9" and python_version < "4.0"
76
- text-unidecode==1.3 ; python_version >= "3.9" and python_version < "4.0"
77
- tomlkit==0.12.0 ; python_version >= "3.9" and python_version < "4.0"
78
- toolz==0.12.1 ; python_version >= "3.9" and python_version < "4.0"
79
- tqdm==4.66.2 ; python_version >= "3.9" and python_version < "4.0"
80
- typer[all]==0.9.0 ; python_version >= "3.9" and python_version < "4.0"
81
- types-python-dateutil==2.8.19.20240106 ; python_version >= "3.9" and python_version < "4.0"
82
- typing-extensions==4.9.0 ; python_version >= "3.9" and python_version < "4.0"
83
- tzdata==2024.1 ; python_version >= "3.9" and python_version < "4.0"
84
- urllib3==2.2.0 ; python_version >= "3.9" and python_version < "4.0"
85
- uvicorn==0.27.1 ; python_version >= "3.9" and python_version < "4.0"
86
- websockets==11.0.3 ; python_version >= "3.9" and python_version < "4.0"
87
- xxhash==3.4.1 ; python_version >= "3.9" and python_version < "4.0"
88
- yarl==1.9.4 ; python_version >= "3.9" and python_version < "4.0"
89
- zipp==3.17.0 ; python_version >= "3.9" and python_version < "3.10"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # This file was autogenerated by uv via the following command:
2
+ # uv export --package layout_validity --no-dev --no-hashes --format requirements-txt
3
+ aiohappyeyeballs==2.6.1
4
+ # via aiohttp
5
+ aiohttp==3.13.2
6
+ # via fsspec
7
+ aiosignal==1.4.0
8
+ # via aiohttp
9
+ anyio==4.12.0
10
+ # via httpx
11
+ attrs==25.4.0
12
+ # via aiohttp
13
+ certifi==2025.11.12
14
+ # via
15
+ # httpcore
16
+ # httpx
17
+ # requests
18
+ charset-normalizer==3.4.4
19
+ # via requests
20
+ click==8.3.1
21
+ # via typer-slim
22
+ colorama==0.4.6 ; sys_platform == 'win32'
23
+ # via
24
+ # click
25
+ # tqdm
26
+ datasets==4.4.2
27
+ # via evaluate
28
+ dill==0.4.0
29
+ # via
30
+ # datasets
31
+ # evaluate
32
+ # multiprocess
33
+ evaluate==0.4.6
34
+ # via layout-validity
35
+ filelock==3.20.1
36
+ # via
37
+ # datasets
38
+ # huggingface-hub
39
+ frozenlist==1.8.0
40
+ # via
41
+ # aiohttp
42
+ # aiosignal
43
+ fsspec==2025.10.0
44
+ # via
45
+ # datasets
46
+ # evaluate
47
+ # huggingface-hub
48
+ h11==0.16.0
49
+ # via httpcore
50
+ hf-xet==1.2.0 ; platform_machine == 'AMD64' or platform_machine == 'aarch64' or platform_machine == 'amd64' or platform_machine == 'arm64' or platform_machine == 'x86_64'
51
+ # via huggingface-hub
52
+ httpcore==1.0.9
53
+ # via httpx
54
+ httpx==0.28.1
55
+ # via
56
+ # datasets
57
+ # huggingface-hub
58
+ huggingface-hub==1.2.3
59
+ # via
60
+ # datasets
61
+ # evaluate
62
+ idna==3.11
63
+ # via
64
+ # anyio
65
+ # httpx
66
+ # requests
67
+ # yarl
68
+ multidict==6.7.0
69
+ # via
70
+ # aiohttp
71
+ # yarl
72
+ multiprocess==0.70.18
73
+ # via
74
+ # datasets
75
+ # evaluate
76
+ numpy==2.2.6
77
+ # via
78
+ # datasets
79
+ # evaluate
80
+ # pandas
81
+ packaging==25.0
82
+ # via
83
+ # datasets
84
+ # evaluate
85
+ # huggingface-hub
86
+ pandas==2.3.3
87
+ # via
88
+ # datasets
89
+ # evaluate
90
+ propcache==0.4.1
91
+ # via
92
+ # aiohttp
93
+ # yarl
94
+ pyarrow==22.0.0
95
+ # via datasets
96
+ python-dateutil==2.9.0.post0
97
+ # via pandas
98
+ pytz==2025.2
99
+ # via pandas
100
+ pyyaml==6.0.3
101
+ # via
102
+ # datasets
103
+ # huggingface-hub
104
+ requests==2.32.5
105
+ # via
106
+ # datasets
107
+ # evaluate
108
+ shellingham==1.5.4
109
+ # via huggingface-hub
110
+ six==1.17.0
111
+ # via python-dateutil
112
+ tqdm==4.67.1
113
+ # via
114
+ # datasets
115
+ # evaluate
116
+ # huggingface-hub
117
+ typer-slim==0.21.0
118
+ # via huggingface-hub
119
+ typing-extensions==4.15.0
120
+ # via
121
+ # aiosignal
122
+ # anyio
123
+ # huggingface-hub
124
+ # typer-slim
125
+ tzdata==2025.3
126
+ # via pandas
127
+ urllib3==2.6.2
128
+ # via requests
129
+ xxhash==3.6.0
130
+ # via
131
+ # datasets
132
+ # evaluate
133
+ yarl==1.22.0
134
+ # via aiohttp