Spaces:
Runtime error
Runtime error
# Import libraries | |
import cv2 # for reading images, draw bounding boxes | |
from ultralytics import YOLO | |
import gradio as gr | |
# Define constants | |
ENTITIES_COLORS = { | |
"Caption": (191, 100, 21), | |
"Footnote": (2, 62, 115), | |
"Formula": (140, 80, 58), | |
"List-item": (168, 181, 69), | |
"Page-footer": (2, 69, 84), | |
"Page-header": (83, 115, 106), | |
"Picture": (255, 72, 88), | |
"Section-header": (0, 204, 192), | |
"Table": (116, 127, 127), | |
"Text": (0, 153, 221), | |
"Title": (196, 51, 2) | |
} | |
BOX_PADDING = 2 | |
# Load models | |
DETECTION_MODEL = YOLO("models/dla-model.pt") | |
def detect(image_path): | |
""" | |
Output inference image with bounding box | |
Args: | |
- image: to check for checkboxes | |
Return: image with bounding boxes drawn | |
""" | |
image = cv2.imread(image_path) | |
if image is None: | |
return image | |
# Predict on image | |
results = DETECTION_MODEL.predict(source=image, conf=0.2, iou=0.8) # Predict on image | |
boxes = results[0].boxes # Get bounding boxes | |
if len(boxes) == 0: | |
return image | |
# Get bounding boxes | |
for box in boxes: | |
detection_class_conf = round(box.conf.item(), 2) | |
cls = list(ENTITIES_COLORS)[int(box.cls)] | |
# Get start and end points of the current box | |
start_box = (int(box.xyxy[0][0]), int(box.xyxy[0][1])) | |
end_box = (int(box.xyxy[0][2]), int(box.xyxy[0][3])) | |
# 01. DRAW BOUNDING BOX OF OBJECT | |
line_thickness = round(0.002 * (image.shape[0] + image.shape[1]) / 2) + 1 | |
image = cv2.rectangle(img=image, | |
pt1=start_box, | |
pt2=end_box, | |
color=ENTITIES_COLORS[cls], | |
thickness = line_thickness) # Draw the box with predefined colors | |
# 02. DRAW LABEL | |
text = cls + " " + str(detection_class_conf) | |
# Get text dimensions to draw wrapping box | |
font_thickness = max(line_thickness - 1, 1) | |
(text_w, text_h), _ = cv2.getTextSize(text=text, fontFace=2, fontScale=line_thickness/3, thickness=font_thickness) | |
# Draw wrapping box for text | |
image = cv2.rectangle(img=image, | |
pt1=(start_box[0], start_box[1] - text_h - BOX_PADDING*2), | |
pt2=(start_box[0] + text_w + BOX_PADDING * 2, start_box[1]), | |
color=ENTITIES_COLORS[cls], | |
thickness=-1) | |
# Put class name on image | |
start_text = (start_box[0] + BOX_PADDING, start_box[1] - BOX_PADDING) | |
image = cv2.putText(img=image, text=text, org=start_text, fontFace=0, color=(255,255,255), fontScale=line_thickness/3, thickness=font_thickness) | |
return image | |
iface = gr.Interface(fn=detect, | |
inputs=gr.Image(label="Upload scanned document", type="filepath"), | |
outputs="image") | |
iface.launch() | |