Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -248,8 +248,15 @@ def predict_text(image: Image.Image):
|
|
| 248 |
|
| 249 |
|
| 250 |
# New helper function: generate label images grid
|
| 251 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 252 |
global font_path
|
|
|
|
| 253 |
|
| 254 |
try:
|
| 255 |
if font_file:
|
|
@@ -257,44 +264,46 @@ def generate_labels(font_file=None, num_labels: int = 20):
|
|
| 257 |
with open(font_file.name, "rb") as uploaded:
|
| 258 |
with open(font_path, "wb") as f:
|
| 259 |
f.write(uploaded.read())
|
| 260 |
-
|
| 261 |
-
if font_path is None or not os.path.exists(font_path):
|
| 262 |
font = ImageFont.load_default()
|
| 263 |
else:
|
| 264 |
-
font = ImageFont.truetype(font_path,
|
| 265 |
|
| 266 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 267 |
|
| 268 |
-
|
| 269 |
-
|
| 270 |
-
|
|
|
|
|
|
|
| 271 |
|
| 272 |
-
|
| 273 |
-
|
| 274 |
|
| 275 |
-
|
|
|
|
|
|
|
| 276 |
|
| 277 |
-
|
| 278 |
-
|
| 279 |
-
|
| 280 |
|
| 281 |
-
|
| 282 |
-
|
| 283 |
-
|
| 284 |
|
| 285 |
-
|
| 286 |
-
draw.text((char_x, char_y), char, font=font, fill=0)
|
| 287 |
-
char_w = font.getbbox(char)[2] - font.getbbox(char)[0]
|
| 288 |
-
char_x += char_w + spacing # move right with spacing
|
| 289 |
-
|
| 290 |
-
return grid_img
|
| 291 |
|
| 292 |
except Exception as e:
|
| 293 |
print("Error in generate_labels:", e)
|
| 294 |
error_img = Image.new("RGB", (512, 128), color=(255, 255, 255))
|
| 295 |
draw = ImageDraw.Draw(error_img)
|
| 296 |
draw.text((10, 50), f"Error: {str(e)}", fill=(255, 0, 0))
|
| 297 |
-
return error_img
|
| 298 |
|
| 299 |
|
| 300 |
|
|
@@ -334,7 +343,12 @@ with gr.Blocks() as demo:
|
|
| 334 |
gen_button = gr.Button("Generate Label Grid")
|
| 335 |
label_image = gr.Image(label="Generated Labels", type="pil")
|
| 336 |
|
| 337 |
-
gen_button.click(
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 338 |
|
| 339 |
|
| 340 |
|
|
|
|
| 248 |
|
| 249 |
|
| 250 |
# New helper function: generate label images grid
|
| 251 |
+
CHARS = string.ascii_letters + string.digits + string.punctuation
|
| 252 |
+
|
| 253 |
+
FONT_SIZE = 32
|
| 254 |
+
PADDING = 8
|
| 255 |
+
LABEL_DIR = "./labels"
|
| 256 |
+
|
| 257 |
+
def generate_labels(font_file=None, num_labels: int = 25):
|
| 258 |
global font_path
|
| 259 |
+
os.makedirs(LABEL_DIR, exist_ok=True)
|
| 260 |
|
| 261 |
try:
|
| 262 |
if font_file:
|
|
|
|
| 264 |
with open(font_file.name, "rb") as uploaded:
|
| 265 |
with open(font_path, "wb") as f:
|
| 266 |
f.write(uploaded.read())
|
| 267 |
+
if not font_file or not os.path.exists(font_path):
|
|
|
|
| 268 |
font = ImageFont.load_default()
|
| 269 |
else:
|
| 270 |
+
font = ImageFont.truetype(font_path, FONT_SIZE)
|
| 271 |
|
| 272 |
+
images = []
|
| 273 |
+
labels = [
|
| 274 |
+
"".join(np.random.choice(list(CHARS), np.random.randint(4, 7)))
|
| 275 |
+
for _ in range(num_labels)
|
| 276 |
+
]
|
| 277 |
|
| 278 |
+
for label in labels:
|
| 279 |
+
# Measure actual text bounding box
|
| 280 |
+
dummy_img = Image.new("L", (1, 1))
|
| 281 |
+
draw = ImageDraw.Draw(dummy_img)
|
| 282 |
+
bbox = draw.textbbox((0, 0), label, font=font)
|
| 283 |
|
| 284 |
+
text_width = bbox[2] - bbox[0]
|
| 285 |
+
text_height = bbox[3] - bbox[1]
|
| 286 |
|
| 287 |
+
# Compute final image size with padding
|
| 288 |
+
image_width = text_width + 2 * PADDING
|
| 289 |
+
image_height = text_height + 2 * PADDING
|
| 290 |
|
| 291 |
+
img = Image.new("L", (image_width, image_height), color=255)
|
| 292 |
+
draw = ImageDraw.Draw(img)
|
| 293 |
+
draw.text((PADDING, PADDING), label, font=font, fill=0)
|
| 294 |
|
| 295 |
+
filename = f"{LABEL_DIR}/{label}_{datetime.now().strftime('%Y%m%d%H%M%S%f')}.png"
|
| 296 |
+
img.save(filename)
|
| 297 |
+
images.append(img)
|
| 298 |
|
| 299 |
+
return images
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 300 |
|
| 301 |
except Exception as e:
|
| 302 |
print("Error in generate_labels:", e)
|
| 303 |
error_img = Image.new("RGB", (512, 128), color=(255, 255, 255))
|
| 304 |
draw = ImageDraw.Draw(error_img)
|
| 305 |
draw.text((10, 50), f"Error: {str(e)}", fill=(255, 0, 0))
|
| 306 |
+
return [error_img]
|
| 307 |
|
| 308 |
|
| 309 |
|
|
|
|
| 343 |
gen_button = gr.Button("Generate Label Grid")
|
| 344 |
label_image = gr.Image(label="Generated Labels", type="pil")
|
| 345 |
|
| 346 |
+
gen_button.click(
|
| 347 |
+
fn=generate_labels,
|
| 348 |
+
inputs=[font_file_labels, num_labels],
|
| 349 |
+
outputs=gr.Gallery(label="Label Images", show_label=True)
|
| 350 |
+
)
|
| 351 |
+
|
| 352 |
|
| 353 |
|
| 354 |
|