File size: 2,022 Bytes
9e147b4
 
 
4559416
ae10331
99a40c7
ae10331
4559416
99a40c7
ae10331
 
99a40c7
ae10331
9e147b4
99a40c7
 
 
9e147b4
4559416
ae10331
99a40c7
 
9e147b4
 
ae10331
99a40c7
ae10331
 
4559416
99a40c7
ae10331
 
99a40c7
4559416
ae10331
 
 
 
99a40c7
ae10331
4559416
99a40c7
4559416
99a40c7
9e147b4
99a40c7
9e147b4
4559416
 
9e147b4
 
99a40c7
2543827
ae10331
99a40c7
2543827
99a40c7
9e147b4
2543827
9e147b4
ae10331
4559416
 
9e147b4
 
99a40c7
4559416
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
import gradio as gr
import cv2
import numpy as np
import torch
from ultralytics import YOLO

# Load YOLOv8 model (pre-trained on COCO dataset)
model = YOLO("yolov8x.pt")  # Use "yolov8x.pt" for highest accuracy

# Class label for trucks (COCO dataset)
TRUCK_CLASS_ID = 7  # "truck" in COCO dataset

def count_trucks(video_path):
    cap = cv2.VideoCapture(video_path)
    if not cap.isOpened():
        return "Error: Unable to open video file."

    frame_count = 0
    truck_count_per_frame = []
    frame_skip = 5  # Process every 5th frame for efficiency

    while True:
        ret, frame = cap.read()
        if not ret:
            break  # End of video

        frame_count += 1
        if frame_count % frame_skip != 0:
            continue  # Skip frames to improve efficiency

        # Run YOLOv8 inference
        results = model(frame, verbose=False)

        truck_count = 0
        for result in results:
            for box in result.boxes:
                class_id = int(box.cls.item())  # Get class ID
                confidence = float(box.conf.item())  # Get confidence score

                if class_id == TRUCK_CLASS_ID and confidence > 0.6:
                    truck_count += 1  # Count trucks with confidence > 0.6

        truck_count_per_frame.append(truck_count)

    cap.release()

    return {
        "Total Trucks in Video": int(np.max(truck_count_per_frame)) if truck_count_per_frame else 0 #,
        #"Avg Trucks Per Frame": round(np.mean(truck_count_per_frame), 2) if truck_count_per_frame else 0
    }

# Gradio UI function
def analyze_video(video_file):
    result = count_trucks(video_file)
    return "\n".join([f"{key}: {value}" for key, value in result.items()])

# Gradio Interface
interface = gr.Interface(
    fn=analyze_video,
    inputs=gr.Video(label="Upload Video"),
    outputs=gr.Textbox(label="Truck Counting Results"),
    title="YOLOv8-based Truck Counter",
    description="Upload a video to detect and count trucks using YOLOv8."
)

# Launch app
interface.launch()