Bu dersimiz ile birlikte kendi nesnelerimizi eğitmeyi, tespit etmeyi ve tespit ettiğimiz nesnelere göre istediğimiz bir görüntü üzerinde nesne tanıma yapmayı öğreneceğiz. Bunun için kütüphane olarak Tensorflow 2.XX kullanacağız, eğitim işlemlerini ise Google Colab GPU'ları üzerinde yapacağız. Kodlarımızı ise Google Colab üzerinde oluşturacağımız Notebook üzerinde yazacağız.
Google Colab kullanabilmek için gmail adresinizin ve drive hesabınızın olması gerekli. Sırasıyla adımları yapalım:
1-Google Drive üzerinde yeni bir klasör oluşturma
Öncelikle Drive hesabınızda Demo adında yeni bir klasör oluşturalım.

2-Klasör İçinde .ipynb uzantılı notebook oluşturma
Yeni oluşturduğumuz Demo adlı klasör içine girip sağ tıklayarak Google Colaboratory'i seçerek yeni bir Notebook oluşturalım. Bundan sonra tüm kodları bu Notebook içine yazıp çalıştıracağız.

Oluşturduğumuz notebook dosyasının adını, tohum.ipynb olarak değiştirelim.

3-Çalışma zamanını ayarlamak ve GPU seçimi
tohum.ipynb dosyasının içine girdikten sonra, Colab üzerinde çalışma zamanımızı ayarlıyoruz ve GPU seçiyoruz.

GPU Kontrolü gerçekleştirebiliriz:
import tensorflow as tf
tf.test.gpu_device_name()
4-Drive'ımızı Google Colab'a bağlamak
Öncelikle tüm çalışma dosyalarımız Google Drive üzerinde olacak dolayısıyla Drive'ımızı Google Colab'a bağlamamız gerekir. Gerekli izinleri verdikten sonra bağlama işlemi tamamlanacaktır. tohum.ipynb dosyasına girip aşağıdaki kodu çalıştıralım:
from google.colab import drive
drive.mount("/content/drive")
Kod çalıştırıldıktan sonra gelen ekranda Google Drive'a Bağlan diyoruz ve yönergeleri takip ederek gmail hesabımız ile ilgili gerekli izinleri veriyoruz.

Mounted at /content/drive gördüyseniz başarılı bir şekilde bağlantınız gerçekleşmiş demektir.
5-Çalışma dizinini ayarlamak
Şimdi oluşturduğumuz Demo adlı klasörümüzü, çalışma dizini olarak belirliyoruz.
import os
os.chdir("/content/drive/MyDrive/Demo")
6-Model dosyasını Git reposundan çekelim
Öncelikle /content/drive/MyDrive/Demo
dizine geçelim.
!cd /content/drive/MyDrive/Demo
Demo klasörü içinde olduğumuza emin olduktan sonra, aşağıdaki kod yardımıyla Git reposundan model dosyasını çekelim. İsterseniz !pwd
komutu ile hangi dizinde olduğumuzu öğrenebiliriz.
!git clone https://github.com/tensorflow/models.git
7-Protos Dosyalarını Derleme
Dosyaları derlemek için models/research
dizinine geçelim:
cd models/research
#yukarıda ki komut çalışmazsa aşağıdaki gibi çalıştırabilirsiniz
#%cd models/research
/content/drive/MyDrive/Demo/models/research
dizinine geçtik. İsterseniz !pwd
komutu ile hangi dizinde olduğunuzu öğrenebilirsiniz.
Aşağıdaki kod yardımıyla tüm dosyaları derleyebiliriz.
!protoc object_detection/protos/*.proto --python_out=.
models\research\object_detection\protos
dizini içinde derlenmiş tüm dosyaları gördüğümüze emin olmalıyız.
Bir hata karşısında, protoc --version
veya !protoc --version
komutu ile versiyonu öğrenebiliriz eğer 3.5 üzeri ise teker teker compile yapmak gerekebilir.
8- setup.py dosyasını çekmek
object_detection/packages/tf2/
içinden setup.py dosyasını kopyalayıp daha sonra Demo/models/research
klasörüne koymak için ve aşağıdaki kodu çalıştıralım:
!cp /content/drive/MyDrive/Demo/models/research/object_detection/packages/tf2/setup.py /content/drive/MyDrive/Demo/models/research
9-Install TensorFlow Object Detection API.
Öncelikle /models/research
dizinine gitmemiz gerekiyor:
!cd /content/drive/MyDrive/Demo/models/research
Şimdi aşağıdaki kodu çalıştıralım:
!python3 -m pip install .
10-To test the installation run:
!python3 /content/drive/MyDrive/Demo/models/research/object_detection/builders/model_builder_tf2_test.py
11-object_detection içinde Images Klasörü Oluşturma ve İçine Girme
Öncelikle object_detection
dizinine gidelim
cd /content/drive/MyDrive/Demo/models/research/object_detection
object_detection
içinde Images klasörü oluşturalım:
!mkdir images
Şimdi Images klasörü içine girelim:
cd images
12-Resimleri Etiketlemek
Bu adımda Google Colab dışında çalışıp resimlerimizi ve dosyalarımızı eğitime hazır hale getirmemiz gerekecek. Resimleri etiketlemek için labelImg kullanabilirsiniz. Resim etiketlemeke için çok farklı etiketleme programları da var. Neyse konumuza devam edelim: Topladığınız resimlerin özellikleri oldukça önemli: farklı arka planlarda, farklı ışıklarda ve resim içinde birbirine temas eden ya da ayrık nesnelere sahip resimler toplamanız gerekecek. Eğer birden fazla sınıf varsa her sınıf için en az 100 tane resime sahip olmanız önerilir.

PASCAL VOC formatında XML dosyası elde ettikten sonra bu dosyaları resimlerle birlikte %80 train klasörüne, %20 test klasörüne ayırıp koymalısınız.
13-Images klasörü içinde, sırasıyla train ve test adında klasörleri oluşturma
Bu bölümde, kendinize uygun olanı seçeceğiniz 2 farklı yol var. Siz sadece bir tanesini seçip yolunuza devam edebilirsiniz. Eğer resimleri Kaggle'dan çekecekseniz train ve test adında klasör oluşturmanıza gerek yok zira çekeceğiniz veri seti içinde zaten bu klasörler hazır olarak gelecekler.
- Verileri Bilgisayardan Google Drive'a Yüklemek
- Verileri Kaggle Üzerinden Google Drive'a Çekmek
1-Verileri Bilgisayardan Google Drive'a Yüklemek
images
dizini içinde train ve test adında 2 klasör oluşturalım:
!mkdir train test
train ve test klasörleri içine test ve eğitim için resimleri ve bunların .xml uzantılı dosyalarını koymalıyız.
2-Verileri Kaggle Üzerinden Google Drive'a Çekmek
Kaggle Veri Setini Google Colab'a Çekmek için kendime ait bir setini kullanacağım. Sizde sainfoin-seeds adlı veri setini buradan inceleyebilirsiniz.
Kaggle Account ile gittiğiniz sayfanın ortasında yer alan API Create New API Token ile kaggle.json dosyasını indirebilirsiniz.

İndirdiğiniz kaggle.json dosyasını Google Drive'da istediğiniz bir dizine yükleyin, Örnek: /content/drive/MyDrive/Demo/models/research/object_detection/images
içine yükledikten sonra Colab üzerinde aşağıdaki kodları çalıştırmalısınız.
import os
os.environ["KAGGLE_CONFIG_DIR"]="/content/drive/MyDrive/Demo/models/research/object_detection/images"
kaggle.json dosyasının olduğu dizine geçelim:
cd /content/drive/MyDrive/Demo/models/research/object_detection/images
Kaggle web sitesinden, veri setimizin sayfasından aşağıda resimde görüldüğü gibi api code alıyoruz.

İstersek indirdiğimiz json dosyasını kod yardımıyla Colab üzerinde bulunduğumuz dizine yükleyebiliriz.
!pip install kaggle
from google.colab import files
# Kaggle API anahtarını yükleyin
files.upload()
Aldığımız bu API kodu Colab üzerinde çalıştıralım:
!kaggle datasets download -d mahmutaydin/sainfoin-seeds
Zip dosyası olarak indirilen veri seti dosyasını zip’ten çıkarıp, zip dosyasını da silmek için aşağıdaki kodları yazıyoruz.
!unzip \*.zip && rm *.zip
artık veri setimiz istediğimiz dizinde görünüyor olmalı
14-xml_to_csv ve generate_tfrecord.py dosyalarını sırasıyla TannerGilbert'in git reposundan çekelim
!wget "https://raw.githubusercontent.com/TannerGilbert/Tensorflow-Object-Detection-API-Train-Model/master/xml_to_csv.py" -P "/content/drive/MyDrive/Demo/models/research/object_detection"
!wget "https://raw.githubusercontent.com/TannerGilbert/Tensorflow-Object-Detection-API-Train-Model/master/generate_tfrecord.py" -P "/content/drive/MyDrive/Demo/models/research/object_detection"
/Demo/models/research/object_detection
dizininde xml_to_csv.py ve generate_tfrecord.py dosyalarını görmeniz gerekiyor. Bu .py uzantılı dosyaları sonraki adımlarda kullanacağız.
15-xml to csv
.xml dosyalarını .csv dosyasına çevireceğiz çünkü tensorflow böyle istiyor ancak bunun için
/content/drive/MyDrive/Demo/models/research/object_detection
dizinine geçmeliyiz.
cd /content/drive/MyDrive/Demo/models/research/object_detection
.xml dosyalarını .csv dosyasına çevirelim:
!python3 /content/drive/MyDrive/Demo/models/research/object_detection/xml_to_csv.py
Successfully converted xml to csv. yazısını gördüyseniz işlem tamamdır.
16-generate_tfrecord.py dosyası
\models\research\object_detection\generate_tfrecord.py
dosyasında gerekli düzenlemeleri yapmamız gerekecek: Sol Menüden dosyaya çift tıklayarak açıp gerekli düzenlemeler yapılabilir. Bende 3 tane nesne sınıfı var. İsimleri sırasıyla: pods, seeds ve split
def class_text_to_int(row_label):
if row_label == 'pods':
return 1
elif row_label == 'seeds':
return 2
elif row_label == 'split':
return 3
else:
return None
Gerekli düzenlemelerin doğru bir şekilde kaydedildiğine emin olmak için dosyaya aşağıdaki kod yardımıyla göz atabilirsiniz.
!cat generate_tfrecord.py
17-TFRecord Dosyalarını Oluşturma
TF-Record (Binary Conversion) · Aşağıda ki komutlardan sonra object_detection
klasörü içinde train.record ve test.record adında 2 tane dosya oluşacak.
!python3 /content/drive/MyDrive/Demo/models/research/object_detection/generate_tfrecord.py --csv_input=/content/drive/MyDrive/Demo/models/research/object_detection/images/train_labels.csv --image_dir=images/train --output_path=train.record
!python3 /content/drive/MyDrive/Demo/models/research/object_detection/generate_tfrecord.py --csv_input=/content/drive/MyDrive/Demo/models/research/object_detection/images/test_labels.csv --image_dir=images/test --output_path=test.record
18-training klasörü oluşturma
\models\research\object_detection
dizininde olduğumuza emin olmalıyız. !pwd
komutu ile hangi dizinde olduğumuza bakabiliriz. Şimdi trainig adında bir dizin oluşturalım:
!mkdir training
19-label_map.pbtxt dosyası oluşturma
Şimdi training dizini içine girelim:
cd /content/drive/MyDrive/Demo/models/research/object_detection/training
sol menüden training klasörü içine, label_map.pbtxt adında bir dosya oluşturalım. Eğer label_map.pbtxt dosyasını kod yardımıyla oluşturmak isterseniz:
!touch '/content/drive/MyDrive/Demo/models/research/object_detection/training/label_map.pbtxt'
label_map.pbtxt dosyasına çift tıklayıp içine girerek aşağıdaki bilgileri ekliyoruz.
item {
id: 1
name: 'pods'
}
item {
id: 2
name: 'seeds'
}
item {
id: 3
name: 'split'
}
Aşağıdaki kod yardımıyla label_map.pbtxt dosyasının içeriğini görüntüleyebiliriz.
!cat /content/drive/MyDrive/Demo/models/research/object_detection/training/label_map.pbtxt
20-Eğitim Yapılandırılması
seçtiğiniz modele göre bir eğitim yapılandırma dosyası oluşturmanız gerekir. TensorFlow 2 için mevcut tüm modellerin bir listesini:
https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/tf2_detection_zoo.md adresinden bulabilirsiniz.
EfficientDet D0 512x512 dosyasını indirmemiz gerekiyor. efficientdet_d0_coco17_tpu-32.tar.gz bunu zipten çıkarıp efficientdet_d0_coco17_tpu-32 klasörünü, \models\research\object_detection
dizinine taşıyalım. Şimdi tüm bunları kodlar yardımıyla yapalım:
A) EfficientDet D0 512x512 dosyasını \models\research\object_detection
dizinine indirelim
!wget "http://download.tensorflow.org/models/object_detection/tf2/20200711/efficientdet_d0_coco17_tpu-32.tar.gz" -P "/content/drive/MyDrive/Demo/models/research/object_detection"
B) /content/drive/MyDrive/Demo/models/research/object_detection
dizinine gidelim.
cd /content/drive/MyDrive/Demo/models/research/object_detection
C) tar dosyasından çıkaralım
!tar -xvf /content/drive/MyDrive/Demo/models/research/object_detection/efficientdet_d0_coco17_tpu-32.tar.gz
21- ssd_efficientdet_d0_512x512_coco17_tpu-8.config dosyasında gerekli düzenlemeler
\models\research\object_detection\configs\tf2
dosyasında da ssd_efficientdet_d0_512x512_coco17_tpu-8.config adında bir config dosyası var. Bu dosyayı \models\research\object_detection\training
adresine kopyalayalım, kodlar şu şekilde:
!cp /content/drive/MyDrive/Demo/models/research/object_detection/configs/tf2/ssd_efficientdet_d0_512x512_coco17_tpu-8.config /content/drive/MyDrive/Demo/models/research/object_detection/training/
ssd_efficientdet_d0_512x512_coco17_tpu-8.config dosyasında gerekli düzenlemeleri yapabiliriz.
num_classes değerini, sınıf sayınız kaç tane ise o kadar olacak, bizde 3 tane nesne sınıfı var. İsimleri sırasıyla: pods, seeds ve split
batch_size değerini, donanımınızın gücüne göre 4, 8, 16 olarak değiştirebilirsiniz.
13.satır num_classes: 3
141.satır fine_tune_checkpoint: "/content/drive/MyDrive/Demo/models/research/object_detection/efficientdet_d0_coco17_tpu-32/checkpoint/ckpt-0"
143.satır fine_tune_checkpoint_type: "detection"
144.satır batch_size: 4
180.satır label_map_path: "/content/drive/MyDrive/Demo/models/research/object_detection/training/label_map.pbtxt"
182.satır input_path: "/content/drive/MyDrive/Demo/models/research/object_detection/train.record"
191.satır label_map_path: "/content/drive/MyDrive/Demo/models/research/object_detection/training/label_map.pbtxt"
197.satır input_path: "/content/drive/MyDrive/Demo/models/research/object_detection/test.record"
22- Tensorboard
Tensorboard, Tensorflow kurulumu ile birlikte gelen, eğitim sürecini tarayıcı üzerinden daha ergonomik bir şekilde takip edilebilmesini sağlayan bir araçtır.
!tensorboard dev upload --logdir "/content/drive/MyDrive/Demo/models/research/object_detection/training/train"
Eğitimin loss değeri 0.05'in altına inmeye başladığında ve modelinizi yeterince eğittiğinize inandıysanız Ctrl+C ile eğitimi durdurabilirsiniz.
TensorBoard'ı farklı şekilde de açabilirsiniz:
%load_ext tensorboard
%tensorboard --logdir '/content/training/train'
23- Eğitimi başlatma
Eğitimi başlatmadan önce output kutucuğuna yazılacak mesaj uzunluğunu 100 karaktere sınırlayalım, ram dolmasın
pd.set_option('display.max_colwidth',100) #100 karaktere sınırla
Daha sonra eğitim için kullanacağım veriyi kontrol amacıyla ilk 5 satırını yazdırıyorum:
import pandas as pd
train_df = pd.read_csv("/content/drive/MyDrive/Demo/models/research/object_detection/images/train_labels.csv")
train_df.head()
Artık eğitimi başlatabiliriz.
!python3 /content/drive/MyDrive/Demo/models/research/object_detection/model_main_tf2.py --pipeline_config_path=training/ssd_efficientdet_d0_512x512_coco17_tpu-8.config --model_dir=training --alsologtostderr
Eğitimin total loss değeri 0.05'in altına inmeye başladığında ve modelinizi yeterince eğittiğinize inandıysanız Ctrl+C ile eğitimi durdurabilirsiniz.
Bazı hataları almamak için bir kaç yükleme(Opsiyonel):
Öncelikle /content/drive/MyDrive/Demo/models/research/object_detection
dizininde yüklemeler yapacağımız için bu dizine gidelim.
cd "/content/drive/MyDrive/Demo/models/research/object_detection"
AttributeError: module 'cv2' has no attribute '_registerMatType' hatası almamak için
!pip install "opencv-python-headless<4.3"
#DNN library is not found hatası almamak için
pip install tensorflow==2.7
24- inference_graph dosyası oluşturma
Modelimizi yeterince eğittikten sonra kullanabilmek için frozen interference graph oluşturmamız gerekiyor. Eğittiğimiz model kayıtlarını object_detection/training
klasörü içerisinde görebiliriz.
object_detection_dir= '/content/drive/MyDrive/Demo/models/research/object_detection'
!python3 {object_detection_dir}/exporter_main_v2.py \
--trained_checkpoint_dir={object_detection_dir}/object_detection/training \
--pipeline_config_path={object_detection_dir}/training/ssd_efficientdet_d0_512x512_coco17_tpu-8.config \
--output_directory {object_detection_dir}/inference_graph
25-Nesne Tanıma
Öncelikle /content/drive/MyDrive/Demo/models/research/object_detection
dizinine gidelim.
cd /content/drive/MyDrive/Demo/models/research/object_detection
Ardından detect_from_image.py
dosyasını TannerGilbert reposundan çekelim.
!wget "https://raw.githubusercontent.com/TannerGilbert/Tensorflow-Object-Detection-with-Tensorflow-2.0/master/detect_from_image.py" -P "/content/drive/MyDrive/Demo/models/research/object_detection"
TannerGilbert reposundan çektiğimiz detect_from_image.py dosyası üzerinden /content/drive/MyDrive/Demo/models/research/object_detection/20_mixed_nt_flash_only_IMG_0020.jpg
adlı resim üzerindeki tohumları test edelim:
!python3 /content/drive/MyDrive/Demo/models/research/object_detection/detect_from_image.py -m "/content/drive/MyDrive/Demo/models/research/object_detection/inference_graph/saved_model" -l "/content/drive/MyDrive/Demo/models/research/object_detection/training/label_map.pbtxt" -i "/content/drive/MyDrive/Demo/models/research/object_detection/20_mixed_nt_flash_only_IMG_0020.jpg"
Sonuç olarak myGraph.jpg adında bir resim dosyası elde edeceğiz. Sonuç:

Veri setimiz ne kadar büyük olursa öğrenme o oranda iyi olacaktır. Bu örnekte çok az bir veri seti kullandım ancak daha fazla resim kullanarak daha iyi sonuçlar elde edileceği muhakkak. Ancak sadece veri setinin büyüklüğü iyi bir model için yeterli değildir, bunun yanı sıra çeşitliliği de önemlidir. Çeşitlilik arttığı oranda modelin başarımı da artış gösterecektir.
Kaynaklar
- https://gilberttanner.com/blog/tensorflow-object-detection-with-tensorflow-2-creating-a-custom-model/
- https://medium.com/mlearning-ai/tensoflow-object-detection-api-with-tf1-vs-tf2-9d716be1f5d9
- https://blog.tensorflow.org/2021/01/custom-object-detection-in-browser.html
- https://www.youtube.com/watch?v=XZ7FYAMCc4M