GPU Yerine CPU Kullanılarak Konfigürasyon Aşamaları

Meyra Aslıhan
Kodcular
Published in
5 min readNov 6, 2020

Darknet framework konfigürasyon aşamaları yazımın devamı niteliğinde Framework kurulumu aşamasında github üzerindeki darknet deposunu git komutu ile klonlanlayalım. Git komutu ile klonlandıktan sonra darknet klasörü içerisine girelim.

Github üzerinden Darknet Framework’ünün indirilmesi

Derleme işlemi başlatılmadan önce darknet klasörü içerisindeki Makefile dosyasını inceleyelim.

Eğer framework üzerinde GPU ile işlem yapılacak ise Makefile dosyasındaki GPU değerini GPU=1 olarak değiştirebiliriz.

Eğer framework kullanımı sırasında resimlerin işlenmesi ve daha fazla resim formatı kullanılmak istiyorsak Makefile dosyasındaki OPENCV değeri;

OPENCV =1 olarak değiştirebiliriz.

Kullandığınız bilgisayar CUDA destekli bir NVIDIA ekran kartına sahip ise framework kullanımı sırasında GPU gücünden yararlanmak isteyebilirsiniz. Bunun için ise Makefile dosyasındaki CUDNN değeri CUDNN =1 olarak değiştirebilirsiniz.

MakeFile dosyasındaki bu değişiklikleri yaptıktan sonra make komutu ile derleme işlemini başlatalım. Bu işlemden sonra aynı dizinde oluşturulacak olan Darknet derlenmiş dosyası ile işlemleri yapmış olacağız.

Derleme işlemini tamamladıktan sonra derlenmiş Darknet dosyası ile Github reposundan indirilen klasörde yer alan önceden eğitilmiş model dosyası ve test görselleri kullanarak derlenen dosyanın ilk testi gerçekleştirdim. Bu işlem için aşağıdaki komutu kullandım.

Darknet resim üzerinden tespit komutu

Yukarıda gördüğünüz üzere test işlemi başarılı bir şekilde gerçekleşti. Sonuç olarak ise terminal ekranında görsel üzerinde tespit ettiğimiz nesnelerin isimleri ve benzerlik oranları yer aldı.

Darknet resim üzerinden tespit işlemi

Yukarıda yer aldığı üzere giraffe benzerlik oranı: %53, test işleminden sonra test edilen resim üzerinde tespit edilen nesneler sınırlayıcı kutucular içerisinde gösteriliyor. Projemizin daha verimli çalışabilmesi için gerçek dünyadan alınan görüntüler anlık video kayıtları olmalı. Önceden derlenen darknet dosyası kullanılarak webcam ile sorunsuz çalışıp çalışmadığı test etmek istedim ve bunun için aşağıda yer alan komutlar kullandım.

Darknet webcam üzerinden tespit komutu

Sonuç olarak webcam tarafından alınan anlık görüntü üzerinden real-time nesne tespiti işlemi gerçekleştirdim.

GPU yerine CPU ile işlemleri gerçekleştirme

Demo çalışmalarından başarılı sonuçlar aldıktan sonra oluşturulacak olan çalışmanın düşük seviyedeki donanımlarda da çalışmasını istedik. Bunun için ise yapılan işlemler sırasında bilgisayarın ekran kartı gücü olan GPU yerine CPU kullanılmamız gerekiyordu. Bu işlemler için ise başta anlattığım Makefile dosyasında CPU=1, GPU=0 ve CUDNN=0 değerlerinde değişiklikler yaptım akabinde make komutu kullanılarak tekrar derledim.

CPU ile çalışmalarda resim üzerinden yaptığım testlerde büyük fark olmasa da webcam üzerinden anlık olarak gelen video yayınında ve daha önceden kaydedilmiş video dosyalarından yaptığım nesne tespit işlemlerinde yaklaşık 3 FPS gibi çok düşük FPS değeri aldım bununla birlikte işlemleri tamamlama sürem çok büyük ölçüde uzadı. Bu uzayan işlem süresini kısaltmak için yeni yollar aradım. Bu işler için darknet ile uyumlu olan yolov3 modeli kullanmıştım bu eğitilmiş model kendi içerisinde çok fazla sinir ağına ve eğitilmiş veriye sahip olması sebebiyle yavaş çalışıyordu.

Çözüm olarak daha hızlı çalışan fakat daha az veriseti ile eğitilmiş model dosyalarından olan tiny-yolo ağırlık dosyasını kullandım. Aldığım FPS değerlerinde büyük bir değişiklik olmadı, yaklaşık olarak 4 FPS gibi değerler ortaya çıktı. Bir diğer çözüm yolum ise nesne tespiti sırasında kullandığım CFG dosyasındaki “subdivisions” değerini arttırmak oldu. Subdivisions değeri; yapılan işlemler sırasında yolo algoritmanın çalışma mantığı olan resmin parçalara bölünmesinde kullanılan kaç parçaya bölüneceğini ifade ediyor.

Testler sırasında yüksek kaliteli ve boyutu büyük olan resimlerin kullandığım için zaman zaman “Out of memory” hatası ortaya çıktı. Yine aynı şekilde CFG dosyasında yer alan” subdivisions” değeri yerine daha büyük bir değer yazdım ve işlemi tekrar başlattım. Sonuç olarak alınan FPS değerleri yine yeterli değildi. Bunun için bilgisayarda yer alan tüm çekirdek ve işlemci gücünün kullanmam gerekiyordu.

FPS değerini yükseltmek için tekrardan araştırma sürecine girdim. Araştırmalarım sonucunda bu alanda uzman hocalarım Thread ve Multi-Proccesing kullanarak FPS değerini yükseltebileceğime dair tavsiye aldım.

Thread ve Multi-Processing Çalışmaları

Projem de CPU ile çalışırken alınan FPS değerini yükseltmek için öncelikle Thread kullandım. Fakat aldığım sonuçlarda herhangi bir değişiklik olmadı bunun sebebi, proje için yazılan kodlarda gerçekleşen işlemler parçalara ayırılacak işlemler değildi. Yani bütün bir işin yarısını Thread1 yaparken kalan yarısını da Thread2’nin yapması mümkün değildi. Bu sebeple gerekli kodları yazıp çalıştırdıktan sonra Thread kullanımından vazgeçtim.

Yeni bir araştırma sürecinden sonra Multi-Processing kullanmaya karar verildi. Tüm projeyi multi-processing ile çalışır bir hale getirdim. Test sonuçlarında bir fark oluşmadı bunun sebebi ise YOLOv3 modeli ve Darknet derlenmiş dosyası arkada planda multi-processing kullanabilir şekilde geliştirilmişti. Bu geliştirilmeler temel bir şekilde C programlama diliyle yazılmıştı.

Projemizi Python ile geliştirdim fakat yeni model eğitimi yani Train işlemleri sırasında zaman zaman derlenen dosyada C kodlarına müdahale yapılıp tekrar derledim. İlerleyen zamanlarda da train işlemleri bu derlenen dosya üzerinden yapılacaktır.

Bouding box ile yapılan işlemler

Projemde tek bir resim karesi üzerinden yapılan nesne tespit işlemi sonucunda tespit edilen nesneler sınırlandırılmış kutucuk (bouding box) içerisine alınıp geriye nesnelerin tespit edilmiş hali dönüyor. Bu tespit edilen alanları tespit edilen sınıf ismine göre kategorilize edip ayrı bir klasörde kaydedilmesi gerekmekteydi. Tespit edilen nesnelerin bouing box içerisine alınmasının aşamasında yazdığım kodlar üzerinden inceleyebilirsiniz.

BoundingBox ve kırpma kodları

Projemin ilk aşamasında tek bir resim karesi üzerinden yapılan nesneleri tespit edip, bounding box içerisine aldım. Bounding box içerisindeki görselleri kırpıp aynı bir klasörde kaydeder hale geldi. İkinci aşamasında ise real time da webcam üzerinden tespit edilen nesneler sınırlandırılmış kutucuk içerisine alıp geriye nesnelerin tespit edilmiş halini döndü.

Webcam ile Nesne Tespiti

Projede webcam ile görüntü alma kodları

Projemde darknet framework’ü ve Yolo modelleri kullanarak yaptığım nesne tespit işlemleri resimden nesne tespiti, web kameradan nesne tespiti ve video dosyasından nesne tespiti şeklinde ayrılır hale geldi. Projemde darknet.py ve darknet_video.py şeklinde iki adet dosya yer alıyor ve yapılan işler bu şekilde birbirinden ayrılıyor.

Projede nesne tespit ve bounding box oluşturma kodları

Video Dosyasından Nesne Tespiti

Son olarak ise önceden kaydedilmiş video dosyası üzerinden tespit edilen nesneleri sınırlandırılmış kutucuk içerisine alıp geriye nesnelerin tespit edilmiş hali dönüyor. Bunun için de aşağıda yer alan değişiklikler yapılır.

Video dosyasının nesne tespit için kodları

--

--