FAST_Demo / app.py
TeddyUW's picture
Initial Working FAST Demo
9ad4d0e
Raw
History Blame Contribute Delete
2.65 kB
import io, cv2, torch, gradio as gr
import matplotlib.pyplot as plt
from matplotlib.patches import Rectangle
from pathlib import Path
from PIL import Image
from transformers.models.fast.image_processing_fast import FastImageProcessor
from transformers.models.fast.modeling_fast import FastForSceneTextRecognition
THIS_DIR = Path(__file__).parent
model_dir = THIS_DIR / "converted_fast_base"
processor = FastImageProcessor.from_pretrained(model_dir)
model = FastForSceneTextRecognition.from_pretrained(model_dir).eval()
def draw_detections(img, dets):
plt.figure(figsize=(8, 8)); plt.imshow(img); ax = plt.gca()
for box in dets["boxes"]:
if len(box) == 5:
xc, yc, w, h, angle = box
pts = cv2.boxPoints(((xc, yc), (w, h), angle)).astype(int).tolist()+[()]
xs, ys = zip(*pts); ax.plot(xs, ys, "-r", lw=2)
elif len(box) == 4 and isinstance(box[0], (list, tuple)):
pts = box+[box[0]]; xs=[p[0] for p in pts]; ys=[p[1] for p in pts]
ax.plot(xs, ys, "-b", lw=2)
elif len(box) == 4:
xmin, ymin, xmax, ymax = box
ax.add_patch(Rectangle((xmin, ymin), xmax-xmin, ymax-ymin,
fill=False, lw=2, ec="r"))
elif len(box) == 8 and all(isinstance(x, (int, float)) for x in box):
xs = list(box[0::2]) + [box[0]]
ys = list(box[1::2]) + [box[1]]
ax.plot(xs, ys, "-g", lw=2)
elif len(box) > 8 and all(isinstance(x, (int, float)) for x in box):
xs = list(box[0::2]) + [box[0]]
ys = list(box[1::2]) + [box[1]]
ax.plot(xs, ys, "-g", lw=2)
else:
raise ValueError(f"Unrecognized box format: {box!r}")
ax.axis("off"); plt.tight_layout()
buf=io.BytesIO(); plt.savefig(buf, format="png", bbox_inches="tight"); buf.seek(0)
out = Image.open(buf).convert("RGB"); plt.close(); return out
def run(image, mode="boxes"):
inputs = processor(images=image, return_tensors="pt")
with torch.no_grad():
outputs = model(**inputs)
dets = processor.post_process_text_detection(
outputs, target_sizes=[image.size[::-1]], output_type=mode)[0]
return draw_detections(image, dets)
demo = gr.Interface(
fn=run,
inputs=[gr.Image(type="pil", label="Upload an image with text", sources=["upload", "clipboard"]), gr.Radio(["boxes", "polygons"], value="boxes")],
outputs=gr.Image(type="pil"), title="FAST Text Detection Demo",
description="Detect text in images using the FAST model from Hugging Face Transformers"
)
if __name__ == "__main__":
demo.launch()