|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import gradio as gr |
|
import cv2 |
|
import numpy as np |
|
|
|
def count_people(video_path): |
|
|
|
net = cv2.dnn.readNet('yolov3.weights', 'yolov3.cfg') |
|
|
|
|
|
with open('coco.names', 'r') as f: |
|
classes = [line.strip() for line in f.readlines()] |
|
|
|
|
|
cap = cv2.VideoCapture(video_path) |
|
|
|
frame_count = 0 |
|
total_people_count = 0 |
|
people_per_frame = [] |
|
|
|
while cap.isOpened(): |
|
ret, frame = cap.read() |
|
if not ret: |
|
break |
|
|
|
height, width, _ = frame.shape |
|
|
|
|
|
blob = cv2.dnn.blobFromImage(frame, 1/255.0, (416, 416), swapRB=True, crop=False) |
|
net.setInput(blob) |
|
|
|
|
|
output_layers_names = net.getUnconnectedOutLayersNames() |
|
|
|
|
|
layer_outputs = net.forward(output_layers_names) |
|
|
|
|
|
boxes = [] |
|
confidences = [] |
|
|
|
|
|
for output in layer_outputs: |
|
for detection in output: |
|
scores = detection[5:] |
|
class_id = np.argmax(scores) |
|
confidence = scores[class_id] |
|
|
|
|
|
if classes[class_id] == 'person' and confidence > 0.5: |
|
|
|
center_x = int(detection[0] * width) |
|
center_y = int(detection[1] * height) |
|
w = int(detection[2] * width) |
|
h = int(detection[3] * height) |
|
|
|
|
|
x = int(center_x - w/2) |
|
y = int(center_y - h/2) |
|
|
|
boxes.append([x, y, w, h]) |
|
confidences.append(float(confidence)) |
|
|
|
|
|
indexes = cv2.dnn.NMSBoxes(boxes, confidences, 0.5, 0.4) |
|
|
|
|
|
people_in_frame = len(indexes) |
|
people_per_frame.append(people_in_frame) |
|
total_people_count += people_in_frame |
|
|
|
frame_count += 1 |
|
|
|
|
|
cap.release() |
|
|
|
|
|
return { |
|
|
|
|
|
|
|
'People in a Video': int(np.max(people_per_frame)) |
|
} |
|
|
|
|
|
def analyze_video(video_file): |
|
result = count_people(video_file) |
|
result_str = "\n".join([f"{key}: {value}" for key, value in result.items()]) |
|
return result_str |
|
|
|
|
|
interface = gr.Interface( |
|
fn=analyze_video, |
|
inputs=gr.Video(label="Upload Video"), |
|
outputs=gr.Textbox(label="People Counting Results"), |
|
title="YOLO-based People Counter", |
|
description="Upload a video to detect and count people using YOLOv3." |
|
) |
|
|
|
|
|
interface.launch() |
|
|