|
|
|
import cv2 |
|
from ultralytics import YOLO |
|
import gradio as gr |
|
|
|
|
|
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 |
|
|
|
|
|
DETECTION_MODEL = YOLO("models/yolov10x_best.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 |
|
|
|
|
|
results = DETECTION_MODEL.predict(source=image, conf=0.2, iou=0.8) |
|
boxes = results[0].boxes |
|
|
|
if len(boxes) == 0: |
|
return image |
|
|
|
|
|
for box in boxes: |
|
detection_class_conf = round(box.conf.item(), 2) |
|
cls = list(ENTITIES_COLORS)[int(box.cls)] |
|
|
|
start_box = (int(box.xyxy[0][0]), int(box.xyxy[0][1])) |
|
end_box = (int(box.xyxy[0][2]), int(box.xyxy[0][3])) |
|
|
|
|
|
|
|
|
|
box_scale_factor = 0.001 |
|
label_scale_factor = 0.5 |
|
|
|
|
|
line_thickness = round(box_scale_factor * (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) |
|
|
|
|
|
text = cls + " " + str(detection_class_conf) |
|
|
|
font_thickness = max(line_thickness - 1, 1) |
|
(font_scale_w, font_scale_h) = (line_thickness * label_scale_factor, line_thickness * label_scale_factor) |
|
(text_w, text_h), _ = cv2.getTextSize(text=text, fontFace=2, fontScale=font_scale_w, thickness=font_thickness) |
|
|
|
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) |
|
|
|
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=font_scale_w, thickness=font_thickness) |
|
|
|
|
|
return image |
|
|
|
iface = gr.Interface(fn=detect, |
|
inputs=gr.Image(label="Upload scanned document", type="filepath"), |
|
outputs="image") |
|
iface.launch() |