PersonDetect / app.py
GwFirman's picture
Update app.py
1927bd2 verified
import torch
import cv2
import os
import numpy as np
import gradio as gr
# Muat model pre-trained YOLOv5
model = torch.hub.load('ultralytics/yolov5', 'yolov5s', pretrained=True)
# Fungsi untuk memproses video dan menghitung jumlah manusia
def process_video(video_path):
# Direktori output
output_dir = "output_videos"
os.makedirs(output_dir, exist_ok=True)
output_path = os.path.join(output_dir, "person_counter_output.mp4")
# Buka video input
cap = cv2.VideoCapture(video_path)
# Dapatkan spesifikasi video
frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
fps = int(cap.get(cv2.CAP_PROP_FPS))
# Buat VideoWriter untuk menyimpan video output
fourcc = cv2.VideoWriter_fourcc(*"mp4v")
out = cv2.VideoWriter(output_path, fourcc, fps, (frame_width, frame_height))
# Proses video
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
# Inferensi dengan YOLOv5
results = model(frame)
detections = results.pred[0]
names = model.names
# Filter hanya label 'person'
person_detections = [d for d in detections if names[int(d[-1])] == "person"]
person_count = len(person_detections)
# Render frame dan buat salinan eksplisit
annotated_frame = results.render()[0]
annotated_frame = np.copy(annotated_frame)
# Tambahkan teks ke frame
cv2.putText(annotated_frame, f"Person Count: {person_count}", (10, 30),
cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)
# Tulis frame yang telah dianotasi ke video output
out.write(annotated_frame)
# Tutup video input dan output
cap.release()
out.release()
# Mengembalikan video yang telah diproses (tidak menjumlahkan seluruh frame)
return output_path
# Fungsi Gradio untuk antarmuka
def gradio_interface(video_file):
output_path = process_video(video_file)
return output_path
# Antarmuka Gradio
iface = gr.Interface(
fn=gradio_interface,
inputs=gr.File(type="filepath"), # Input berupa file video
outputs=gr.File(label="Processed Video"),
title="Person Counter using YOLOv5",
description="Upload a video file to detect and count the number of people in each frame using YOLOv5."
)
# Menjalankan aplikasi
if __name__ == "__main__":
iface.launch()