CNIC_Detector / app.py
maliahson's picture
Update app.py
6c68efc verified
import gradio as gr
import cv2
import numpy as np
from ultralytics import YOLO
from PIL import Image
# Load YOLO models
try:
front_model = YOLO("front_cnic_model.pt")
back_model = YOLO("back_cnic_model.pt")
except Exception as e:
print(f"Error loading models: {e}")
def preprocess_image(image):
"""Convert PIL Image to OpenCV format."""
try:
img = np.array(image)
img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)
return img
except Exception as e:
return None, f"Error preprocessing image: {e}"
def extract_regions(image, boxes, model_names):
"""Extract regions of interest (ROIs) by label from YOLO detections."""
results = {}
for box in boxes:
try:
x1, y1, x2, y2 = map(int, box.xyxy[0])
cls_name = model_names[int(box.cls)]
roi = image[y1:y2, x1:x2]
results[cls_name] = f"Detected region at [{x1}, {y1}, {x2}, {y2}]"
except Exception as e:
results[cls_name] = f"Region extraction error: {e}"
return results
def process_front_cnic(image):
"""Process front CNIC image to extract fields."""
if image is None:
return {"error": "No image provided"}
img = preprocess_image(image)
if isinstance(img, tuple):
return {"error": img[1]}
try:
results = front_model.predict(img, conf=0.5)
extracted_info = extract_regions(img, results[0].boxes, front_model.names)
return extracted_info if extracted_info else {"error": "No objects detected"}
except Exception as e:
return {"error": f"Front CNIC processing error: {e}"}
def process_back_cnic(image):
"""Process back CNIC image to extract ROIs for Barcode and CNIC number."""
if image is None:
return {"error": "No image provided"}
img = preprocess_image(image)
if isinstance(img, tuple):
return {"error": img[1]}
try:
results = back_model.predict(img, conf=0.5)
extracted_info = extract_regions(img, results[0].boxes, back_model.names)
return extracted_info if extracted_info else {"error": "No objects detected"}
except Exception as e:
return {"error": f"Back CNIC processing error: {e}"}
# Gradio Interface
with gr.Blocks(theme=gr.themes.Soft()) as demo:
gr.Markdown(
"""
# CNIC Detection (YOLO-only)
Upload front and back CNIC images to detect regions of interest.
- **Front CNIC**: Detects regions such as Name, DOB, Father's Name, etc.
- **Back CNIC**: Detects Barcode and CNIC number regions (no OCR).
"""
)
with gr.Row():
with gr.Column():
gr.Markdown("## Front CNIC")
front_input = gr.Image(type="pil", label="Upload Front CNIC Image")
front_button = gr.Button("Process Front CNIC")
front_output = gr.JSON(label="Detected Regions")
with gr.Column():
gr.Markdown("## Back CNIC")
back_input = gr.Image(type="pil", label="Upload Back CNIC Image")
back_button = gr.Button("Process Back CNIC")
back_output = gr.JSON(label="Detected Regions")
front_button.click(
fn=process_front_cnic,
inputs=front_input,
outputs=front_output
)
back_button.click(
fn=process_back_cnic,
inputs=back_input,
outputs=back_output
)
if __name__ == "__main__":
demo.launch()