← Projelere dön

Gerçek Zamanlı Hedef Tespit ve Takip

Rol
Yazılım mühendisi
Kurum
Digitest Savunma ve Havacılık
Dönem
2021-2024
Ekip
6-10 kişilik yazılım ekibi
C++Termal görüntülemeCUDA COpenMP

Gizlilik notu

Bu çalışma gizlilik yükümlülüğüne tabidir. Müşteri ve ürün adları, performans parametreleri, ekran görüntüleri ve test verileri bilinçli olarak yer almamaktadır; anlatım yalnızca çözülen mühendislik problemi ve kullanılan teknoloji düzeyindedir. Teknik detaylar, gizliliğin izin verdiği ölçüde yüz yüze aktarılabilir.

Problem

Savunma sanayii müşterisi için gerçek zamanlı görüntü işleme tabanlı hedef tespit ve takip yazılımı geliştirdim. Tespit tarafı C++, takip tarafı Python ile yazıldı. Gerçek zamanlı görüntü üzerine veriye dayalı sembol çizdirme (overlay) ve operatör arayüzünü Qt Creator/C++ ile geliştirdim.

Gerçek zamanlı işleme gereksinimini karşılamak için C++ multithreading, CUDA C ve OpenMP ile paralel işleme hatları kurdum. Tüm hat NVIDIA Jetson gömülü platformlar üzerinde çalışacak şekilde entegre edildi; veri alışverişi TCP, UDP ve UART protokolleri üzerinden yürütüldü.

C++PythonCUDA COpenMP Qt CreatorNVIDIA JetsonTCP/UDP/UARTMultithreading

Görünür ve termal kanallar

Sistem hem görünür hem termal/kızılötesi kamera akışında çalışıyor: aynı tespit ve takip hattı, drone dahil hava hedeflerine iki spektrumda da kilitleniyor; gerçek zamanlı sınırlayıcı kutu, nişangâh ve veriye dayalı sembol katmanı canlı görüntünün üzerine çiziliyor.

Bu karelerin gösterdiğinin ötesindeki her şey gizli: son müşteri adı yok, performans parametresi yok, test verisi yok. Fazlası yüz yüze konuşulabilir, gizliliğin izin verdiği ölçüde.

Görünür (sol) ve termal/kızılötesi (sağ) kamera akışı: gerçek zamanlı sınırlayıcı kutu, nişangâh ve sembol katmanı. Portfolyomda yayımlandığı haliyle.

Sahaya inmiş, operasyonel yazılım: bir dedektörün laboratuvar dışında, gerçek donanımda, gerçek görüntü akışında yıllarca ayakta kalması için ne gerektiğini bu projede öğrendim.

// Uretici-tuketici iskeleti: yakalama asla cikarimi beklemez.
// Kuyruk dolarsa EN ESKI kare atilir; gercek zamanda gecikme,
// kare kaybindan daha pahalidir.
template <typename T>
class SinirliKuyruk {
  std::deque<T> q_; std::mutex m_; std::condition_variable cv_;
  size_t kapasite_;
public:
  void koy(T kare) {
    { std::lock_guard<std::mutex> k(m_);
      if (q_.size() >= kapasite_) q_.pop_front();   // eskiyi at
      q_.push_back(std::move(kare)); }
    cv_.notify_one();
  }
  T al() {
    std::unique_lock<std::mutex> k(m_);
    cv_.wait(k, [&]{ return !q_.empty(); });
    T kare = std::move(q_.front()); q_.pop_front();
    return kare;
  }
};
Sadeleştirilmiş temsili kod: gerçek zamanlı hattın arkasındaki sınırlı kuyruk fikri. Proje kodu değildir.