Bu makale, YOLO v4 teknolojisini kullanarak özelleşmiş nesne algılama ve nesne sınıflandırma için izlenmesi gereken işlemleri adım adım anlatan bir kılavuzdur. Yolo modelinin, yerel makinelerde eğitilmesi işleminin bir hayli zorlu olması sebebiyle Google Colab üzerinde eğitilmesini ele alacağız. Google Colab, geliştiriciye tahsis edilen gelişmiş ücretsiz GPU kullanma avantajı da sağlar. Buna rağmen yine de modelin eğitim hızını daha da artırabilmek adına Yolov4’e göre daha kısıtlı ama hızlı sonuç veren Yolov4-tiny’i kullanacağız. Bu makale sayesinde pek çok kişinin nesne algılama ve nesne sınıflandırma alanında ufkunu genişletebileceğini umuyorum.
-YOLOv4 ( You only look once) Nedir ?
YOLOv4, Nisan 2020’de yayınlanan ve COCO veri setinde son teknoloji performansa ulaşan gerçek zamanlı bir nesne algılama modelidir.
Nesne algılama görevini iki parçaya bölerek çalışır;
- Sınırlayıcı kutular aracılığıyla nesne konumlandırmasını tanımlamak için regresyon
- Nesnenin sınıfını belirlemek için sınıflandırma.
Yolov4’ü kullanarak, Yolo ailesindeki geçmiş araştırma katkılarının birçoğu, yeni özellikler de dahil olmak üzere Yolov4’e özgü bir dizi yeni katkı ile birlikte uygulanabilir: WRC, CSP, CmBN, SAT, Mish aktivasyonu, Mozaik veri büyütme, CmBN, DropBlock düzenlemesi ve CIoU kaybı. Kısacası, Yolov4 ile daha iyi bir nesne algılama ağ mimarisi ve yeni veri büyütme teknikleri kullanılabilir.
-YOLO Mimarisi
PART 1 – YOLOv4-tiny ORTAMI İÇİN GEREKLİ DÜZENLEMELER
- İlk olarak Google Colab üzerinde yeni bir notebook dosyası açın.
- Menü çubuğu üzerindeki “Runtime” sekmesi altından “Change runtime type” a tıklayın ve “Hardware accelerator” seçeneğini GPU olarak değiştirip kaydedin.
Daha sonra notebook üzerinde aşağıdaki adımları sırasıyla gerçekleştirin.
1 – Darknet çerçevesini aşağıdaki şekilde github reposu üzerinden Colab ortamınıza klonlayın.
!git clone https://github.com/AlexeyAB/darknet
2 – Drive üzerinde ‘Yolov4-tiny’ ve ‘training’ adında klasörleri oluşturun.
3- Özelleşmiş Algılayıcı (Custom Detector) için gerekli olan aşağıdaki dosyaları oluşturun ve drive’a yükleyin
- Daha önceden etiketlendirilmiş, özel veriseti
- Özel cfg dosyası
- obj.data ve obj.names dosyaları
- process.py ( train.txt ve test.txt dosyalarını oluşturmak için gerekli script)
3.a – Verisetini Etiketlendirme
Tensorflow kütüphanesine ait LabelImg adlı etiketleme aracını kullanarak etiketleme işlemini gerçekleştireceğin. LabelImg aracının kurulumu için gerekli rehbere bu https://ai.yemreak.com/tensorflow-object-detection-api/labelimg-kurulumu üzerinden ulaşabilirsiniz.
Elimizdeki bir otomobilin, uyarı ışıklarının mevcut olduğu gösterge paneline ait örnek görüntü verisi üzerinde etiketlendirme işlemini gösterecek olursak;
Etiketlendirme yapılırken sol taraftan çıktı formatı olarak PascalVOC yerine Yolo seçilmelidir. Etiketlendirme işleminden sonra aşağıdaki şekilde kaydettiğimizde bize Yolov4-tiny ile model eğitimi için gerekli olan fotodaki uyarı ışıklarının sınıf bilgilerini ve etrafında çizdirmiş olduğumuz sınırlandırıcı dikdörtgenlere ait koordinat bilgisini içeren ‘<image_name>.txt’ adlı bir çıktı üretecektir.
İlk olarak train için kullanılacak görüntü verisi ve Yolo formatındaki etiketlerin bulunduğu görüntüler ile aynı isimdeki txt dosyaları “obj” adında bir klasöre taşınır ve bu dosya “.zip” uzantısı olacak şekilde sıkıştırılarak “Yolov4-tiny” klasörüne yüklenir.
3.b) Özel “cfg” Dosyasının Düzenlenmesi
Github üzerinden daha önce klonlanan Darknet çerçevesi altındaki cfg klasöründen “Yolov4-tiny-custom.cfg” dosyasında aşağıdaki değerler aynı şekilde düzenlenip ve “Yolov4-tiny” kök dizinine taşınmalıdır.
- batch = 64
- subdivisions = 16
- max_batches = (sınıf nesne sayısı * 2000)
- steps = max_batches değeri * 0.8, max_batches değeri * 0.9
- her bir [Yolo] katmanındaki classes değeri sınıf nesne sayısı ile değiştirilmelidir.
- Yine aynı şekilde her bir [Yolo] katmanı öncesindeki [convolutional] katmanı altındaki filters değeri ((sınıf nesne sayısı + 5) * 3) olarak yani 10 sınıf olduğunu varsayarsak “45” olarak değiştirilmelidir.
c) “obj.data” ve “obj.names” Dosyalarının Oluşturulması
Bir txt dosyası aşağıdaki şekilde oluşturulup “obj.data” ismiyle kaydedilip yine aynı şekilde “Yolov4-tiny” dizinine yüklenmelidir.
classes = (sınıf nesne sayısı)
train = data/train.txt
valid = data/test.txt
names = data/obj.names
backup = /mydrive/Yolov4-tiny/training/
“obj.names” dosyası da “obj.names” gibi aynı şekilde oluşturulup içerisine eğitimde kullanılacak olan etiketlenmiş görüntü verilerindeki bütün sınıf nesnelerinin isimleri etiketleme sonucunda üretilen id değerlerinin sırasına göre yazılıp, “Yolov4-tiny” klasörüne yüklenmelidir
d) “process.py” scripti kullanılarak “train.txt” ve “test.txt” Dosyalarının Oluşturulması
Bu script etiketlendirilmiş görüntü verisini öntanımlı %80 train ve %20 test olacak şekilde train ve test verisetlerine ayırmak için kullanılır. Dilerseniz bir kod editörü yardımıyla ayırma oranını kendiniz de belirleyebilirsiniz. Bu dosya da diğer dosyalar gibi “Yolov4-tiny” klasörüne yüklenmelidir. “process.py” içeriği aşağıdaki gibidir.
import glob, os # Current directory current_dir = os.path.dirname(os.path.abspath(__file__)) print(current_dir) current_dir = 'data/obj' # Percentage of images to be used for the test set percentage_test = 20; # Create and/or truncate train.txt and test.txt file_train = open('data/train.txt', 'w') file_test = open('data/test.txt', 'w') # Populate train.txt and test.txt counter = 1 index_test = round(100 / percentage_test) for pathAndFilename in glob.iglob(os.path.join(current_dir, "*.jpg")): title, ext = os.path.splitext(os.path.basename(pathAndFilename)) if counter == index_test: counter = 1 file_test.write("data/obj" + "/" + title + '.jpg' + "\n") else: file_train.write("data/obj" + "/" + title + '.jpg' + "\n") counter = counter + 1
Günün sonunda drive üzerindeki “Yolov4-tiny” dizini şu şekilde olmalıdır.
4) Google Colab ile Drive Bağlantısının Kurulması
- Drive’ın Colab’a Monte Edilmesi
- Drive İçin Sembolik Link Oluşturma
Bu komutun çalıştırılması ile artık “/content/gdrive/My\ Drive/” dizinine dosya yolu “/mydrive” dosya yoluna eşitlendirilmiş olur.
5) Makefile Dosyasını Düzenleyip OPENCV ve GPU ‘nun Aktifleştirilmesi
6) Darknet Paketinin Make Komutu ile Derlenmesi
7) “Yolov4-tiny” Dizinindeki Dosyaların Darknet Dizinine Kopyalanması
Buraya kadar sırasıyla yapılan işlemler sonrasında Colab da çalışma dizini olarak şu an “/content/darknet” olarak ayarlıdır.
“darknet” dizini altındaki “labels” dosyası hariç olmak üzere “data” dizini içindeki bütün dosyalar aşağıdaki komutlar yardımıyla silinir ve “cfg” dizini yeniden oluşturulur.
Bu işlemlerden sonra artık “Yolov4-tiny” dizininde yedeklenen daha önce oluşturulmuş eğitim için gerekli düzenlemeler Colab ortamına kopyalama yoluyla aktarılır. Bu işlemlerde aşağıdaki şekilde sırasıyla yapılmalıdır.
8) process.py Scriptinin Çalıştırılması ve Train – Test Verisetlerinin Oluşturulması
9) Daha Önceden Eğitilmiş YOLOv4-tiny Modelinin İndirilmesi
Yolo ile özel nesne algılayıcı modeli eğitilirken, daha önceden eğitilmiş bir model “transfer learning” yöntemi ile kullanmak üzere aşağıdaki şekilde indirilmelidir.
10) Özelleşmiş Nesne Algılayıcı Modelinin Eğitilmesi
Nihayet, eğitim için gerekli olan bütün hazırlıkları bitirip artık modelin eğitimine başlanılabilir.
Eğitim işlemi sınıf nesnesi sayısına bağlı olarak uzayabilir bu sebeple en iyi skor için “average loss” metriği gözlemlenmeli ve eğer ki “0.05” değerinin altına indiği ve o değer bandında sabit kaldığı gözlemleniyorsa eğitim durdurulabilir.
Ortalama hassasiyet skoru ya da mAP olarak bilinen metrik, eğitilen modelin başarısı hakkında ortalama bir değer sunar. Bu değer ne kadar yüksek olursa model o kadar kaliteli bir eğitimden geçirilmiş anlamı taşır. Eğitim işlemini başlatmak için aşağıdaki komutlar kullanılır.
Bağlantınız koparsa veya oturumunuzu kaybederseniz, modelinizi yeniden eğitmeye baştan başlamanız gerekmez. Eğitime kaldığınız yerden yeniden başlayabilirsiniz. En son kaydedilen ağırlıkları kullanın. Ağırlıklar, drive üzerinde “Yolov4-tiny/training” klasörüne her 100 epoch’da bir “yolov4-tiny-custom_last.weights” olarak kaydedilir. (“obj.data” dosyasında yedek olarak verdiğimiz yol).
Bağlantıyı yeniden başlatmak için aşağıdaki komut kullanılır.
11) Modelin Performansının Kontrol Edilmesi
Eğitim işlemi sonrasında elde edilen sonuçların test verileri üzerinde görselleştirilmesi için aşağıdaki yardımcı fonksiyon kullanılır.
Eğitim durdurulduktan sonra, modelin en son kalınan noktadaki ortalama hassasiyet skoruna aşağıdaki komut ile erişilebilinir. Komut üzerindeki “xxxx” yazan kısımda her 100 epoch’da yedeklenen modelin en son hangi epoch’da yedeklendiğine ait bilgi yazılmalıdır.
Ayrıca her 1000 epoch’da bir en iyi mAP skorunun elde edildiği eğitim aşaması da “Yolov4-tiny-custom_best.weights” ismiyle yedeklenir.
12) Eğitilen Özelleşmiş Nesne Algılayıcı Modelinin Test Edilmesi
Öncelikle “cfg” dosyası altına daha önceki aşamalarda kopyalanan “Yolov4-tiny-custom.cfg” dosyasında test işlemi için bir takım değişiklikler yapılır. Sonrasında bir test verisi kullanılarak model test edilir.
Sonuç olarak çıktı aşağıdaki gibi olacaktır:
process.py dosyasında pathandfile kısmına kendi dosya yolumuzu mu yazacağız veya neyin dosya yolunu yazacağız yoksa öyle mi kalacak
Sınıf nesne sayısı dediğiniz tam olarak ne oluyor.