AI

بهینه‌سازی YOLOv8 برای ایمنی صنعتی مبتنی بر لبه

منظره ایمنی صنعتی در حال دگرگونی رادیکال است که توسط بینایی ماشین در زمان واقعی هدایت می‌شود. نظارت سنتی بر تحلیل پس از رویداد تکیه دارد، اما پروتکل‌های ایمنی مدرن مداخله فوری را طلب می‌کنند. وقتی کارگری از پوشیدن تجهیزات حفاظت فردی (PPE) خودداری می‌کند یا وارد منطقه ممنوعه می‌شود، میلی‌ثانیه‌ها اهمیت حیاتی دارند. با این حال، استقرار مدل‌های پیچیده یادگیری عمیق مانند YOLOv8 بر روی دستگاه‌های لبه با منابع محدود—مانند NVIDIA Jetson Orins یا بردهای Raspberry Pi—چالش‌های قابل توجهی را از نظر تأخیر و ردپای حافظه به همراه دارد.

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

معماری مدل و پیرایش برای محدودیت‌های لبه

مدل‌های استاندارد YOLOv8، به ویژه نسخه‌های 'L' یا 'X'، برای پردازنده‌های گرافیکی (GPU) مراکز داده با قابلیت‌های پردازش موازی عظیم طراحی شده‌اند. استقرار مستقیم این مدل‌ها بر روی یک دستگاه لبه اغلب منجر به نرخ فریم کمتر از ۱۰ FPS می‌شود که برای پایش ایمنی غیرقابل قبول است. اولین گام بهینه‌سازی، انتخاب نسخه مناسب مدل است. برای استقرار لبه، باید از پیکربندی‌های 'Nano' یا 'Small' استفاده کنیم.

فراتر از انتخاب معماری، پیرایش مدل می‌تواند پیچیدگی را بیشتر کاهش دهد. با شناسایی و حذف فیلترهای کانولوشنی اضافی که سهم کمی در خروجی نهایی دارند، می‌توانیم اندازه مدل را تا ۴۰٪ با تأثیر ناچیز بر دقت میانگین (mAP) کاهش دهیم. این امر برای کاهش نیازهای پهنای باند حافظه دستگاه لبه حیاتی است.

# مثال: انتخاب مدل Nano برای استقرار لبه در PyTorch
from ultralytics import YOLO

# بارگذاری مدل YOLOv8n از پیش آموزش دیده (نسخه Nano بهینه‌شده برای سرعت)
model = YOLO('yolov8n.pt')

# صادرات مدل به فرمت ONNX برای بهینه‌سازی بیشتر
model.export(format='onnx', opset=12, simplify=True)

print("مدل با موفقیت صادر شد. کاهش اندازه از طریق پیرایش و تبدیل ONNX حاصل شد.")

کوانتیزه کردن: از FP32 به INT8

حتی با یک معماری کوچکتر، محاسبات اعشاری شناور (FP32) بر روی سخت‌افزار لبه پرهزینه است. موثرترین تکنیک برای شتاب‌دهی استنتاج، کوانتیزه کردن است. با تبدیل وزن‌ها و فعال‌سازی‌های مدل از اعشار شناور ۳۲-بیتی به اعداد صحیح ۸-بیتی (INT8)، می‌توانیم استفاده از حافظه را به شدت کاهش داده و بهره‌وری را افزایش دهیم. GPUهای لبه مدرن به طور بومی از دستورات INT8 پشتیبانی می‌کنند که اغلب سرعت استنتاج را دو یا سه برابر می‌کند.

کوانتیزه کردن می‌تواند پس از آموزش (PTQ) با استفاده از یک مجموعه داده کالیبراسیون نماینده انجام شود. در حالی که PTQ سریع‌تر است، نیاز به یک مجموعه داده مشابه محیط تولید دارد تا دقت حفظ شود. برای کاربردهای ایمنی، که در آن خطاهای منفی (False Negatives) خطرناک هستند، توصیه می‌شود با استفاده از تصاویری که به طور خاص شرایط کم‌نور و اشیاء محجوب رایج در محیط‌های صنعتی را پوشش می‌دهند، کالیبراسیون انجام شود.

# مثال: تبدیل YOLOv8 به INT8 با استفاده از کوانتیزه کردن PyTorch
import torch
import torch.quantization as quant

# تبدیل مدل به حالت ارزیابی و تنظیم بک‌اند هدف
model.train(False)
model.fuse()

# آماده‌سازی برای کوانتیزه کردن
model.qconfig = torch.quantization.get_default_qconfig('fbgemm')
model = torch.quantization.prepare(model)

# اجرای کالیبراسیون (جاگذاری برای داده‌های واقعی کالیبراسیون)
# در عمل، یک حلقه روی مجموعه داده کالیبراسیون نماینده خود اجرا کنید
for images, _ in calibration_loader:
    model(images)

# تبدیل به مدل کوانتیزه شده
model_quantized = torch.quantization.convert(model)

print("مدل با موفقیت به فرمت INT8 کوانتیزه شد.")

بهینه‌سازی زمان اجرا با TensorRT

گام نهایی در خط لوله بهینه‌سازی، ساخت موتور با استفاده از NVIDIA TensorRT است. TensorRT نمودار محاسباتی را تحلیل کرده و عملیات را ترکیب می‌کند (مثلاً ترکیب Convolution + BatchNorm + ReLU در یک کرنل واحد) که به طور خاص برای معماری GPU زیرین سفارشی شده است. این امر بار راه‌اندازی کرنل را کاهش می‌دهد که یک گلوگاه قابل توجه در دستگاه‌های لبه است که عملیات‌های کوچک زیادی را اجرا می‌کنند.

هنگام صادرات به TensorRT، باید پروفایل بهینه‌سازی را تعریف کنید. این شامل تنظیم حداقل، بهینه و حداکثر شکل‌ها برای تانسور ورودی است. در حالی که کاربردهای ایمنی اغلب به اندازه ورودی ثابت نیاز دارند، تعریف یک پروفایل پویا به TensorRT اجازه می‌دهد تا اگر وضوح دوربین تغییر می‌کند، استفاده از حافظه را بهتر بهینه کند.

# مثال: ساخت موتور TensorRT از مدل ONNX
from tensorrt import (
    Logger, Builder, NetworkDefinitionCreationFlag,
    IBuilderConfig, ICudaEngine, IHostMemory
)
from onnx_graphsurgeon import Graph, Constant, Tensor

# بارگذاری مدل ONNX تولید شده قبلی
onnx_path = 'yolov8n.onnx'

# راه‌اندازی سازنده و شبکه TensorRT
logger = Logger()
builder = Builder(logger)
network = builder.create_network(NetworkDefinitionCreationFlag(1 << int('LOCAL_STATIC_WORKSPACE_BIT')))
parser = builder.create_onnx_parser(onnx_path, logger)

# تجزیه مدل و ساخت موتور
if not parser.parse(onnx_path):
    print("تجزیه مدل ONNX ناموفق بود")

config = builder.create_builder_config()
config.set_max_workspace_size(1 << 30) # فضای کاری ۱ گیگابایت
engine = builder.build_serialized_network(network, config)

# ذخیره موتور سریال‌شده
with open('yolov8n.engine', 'wb') as f:
    f.write(engine)

نتیجه‌گیری

پیاده‌سازی تشخیص اشیاء در زمان واقعی بر روی دستگاه‌های لبه برای ایمنی صنعتی یک چالش مهندسی پیچیده اما قابل دستیابی است. با انتخاب استراتژیک معماری YOLOv8n، اعمال کوانتیزه کردن INT8 و بهره‌گیری از TensorRT برای ترکیب کرنل، توسعه‌دهندگان می‌توانند به تأخیر کمتر از ۳۰ میلی‌ثانیه دست یابند. این اطمینان حاصل می‌کند که هشدارهای ایمنی سریع‌تر از آنکه خطر فیزیکی بتواند تکامل یابد، تولید می‌شوند و یک سیستم پایش قوی و واکنش‌گرا ایجاد می‌کنند. همان‌طور که سخت‌افزار لبه به تکامل خود ادامه می‌دهد، این تکنیک‌های بهینه‌سازی برای استقرار هوش مصنوعی قابل اعتماد در محیط‌های صنعتی حیاتی باقی خواهند ماند.

Share: