Yolo Algoritması Ve Kodların Açıklanması

Kaan Koska
5 min readMay 8, 2021

Yukarıdaki kodlarda ilk olarak okuma yapmamız için gerekli olan kütüphaneleri import ediyoruz. cv2 ve numpy daha sonra okumak istediğimiz resmin adresini alıyoruz. Resmi doğru alıp almadığımızı anlamak için print ile kontrol ediyoruz. Burada bize verilen matris 000 değil ise doğru okuma yapılmış demektir. Daha sonra ileride kullanmamız gerektiği için resmimizin genişliğini ve yüksekliğini alıyoruz. Bu bilgileri, algoritmamızı şekillendirirken ve filtre uygularken kullanacağız. Sonra ise resmimizi blob formatına çeviriyoruz. YOLO algoritmamızın okuma yapabilmesi için resmin blob formatında olması gerekiyor. Bir nevi resmin derinliğini arttırmak gibi. Bu fonksiyonun içinde bir kaç değer var. Bunlardan ilki 1/255 resmin incelenme ölçeği. Bu değeri YOLO yazarları ideal değer olarak bulmuşlar. O yüzden 1/255 ancak değiştirilebilir bir değer. İkincisi ise resmimizin incelenme boyutu. Bu tamamen sizin modelinize göre değişen bir değer. Eğitimde kullandığınız fotoların boyutlarına göre alacağınız verim değişebilir. Benim algoritmamda farklı fotoğraflar ile yaptığım denemeler sonucu 416x416 en ideal boyut oldu. Ama eğer eğitiminizde 512x512 fotoğraflar kullandıysanız bu değer sizin algoritmanız için daha iyi olabilir.

Daha sonraki swaprb ise resmimizin rb türüne dönüştürüyor. Sonra da “crop = false” ile resmimizi kırpmadan incelemek istediğimizi belirtiyoruz. Labels kısmı ise daha önce de belirttiğim gibi modelimizin tanımlayabileceği nesnelerin adlarının bulunduğu dizi. Color kısmı ise önceden oluşturduğum renk uzaylarını split fonksiyonu ile virgüllerden bölerek ve int dönüşümünü yaparak her nesne için farklı boundingbox renk atması yapmamı sağlıyor. Daha sonra bu diziyi tile fonksiyonu ile birbirine bağlayarak dizini büyütüp renk çeşitliliğini arttırıyorum.

Burada ise model değişkenime kendi hazırladığım ya da hazır aldığım weights ve cfg dosyalarımın yolunu belirtiyorum. İlk olarak cfg, sonra weights daha sonra layers değişkenime model dosyamdaki layersları, yani okuma dosyalarımı atıyorum. Ancak burada önemli olan şey benim okuma yapmak için yalnızca outputlayerlarıma ihtiyacımın olduğu. Bu layerlar dizi içinde olduğu için ve diziler sıfırdan başladığı için layers’a, layers-1'e atılarak bütün outputlayerlarımı alıyorum. Sonrasında önceden blob haline dönüştürdüğüm fotoğrafımı modelime input olarak veriyorum. Diziden bulduğum ve output_layers değişkenine atadığım outputlayerlarımıdetection_layer tanımlama layerlarına atıyorum. Bu değer bir dizi halinde çıktı verdiği için forward fonksiyonunu kullanıyorum. Daha sonra bu algoritmamda nonmaximumsuppression kullanacağım için en yüksek güvenilirlik değeri veren sonuçlarımı atacağım boş dizilerimi oluşturuyorum.

Daha öncede dediğim gibi detection_layer değişkeni değerli atadığım modelden bir dizi olarak alır. Bu yüzden yukarıda bu değişkeni for döngüsüne alarak tüm output değişkenlerime ulaşıyorum. Bu değişkende 5 değer dönüyor. Bir dizi olarak bunlardan ilk 4’ü bulunan nesnenin yüksekliği, genişliği, ve (x,y) koordinatlarıdır. 5. değer ise o nesnenin güvenilirlik değeridir. O yüzden scores dizisine object_detection[5:] yani güvenilirlik değerleri; örneğin predicted_id ye ise scores dizisinin en büyük değerini, en yüksek güvenilirliğe sahip olan değeri atıp tanımlanması gereken nesneyi seçiyorum ve bu değeri confidance değişkenine atıyorum. Daha sonra eğer bulunan confidance değeri 20’den büyükse label dizisinden bulunan ID’nin adını alıyorum ve boundingbox dizisine ilk dört değer olan koordinat, yükseklik ve genişlik değerlerimi atıyorum. Bu değerleri int çevirip gerekli koordinat değişkenlerini oluşturuyorum. Bunu daha önce de anlatmıştım. Merkez noktası (box_center_x — (box_width/2)) için bu formülü, ve y noktası için ise int(box_center_y — (box_height/2)) bu formülü kullanıyorum. Bu şekilde

boundingboxlarımı çizmek için gerekli olan değişkenlerimi oluşturmuş oluyorum. Daha sonra ise nonmaximumsuppressıon dizilerime gerekli atamaları yapıyorum. Daha sonra bu dizilerden en yüksek değerlere sahip olanları alıp kullanacağım. Böylelikle aynı nesneyi 2 kere bulup farklı güvenilirlik oranları ile paylaşmamış olacağım.

dnn.NMSBoxes fonksiyonu ise non maximum suppressions için kullanılan bir fonksiyondur. Sahip olduğum ID’ler arasından en büyük olanları güvenilirlik bakımından sıralayarak büyük olan değer label ve koordinat ataması maksimum ID değişkenine atıyorum. Daha sonra bu değişkenler for döngüsü içinde döndürülerek geziliyor. Böylece hem yüksek değeri buluyorum hem de birden çok nesne tanımasını aynı anda yapmış oluyorum. Daha sonra dizi halinde alınan değişkenleri, gerekli değişkenlere atıyorum. Örneğin yeni oluşturulan box değişkenine boxes_ıd değişkenindeki maxID’ye sahip olan bilgileri atıyorum. Koordinat, yükseklik, genişlik gibi aynısını diğer değişkenler için de yapıyorum-confidance ve label gibi-. Daha sonra boundingboxlarını çizmek için değişkenlere atamalar yapıyorum. Boundingbox çizimi için gerekli olan koordinatlara nasıl ulaşıldığını daha önce anlatmıştım. Sonra ise labelları yazmak için ufak bir formatlama yapıyorum. Confidance değerini yan yana verebilmek ve aynı zamanda sonuçları konsolda görebilmek için print ile yazdırıyorum. Daha sonra sahip olunan tüm değişkenleri kullanarak rectangel çiziyorum ve kutunun kalınlığını belirtiyorum. Son olarak kutunun üstüne formatlı bir şekilde text koyuyorum. Bu text’delabel ad ve güvenilirlik oranı yazıyor. En sonda ise resmi ekranda gösteriyorum. Bu algoritma resimlerde nesne tespiti içindi. Videolarda nesne tespiti ile neredeyse aynı. Videolarda nesne tespiti yaparken algoritmamın her frame’de bir okuma yapması gerekiyor. Bu yüzden while döngüsünü kullanıyorum

Yukarıdaki videolarda nesne tanımak için kullandığımız algoritmayı ekleyerek resim okuma ile video okuma algoritmaları arasındaki farkı göstermeye çalıştım.

Silah Tespit Ve Tehlike Puanı Ataması İlk örneğim kendi oluşturduğum silah tanıma modelim olacak. Bu modeli hazırlama aşamalarımı ve algoritmadaki kodların açıklamasını geçen konularda detaylıca anlattım. Burada projenin kodlarını ve çıktılarını paylaşacağım. Çıktılar :

Örnek Yolo Hazır Weights Dosyası İle Nesne Tanıma

--

--

Kaan Koska

Computer programming student, currently working on computer vision, opencv, Yolo, Python