Tensorflow Object Detection API ile Eğitim

Merve Turan
5 min readSep 11, 2019

--

Verilerinizle hızlı bir şekilde eğitim yapmak istiyorsunuz ama nereden başlayacağınızı bilmiyor musunuz? Ubuntu üzerinde eğitim ve test nasıl yapabilirim diyorsanız sizleri yazının devamına bekliyorum. 😇

Nesne tanıma, görüntülerde ve videolarda belirli bir sınıfın (insanlar, binalar veya arabalar gibi) anlamsal nesnelerin örneklerini algılamaya yönelik, bilgisayarlı görü ve görüntü işleme ile ilgili bir bilgisayar teknolojisidir.

Hadi gelin hep beraber bu teknolojiyi nasıl kullanabiliriz göz atalım. 🏃

Gereksinim ve Kurulumlar

Özellikle Ubuntu 16.04 için anlatacağım. Ancak diğer Linux dağıtımları için de uygulayabilirsiniz. Ama diyorsanız “Ben Windows kullanıyorum. Bu paketleri yükleyemem mi?” O zaman sizleri şuraya alalım.

Not: Bir çok kütüphane, paket yüklememiz gerekiyor. Bunlar için Anaconda da kullanabilirsiniz.

Nedir bu kütüphaneler?

Öncelikle: CUDA ve Cudnn

NOT: Burada CUDA 9.0 ve Cudnn 7.2 yi yüklemelerini anlatmaya çalıştım. Eğer diğer versiyonlara ihtiyacın varsa onları da aynı yöntemle yükleyebilirsin.

wget http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/cuda-repo-ubuntu1604_9.0.176-1_amd64.deb
learning/repos/ubuntu1604/x86_64/libcudnn7_7.2.1.38-1+cuda9.0_amd64.deb
wget http://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1604/x86_64/libcudnn7-dev_7.2.1.38-1+cuda9.0_amd64.deb
wget http://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1604/x86_64/libnccl2_2.1.4-1+cuda9.0_amd64.deb
wget http://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1604/x86_64/libnccl-dev_2.1.4-1+cuda9.0_amd64.deb
sudo dpkg -i cuda-repo-ubuntu1604_9.0.176-1_amd64.deb
sudo dpkg -i libcudnn7_7.2.1.38-1+cuda9.0_amd64.deb
sudo dpkg -i libcudnn7-dev_7.2.1.38-1+cuda9.0_amd64.deb
sudo dpkg -i libnccl2_2.1.4-1+cuda9.0_amd64.deb
sudo dpkg -i libnccl-dev_2.1.4-1+cuda9.0_amd64.deb
sudo apt-get update
sudo apt-get install cuda=9.0.176-1
sudo apt-get install libcudnn7-dev
sudo apt-get install libnccl-dev

❗️ Paketleri sırasıyla yükledikten sonra bilgisayarı yeniden başlatmanızda fayda var. Size fazladan şu linki de bırakıyorum bakarsınız belki 😉

Peki CUDA ve Cudnn’ni yükledik. Sırada neler var?

tensorflow-gpu >= 1.12

⚠️ Eğer “Bende ekran kartı yok. Ne kullanacağım?” derseniz şu da olur;

tensorflow >= 1.12

En önemli kısımları kurduk. Diğerlerine geçelim;

opencv-python
matplotlib
pandas
lxml
contextlib2
pillow

Kurulumları bitirdiğimize göre sıradaki adımımıza geçebiliriz. 👻

Eğitime Hazırlık!

Tensorflow Object Detection API kullanacağımız için öncelikle şuradan indiriyoruz.

Sıra geldi kullanacağımız modeli indirmeye. Kendi probleminize, donanım gereksinimlerinize vs. göre uygun olan model ile devam edebilirsiniz. Nereden indirebilirim derseniz , sizleri şöyle alalım.

⚠️ Bu yazıda Resnet-101 kullanılmıştır. Yazının ilerleyen kısımlarında Resnet-101.config dosyasını nasıl düzenlediğimizi de anlatacağım.

İndirdiğimiz dosyayı models/research/object_detection klasörünün içerisine atıyoruz.

Gerekli olan bazı scriptlerimiz var. Onları da buradan indirip models/research/object_detection klasörüne atıyoruz.

Veri Hazırlama

Gözetimli Öğrenme(Supervised Learning)’de verimizin hangi girdi değerinde hangi çıktıyı verdiğini işaretlemiş olmamız gerekiyor. Yani elimizde her zaman etiketli veriler olmalıdır.

Peki verilerimizi nasıl elde etmeliyiz ve etiketlemeliyiz?

💥 Veri, nesne tanıma algoritmalarında can damarı diyebiliriz. Bir nesneyi veya nesneleri tespit edebilmek için öncelikle elimizde o sınıflara ait veriler olmalıdır. Eğitim setimizdeki verilerin, test setimizdeki verilerle uyuşması önemlidir. Örneğin, gün ışığındaki kedi verileri ile eğitilen modelin gece çekilmiş kedi verilerinde çok başarılı olmasını bekleyemeyiz. Aynı ortam şartlarının sağlanmış olması modelin daha başarılı sonuç vermesini sağlayacaktır.

Not: Geliştirdiğim modellerin çoğunda mAP skorunun artış veya azalışının veriye bağlı olduğunu söyleyebilirim. İstisnalar hariç 😇

Eğitilen ve test edilen verilerdeki ortam şartlarının benzerliğinde model o nesneyi veya nesneleri daha yüksek skorlar ile tespit etmektedir.

  1. Veri Toplama

Probleminize yönelik verilerin tek tek fotoğrafını çekip elde edebileceğiniz gibi Google görsellerden verileri çekerek de toplayabilirsiniz.

➡️ Google görsellerden veri çekmek isterseniz bu scripti kullanabilirsiniz. 👊

❗️ Elde ettiğiniz verileri “test” ve “train” adında iki farklı klasörde toplamalısınız. Verilerin %20'si test, %80'i ise train klasöründe olmalıdır.

Eğer verisetinizin az olduğunu düşünüyorsanız veri çoğaltma işlemi uygulayabilirsiniz. Bkz;

⚠️ Ekstra önemli not: Test ve train verileriniz birbirine çok benziyorsa modelin overfit(ezberleme) durumu oluşabilir. Çeşitlilik olmasına dikkat edelim.

2. Veri Etiketleme

Şimdi geldik en sıkıcı kısma 😩

Verileri topladıktan sonra o nesnenin ne olduğunu belirtmemiz gerekiyor. Bunun için LabelImg isimli etiketleme programını öneriyorum.

LabelImg bize .xml formatında dosya üretiyor. Dosyanın içerisinde etiketlediğimiz nesneye ait sınıf ismi ve nesnenin bulunduğu konumun koordinatları yer alıyor.

Etiketlediğimiz bu fotoğrafları ve .xml dosyalarını daha önce belirttiğim gibi test ve train olarak ayırıyoruz. Dosya yapımız images/test ve images/train şeklinde olmalı.

3. xml_to_csv

.xml dosyalarını Tensorflow’un anlayacağı formata getirmemiz gerekiyor. Bunun için öncelikle xml’i csv’ye dönüştürmeliyiz.

#models/research/object_detection
python3 xml_to_csv.py

Daha sonra csv’yi Tensorflow’un formatı olan tfrecord’a dönüştürmeliyiz.

4. generate_tfrecord

Bunun için generate_tfrecord.py’ı açıyoruz. Eğiteceğimiz nesnelerin isimlerini buradan düzenliyoruz.

Bu komutları çalıştırıyoruz.

python3 generate_tfrecord.py --csv_input=images/test_labels.csv 
--image_dir=images/test --output_path=training/test.record
python3 generate_tfrecord.py --csv_input=images/train_labels.csv
--image_dir=images/train --output_path=training/train.record

Artık tfrecordlarımız hazır. 😃

5. Labelmap oluşturma

Labelmap, her nesnenin ne olduğunu, sınıf adlarının sınıf ID numaralarıyla eşleştirilmesini söyler. models/research/object_detection/training klasörünün içerisine labelmap.pbtxt adında bir dosya oluşturuyoruz. Aşağıdaki gibi düzenliyoruz.

6. Config dosyasını düzenleme

model_zoo’dan indirdiğiniz modelinize ait pipeline.config’i alıp training klasörüne atmalısınız.

Training klasörü içerisinde bulunan config dosyası üzerinden çeşitli değişikler yaparak modelimizin başarımını artırabilmemiz mümkündür. Config dosyasının içerisinde genel olarak hiper parametreler(hyper parameters) bulunmaktadır. Ben de burada hangi parametreler ile oynayarak model başarımını artırdığımdan bahsedeceğim.

❗️ Buradaki değişiklikler benim problemime yöneliktir.

Sizler de biraz deneme yanılma ile kendi parametrelerinizi düzenleyebilirsiniz. Böylece hangileri ile nasıl değişiklikler yaptığınızda, nasıl sonuçlar alabileceğiniz konusunda fikir sahibi olabileceksiniz.

Neyse daha fazla uzatmadan konuya dalalım beraber 😎

Yukarıda görüldüğü üzere num_classes:3 olarak değiştirilmiştir. Kaç nesne üzerinden eğitim yapacaksanız buradaki sayıyı ona göre düzenlemelisiniz. Image resizer olarak fixed_shape_resizer kullanılmıştır. Bunun faydası, fotoğrafın boyutunu başarılı bir şekilde vererek modelin resmin boyutlarına odaklanmasını sağlamaktır. Başka önemli bir faktör ise seyreltme(dropout) kavramıdır. Bu kavramın ve daha fazlasının detaylı açıklamalarını şuradan inceleyebilirsiniz.

Seyreltme(dropout) oranını 0.7 olarak belirledim.

⚠️ Andrew Ng’ye göre 0.5 ile 1 arasında bir değer verilmelidir.

Başka önemli bir değişiklik ise train config bölümündedir. Bu bölümde optimizasyon yöntemi değiştirilmiştir. Var olan momentum_optimizer yerine sıklıkla kullanılan adam_optimizer kullandım. Öğrenim değerini(learning rate) ise 0.0001 olarak belirledim. Batch size değerini artırmak da önemli bir faktördür. Ancak bu durum sizin makinenizin ekran kartı değeri ile orantılıdır. Ben eğitimimi NVIDIA GTX 1080 ekran kartı ile yaptım. Resnet-101 modeli için batch size’ı maksimum 5 olarak kullanabildim. Bu kadar artırma bile mAP skoru uçurdu. 😃

Şimdi geldik test config tarafındaki kavramlara. num_example test klasörünüzdeki görüntülerin sayısını ifade ediyor. num_visualization ise Tensorboard’da kaç tane test görüntüsünün gösterileceğini ifade ediyor.

EĞİTİM BAŞLASIN!

Bütün hazırlıklarımız bittiğine göre artık eğitim başlatmak için hazırız. 👻

Terminalimizi açıyoruz. Aşağıdaki komutları sırasıyla çalıştırıyoruz. (Dosya yollarını ayarlamayı unutmayınız.)

# From models/research/
protoc object_detection/protos/*.proto --python_out=.
# From models/research/
export PYTHONPATH=$PYTHONPATH:`pwd`:`pwd`/slim
# From the tensorflow/models/research/ directory
PIPELINE_CONFIG_PATH={path to pipeline config file}
MODEL_DIR={path to model directory}
NUM_TRAIN_STEPS=50000
SAMPLE_1_OF_N_EVAL_EXAMPLES=1
python object_detection/model_main.py \
--pipeline_config_path=${PIPELINE_CONFIG_PATH} \
--model_dir=${MODEL_DIR} \
--num_train_steps=${NUM_TRAIN_STEPS} \
--sample_1_of_n_eval_examples=$SAMPLE_1_OF_N_EVAL_EXAMPLES \
--alsologtostderr

Eğitim süreniz kullandığınız modele, donanımsal özelliklerinize vs. göre değişiklik gösterebilir.

Eğitim yaptık. Test etme ve Tensorboard’daki grafikleri yorumlama kısmı için diğer yazıda görüşmek üzere..

Not: Bu bilgilerin çoğuna İngilizce kaynaklardan zaten ulaşabilirsiniz. Bu yazının yazılmasındaki asıl amaç, deep learning alanında Türkçe kaynakların artmasına katkı sağlamaktır.

Okuduğunuz için çok teşekkürler. Katkılarından dolayı en büyük teşekkür ise Furkan Senturk’e 🙏

--

--