Tensorflow Object Detection API ile Nesne Tanıma

Buse Dinçer
Deep Learning Türkiye
7 min readDec 15, 2020

Nesne tanıma, görüntülerdeki ve videolardaki nesneleri tespit etmemizi, nesneleri tanımlamamızı, sınıflandırmamızı ve takibini yapabilmemizi sağlayan bilgisayarlı görü ve görüntü işleme ile alakalı bir teknolojidir. Tensorflow Object Detection API ise önceden eğitilmiş modelleri kullanmamızı sağlayan bir nesne tanıma aracıdır.

(https://i.morioh.com/2019/12/18/65d2da16ffc7.jpg)

Öncelikle Tensorflow Object Detection API’nin çalışması için gerek duyduğu gereksinimlerden ve kurulumlardan bahsedeceğim. Daha sonra kendi eğitim verimiz ile nesne tanıma uygulaması yapım aşamalarını adım adım inceliyor olacağız.

Not: Bu yazıda Windows işletim sistemi kullanıldığı varsayılmaktadır. Diğer işletim sistemleri için komutlar değişmektedir.

Gereksinimler

Anaconda, Python ve R programlama dilleri ile bilimsel çalışmalarda paket yönetimini kolaylaştırmayı amaçlayan bir özgür ve açık kaynaklı dağıtımdır. Daha fazla bilgi için tıklayınız.

Not: Anaconda’nın mevcut sürümü, TensorFlow tarafından resmi olarak desteklenmeyen Python 3.8'i kullanıyor. Anaconda sanal ortamı oluştururken, ona Python 3.6'i kullanmasını söyleyeceğiz.

CUDA, Nvidia tarafından ortaya konulan, bilgisayarın işlem performansına yüksek oranda katkı yapan bir paralel programlama platformudur. C, C++, C#, Fortran, Java, Python gibi programlama dilleri ile yazılmış algoritmaların GPU yani “grafik işlem birimi” üzerinde çalışmasını sağlayan bir sistemdir. cuDNN, Derin Öğrenme algoritmalarını GPU-ekran kartı üzerinde çalıştırmak için gerekli bir kütüphanedir. Daha fazla bilgi için tıklayınız.

Not: Tensorflow Object Detection API’yi GPU üzerinde kullanacaksanız CUDA ve cuDNN gereklidir. CPU(Merkezi işlem birimi) üzerinden çalıştıracaksanız gerekli değildir.

TensorFlow, gelişmiş derin öğrenme ve makine öğrenimi uygulamaları oluşturmamıza olanak tanıyan yüksek performanslı bir Python kütüphanesidir. Tensorflow 2 ve üstü sürümleri mevcuttur. Ancak Tensorflow Object Detection API ile uyum sağlaması açısından 1.14 ve altındaki sürümleri önermekteyim.

Kurulumlar

TensorFlow’un hangi sürümünün hangi CUDA ve cuDNN sürümlerini gerektirdiğini gösteren bir tablo.

Anaconda kurulumu için tıklayınız.

CUDA kurulumu için tıklayınız.

cuDNN kurulumu için tıklayınız.

Programların doğru bir şekilde çalışabilmesi için Environment Variables(Ortam değişkenleri) eklenmesi gerekmektedir. Başlangıca gidip arama kısmına ‘Environment Variables’ yazınız. System Variables’ın altındaki Path’i seçiniz ve ardından aşağıdaki Path’leri ekleyiniz.

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0\bin

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0\libnvvp

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0\extras\CUPTI\libx64

C:\cuda\bin

Anaconda’da sanal ortam oluşturma

Not:Proje boyunca tüm komutlar için Anaconda Prompt kullanılmaktadır.

Not: tensorflow sanal ortamın ismidir. İstediğiniz ismi verebilirsiniz.

(base) C:\Users\YourPCName>conda create -n tensorflow pip python=3.6

Anaconda’da sanal ortamı aktive etme

(base) C:\Users\YourPCName>activate tensorflow

Tensorflow kurulumu

GPU için

(tensorflow) C:\Users\YourPCName>pip install --ignore-installed tensorflow-gpu==1.14

CPU için

(tensorflow) C:\Users\YourPCName>pip install --ignore-installed tensorflow==1.14

Pip güncelleme

(tensorflow) C:\Users\YourPCName>python -m pip install --upgrade pip

Tensorflow, Cuda, cuDNN kurulumunu gösteren video için tıklayınız.

Diğer gerekli paketlerin kurulması

(tensorflow) C:\Users\YourPCName>conda install -c anaconda protobuf(tensorflow) C:\Users\YourPCName>pip install pillow(tensorflow) C:\Users\YourPCName>pip install lxml(tensorflow) C:\Users\YourPCName>pip install Cython(tensorflow) C:\Users\YourPCName>pip install contextlib2(tensorflow) C:\Users\YourPCName>pip install jupyter(tensorflow) C:\Users\YourPCName>pip install matplotlib(tensorflow) C:\Users\YourPCName>pip install pandas(tensorflow) C:\Users\YourPCName>pip install opencv-python

Gerekli Github Repolarının indirilmesi

Tensorflow Object Detection API reposu için tıklayınız.

Not: indirdiğiniz repoyu models adıyla bu dizine(C:\Users\YourPCName\anaconda3\envs\tensorflow) açınız.

Object Detection çalışmasıyla alakalı reposu için tıklayınız.

Not: C:\Users\YourPCName\anaconda3\envs\tensorflow\models\research\object_detection dizinine açınız.

/object_detection klasörünüz bu şekilde gözükmelidir.

(https://github.com/EdjeElectronics/TensorFlow-Object-Detection-API-Tutorial-Train-Multiple-Objects-Windows-10/raw/master/doc/object_detection_directory.jpg)

Bu repo oyun kartları nesnelerinin tanınmasıyla alakalı bir çalışmadır. Object_detection_image.py (veya video veya web kamerası) komut dosyasını çalıştırarak bunu test edebilirsiniz.

Tensorflow Object Detection API ile oyun kartları çalışması (https://github.com/EdjeElectronics/TensorFlow-Object-Detection-API-Tutorial-Train-Multiple-Objects-Windows-10/raw/master/doc/detector1.jpg)

TensorFlow, çeşitli nesne algılama modelleri (belirli sinir ağı mimarilerine sahip önceden eğitilmiş sınıflandırıcılar) sağlar. Bazı modeller daha hızlı öğrenme sağlarken bazı modeller daha yavaş ancak daha fazla doğruluk sağlar. İstediğiniz modeli indirmek için tıklayınız.

Faster-RCNN-Inception-V2 ve MobileNet-SSD-V1 modelleri arasındaki zaman ve başarı farkı (https://github.com/EdjeElectronics/TensorFlow-Object-Detection-API-Tutorial-Train-Multiple-Objects-Windows-10/raw/master/doc/rcnn_vs_ssd.jpg)
Transfer Learning Modelleri
Tensorflow Object Detection Transfer Learning Models (https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/tf1_detection_zoo.md)

Kendi nesne algılayıcınızı eğitmek istiyorsanız, aşağıdaki dosyaları silin:

\object_detection\images\train and \object_detection\images\test

\object_detection\images\train and \object_detection\images\train

içerisindeki tüm dosyaları silerek kendi test ve train görüntülerinizi bu dosyaların içerisine ekleyiniz.

\object_detection\images içerisindeki “test_labels.csv” ve “train_labels.csv” dosyaları siliniz.

\object_detection\training ve \object_detection\inference_graph içerisindeki tüm dosyaları siliniz.

Gerekli PYTHONPATH değişkenlerinin oluşturulması

(tensorflow) C:\Users\YourPCName>set C:\Users\YourPCName\anaconda3\envs\tensorflow\models(tensorflow) C:\Users\YourPCName>set C:\Users\YourPCName\anaconda3\envs\tensorflow\models\research(tensorflow) C:\Users\YourPCName>set C:\Users\YourPCName\anaconda3\envs\tensorflow\models\research\slim

Not: tensorflow sanal ortamından her çıkıldığında bu değişkenler silinmekte ve bu yüzden yeniden oluşturulması gerekmektedir.

Model ve eğitim parametrelerini yapılandırmak için Tensorflow tarafından kullanılan protobuf dosyalarının derlenmesi

C:\Users\YourPCName\anaconda3\envs\tensorflow\models\research dizinine gidiniz.

(tensorflow) C:\Users\YourPCName>cd C:\Users\YourPCName\anaconda3\envs\tensorflow\models\research

Aşağıdaki komutu kopyalayarak çalıştırınız.

(tensorflow) C:\Users\YourPCName\anaconda3\envs\tensorflow\models\research>protoc --python_out=. .\object_detection\protos\anchor_generator.proto .\object_detection\protos\argmax_matcher.proto .\object_detection\protos\bipartite_matcher.proto .\object_detection\protos\box_coder.proto .\object_detection\protos\box_predictor.proto .\object_detection\protos\eval.proto .\object_detection\protos\faster_rcnn.proto .\object_detection\protos\faster_rcnn_box_coder.proto .\object_detection\protos\grid_anchor_generator.proto .\object_detection\protos\hyperparams.proto .\object_detection\protos\image_resizer.proto .\object_detection\protos\input_reader.proto .\object_detection\protos\losses.proto .\object_detection\protos\matcher.proto .\object_detection\protos\mean_stddev_box_coder.proto .\object_detection\protos\model.proto .\object_detection\protos\optimizer.proto .\object_detection\protos\pipeline.proto .\object_detection\protos\post_processing.proto .\object_detection\protos\preprocessor.proto .\object_detection\protos\region_similarity_calculator.proto .\object_detection\protos\square_box_coder.proto .\object_detection\protos\ssd.proto .\object_detection\protos\ssd_anchor_generator.proto .\object_detection\protos\string_int_label_map.proto .\object_detection\protos\train.proto .\object_detection\protos\keypoint_box_coder.proto .\object_detection\protos\multiscale_anchor_generator.proto .\object_detection\protos\graph_rewriter.proto .\object_detection\protos\calibration.proto .\object_detection\protos\flexible_grid_anchor_generator.proto

C:\Users\YourPCName\anaconda3\envs\tensorflow\models\research dizininde aşağıdaki komutları yapıştırınız.

(tensorflow) C:\Users\YourPCName\anaconda3\envs\tensorflow\models\research>python setup.py build(tensorflow) C:\Users\YourPCName\anaconda3\envs\tensorflow\models\research>python setup.py install

Kurulumun doğru bir şekilde tamamlandığını kontrol etmek için:

\object_detection dizinine giderek aşağıdaki komut ile object_detection_tutorial.ipynb scriptini çalıştırınız.

(tensorflow) C:\Users\YourPCName\anaconda3\envs\tensorflow\models\research>cd C:\Users\YourPCName\anaconda3\envs\tensorflow\models\research\object_detection(tensorflow) C:\Users\YourPCName\anaconda3\envs\tensorflow\models\research\object_detection>jupyter notebook object_detection_tutorial.ipynb
(https://github.com/EdjeElectronics/TensorFlow-Object-Detection-API-Tutorial-Train-Multiple-Objects-Windows-10/raw/master/doc/jupyter_notebook_dogs.jpg)

Veri setinin toplanması ve etiketlenmesi

(https://github.com/EdjeElectronics/TensorFlow-Object-Detection-API-Tutorial-Train-Multiple-Objects-Windows-10/raw/master/doc/collage.jpg)

İyi bir nesne tanıma sınıflayıcısı yüzlerce görüntüye ihtiyaç duyar. Aynı zamanda görüntü kalitesi de sınıflayıcının iyi öğrenmesi için önemlidir. Test ve eğitim için görüntüler toplanarak %20’sini teste %80’nini eğitime ayrılır. Eğitim için ayrılan görüntüleri \object_detection\images\train dizinine, test için ayrılan görüntüleri de \object_detection\images\test dizinine taşıyınız.

Şimdi her görüntüdeki istediğimiz nesneleri etiketleme zamanı. Etiketlemek için LabelImg aracını kullanacağız. LabelImg github reposu için tıklayınız.

Labelmg dizinine gidin ve aşağıdaki komutları sırasıyla çalıştırınız.

conda install pyqt=5conda install -c anaconda lxmlpyrcc5 -o libs/resources.py resources.qrcpython labelImg.py

Her nesnenin etrafını çizerek sınıf bilgisini giriniz.

(https://github.com/EdjeElectronics/TensorFlow-Object-Detection-API-Tutorial-Train-Multiple-Objects-Windows-10/raw/master/doc/labels.jpg)

LabelImg, her görüntü için etiket verilerini içeren bir .xml dosyası kaydeder. Bu .xml dosyaları, TensorFlow eğiticisinin girdilerinden biri olan TFRecords oluşturmak için kullanılacaktır.

Etiketleme işlemi tamamlandıktan sonra Tensorflow eğitim modelinin girdisi verisi olarak kullanılan TFRecords’u oluşturunuz. Öncelikle etiketleme sırasında elde ettiğimiz .xml dosyalarını .csv formatına çevireceğiz.

\object_detection dizininde python xml_to_csv.py komutunu çalıştırın. Bu komut \object_detection\images dizininde train_labels.csv ve test_labels.csv oluşmasını sağlayacaktır.

(tensorflow) C:\Users\YourPCName\anaconda3\envs\tensorflow\models\research\object_detection>python xml_to_csv.py

Bir metin düzenleyicide generate_tfrecord.py dosyasını açarak kendi etiket kümenizi tanımlayınız.

# TO-DO replace this with label map
def class_text_to_int(row_label):
if row_label == 'nine':
return 1
elif row_label == 'ten':
return 2
elif row_label == 'jack':
return 3
elif row_label == 'queen':
return 4
elif row_label == 'king':
return 5
elif row_label == 'ace':
return 6
else:
None

Buradaki gibi kendi etiket kümenizle yer değiştiriniz.

# TO-DO replace this with label map
def class_text_to_int(row_label):
if row_label == 'basketball':
return 1
elif row_label == 'shirt':
return 2
elif row_label == 'shoe':
return 3
else:
None

Aşağıdaki komutlar ile TFRecord dosyalarını oluşturunuz.

(tensorflow) C:\Users\YourPCName\anaconda3\envs\tensorflow\models\research\object_detection>python generate_tfrecord.py --csv_input=images\train_labels.csv --image_dir=images\train --output_path=train.record(tensorflow) CC:\Users\YourPCName\anaconda3\envs\tensorflow\models\research\object_detection>python generate_tfrecord.py --csv_input=images\test_labels.csv --image_dir=images\test --output_path=test.record

Etiket dosyasının oluşturulması

Etiket dosyası, sınıf isimleri ile sınıf ID’lerinin eşlemesinin yer aldığı ve eğiticiye o nesnenin hangi nesneye denk geldiğinin tanımlandığı dosyadır. Bu dosya \object_detection\training dizininde labelmap.pbtxt adıyla yer alır. Bu dosyayı bir metin düzenleyicide açarak kendi etiket kümenizi yazınız.

item {
id: 1
name: 'nine'
}

item {
id: 2
name: 'ten'
}

item {
id: 3
name: 'jack'
}

item {
id: 4
name: 'queen'
}

item {
id: 5
name: 'king'
}

item {
id: 6
name: 'ace'
}

Buradaki gibi kendi etiket kümenizle yer değiştiriniz.

item {
id: 1
name: 'basketball'
}

item {
id: 2
name: 'shirt'
}

item {
id: 3
name: 'shoe'
}

Eğitim parametrelerinin yapılandırılması

9. satırdaki num_classes : 3 için kendi sınıf sayınızı giriniz.

106. satırdaki dizin için kendi dizininizi yazınız.

fine_tune_checkpoint : “…/models/research/object_detection/faster_rcnn_inception_v2_coco_2018_01_28/model.ckpt”

123. satırdaki dizin için kendi dizininizi yazınız.

input_path : “…/models/research/object_detection/train.record”

125. satırdaki dizin için kendi dizininizi yazınız.

label_map_path: “…/models/research/object_detection/training/labelmap.pbtxt”

130. Satırda yer alan num_examples’a kendi test veri sayınızı giriniz.

135. satırdaki dizin için kendi dizininizi yazınız.

input_path : “…/models/research/object_detection/test.record”

137. satırdaki dizin için kendi dizininizi yazınız.

label_map_path: “…/models/research/object_detection/training/labelmap.pbtxt”

Eğitimi başlatma

Aşağıdaki komut satırı ile eğitimi başlatın.

(tensorflow) C:\Users\YourPCName\anaconda3\envs\tensorflow\models\research\object_detection>python train.py --logtostderr --train_dir=training/ --pipeline_config_path=training/faster_rcnn_inception_v2_pets.config

Farklı bir Anaconda Prompt’an Tensorboard’ı açarak eğitimi izleyebilirsiniz.

(tensorflow)C:\Users\YourPCName\anaconda3\envs\tensorflow\models\research\object_detection>tensorboard --logdir=training

Yerel makinenizde YourPCName:6006 adresi oluşacak. Web tarayıcısına bu adresi kopyalayarak TensorBoard ile eğitimin nasıl ilerlediğini grafikler ile görebilirsiniz. Loss grafiği, sınıflandırıcının zaman içindeki genel kaybını gösteren önemli bir grafiktir.

(https://github.com/EdjeElectronics/TensorFlow-Object-Detection-API-Tutorial-Train-Multiple-Objects-Windows-10/raw/master/doc/loss_graph.JPG)

Eğitimi Durdurma ve Modeli Dışarıya Çıkarma

Eğitimin loss değeri 0.05'in altına inmeye başladığında Ctrl+C ile eğitimi durabilirsiniz. Ardından \object_detection\training klasöründeki en yüksek numaralı .ckpt dosyasının ismini X bulunan yere koplayarak aşağıdaki komutu çalıştırın.

python export_inference_graph.py --input_type image_tensor --pipeline_config_path training/faster_rcnn_inception_v2_pets.config --trained_checkpoint_prefix training/model.ckpt-X --output_directory inference_graph

Bu \object_detection\inference_graph dizininde frozen_inference_graph.pb isimli dondurulmuş bir model oluşturur.

Eğitilmiş Modeli Test Etme

Test etmek istediğiniz görüntüyü \object_detection dizinine taşıyın ve Anaconda Prompt’ta sanal ortamı aktifleştirdikten sonra ‘idle’ komutunu çalıştırın.

(tensorflow) C:\Users\YourPCName\anaconda3\envs\tensorflow\models\research\object_detection>idle

File>Open>Object_detection_image>Open’a tıklayınız.

Object_detection_image.py’yi seçtikten sonra kodların içinden NUM_CLASSES ve IMAGE_NAME değişkenlerini kendinize göre değiştirin.

Daha sonra Run>Run Module ile çalıştırın. Ve sonunda açılan pencerede tespit edilen nesneleri göreceksiniz.

(https://github.com/EdjeElectronics/TensorFlow-Object-Detection-API-Tutorial-Train-Multiple-Objects-Windows-10/raw/master/doc/detector2.jpg)

Not: Karşılabileceğiniz yaygın hatalar için tıklayınız.

Kaynaklar:

--

--