creek

The AI Image Editor of 2030

models/typography.py (2468B)


 1"""
 2Typography
 3Original file: https://colab.research.google.com/drive/11sdpsNaYwetetOotIX3GKtxgaQOt7S0Y
 4"""
 5
 6!pip install easyocr -q
 7
 8import numpy as np
 9from PIL import Image
10import easyocr
11import pickle
12import os
13import json
14from tensorflow.keras.models import model_from_json, Model
15from tensorflow.keras.utils import get_custom_objects
16
17TEST_IMAGE_PATH = "test image.png"
18MODEL_JSON = "fannet.json"
19MODEL_WEIGHTS = "fannet_weights.h5"
20FONT_DB_PKL = "font_database.pkl"
21
22if os.path.exists(FONT_DB_PKL) and os.path.exists(MODEL_JSON):
23    with open(FONT_DB_PKL, "rb") as f:
24        font_db = pickle.load(f)
25
26    get_custom_objects()["Model"] = Model
27
28    with open(MODEL_JSON, "r") as f:
29        model_json_content = f.read()
30
31    fannet_model = model_from_json(model_json_content)
32    fannet_model.load_weights(MODEL_WEIGHTS)
33
34    encoder = Model(
35        inputs=fannet_model.input, outputs=fannet_model.get_layer("dense_1").output
36    )
37    reader = easyocr.Reader(["en"], gpu=True)
38
39    img_pil = Image.open(TEST_IMAGE_PATH)
40    detections = reader.readtext(TEST_IMAGE_PATH)
41
42    print(f"{'TEXT':<20} | {'PREDICTED FONT':<25} | {'CONFIDENCE'}")
43    print("-" * 65)
44
45    for bbox, text, conf in detections:
46        tl, tr, br, bl = bbox
47        x_min = max(0, int(min(tl[0], bl[0])))
48        y_min = max(0, int(min(tl[1], tr[1])))
49        x_max = min(img_pil.width, int(max(tr[0], br[0])))
50        y_max = min(img_pil.height, int(max(bl[1], br[1])))
51
52        if x_max - x_min > 5 and y_max - y_min > 5:
53            crop = img_pil.crop((x_min, y_min, x_max, y_max))
54
55            img = crop.convert("L").resize((64, 64), Image.LANCZOS)
56            arr = np.array(img, dtype=np.float32)
57            arr = (arr < np.mean(arr)).astype(np.float32)
58            processed = np.expand_dims(arr, axis=(0, -1))
59
60            dummy_char = np.zeros((1, 26, 1))
61            features = encoder.predict([processed, dummy_char], verbose=0)[0]
62
63            best_font = "Unknown"
64            min_dist = float("inf")
65
66            for name, db_feat in font_db.items():
67                dist = np.linalg.norm(features - db_feat)
68                if dist < min_dist:
69                    min_dist = dist
70                    best_font = name
71
72            font_conf = 1.0 / (1.0 + min_dist)
73            print(f"{text:<20} | {best_font:<25} | {font_conf:.4f}")
74else:
75    print(
76        "Files not found. Please upload test image.png, fannet.json, fannet_weights.h5, and font_database.pkl"
77    )