Endüstriyel güvenliği alanı, gerçek zamanlı bilgisayar görüsü tarafından yönlendirilen köklü bir dönüşüm geçiriyor. Geleneksel gözetim, olay sonrası analize dayanırken, modern güvenlik protokolleri acil müdahaleyi gerektiriyor. Bir işçi kişisel koruyucu donanım (KKD) takmadığında veya kısıtlı bir bölgeye girdiğinde, milisaniyeler hayati önem taşır. Ancak, YOLOv8 gibi karmaşık derin öğrenme modellerinin NVIDIA Jetson Orin veya Raspberry Pi panoları gibi kaynak kısıtlı kenar cihazlarına dağıtılması, gecikme ve bellek izi açısından önemli zorluklar sunmaktadır.
Bu makale, YOLOv8'den maksimum performansı elde etmek için gerekli teknik stratejileri incelemekte ve yaşam-kritik uygulamalar için gereken hassasiyeti feda etmeden kenarda verimli çalışmasını sağlamaktadır.
Kenar Kısıtlamaları İçin Model Mimarisi ve Budama
Standart YOLOv8 modelleri, özellikle 'L' veya 'X' varyantları, büyük paralel işleme yeteneklerine sahip veri merkezi GPU'ları için tasarlanmıştır. Bunları doğrudan bir kenar cihaza dağıtmak genellikle 10 FPS'nin altında kare hızlarına yol açar ki bu da güvenlik izlemesi için kabul edilemezdir. İlk optimizasyon adımı, uygun model varyantını seçmeyi içerir. Kenar dağıtımı için 'Nano' veya 'Small' yapılandırmalarını kullanmamız gerekir.
Mimari seçimlerinin ötesinde, model budama karmaşıklığı daha da azaltabilir. Nihai çıktıya en az katkıda bulunan gereksiz konvolüsyonel filtreleri belirleyip kaldırarak, Ortalama Doğruluk (mAP) üzerinde ihmal edilebilir bir etkiyle model boyutunu %40'a kadar azaltabiliriz. Bu, kenar cihazının bellek bant genişliği gereksinimlerini azaltmak için kritiktir.
# Örnek: PyTorch'ta kenar dağıtımı için Nano modelinin seçimi
from ultralytics import YOLO
# Hız için optimize edilmiş önceden eğitilmiş YOLOv8n (Nano) modelini yükleyin
model = YOLO('yolov8n.pt')
# Modeli daha fazla optimizasyon için ONNX formatına aktarın
model.export(format='onnx', opset=12, simplify=True)
print("Model başarıyla aktarıldı. Budama ve ONNX dönüştürme yoluyla boyut azaltması sağlandı.")
Nicemleme: FP32'den INT8'e
Daha küçük bir mimariye sahip olmasına rağmen, kenar donanımda kayan nokta aritmetiği (FP32) hesaplamalı olarak pahalıdır. Çıkarımı hızlandırmak için en etkili teknik nicemlemedir. Model ağırlıklarını ve aktivasyonlarını 32-bit kayan noktadan 8-bit tamsayılara (INT8) dönüştürerek bellek kullanımını önemli ölçüde azaltabilir ve verimliliği artırabiliriz. Modern kenar GPU'ları, genellikle çıkarım hızlarını iki veya üç katına çıkaran yerel olarak desteklenen INT8 talimatlarını destekler.
Nicemleme, temsilci bir kalibrasyon veri seti kullanılarak eğitim sonrası (PTQ) olarak gerçekleştirilebilir. PTQ daha hızlı olmasına rağmen, doğruluğu korumak için üretim ortamına benzer bir veri seti gerektirir. Güvenlik uygulamalarında, yanlış negatiflerin tehlikeli olduğu durumlarda, endüstriyel ortamlarda yaygın olan düşük ışık koşullarını ve örtülü nesneleri özellikle kapsayan görüntülerle kalibre etmek tavsiye edilir.
# Örnek: PyTorch Nicemleme kullanarak YOLOv8'i INT8'e dönüştürme
import torch
import torch.quantization as quant
# Modeli eval moduna dönüştürün ve hedef arka planı ayarlayın
model.train(False)
model.fuse()
# Nicemleme için hazırlanın
model.qconfig = torch.quantization.get_default_qconfig('fbgemm')
model = torch.quantization.prepare(model)
# Kalibrasyonu çalıştırın (gerçek kalibrasyon verisi için yer tutucu)
# Pratikte, temsilci kalibrasyon veri setiniz üzerinde bir döngü çalıştırın
for images, _ in calibration_loader:
model(images)
# Nicemlenmiş modele dönüştürün
model_quantized = torch.quantization.convert(model)
print("Model başarıyla INT8 formatına nicemlendi.")
TensorRT ile Çalışma Zamanı Optimizasyonu
Optimizasyon hattındaki son adım, NVIDIA TensorRT kullanılarak motor oluşturmaktır. TensorRT, hesap grafiğini analiz eder ve işlemleri birleştirir (örneğin, Konvolüsyon + BatchNorm + ReLU'u tek bir çekirdekte birleştirir) ve bunları altta yatan GPU mimarisine özel olarak uyarlar. Bu, birçok küçük işlem çalıştıran kenar cihazlarında önemli bir darboğaz olan çekirdek başlatma aşırı yükünü azaltır.
TensorRT'ye aktarırken, optimizasyon profilini tanımlamanız gerekir. Bu, girdi tensörü için minimum, optimal ve maksimum şekilleri ayırmayı içerir. Güvenlik uygulamaları genellikle sabit bir girdi boyutu gerektirse de, dinamik bir profil tanımlamak, kamera çözünürlüğü değişirse TensorRT'nin bellek kullanımını daha iyi optimize etmesine olanak tanır.
# Örnek: ONNX modelinden bir TensorRT Motoru oluşturma
from tensorrt import (
Logger, Builder, NetworkDefinitionCreationFlag,
IBuilderConfig, ICudaEngine, IHostMemory
)
from onnx_graphsurgeon import Graph, Constant, Tensor
# Daha önce oluşturulan ONNX modelini yükleyin
onnx_path = 'yolov8n.onnx'
# TensorRT oluşturucusunu ve ağını başlatın
logger = Logger()
builder = Builder(logger)
network = builder.create_network(NetworkDefinitionCreationFlag(1 << int('LOCAL_STATIC_WORKSPACE_BIT')))
parser = builder.create_onnx_parser(onnx_path, logger)
# Modeli parse edin ve motoru oluşturun
if not parser.parse(onnx_path):
print("ONNX modeli parse edilemedi")
config = builder.create_builder_config()
config.set_max_workspace_size(1 << 30) # 1GB çalışma alanı
engine = builder.build_serialized_network(network, config)
# Serileştirilmiş motoru kaydedin
with open('yolov8n.engine', 'wb') as f:
f.write(engine)
Sonuç
Endüstriyel güvenlik için kenar cihazlarda gerçek zamanlı nesne algılama uygulamak, karmaşık ancak ulaşılabilir bir mühendislik zorluğudur. YOLOv8n mimarisini stratejik olarak seçerek, INT8 nicemlemesi uygulayarak ve çekirdek birleştirme için TensorRT'den yararlanarak, geliştiriciler 30 ms'nin altında gecikme elde edebilirler. Bu, güvenlik uyarılarının fiziksel tehlikenin evrimleşmesinden daha hızlı üretilmesini sağlar ve sağlam, duyarlı bir izleme sistemi oluşturur. Kenar donanımı gelişmeye devam ettikçe, bu optimizasyon teknikleri, kritik endüstriyel ortamlarda güvenilir yapay zeka dağıtmak için temel olmaya devam edecektir.