import gradio as gr import cv2 from pathlib import Path from huggingface_hub import hf_hub_download from ultralytics import YOLO from supervision import Detections def detect_age_or_gender(face, model): result = model(face, verbose=False) index_mapping = result[0].names result_index = result[0].probs.top1 label = index_mapping[result_index] return label def crop_face(img, bbox): return img[bbox[1]:bbox[3], bbox[0]:bbox[2]] def detect_age_gender(image): new_image = image.copy() fd_output = fd_model(image, verbose=False) results = Detections.from_ultralytics(fd_output[0]) for ind, result in enumerate(results): if len(results.xyxy[ind]) > 0: bbox = [int(b) for b in results.xyxy[ind]] # xyxy = [x1, y1, x2, y2] confidence = results.confidence[ind] face = crop_face(image, bbox) gender = detect_age_or_gender(face, gd_model) age = detect_age_or_gender(face, ad_model) new_image = cv2.rectangle(new_image, (bbox[0], bbox[1]), (bbox[2], bbox[3]), (36, 255, 12), 3) cv2.putText(new_image, f"{gender}, {age} ({confidence:.2f})", (bbox[0], bbox[1] - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.59, (36, 255, 12), 2) return new_image def init_models(): # ----------------------- CONFIGURATIONS ----------------------- # FACE_DETECTION_MODEL = "arnabdhar/YOLOv8-Face-Detection" GENDER_DETECTION_MODEL = str(Path("models") / "gender.pt") AGE_DETECTION_MODEL = str(Path("models") / "age.pt") # -------------------------------------------------------------- # # Load Face Detection (fd) Model model_path = hf_hub_download(repo_id=FACE_DETECTION_MODEL, filename="model.pt") fd_model = YOLO(model_path) # Load Gender Detection (gd) Model gd_model = YOLO(GENDER_DETECTION_MODEL) # Load Age Detection (ad) Model ad_model = YOLO(AGE_DETECTION_MODEL) return fd_model, gd_model, ad_model fd_model, gd_model, ad_model = init_models() # Gradio Interface with gr.Blocks(theme=gr.themes.Glass()) as demo: gr.Markdown("# Age and Gender Detection App") gr.Markdown("Click a button to either upload an image or use your camera for real-time detection.") with gr.Tab("Single Image"): gr.Interface(fn=detect_age_gender, inputs=gr.Image(type="numpy", label="Input Image", width="100%", height=640), outputs=gr.Image(type="numpy", label="Output Image", width="100%", height=640)) with gr.Tab("Video Capture"): # The webcam image component. The `sources=["webcam"]` and `streaming=True` # are the key components for real-time video processing. webcam_input = gr.Image( sources=["webcam"], streaming=True, interactive=True, type="numpy", label="Webcam Input", width="100%", height=480 ) # The output component where the processed video will be displayed. output_image = gr.Image( label="Processed Feed", width="100%", height=480 ) # The `stream()` method automatically calls the `process_frame` function # for each frame of the video feed. webcam_input.stream(detect_age_gender, inputs=webcam_input, outputs=output_image) demo.launch()