YOLO (You Only Look Once), “Sadece Bir Kez Bakarsın” anlamına gelir. Adından da anlaşılacağı üzere nesneleri tek seferde oldukça hızlı bir şekilde tanımaktadır. Tek bir çerçevede birden fazla nesneyi tanıyıp aynı anda koordinatlarını tespit eder. Bu yazıda Yolov4 ile nesne tanıma modeli oluştururken nelere dikkat etmemiz gerektiğini, hangi araçları kullandığımızı göstereceğim.
Veri Seti (Dataset) Oluşturma
Ben bu eğitimde örnek olarak 2 sınıflı (baret ve insan) bir model eğiteceğim. Sizlerde dilediğiniz bir veya birden fazla nesne sınıfı seçerek veri setinizi oluşturmaya başlayabilirsiniz. Veri toplamanın birden çok yöntemi bulunuyor. Nesne sınıfınızı Google görsellerde aratarak toplayabilir ya da veri bilimi topluluğu tarafından oluşturulan https://www.kaggle.com/ adlı sitede bulabilirsiniz.
Başlangıç seviyesinde bir eğitim olacağı için 2 sınıfa karşılık olarak 400 fotoğraf (200 insan + 200 baret) kullanacağım. Tabi ki 1000-1500 kadar veri toplayabilirsiniz ama şu an da böyle bir ihtiyaca gerek duymuyorum. Fotoğraflarda dikkat etmeniz gereken bir konu da boyutlarının 416×416 ölçeğinden büyük olması gerektiğidir. Eğitim için daha küçük ölçekli fotoğraflar da kullanabilirsiniz ancak bu eğitimin kalitesini etkileyecektir. Şu an elimizde bulunan 400 fotoğrafı images adlı bir klasörün içine yerleştirdik.
Fotoğraf Etiketleme
Etiketleme adımına geçmeden önce images klasörü içerisine yerleştirdiğiniz fotoğrafları isimlendirmeyi unutmayın. Bu işlemi tüm fotoğrafları seçip sağ tıkla yeniden adlandır şeklinde yapabilirsiniz. Şimdi etiketleme işlemine geçebiliriz. Bunun için açık kaynaklı bir web sitesi olan https://www.makesense.ai/ platformundan yararlanacağız. Hemen sağ altta göreceğiniz “Get Started” seçeneğine tıkladıktan sonra ekrandaki kutuya tıklayıp fotoğraflarınızı yükleyiniz. Daha sonra “Object Detection” butonuna tıklayıp ekranda çıkan label (1) kutusuna sınıflarınızın isimlerini giriniz. “Start Project” butonuna tıklayıp fotoğrafları etiketlemeye (2) başlayabilirsiniz.
Sayfanın sol tarafında yüklenen resimleri sağ tarafında ise nesnelerinizin hangi sınıfa ait olduğunu göreceksiniz. Fotoğrafları çerçeve içine alırken sağ taraftan çerçevenin sınıfını seçmeyi unutmayın. Bu işlemi tüm fotoğraflar için yaptıktan sonra yukarıdaki “Actions” butonuna tıklayın. “Export Annotations” seçeneği ile “A .zip package containing files in YOLO format” yazısı karşınıza çıkacak. Tik işaretini attıktan sonra etiketlerinizi “Export” seçeneği ile dışarı aktarabilirsiniz.
Darknet Düzenleme
Darknet, kendi nesne tanıma modelimizi eğitebilmek için gerekli olan dosyaların bulunduğu depodur. Öncelikle https://github.com/AlexeyAB/darknet (1) Github hesabına giriş yapıyoruz. “Code” (a) bölümünden bu depoyu indirmek için “Download ZIP” (b) butonuna tıklıyoruz. Aynı sayfada “Download yolov4.weights file 245 MB” bölümünden “yolov4.weights” dosyasını ve önceden eğitilmiş olan yolov4.conv.137 dosyasını indiriyoruz. (Dosyaları ctrl+f ile aratmanız size kolaylık sağlayacaktır.)
İndirme işlemleri bittikten sonra .zip uzantılı, darknet-master isimli dosyayı klasöre çıkartıp gerekli düzenlemeleri yapmaya başlayabiliriz. İlk olarak indirdiğimiz “yolov4.weights” ve “yolov4.conv.137” dosyalarını klasörümüzün içine taşıyoruz. “yolov4.weights” bizim örnek ağırlık dosyamız olacak. \darknet-master\cfg klasöründen “yolov4.cfg” isimli dosyayı kopyalayıp \darknet-master adlı ana klasörümüzün içine atıyoruz. Bu bizim konfigürasyon dosyamız, burada gerçekleşecek olan ayarlara ayrıca değineceğim. Son olarak ana klasörümüz içerisinde adı “myData” olan yeni bir klasör oluşturuyoruz. Son işlemlerden sonra ana klasör şu şekilde görünmelidir:
Konfigürasyon ve Makefile Dosyası Düzenleme
Makefile dosyasını bir not defteri içerisinde açarak GPU, CUDNN ve OPENCV değerlerini 1 olarak değiştiriyoruz. Bu konu ile ilgili ayrıntılı bilgi edinmek için “akillifabrikalar.com.tr/blog-yazilari/” yazımızı okuyabilirsiniz.
Konfigürasyon dosyamızdan daha önce bahsetmiştik. “yolov4.cfg” adlı dosyayı açıp içindeki bazı değerleri değiştirip ne anlamlara geldiğini açıklayacağım. İlk olarak bizi batch ve subdivisions değerleri karşılıyor. Batch, her bir iterasyonda sinir ağı içerisinde yer alacak resim sayısıdır ve bunu default olan 64 değerinde bırakıyoruz. Subdivisions ise her bir batch i kaç alt adıma böleceğimizi belirttiğimiz değerdir. Subdivisions değerini yüksek tutmak eğitimin uzamasını, düşük tutmak ise kalitesini olumsuz etkileyecektir. Bu yüzden yine varsayılan değer olarak 64 belirliyoruz.
Width, height değerlerini 416 olarak belirliyoruz. Bunu daha önce image dosyalarını ayarlarken belirtmiştik. Max_batches değerini oluştururken çok basit bir denklem kullanacağız. Sınıf sayımızı 2000 ile çarpıp max_batches sayısını elde edeceğiz. Hatırlarsanız bizim 2 sınıfımız (baret, insan) bulunuyordu. Bu yüzden max_batches değerimiz 2×2000 yani 4000 olur. Steps değeri ise her zaman max_batches sayısının yüzde 80’idir. Bu durumda 4000’nin %80 i 3200 olur.
Son olarak classes ve filters değerlerini hesaplayacağız. Burada da bir denklemimiz bulunuyor. (Sınıf sayısı + 5 )x3 bize filters değerini verecektir. Sınıf sayımız (classes) 2 idi. (2+5)x3 = 21 olur. Not defteri içerisinde (yolov4.cfg) 3 adet classes ve filters değeri bulunmaktadır. Bunları ctrl+f ile aratıp bulabilirsiniz. Son durumda yolov4.cfg dosya içi görünümü şu şekilde olmalıdır.
myData Dosyası Düzenleme
Bu klasör içerisinde, daha önceden etiketlemiş olduğumuz resimler ile ilgili işlemler yapacağız. Eğitimin başında oluşturduğumuz images adlı dosyayı myData’nın içerisine taşıyınız ve burada labels isimli bir dosya daha oluşturunuz. Etiketleme işlemi yaptıktan sonra export ettiğimiz label dosyalarını hem images hem de labels klasörleri içerisine kopyalayınız. Benim modelime göre şu anda images dosyasının içerisinde 400 fotoğraf 400 label bulunmakta. Aynı zamanda labels klasörü içerisinde de 400 label bulunmakta.
Şimdi resim ve etiketlerin yollarını belirtmemiz gerekiyor. myData klasörü içerisinde iki not defteri açıp birinin adını testing diğerinin training koyuyoruz. Resimlerin %80’i train geri kalan %20’si ise test edilecek. Bu yüzden ben 400 fotoğraftan 320’sinin dosya yolunu training.txt geri kalan 80 fotoğraf yolunu ise testing.txt dosyası içerisine yazıyorum.
Not defterleri içerisinde, sağ alt köşeden satır sayılarına bakarak hata yapıp yapmadığınızı kontrol edebilirsiniz. Benim training.txt dosyamda 320, testing.txt dosyamda 80 satır bulunuyor. Toplam 400 satır 400 fotoğrafa denk geliyor. Ayrıca dosya yollarını tek tek elle yazmak yerine küçük bir python kodu ile yazabilirsiniz.
myData klasörü içerisinde bir not defteri açıp, her satıra tek tek sınıf isimlerini yazıyoruz. (1) Benim iki sınıfım olduğu için (baret, insan) 2 satır yazıyorum. Not defterini farklı kaydet deyip “myData.names” tırnak işaretleri ile birlikte kaydediyoruz ki uzantısı .names olsun. (2)
myData klasöründe son bir not defteri açıp içerisine sınıf sayısını belirtmek için classes = 2 yazıyoruz. Train, test ve names dosyalarının yollarını yazıp model çıktımızı kaydedeceğimiz backup dosyamızı belirtiyoruz. (1) Not defterini farklı kaydet deyip “myData.data” tırnak işaretleri ile birlikte kaydediyoruz ki uzantısı .data olsun. (2)
myData klasörümüzün son görüntüsü aşağıdaki gibi olmalıdır. Bu bizim model eğitme işlemine geçmeden önceki son aşamamızdı. Bu süreçte birçok şey gözünüzden kaçabilir. Bu yüzden tecrübe kazanmadan önce bütün adımları gözden geçirmeniz yararınıza olacaktır. Çünkü model eğitme işlemi sırasında gerçekleşen hataların büyük çoğunluğu model hazırlanması sırasında yaşanan aksaklıklardan kaynaklanıyor. Ancak size güzel bir haberim var. Bu aşamaya kadar geldiyseniz yapılacaklar bölümünün büyük çoğunluğunu tamamladınız demektir. Bir sonraki adımda sizler kahvenizi yudumlarken Google Colab iş yükünüzü tek başına sırtlayacak.
“Google Colab Nedir? Nasıl Kullanılır?” yazımıza ulaşmak için: Google Colab Nedir?