bgamazay commited on
Commit
ea74654
·
verified ·
1 Parent(s): bde2fbd

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +43 -59
app.py CHANGED
@@ -4,16 +4,11 @@ from PIL import Image, ImageDraw, ImageFont
4
  import io
5
 
6
  def main():
7
- # Sidebar logo and title
8
- st.sidebar.image("logo.png", use_container_width=True) # Display the logo at the top
9
  st.sidebar.title("Label Generator")
10
  st.sidebar.markdown("For [AI Energy Score Leaderboard](https://huggingface.co/spaces/AIEnergyScore/Leaderboard)")
11
 
12
-
13
- # Initialize data_df
14
- data_df = None
15
-
16
- # Read Data from CSV
17
  try:
18
  data_df = pd.read_csv("data.csv")
19
  except FileNotFoundError:
@@ -23,52 +18,44 @@ def main():
23
  st.sidebar.error(f"Error reading 'data.csv': {e}")
24
  return
25
 
26
- # Ensure the CSV has required columns
27
  required_columns = ["model", "provider", "date", "task", "hardware", "energy", "score"]
28
  for col in required_columns:
29
  if col not in data_df.columns:
30
  st.sidebar.error(f"The CSV file must contain a column named '{col}'.")
31
  return
32
 
33
- # Dropdown for selecting a model
34
  st.sidebar.write("### Instructions:")
35
  st.sidebar.write("#### 1. Select a model below")
36
- model_options = data_df["model"].unique().tolist() # Get model options
37
- selected_model = st.sidebar.selectbox(
38
- "Scored Models", model_options, help="Start typing to search for a model"
39
- ) # Searchable dropdown
40
 
41
- # Add step 2 instructions and move the Download button
 
 
 
 
 
42
  st.sidebar.write("#### 2. Download the label")
43
 
44
- # Filter the data for the selected model
45
  model_data = data_df[data_df["model"] == selected_model].iloc[0]
46
 
47
- # Dynamically select the background image based on the score
48
  try:
49
- score = int(model_data["score"]) # Convert to int
50
- background_path = f"{score}.png" # E.g., "1.png", "2.png"
51
  background = Image.open(background_path).convert("RGBA")
52
-
53
- # Proportional scaling to fit within the target size
54
- target_size = (800, 600) # Maximum width and height
55
- background.thumbnail(target_size, Image.Resampling.LANCZOS)
56
-
57
  except FileNotFoundError:
58
  st.sidebar.error(f"Could not find background image '{score}.png'. Using default background.")
59
  background = Image.open("default_background.png").convert("RGBA")
60
- background.thumbnail(target_size, Image.Resampling.LANCZOS) # Resize default image proportionally
61
  except ValueError:
62
  st.sidebar.error(f"Invalid score '{model_data['score']}'. Score must be an integer.")
63
  return
64
 
65
- # Generate the label with text
66
- generated_label = create_label(background, model_data)
 
67
 
68
- # Display the label
69
- st.image(generated_label, caption="Generated Label Preview")
70
 
71
- # Download button for the label
72
  img_buffer = io.BytesIO()
73
  generated_label.save(img_buffer, format="PNG")
74
  img_buffer.seek(0)
@@ -80,42 +67,38 @@ def main():
80
  mime="image/png"
81
  )
82
 
83
- # Step 3 instructions
84
  st.sidebar.write("#### 3. Share your label in technical reports, announcements, etc.")
85
 
86
- def create_label(background_image, model_data):
 
87
  """
88
- Create the label image by adding text from model_data to the background image.
89
- Render at high resolution and scale down for sharper output.
90
  """
91
- # Scale factor for high resolution rendering
92
- scale_factor = 2
93
- original_size = background_image.size
94
- high_res_size = (original_size[0] * scale_factor, original_size[1] * scale_factor)
95
 
96
- # Resize background proportionally for high resolution
97
- high_res_image = background_image.resize(high_res_size, Image.Resampling.LANCZOS)
98
- draw = ImageDraw.Draw(high_res_image)
99
-
100
- # Load fonts with scaled sizes
101
  try:
102
- title_font = ImageFont.truetype("Inter_24pt-Bold.ttf", size=22 * scale_factor)
103
- details_font = ImageFont.truetype("Inter_18pt-Regular.ttf", size=18 * scale_factor)
104
- energy_font = ImageFont.truetype("Inter_18pt-Medium.ttf", size=20 * scale_factor)
105
  except Exception as e:
106
  st.error(f"Font loading failed: {e}")
107
- return high_res_image
108
 
109
- # Define scaled positions for text
110
- title_x, title_y = 28 * scale_factor, 128 * scale_factor
111
- details_x, details_y = 375 * scale_factor, 210 * scale_factor
112
- energy_x, energy_y = 350 * scale_factor, 390 * scale_factor
 
 
113
 
114
- # Group 1: Title (Bold)
115
  draw.text((title_x, title_y), str(model_data['model']), font=title_font, fill="black")
116
- draw.text((title_x, title_y + 30 * scale_factor), str(model_data['provider']), font=title_font, fill="black")
117
 
118
- # Group 2: Details (Right-Justified)
119
  details_lines = [
120
  str(model_data['date']),
121
  str(model_data['task']),
@@ -124,17 +107,18 @@ def create_label(background_image, model_data):
124
  for i, line in enumerate(details_lines):
125
  bbox = draw.textbbox((0, 0), line, font=details_font)
126
  text_width = bbox[2] - bbox[0]
127
- draw.text((details_x - text_width, details_y + i * 40 * scale_factor), line, font=details_font, fill="black")
 
128
 
129
- # Group 3: Energy (Bottom-Center)
130
  energy_text = str(model_data['energy'])
131
  bbox = draw.textbbox((0, 0), energy_text, font=energy_font)
132
  energy_text_width = bbox[2] - bbox[0]
 
133
  draw.text((energy_x - energy_text_width // 2, energy_y), energy_text, font=energy_font, fill="black")
134
 
135
- # Downscale to original size
136
- final_image = high_res_image.resize(original_size, Image.Resampling.LANCZOS)
137
- return final_image
138
 
139
  if __name__ == "__main__":
140
- main()
 
4
  import io
5
 
6
  def main():
7
+ st.sidebar.image("logo.png", use_container_width=True)
 
8
  st.sidebar.title("Label Generator")
9
  st.sidebar.markdown("For [AI Energy Score Leaderboard](https://huggingface.co/spaces/AIEnergyScore/Leaderboard)")
10
 
11
+ # Load CSV
 
 
 
 
12
  try:
13
  data_df = pd.read_csv("data.csv")
14
  except FileNotFoundError:
 
18
  st.sidebar.error(f"Error reading 'data.csv': {e}")
19
  return
20
 
21
+ # Check columns
22
  required_columns = ["model", "provider", "date", "task", "hardware", "energy", "score"]
23
  for col in required_columns:
24
  if col not in data_df.columns:
25
  st.sidebar.error(f"The CSV file must contain a column named '{col}'.")
26
  return
27
 
 
28
  st.sidebar.write("### Instructions:")
29
  st.sidebar.write("#### 1. Select a model below")
 
 
 
 
30
 
31
+ model_options = data_df["model"].unique().tolist()
32
+ selected_model = st.sidebar.selectbox(
33
+ "Scored Models",
34
+ model_options,
35
+ help="Start typing to search for a model"
36
+ )
37
  st.sidebar.write("#### 2. Download the label")
38
 
 
39
  model_data = data_df[data_df["model"] == selected_model].iloc[0]
40
 
41
+ # Select background by score
42
  try:
43
+ score = int(model_data["score"])
44
+ background_path = f"{score}.png"
45
  background = Image.open(background_path).convert("RGBA")
 
 
 
 
 
46
  except FileNotFoundError:
47
  st.sidebar.error(f"Could not find background image '{score}.png'. Using default background.")
48
  background = Image.open("default_background.png").convert("RGBA")
 
49
  except ValueError:
50
  st.sidebar.error(f"Invalid score '{model_data['score']}'. Score must be an integer.")
51
  return
52
 
53
+ # Keep the final label size at 520×728
54
+ final_size = (520, 728)
55
+ generated_label = create_label_single_pass(background, model_data, final_size)
56
 
57
+ st.image(generated_label, caption="Generated Label Preview", use_column_width=False)
 
58
 
 
59
  img_buffer = io.BytesIO()
60
  generated_label.save(img_buffer, format="PNG")
61
  img_buffer.seek(0)
 
67
  mime="image/png"
68
  )
69
 
 
70
  st.sidebar.write("#### 3. Share your label in technical reports, announcements, etc.")
71
 
72
+
73
+ def create_label_single_pass(background_image, model_data, final_size=(520, 728)):
74
  """
75
+ Resizes the background to 520×728, then draws text onto it.
 
76
  """
77
+ # 1. Resize background to final_size
78
+ bg_resized = background_image.resize(final_size, Image.Resampling.LANCZOS)
79
+ draw = ImageDraw.Draw(bg_resized)
 
80
 
81
+ # 2. Load fonts at sizes appropriate for a 520×728 label
 
 
 
 
82
  try:
83
+ title_font = ImageFont.truetype("Inter_24pt-Bold.ttf", size=22)
84
+ details_font = ImageFont.truetype("Inter_18pt-Regular.ttf", size=18)
85
+ energy_font = ImageFont.truetype("Inter_18pt-Medium.ttf", size=20)
86
  except Exception as e:
87
  st.error(f"Font loading failed: {e}")
88
+ return bg_resized
89
 
90
+ # 3. Place your text.
91
+ # You may need to experiment with x/y coordinates or font sizes
92
+ # to make it look right in 520×728.
93
+ title_x, title_y = 28, 100
94
+ details_x, details_y = 380, 200
95
+ energy_x, energy_y = 360, 400
96
 
97
+ # Text 1 (title)
98
  draw.text((title_x, title_y), str(model_data['model']), font=title_font, fill="black")
99
+ draw.text((title_x, title_y + 30), str(model_data['provider']), font=title_font, fill="black")
100
 
101
+ # Text 2 (details)
102
  details_lines = [
103
  str(model_data['date']),
104
  str(model_data['task']),
 
107
  for i, line in enumerate(details_lines):
108
  bbox = draw.textbbox((0, 0), line, font=details_font)
109
  text_width = bbox[2] - bbox[0]
110
+ # Right-justify the details text at details_x
111
+ draw.text((details_x - text_width, details_y + i*40), line, font=details_font, fill="black")
112
 
113
+ # Text 3 (energy)
114
  energy_text = str(model_data['energy'])
115
  bbox = draw.textbbox((0, 0), energy_text, font=energy_font)
116
  energy_text_width = bbox[2] - bbox[0]
117
+ # Center the energy text horizontally around energy_x
118
  draw.text((energy_x - energy_text_width // 2, energy_y), energy_text, font=energy_font, fill="black")
119
 
120
+ return bg_resized
121
+
 
122
 
123
  if __name__ == "__main__":
124
+ main()