| import gradio as gr |
| import cv2 |
| import numpy as np |
| import pytesseract |
| from ultralytics import YOLO |
| import easyocr |
| import os |
| os.environ['TESSDATA_PREFIX'] = '/usr/share/tesseract-ocr/5/tessdata' |
|
|
| |
| |
| yolo_model = YOLO("models/Metz2_V2_Dataset_2_E_68_35best.pt") |
|
|
| easyocr_readers = {} |
|
|
| |
| detected_crops = [] |
|
|
| |
| def detect_objects(image): |
| global detected_crops |
| results = yolo_model(image)[0] |
| annotated = image.copy() |
| detected_crops = [] |
|
|
| for box in results.boxes.data.tolist(): |
| x1, y1, x2, y2, conf, cls = box |
| x1, y1 = max(0, int(x1)), max(0, int(y1)) |
| x2, y2 = int(x2), int(y2) |
| label = yolo_model.names[int(cls)] |
| cropped = image[y1:y2, x1:x2] |
| detected_crops.append((label, cropped)) |
| cv2.rectangle(annotated, (x1, y1), (x2, y2), (0,255,0), 2) |
| cv2.putText(annotated, label, (x1, y1-10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (255,0,0), 2) |
|
|
| crops = [crop for _, crop in detected_crops] |
| return annotated, crops |
|
|
| |
| def run_ocr(engine, lang = 'fr'): |
| results = [] |
| for label, crop in detected_crops: |
| try: |
| if engine == "EasyOCR": |
| if lang not in easyocr_readers: |
| easyocr_readers[lang] = easyocr.Reader([lang], gpu=False) |
| reader = easyocr_readers[lang] |
| text = "\n".join(reader.readtext(crop, detail=0)) |
| elif engine == "Tesseract": |
| config = f'--oem 3 --psm 6 -l {lang}' |
| text = pytesseract.image_to_string(crop, config=config) |
| else: |
| text = "[Unsupported Engine]" |
| except Exception as e: |
| text = f"[Error: {e}]" |
| results.append(f"{label}:\n{text}") |
| return "\n\n".join(results) |
|
|
| |
| with gr.Blocks() as demo: |
| gr.Markdown("## π§ YOLO Detection + OCR Modular App - NER") |
|
|
| with gr.Row(): |
| input_img = gr.Image(type="numpy", label="Upload Image") |
| detected_img = gr.Image(type="numpy", label="Annotated Image") |
|
|
| detect_button = gr.Button("π Run Detection") |
| gallery = gr.Gallery(label="Detected Crops") |
|
|
| with gr.Row(): |
| ocr_engine = gr.Radio(["EasyOCR", "Tesseract"], value="EasyOCR", label="OCR Engine") |
| lang_input = gr.Textbox("fr", label="Language Code") |
|
|
| ocr_button = gr.Button("π Run OCR on Detected Regions") |
| ocr_output = gr.Textbox(label="Extracted Text", lines=10) |
|
|
| detect_button.click(fn=detect_objects, inputs=input_img, outputs=[detected_img, gallery]) |
| ocr_button.click(fn=run_ocr, inputs=[ocr_engine, lang_input], outputs=ocr_output) |
|
|
| |
| example_images = ["images/example1.jpg", "images/example2.jpg", "images/example3.jpg", "images/example4.jpg", "images/example5.jpg"] |
| gr.Examples( |
| examples=[[img] for img in example_images], |
| inputs=[input_img], |
| label="Example Images" |
| ) |
|
|
| demo.launch() |