creek
The AI Image Editor of 2030git clone https://github.com/maydayv7/creek
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 )