پردازش هوشمند ویدیوهای طولانی با YOLOv8 و Batch Processing

پروژه‌های بینایی کامپیوتر

این مطلب از سایت tool.hamidvalad.ir گرفته شده است

مقدمه

پردازش ویدیوهای طولانی با مدل‌های بینایی ماشین مثل YOLOv8 یکی از چالش‌های مهم در پروژه‌های واقعی است. بسیاری از توسعه‌دهندگان هنگام اجرای مدل روی ویدیوهای چند هزار فریمی با مشکلاتی مانند کمبود حافظه GPU، کرش کردن برنامه یا افت سرعت پردازش مواجه می‌شوند. این مشکلات باعث می‌شوند پروژه‌ها زمان‌بر و غیرقابل اعتماد شوند، مخصوصاً وقتی هدف، پردازش و تحلیل ویدیوهای طولانی با دقت بالا باشد.

برای حل این مشکل، رویکرد Batch Processing هوشمند معرفی می‌شود. در این روش به جای پردازش کل ویدیو به صورت یک‌جا، ویدیو به بخش‌های کوچکتر یا بچ (Batch) تقسیم می‌شود و هر بخش به طور مرحله‌ای پردازش می‌شود. این کار باعث می‌شود مصرف حافظه GPU کنترل شود، پردازش پایدارتر انجام شود و در صورت بروز خطا بتوان راحت‌تر آن را مدیریت کرد. علاوه بر این، رویکرد Batch امکان تنظیم پویا اندازه بچ‌ها را فراهم می‌کند تا در شرایط کمبود منابع، سیستم به طور خودکار حجم پردازش را کاهش دهد و از کرش جلوگیری شود.

استفاده از این روش برای پروژه‌های واقعی بینایی ماشین حیاتی است، زیرا به شما اجازه می‌دهد بدون محدودیت سخت‌افزاری و با دقت بالا ویدیوهای طولانی را تحلیل کنید، فریم‌ها را Annotate کرده و خروجی‌های تصویری یا ویدیویی با کیفیت تولید کنید. علاوه بر این، این روش انعطاف‌پذیری بالایی دارد و می‌تواند به راحتی با مدل‌های دیگر YOLO یا سیستم‌های Tracking ترکیب شود.

کتابخانه‌های مورد نیاز

برای پیاده‌سازی این پروژه، چند کتابخانه کلیدی مورد استفاده قرار گرفته است که هر کدام نقش مشخص و مهمی دارند:

۱. ultralytics
این کتابخانه شامل مدل‌های YOLOv8 است و امکان انجام Object Detection و Object Tracking را فراهم می‌کند. با استفاده از این کتابخانه می‌توان مدل‌های آماده YOLOv8 را بارگیری کرده و روی تصاویر یا ویدیوها اعمال کرد. همچنین گزینه‌های متعددی برای تنظیم کلاس‌ها، Confidence Threshold و Tracker در اختیار کاربر قرار می‌دهد.

۲. OpenCV (cv2)
OpenCV برای خواندن و نوشتن ویدیوها و پردازش فریم‌ها استفاده می‌شود. این کتابخانه امکان دسترسی به ویژگی‌هایی مانند FPS، ابعاد فریم و فرمت ویدیو را فراهم می‌کند و ابزار اصلی برای ترکیب فریم‌های Annotate شده و خروجی گرفتن ویدیو است.

۳. Torch (PyTorch)
کتابخانه PyTorch برای مدیریت پردازش روی GPU یا CPU استفاده می‌شود. با بررسی موجودیت GPU، مدل به طور هوشمند روی دستگاه مناسب اجرا می‌شود. علاوه بر این، امکان آزادسازی حافظه GPU با استفاده از torch.cuda.empty_cache() بعد از هر Batch وجود دارد که از بروز خطاهای Out Of Memory جلوگیری می‌کند.

۴. GC (Garbage Collector)
برای آزادسازی حافظه استفاده می‌شود. در پروژه‌های طولانی پردازش ویدیو، جمع‌آوری خودکار حافظه به جلوگیری از مصرف بیش از حد RAM و افزایش پایداری پردازش کمک می‌کند.

این چهار کتابخانه اصلی، پایه و اساس اجرای Batch Processing هوشمند و پردازش پایدار ویدیو را فراهم می‌کنند و بدون آن‌ها اجرای چنین پروژه‌ای بسیار دشوار خواهد بود.

نکات مهم در پیاده‌سازی

Batch Processing هوشمند: تقسیم ویدیو به بخش‌های کوچکتر باعث کاهش مصرف حافظه GPU و جلوگیری از کرش می‌شود. اندازه هر Batch قابل تنظیم است و می‌تواند در صورت بروز خطا کاهش پیدا کند.

تعامل با GPU و CPU: با بررسی در دسترس بودن GPU، پردازش به صورت پویا روی دستگاه مناسب انجام می‌شود. این قابلیت باعث می‌شود پروژه روی سیستم‌های بدون GPU نیز قابل اجرا باشد.

پاک‌سازی حافظه بعد از هر Batch: با استفاده از Garbage Collector و torch.cuda.empty_cache() حافظه آزاد شده و امکان پردازش Batch بعدی بدون مشکل فراهم می‌شود.

استفاده از Tracker حرفه‌ای: ترکیب YOLOv8 با Tracker مانند ByteTrack باعث می‌شود که اشیاء به‌صورت دقیق بین فریم‌ها دنبال شوند و Tracking پایدار انجام شود.

خروجی ویدیوی Annotate شده: فریم‌های پردازش شده همراه با Bounding Box و اطلاعات Tracking روی ویدیو ذخیره می‌شوند تا نتایج قابل مشاهده و تحلیلی باشند.

این نکات باعث می‌شوند پروژه هم مقیاس‌پذیر باشد و هم پایدار و قابل اعتماد اجرا شود.

کد پروژه

!pip install ultralytics

from ultralytics import YOLO
import cv2
import gc
import torch

# Load model
model = YOLO('yolov8n.pt')

def smart_batch_processing(video_path, total_frames=4650, batch_size=100):
    cap = cv2.VideoCapture(video_path)
    
    fps = cap.get(cv2.CAP_PROP_FPS)
    width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
    height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
    
    fourcc = cv2.VideoWriter_fourcc(*'mp4v')
    out = cv2.VideoWriter('output.mp4', fourcc, fps, (width, height))
    
    frame_count = 0
    batch_num = 1
    
    while frame_count < total_frames:
        print(f"Processing batch {batch_num} (frames {frame_count + 1}-{frame_count + batch_size})")
        
        frames_batch = []
        batch_frame_indices = []
        
        for _ in range(batch_size):
            if frame_count >= total_frames:
                break
            ret, frame = cap.read()
            if not ret:
                break
            frames_batch.append(frame)
            batch_frame_indices.append(frame_count)
            frame_count += 1
        
        if not frames_batch:
            break
            
        try:
            results = model.track(
                frames_batch,
                classes=[2, 5, 7],
                tracker='bytetrack.yaml',
                conf=0.5,
                verbose=False,
                device='cuda' if torch.cuda.is_available() else 'cpu'
            )
            
            for i, result in enumerate(results):
                annotated_frame = result.plot()
                out.write(annotated_frame)
            
            print(f"Batch {batch_num} completed")
            
        except Exception as e:
            print(f"Error in batch {batch_num}: {e}")
            batch_size = max(20, batch_size // 2)
            print(f"Changing batch size to: {batch_size}")
        
        del frames_batch, results
        gc.collect()
        if torch.cuda.is_available():
            torch.cuda.empty_cache()
        
        batch_num += 1
        
        if batch_num % 5 == 0:
            print("Short break...")
            import time
            time.sleep(2)
    
    cap.release()
    out.release()
    print("Processing completed!")

# Run processing
smart_batch_processing('input_video.mp4', total_frames=4650, batch_size=80)

نکات مهم کد

پردازش ویدیو با YOLOv8 و Batch Processing، نکات فنی زیادی دارد که برای اجرای صحیح و پایدار پروژه ضروری هستند. اول از همه، تقسیم ویدیو به Batchهای کوچک باعث می‌شود مصرف GPU کنترل شود و برنامه هنگام پردازش ویدیوهای طولانی کرش نکند. اندازه هر Batch در کد قابل تنظیم است و در صورت بروز خطا، به‌طور هوشمند کاهش پیدا می‌کند تا از توقف برنامه جلوگیری شود. این ویژگی برای ویدیوهای با چند هزار فریم حیاتی است و به پایداری پردازش کمک می‌کند.

یکی دیگر از نکات کلیدی، مدیریت حافظه GPU و CPU است. کد با بررسی موجودیت GPU، به‌صورت خودکار تصمیم می‌گیرد پردازش روی GPU یا CPU انجام شود. پس از پردازش هر Batch، حافظه با استفاده از Garbage Collector و torch.cuda.empty_cache() آزاد می‌شود تا امکان پردازش Batch بعدی بدون مشکل فراهم باشد. این کار مصرف منابع را بهینه می‌کند و از بروز خطاهای Out Of Memory جلوگیری می‌کند.

استفاده از Tracker حرفه‌ای مانند ByteTrack باعث می‌شود اشیاء در فریم‌های متوالی با دقت دنبال شوند و Tracking پایدار انجام شود. در این پروژه، مدل فقط کلاس‌های مشخصی (مثلاً ماشین، اتوبوس و کامیون) را پردازش می‌کند تا پردازش دقیق و سریع باشد. این رویکرد باعث کاهش پردازش غیرضروری و افزایش سرعت اجرای برنامه می‌شود.

خروجی Annotate شده ویدیویی از دیگر نکات مهم است. فریم‌ها بعد از پردازش همراه با Bounding Box و اطلاعات Tracking روی ویدیو ذخیره می‌شوند و امکان مشاهده نتایج و تحلیل دقیق آنها فراهم می‌شود. این قابلیت برای ارائه پروژه به دیگران یا بررسی نتایج کاربردی بسیار مهم است.

از لحاظ فنی، استفاده از کتابخانه‌های کلیدی مانند ultralytics برای YOLOv8، OpenCV برای خواندن و نوشتن ویدیو، torch برای مدیریت پردازش GPU/CPU و gc برای آزادسازی حافظه باعث می‌شود کد مقیاس‌پذیر، پایدار و قابل اعتماد باشد. هر یک از این کتابخانه‌ها نقش حیاتی در اجرای موفق پروژه دارند و ترکیب آنها، یک فریم‌ورک کوچک اما کامل برای پردازش ویدیوهای طولانی ایجاد می‌کند.

همچنین، کد شامل مدیریت خطا و تغییر پویا Batch Size است. اگر پردازش Batch خاصی با مشکل مواجه شود، برنامه به‌طور خودکار اندازه Batch را کاهش می‌دهد و پردازش ادامه پیدا می‌کند. این رفتار باعث می‌شود پروژه در شرایط مختلف سخت‌افزاری و نرم‌افزاری بدون توقف اجرا شود و تجربه کاربری حرفه‌ای‌تری ایجاد کند.

نتیجه‌گیری

اجرای پروژه پردازش ویدیو با YOLOv8 و Batch Processing، نمونه‌ای عملی و حرفه‌ای از کار با بینایی ماشین است. این پروژه نشان می‌دهد که با برنامه‌ریزی درست، مدیریت منابع و استفاده هوشمند از قابلیت‌های GPU و CPU می‌توان ویدیوهای طولانی را به شکل پایدار و دقیق پردازش کرد. تقسیم فریم‌ها به Batchهای کوچک، مدیریت حافظه، آزادسازی منابع و استفاده از Trackerهای حرفه‌ای باعث می‌شود پروژه هم مقیاس‌پذیر باشد و هم برای ویدیوهای واقعی با چند هزار فریم قابل استفاده باشد.

علاوه بر این، خروجی Annotate شده و ذخیره دائمی نتایج، امکان بررسی و تحلیل دقیق اطلاعات را فراهم می‌کند و پایه‌ای مناسب برای پروژه‌های پیشرفته‌تر در حوزه هوش مصنوعی و بینایی ماشین ایجاد می‌کند. این روش به خصوص برای کسانی که می‌خواهند پروژه‌های واقعی با YOLOv8 اجرا کنند یا روی داده‌های طولانی کار کنند، ارزشمند و کاربردی است.

به طور کلی، این پروژه نه تنها تمرینی عالی برای یادگیری پردازش ویدیو و Object Tracking است، بلکه یک الگوی حرفه‌ای برای اجرای پروژه‌های واقعی به شمار می‌رود. با اجرای آن، شما با تکنیک‌های مدیریت حافظه، پردازش مرحله‌ای، و تعامل هوشمند با GPU و CPU آشنا می‌شوید و می‌توانید آنها را در پروژه‌های بزرگ‌تر و پیچیده‌تر خود به کار ببرید.

این کد نمونه‌ای از یک رویکرد عملی و کاربردی برای پردازش ویدیو است که به توسعه‌دهندگان اجازه می‌دهد همزمان با یادگیری، یک پروژه قابل استفاده و واقعی بسازند و تجربه عملی ارزشمندی در حوزه بینایی ماشین کسب کنند.