File size: 1,903 Bytes
9e147b4
 
 
4559416
ae10331
99a40c7
ef72450
5021a93
99a40c7
ae10331
 
99a40c7
ae10331
9e147b4
99a40c7
 
 
9e147b4
4559416
ae10331
99a40c7
 
9e147b4
 
ae10331
99a40c7
ae10331
 
4559416
99a40c7
ef72450
ae10331
99a40c7
4559416
ae10331
 
 
 
99a40c7
ae10331
4559416
99a40c7
4559416
99a40c7
9e147b4
99a40c7
9e147b4
ef72450
9e147b4
 
99a40c7
2543827
ae10331
99a40c7
2543827
99a40c7
9e147b4
2543827
9e147b4
ae10331
ef72450
 
9e147b4
 
99a40c7
ef72450
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 YOLOv12x model (pre-trained on COCO dataset)
model = YOLO("yolov8x.pt")  # Update to YOLOv12x

# 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 YOLOv12x 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
    }

# 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="YOLOv12x-based Truck Counter",
    description="Upload a video to detect and count trucks using YOLOv12x."
)

# Launch app
interface.launch()