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 main(): # ----------------------- 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) # inference video = cv2.VideoCapture(0) while True: _, frame = video.read() fd_output = fd_model(frame, 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(frame, bbox) gender = detect_age_or_gender(face, gd_model) age = detect_age_or_gender(face, ad_model) frame = cv2.rectangle(frame, (bbox[0], bbox[1]), (bbox[2], bbox[3]), (36, 255, 12), 3) cv2.putText(frame, f"{gender}, {age} ({confidence:.2f})", (bbox[0], bbox[1] - 10), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (36, 255, 12),2) cv2.imshow('Camera', frame) k = cv2.waitKey(1) if k == ord('q'): break video.release() cv2.destroyAllWindows() if __name__ == '__main__': main() print("Finished")