MiVOLO / app.py
jaimin's picture
Update app.py
1fed86e verified
raw
history blame
3.71 kB
import os
import cv2
import imghdr
import shutil
import warnings
import numpy as np
import gradio as gr
from dataclasses import dataclass
from mivolo.predictor import Predictor
from utils import is_url, download_file, get_jpg_files, MODEL_DIR
TMP_DIR = "./__pycache__"
@dataclass
class Cfg:
detector_weights: str
checkpoint: str
device: str = "cpu"
with_persons: bool = True
disable_faces: bool = False
draw: bool = True
class ValidImgDetector:
predictor = None
def __init__(self):
detector_path = f"{MODEL_DIR}/yolov8x_person_face.pt"
age_gender_path = f"{MODEL_DIR}/model_imdb_cross_person_4.22_99.46.pth.tar"
predictor_cfg = Cfg(detector_path, age_gender_path)
self.predictor = Predictor(predictor_cfg)
def _detect(
self,
image: np.ndarray,
score_threshold: float,
iou_threshold: float,
mode: str,
predictor: Predictor,
) -> np.ndarray:
predictor.detector.detector_kwargs["conf"] = score_threshold
predictor.detector.detector_kwargs["iou"] = iou_threshold
if mode == "Use persons and faces":
use_persons = True
disable_faces = False
elif mode == "Use persons only":
use_persons = True
disable_faces = True
elif mode == "Use faces only":
use_persons = False
disable_faces = False
predictor.age_gender_model.meta.use_persons = use_persons
predictor.age_gender_model.meta.disable_faces = disable_faces
detected_objects, out_im = predictor.recognize(image)
has_child, has_female, has_male = False, False, False
if len(detected_objects.ages) > 0:
has_child = min(detected_objects.ages) < 18
has_female = "female" in detected_objects.genders
has_male = "male" in detected_objects.genders
return out_im[:, :, ::-1], has_child, has_female, has_male
def valid_video(self, video_path):
cap = cv2.VideoCapture(video_path)
results = []
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
# Process each frame
out_frame, has_child, has_female, has_male = self._detect(frame, 0.4, 0.7, "Use persons and faces", self.predictor)
results.append((out_frame, has_child, has_female, has_male))
cap.release()
return results
def infer(video_path: str):
if is_url(video_path):
if os.path.exists(TMP_DIR):
shutil.rmtree(TMP_DIR)
video_path = download_file(video_path, f"{TMP_DIR}/download.mp4")
detector = ValidImgDetector()
if not video_path or not os.path.exists(video_path):
return None, None, None, "Please input the video correctly"
results = detector.valid_video(video_path)
# Process results to only return first frame's result as an example
if results:
first_frame_result = results[0]
return first_frame_result
else:
return None, None, None, "No frames detected in video."
if __name__ == "__main__":
with gr.Blocks() as iface:
warnings.filterwarnings("ignore")
with gr.Tab("Upload Mode"):
gr.Interface(
fn=infer,
inputs=gr.Video(label="Upload Video"),
outputs=[
gr.Image(label="Detection Result", type="numpy"),
gr.Textbox(label="Has Child"),
gr.Textbox(label="Has Female"),
gr.Textbox(label="Has Male"),
],
allow_flagging="never",
)
iface.launch()