Başlangıç > Deep Learning > YOLOV3’ü kendi veri setimizle Eğitmek (Train YOLOV3 with Custom DataSet)

YOLOV3’ü kendi veri setimizle Eğitmek (Train YOLOV3 with Custom DataSet)

Merhaba, bu yazımda object detection ve classification yapabilen ağlardan bir tanesi olan YOLOV3’ü kendi verimizle nasıl eğiteceğimizi anlatmaya çalışacağım. YOLOV3’ün çalışma prensibi, neden V3, V2 ‘den farkı nedir gibi sorularınızı başka bir yazıda cevaplamayı planlıyorum. İlk cümlede bahsettiğim gibi YOLO bir görüntü içinde birden fazla nesnenin yerini ve türünü tespit edebilen bir derin ağ. YOLO’nun istediğimiz bir nesneyi görüntüde bulmasını istiyorsak ilk olarak onu eğitmemiz gerekir. Bu sebeble ilk olarak verimizi hazırlayacağız.

Veri Setini Oluşturma

İlk olarak tespit etmek istediğimiz nesneyi barındıran görüntülerimizi bir klasör altında topluyoruz. Bu yazıda bir tek nesne tanıma üzerine odaklanacağız bu yüzden kedi verisetini kullanacağız.

Screenshot from 2018-12-10 10:48:36

Veri Setini Etiketleme

Veri setini ayarladıktan sonra artık veri üzerinde etiketleme yapmamız gerekiyor. Bunun için şöyle bir tool geliştirilmiş BBOX-Label-Tool. Buradan indirebilirsiniz. İndirince bir iki düzenleme yapmamız gerekiyor. İlk olarak 133 satırı kendi sisteminize göre düzenlemeniz gerekiyor yani indirdiğimiz klasöre göre yolu düzenliyoruz. Ben 133. satırı aşağıdaki gibi düzenledim.

s = r/home/enes/darknet/BBox-Label-Tool

Diğer bir dikkat edilmesi gereken hususda BBox Label Tool . JPEG uzantılı dosyaları arıyor dosya formatınız farklı ise main.py dosyası içinde  burayı da güncellemek gerkiyor.  Diğer bir konu ise eğer etiketlemek istediğiniz veri çok yüksek çözünürlükte ise resim tool içinden taşıyor bunun için görüntüyü yeniden ölçüklendirmeniz gerekebilir, main.py içinde 179 satırı eğer yüksek çöznürlüklü görüntüleriniz yoksa pasif hale getirin.

cd /darknet/BBox-Label-Tool 

BBox Tool içinde çeşitli klasörler bulunmaktatır.

Screenshot from 2018-12-10 11:27:1643

Bu klasörlerden Images, Labels ve Examples altında 001 isimli bir klasör vardır. Burada siz 002 klasörünü oluşturabilir yada 001 içini temizleyip kendi veri setinizi Images altında bulunan 001 içine atabilirsiniz. Burada her bir klasör (001,002,003) gibi farklı bir nesneyi temsil etmektedir. Neyse veri setimizi 001 içine attık ve Labels içindeki 001 içinide boşalttık. Aşağıdaki terminal komutu ile kodumuzu çalıştırdık.

python main.py

Aşağıdaki ekran karşımıza gelmektedir. Bu ekranda Image Dır kısmına 1 yazıp load dersek Images/001 nolu klasörde bulunan resimler yüklenir fare yardımı ile görüntü içinde bulunmasını istediğimiz nesneyi çerçeve içine alıyoruz. Sağ tarafta gördüğünüz gibi oluşturduğumuz çerçevenin sol üst kordinatları ve sağ alt kordinatları alınıyor ve next dediğmizde Labels/001 dosyası altında resim ismi kullanılarak bir txt dosyasına bu veriler aşağıdaki gibi yazılıyor.

Screenshot from 2018-12-10 11:27:163

1
116 27 372 353

Tüm resimler üzerinde etiketleme işlemimizi bitirdikten sonra Labels/001 altında veri setimizde ki resim adedince txt dosyası olduğunu göreceksiniz. Fakat elde ettiğimiz bu çıktılar Yolo’nun bizden istediği formatta değil. Yolo aşağıdaki görseldeki gibi format kullanıyor ve piksel kordinat değerlerinin 0-1 aralığında olmasını istiyor.

Yolo’nun istediği format :

1_gyOSRA_FDz4Pf5njoUb4KQ

[kategori numarası] [nesnenin merkez noktasının X değeri] [nesnenin merkez noktasının Y değeri] [nesnenin genişliğinin X değeri] [nesnenin genişliğinin Y değeri]

0 0.478 0.458 0.844 0.896

Bu formata dönüştürmek için Guanghan Ning’nin  yazmış olduğu ve indirdiğimiz BBox-Label-Tool içinde bulunan convert.py dosyasını kullacağız. Burada dikkat edilmesi gereken nokta convert.py içinde bazı satırları kendi veri setimize göre düzenlemiş olmamız gerekiyor.  Bu satırlardan

5.satırı classes = [“001”] şeklinde (etiket değerimiz, siz 002 de vermiş olabilirsiniz)

34.satırı mypath = “/home/enes/darknet/BBox-Label-Tool/Labels/001/”  (BBox Label Tool etiketlediğimiz koordinatların kaydedildiği klasör)
35. satırı outpath = “/home/enes/darknet/cats/”şeklinde (YOLO darknet kütüphanesinin bulunduğu klasör altındaki yeni verisetimizin bulunduğu klasör)
37.satırı cls = “001” şeklinde (etiket değerimiz)

şeklinde düzenleyip python convert.py ile kodu çalıştırıyoruz. cats klasörü altında bulunan resimlerimizin yanına Yolo’un istediği gibi kordinat bilgilerini de text halinde atmış oluyoruz.

Eğitim ve Test Veri Setlerini Oluşturma.

Yolo’yu eğitmek için verimizi belli test ve eğitim olmak üzere ikiye ayırmamız gerekiyor. Bu işlem için yazılmış bir  script bulunmakta.  Bu script üzerinde veriyi % kaç oranında böleceğiniz ve verinin bulunduğu klasör ismi bilgilerini düzenledikten sonra scripti çalışıtırıyoruz. Scritpt sonuç olarak train.txt ve test.txt isminde iki adet dosya üretmekte bu dosyalar için de ise veri setimiz içindeki görüntülerin verdiğimiz %’lik dağılıma göre isimleri bulunmakta.

YOLO Parametre Ayarları

Oluşturmuş olduğumuz veri seti için darknet dosyası içinde çeşitli düzenlemeler yapılması gerekemektedir.  cfg klasörü altında obj.data, obj.names, yolo-obj.cfg isimli dosyalar oluşuturulması gerekiyor. İlk olarak cats-obj.data isimli bir dosya oluşturup içine aşağıdaki bilgileri giriyoruz ve kaydediyoruz.

classes= 1
train = /home/enes/darknet/cats/train.txt
valid = /home/enes/darknet/cats/test.txt
names = /home/enes/darknet/cfg/cats-obj.names
backup = /home/enes/darknet/backup/

Daha sonra cats-obj.names isminde bir dosya açıp içine Cat yazıyoruz ve kaydediyoruz. Sonra cfg altında bulunan yolov3-obj.cfg isimli bir dosyanın bir kopyasını oluşturup cats-yolov3.cfg olarak kaydediyoruz. Bu dosya içinde düzenlememiz gereken bazı satırlar var bunlar

Satır 3: batch = 32, her eğitim adımı için 32 resim kullanıyor olacağız.
Satır 4: subdivisions = 8’i ayarlayın( GPU bellek mikarınıza göre arttırıp azaltabilirsiniz)
Satır 603: filters = (class + 5) * 3  bu durumda bizim filtre sayımız 18
Satır 610: class = 1, saptamak istediğimiz kategori sayısı
Satır 689: sfilters = (class + 5) * 3  bu durumda bizim filtre sayımız 18
Satır 696: class = 1, saptamak istediğimiz kategori sayısı
Satır 776: filters = (class + 5) * 3  bu durumda bizim filtre sayımız 18
Satır 783: class = 1, saptamak istediğimiz kategori sayısı

Eğitim

Eğitime başlamadan önce daknet 53 için daha önce büyük veri ile eğitilmiş ağırlıklarımızı buradan darknet klasörümüzün içine indiriyoruz. (76MB)

Ağırlıklarımızıda indirdikten sonra artık eğitim için hazırız, Terminal ekranında darknet dizini altında iken  aşağıdaki komut ile eğitimi başlatıyoruz.

./darknet detector train cfg/cat-obj.data cfg/cat-yolov3.cfg darknet53.conv.74

Bu komuttan sonra eğitim başlıyor ve daha önce yolunu vermiş olduğumuz backup dosyası içine 900 epoğa kada her 100 epokda bir ağırlıklar kaydedilir.  900. epoktan sonra her 10000 binde bir kayıt edilir. İsterseniz bunu değiştirebilirsiniz.

Test

Eğtitim bittikten sonra elde ettiğimiz son ağırlık dosyasını backup içinden alıp cfg dosyasının içine taşıyoruz. Ben 100000 epokluk bir eğitim sonucunda eğitimi sonlandırdım. Veri setimizde bulunmaya bir görüntü ile aşağıdaki komutu terminal ekranından girerek ağımızı test ediyoruz.

./darknet detector test cfg/cat-obj.data cfg/cat-yolov3.cfg cfg/cat-yolov3_10000.weights data/test.jpg

Ve Sonuç:

predictions

İşlemler Ubuntu işletim sistemi üzerinde GPU kullanılarak yapılmıştır. Eğer yeteri kadar güçlü bir GPU’nuz yoksa bellek hataları alabilirsiniz. Bunu çözmek için batch ve subdivision değerlerini düşürmek faydalı olabilir.  Soru ve sorunlarınız içi yazabilirsiniz.

Kaynaklar :

YOLOv3.pdf erişimi için tıklayın

https://pjreddie.com/darknet/yolo/

 

Kategoriler:Deep Learning
  1. Henüz yorum yapılmamış.
  1. No trackbacks yet.

Yorum bırakın