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

Aralık 10, 2018 Yorum bırakın

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

Top-1 Top-5 Error Kavramları

Merhaba bu yazımda top-1 top-5 yada top-n diye bahsi geçen hata kavramlarından bahsedeceğim. Eğer makine öğrenmesi veya daha derin  öğrenme çalışıyorsanız bu kavramları sıkça duyarsınız. Eğittiğimiz bir yapay sinir ağı test esnasında bize verilen verinin ait olduğu sınıfa ait bir olasılık verir. Örneğin 10 adet çıktısı olan bir ağda toplamı 1 olacak şekilde bir olasılık dağılımı elde ederiz. Örneklendirecek olursak 10 adet sınıfımız olan bir veri setimiz olsun (kedi, köpek, araba, uçak, tren, gemi, insan, ağaç, fil, inek).

Top-1 Error: Örneğin test etmek için ağımızda bir kedi resmi gönderdik. Ağın çıktısı aşağıda en yüksek olasılık köpek yani ağımız kendisine gelen verinin köpek olduğunu düşünüyor. Bu durumda top-1 error’a göre sınıflandırma yanlış.

Top-5 Error: Aynı örnek üzerinden konuşacak olursak ağın en yüksek 5 olasılığı alınır. Bu olasıklar içinde bizim yolladığımız veriye ait bir olasılık varsa ağın doğru tahmin ettiği varsayılır. Top-1 ‘e göre hata yapan ağımız top-5’e göre doğru bir tahmin yapmış olur.

  1. kedi : 0.2
  2. köpek: 0.4
  3. araba:0.1
  4. uçak:0.0
  5. tren:0.1
  6. gemi:0.0
  7. insan:0.0
  8. ağaç:0.0
  9. fil: 0.1
  10. inek: 0.1

Kısaca Top-1 error ağın verdiği sonuçlar arasında en yüksek olasılık değeri alınır doğruluğu kontrol edilir sonuç doğru ise kabul edilir. Top-5 de ise istenilen sınıfın olasılığı düşükte olsa en yüksek 5 sonuç arasında olması ağın doğru sonuç verdiğinin kabulü için yeterlidir.

 

Kategoriler:Deep Learning

IEEE pdf express Font is not embedded Error

Hi, recently when I uploaded an article to the PDF expresse for control, I got the error  which is specified in the title. I have resolved this error as follows. While word document is open, hit the ctrl + P then select foxit reader as default printer and hit the print. Then load the saved pdf document to the PDF expresse.

Good work.

Kategoriler:KARIŞIK

Ubuntu’da Derin Öğrenme Ortamının Hazırlanması

Merhaba bu yazımda derin öğrenmeye başlamak isteyenler için gerekli kütüphanelerin nasıl kurulacağını anlatmak istiyorum. Söz konusu sistem 64 bit Ubuntu 14.04 işletim sistemi ve Nvidia Quadro K4200 ekran kartı üzerinde test edilmiştir.

1-İlk olarak işletim sisteminizin güncel olması gerekiyor aşağıdaki komut ile işletim sisteminizi güncelleyin.


sudo apt-get update
sudo apt-get upgrade
sudo apt-get install build-essential cmake g++ gfortran git pkg-config python-
dev software-properties-common wget
sudo apt-get autoremove
sudo rm -rf /var/lib/apt/lists/*2

2- Ekran  Kartınızın sürücüsü güncel olmalı nvidia sitesinden indirip kurma yoluna gidebilirsiniz fakat burada xserver’ı kapatmanızı isteyecek çeşitli hatalar alacaksınız çok iyi bir linux kullanıcısı değilseniz bu yol yerine uygulamardan Additional Drivers kısmından güncel olanını yükleyin ve sisteminiz yeniden başlatın.

3-  Nvida web sayfasına giderek CUDA Toolkit indirin, burada CUDA Toolkit’i indirirken onun desteklediği en son sürücü versiyonunu da kontrol edebilrsiniz.  Ben bu yazıyı yazarken CUDA Toolkit 9.1 sürümü vardı.  İndirmeden önce size sistemizle alakalı sorular soruluyor, sisteminize uygun olanı indirsiniz. Yaklaşık 1.2 GB’lık bir dosya iniyor. Dosya indikten sonra aşağıdaki komutlar ile kuruluma başlıyoruz

sudo dpkg -i cuda-repo-ubuntu1404*amd64.deb
sudo apt-get update
sudo apt-get install cuda

Bu işlemden sonra daha sonra kullanılmak üzere cuda’yı ortam değişkenlerine ekliyoruz.

 echo 'export PATH=/usr/local/cuda/bin:$PATH' >> ~/.bashrc
  echo 'export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH' >> ~/.bashrc
  source ~/.bashrc

Her şey yolunda gittiyse aşağıdaki komutun çıktısı CUDA sürümüzü ekrana yazdıracaktır.

nvcc -V

sonuc

Bilgisayarınızı tekrardan başlatın.

4- cuDNN derin öğrenme için gerekli olan kütüphaneler. Son sürümünü nvidia’nın sistesinden indirin ben bu yazıyı yazarken cuDNN v7.1 for Linux sürümü vardı.  İndirebilmek için üye olmanız ve üyeliğinizin onaylanması gerekiyor. Bu bazen hemen olurken bazen zaman alabiliyor şansınıza artık. Yaklaşık 360 MB bir dosya iniyor. Aşağıdaki komutlarla cuDNN kurulumununu yapıyoruz.

cd ~/Downloads/
  tar xvf cudnn*.tgz
  cd cuda
  sudo cp */*.h /usr/local/cuda/include/
  sudo cp */libcudnn* /usr/local/cuda/lib64/
  sudo chmod a+r /usr/local/cuda/lib64/libcudnn*

Bu aşamadan sonra kontrol için nvidia-smi komutu ile herşeyin yolunda gidip gitmediğini kontrol etmiş oluyoruz. Bu komut sonucunda ekran kartınızla ilgili çeşitli bilgiler komut ekranında gözükecektir.

5- Derin öğrenme için tercih ettiğiniz dil python’sa ki python olmalı bence, bu iş için bize yardımcı olacak çok güzel kütüphanler var bunları kuruyoruz. Bu zamana kadar tüm bilgisayarımızı ilgilendiren işler yaptık artık Virtual Env üzerinden gideceğiz bunu bildiğinizi varsayıyorum daha önce kurulumu üzerine bir yazı yazmıştım.  Bir Virtual Env Klasörü oluşturduk ve aşağıdaki komutları sırası ile işliyoruz.


pip install matplotlib
pip intsall numpy
pip intsall pandas
pip intsall h5py
pip intsall scipy
pip intsall skimage
pip intsall sklearn
pip intsall sympy 

Ayrıca ihtiyacınız olursa OpenCv’yi de eklemeniz gerekebilir onuda burada anlattım.

6- Bu aşamadan sonra atrık ihtiyacımız olan kütüphaneleri kuracağız. Yeni başlayan biri için en uygun Keras, Tensorflow, Theano üçlüsü, hemen üçünüde bilecekmiyiz demeyin bunlardan Keras Theano veya Tensorflow ile çalışabilen bir üst kütüphane. İşleri kolaylaştırmak için yazılmış kurduktan sonra arka planda hangisinin çalışmasını istiyorsanız onu ayarlayabilirsiniz.  Bu kütüphanelerin hem GPU hemde CPU için kurumları var eğer GPU’nuz yoksa diğer kurulumları tercih edin.

Önce Tensorflow kuruyoruz. Kurulum için komutlar burda mevcut inanmazsanız bakın.

pip install --upgrade tensorflow-gpu

Bu arada ben python 2.7 kullanıyorum. Siz python3.x sürümü kullanıyorsanız pip leri pip3 şeklinde kullanının. Kurulum bittikten sonra import ettiğinizde hata yoksa işlem tamamdır.

  python
  >>> import tensorflow as tf
  >>> exit()

Evet sıra Theanoda onunda kurulumu burada var. Aşağıda komutlar arasına virgül koydum öyle çalışmaz ise tek tek kurun.

pip install dev,nose g++, pygments,sphinx,nose
pip install Theano
  python
  >>> import theano
  >>> exit()

Sıra geldi en kolayını kurmaya onunda kurulumu ve çeşitli ayarları burada var.

  sudo pip install keras  
      python
  >>> import keras

Kurulumdan sonra import komutunu verdiğinizde alacağınız çıktı aşağı yukarı bu şekilde ise hadi bakalım gözünüz aydın.

Screenshot from 2018-03-12 17:56:550

Ammada uzun oldu. Kelime hataları dil sürçmeleri olabilir kusura bakmayın artık. Herhangi bir sorunla karşılaştığınızda çekinmeden ulaşabilirsiniz. Bir dahaki yazıda görüşmek üzere.

Kaynaklar :

1-https://github.com/floydhub/dl-setup

2- https://www.tensorflow.org/install/install_linux#InstallingVirtualenv

3-https://keras.io/backend/

4-http://deeplearning.net/software/theano/install_ubuntu.html

5-https://developer.nvidia.com/cuda-toolkit

6-https://developer.nvidia.com/cudnn

Kategoriler:LINUX

Python Virtulenv içine opencv entegre etmek Linux

Merhaba şimdi bu yazımda virtualenv içine opencv’ yi nasıl aktarcağımız anlatacağım. İlk olarak sisteminizde opencv nin kurulu olması gerekmektedir. Ayrıca virtualenv nedir bunu bildiğinizi var sayarak başlıyoruz.

Opencv kuruluduğunuzda  opencv nin kullanacağımız 2 adet dosyası var biri cv2.so diyeri cv.py aslında olayın özü bu iki dosyayı virtualenv içindeki projemize taşımak. Bu iki dosya genelde  aşağıdaki yollardan birinde bulunur kurulumdaki seçiminize göre değişkenlik gösterebilir.

/usr/local/lib/python2.7/distpackages/

yada

/usr/lib/python2.7/distpackages/

ilk olarak komutla Virtualenv içindeki projemize gidiyoruz.

1- cd /VirtualEnv/tensorflow

2-cp /usr/lib/python2.7/dist-packages/cv2.so ./lib/python2.7/site-packages/

3-cp /usr/lib/python2.7/dist-packages/cv.py ./lib/python2.7/site-packages/

4-source bin/activate

5-python

6- import cv2

7- ve mutlu son

İyi çalışmalar

Kategoriler:KARIŞIK