7 Aşamada Tensorflow Object Detection Api kullanılarak Nesne Tanıma Uygulaması

Feyza
5 min readJul 1, 2020

--

Tensorflow object detection apisi kullanılarak nesne tanıması :

Öncelikle bilgisayarınızda Anaconda ve Tensorflow kurulumunun yapılması gerekiyor. Tensorflow’u CPU veya bilgisayarınızın ekran kartı destekliyorsa GPU için kurabilirsiniz. Ben bilgisayarımın ekran kartını kullandığım için Cuda 10.0 ve Cudnn 7.4.2 yükledim.

Nesne Tanıma Uygulaması için Gerekli Adımlar

  1. Tensorflow Object Detection Kurulumu ve Anaconda Virtual Environment Oluşturma
  2. Resim Toplayıp Etiketleme
  3. Eğitim Verisi Oluşturma
  4. Label Map Oluşturma ve Eğitim Ayarları
  5. Eğitim Gerçekleştirme
  6. Inference Graph Oluşturma
  7. Programı Kullanma

Adım 1.a : Tensorflow Object Detection Kurulumu ve Anaconda Virtual Environment Oluşturma

İlgili linkten Tensorflow reposundan models klasörünü indirin.Ve C diskinizde resimde görüldüğü gibi önce tensorflow2 klasörü oluşturup içerisine models klasörünü ekleyin.

Link: https://github.com/tensorflow/models

Kodların üzerinde gerekli güncellemelerin yapılmış halini aşağıdaki github reposundan indirin ve object_detection klasörünün içerisine ekleyin.

https://github.com/

Eğitim işlemimizi gerçekleştirirken Faster-RCNN-Inception-V2-COCO modelini kullanacağız. Aşağıdaki linkten indirebilirsiniz. İndirme işlemi tamamlandıktan sonra aynı şekilde bu klasörü de object_detection klasörünün içerisine ekleyin.

https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/detection_model_zoo.md

Faster-RCNN-Inception-V2-COCO

Faster-RCNN-Inception-V2-COCO Modelimizi de ilgili dizine ekledikten sonraki görünümü aşağıdaki resimde görüldüğü gibi olmalıdır.

Gerekli tüm klasör ve ilgili .py scriptlerinin, klasörünüzün içerisinde aşağıda belirten gibi olduğunu son bir kez kontrol edelim.

Adım 1.b : Anaconda Virtual Environment Kurulumu

Komut penceresini yönetici olarak açın. Virtual environment oluşturmak için aşağıdaki komutu yazın:

  • C:\> conda create -n tensorflow1 python=3.6

Virtual environment’ı aktifleştirmek için aşağıdaki komutu kullanın:

  • C:\> activate tensorflow1

Virtual environment aktifleştiyse parantez içerisinde (tensorflow1) göreceksiniz. Bu virtual environment üzerinde tek tek aşağıdaki tüm kütüphaneleri kurun:

  • (tensorflow1) C:\> pip install tensorflow-gpu==1.15.0
  • (tensorflow1) C:\> conda install -c anaconda protobuf
  • (tensorflow1) C:\> pip install pillow
  • (tensorflow1) C:\> pip install lxml
  • (tensorflow1) C:\> pip install jupyter
  • (tensorflow1) C:\> pip install matplotlib
  • (tensorflow1) C:\> pip install pandas
  • (tensorflow1) C:\> pip install opencv-python

NOT: Tensorflow’u CPU için kuracaksanız pip install’dan GPU’yu silin.

PYTHONPATH AYARLAMA

Aşağıdaki satırlarla PYTHONPATH oluşturun.

(tensorflow1) C:\> set PYTHONPATH=C:\tensorflow2\models;C:\tensorflow2\models\research;C:\tensorflow2\models\research\slim

PROTOBUF’LARI DERLEME

Protobuf’ları derlemek için research klasörü içinde olmanız gerekiyor. Aşağıdaki satırlar ile protobuf’ları derleyin:

(tensorflow1) C:\> cd C:\tensorflow2\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

Derlenen Proto dosyalarının Görünümü
  • Aşağıdaki satırlar ile setup.py dosyasını çalıştırın. Önce build sonra install demeniz lazım.

(tensorflow1) C:\tensorflow2\models\research> python setup.py build

(tensorflow1) C:\tensorflow2\models\research> python setup.py install

2) Resimleri Toplayıp Etiketleme

Datasetinizde en az 200- 300 kadar resim olması gerekiyor.

Resimleri topladıktan sonra %20'sini \object_detection\images\test klasörüne %80'ini \object_detection\images\train klasörüne atın.

Resimleri etiketleme işlemi için LabelImg uygulamasını kullanabilirsiniz.

Github: https://github.com/tzutalin/labelImg

Download: https://www.dropbox.com/s/tq7zfrcwl44vxan/windows_v1.6.0.zip?dl=1

3)Eğitim Verisi Oluşturma

.xml dosyalarını .csv dosyasına çevireceğiz. Bunu yapmak için komut penceresinde object_detection klasöründe olmanız gerekiyor. Daha sonra aşağıdaki komutu çalıştırın. Images klasöründe 2 tane .csv dosyası aşağıdaki resimdeki gibi oluşacak.

  • (tensorflow1) C:\tensorflow2\models\research\object_detection> python xml_to_csv.py

.csv dosyaları oluşturulduktan sonra generate_tfrecord.py dosyasını herhangi bir text editor ile açın. 31. satırda sınıf bilgilerinizi girin. Benim datasetimde 5 tane sınıf olduğu için 5 tane farklı ID atadım. Sınıf sayınıza göre bunları değiştirerek 1'den başlayarak sınıf sayınız kadar ID atayın.

Örneğin bizim örnek veri set için :

generate_tfrecord.py

Sınıflarınıza ID verdikten sonra aşağıdaki komutlar hem test hem train için TFRecord dosyası oluşturun. Komutları çalıştırdıktan sonra object_detection klasöründe test.record ve train.record dosyaları yaratılacak.

  • python generate_tfrecord.py — csv_input=images\train_labels.csv — image_dir=images\train — output_path=train.record
  • python generate_tfrecord.py — csv_input=images\test_labels.csv — image_dir=images\test — output_path=test.record

4)Label Map Oluşturma ve Eğitim Ayarları

Label map modele hangi ID’de hangi sınıf var onu söyler. object_detection/training klasörüne gidin ve hazır olarak kullanmak isterseniz labelmap_narenltk.pbtxt dosyasını açın ve içerisinde değiştirmek istediğiniz sınıf id bilgilerini giriniz. Aynı veri setini kullanacaksanız herhangi bir değişiklik yapmanıza gerek yok.

labelmap_narenltk.pbtxt file

Eğitim Ayarları

Bu aşamada hangi model ve hangi parametreler kullanılacak belirliyoruz.

  1. C:\tensorflow2\models\research\object_detection\samples\configs klasörüne gidin
  2. faster_rcnn_inception_v2_pets.config dosyasını kopyalayıp object_detection\training klasörüne yapıştırın. (Hangi modeli kullanacaksanız o modelin config dosyasını yapıştırın)
  3. Text editor ile bu dosyayı açın ve aşağıdaki değişiklikleri yapın.
  • 9. satır: Buraya sınıf sayınızı yazın. Benim için bu num_classes : 5.
  • 110. satır: fine_tune_checkpoint’e aşağıdaki satırı verin. (Hangi modeli kullanmak istiyorsanız onu verin)

fine_tune_checkpoint : "C:/tensorflow2/models/research/object_detection/faster_rcnn_inception_v2_coco_2018_01_28/model.ckpt"

  • 126 ve 128. satır: train_input_reader içerisinde input_path ve label_map_path belirleyin. Bunları aşağıdaki satırlardaki gibi değiştirin.

input_path : “C:/tensorflow2/models/research/object_detection/train.record”

label_map_path: “C:/tensorflow2/models/research/object_detection/training/labelmap_narenltk.pbtxt”

  • 132. satır: Bu satırda num_examples’a kaç tane test resminiz varsa onu vereceksiniz. images\test klasöründe kaç tane test resminiz olduğunu öğrenebilirsiniz. Ben de 67 tane var. O yüzden num_examples: 67 yazmam gerekiyor.
  • 140 ve 142. satır: eval_input_reader içerisinde input_path ve label_map_path belirleyin. Bunları aşağıdaki satırlardaki gibi değiştirin.

input_path : “C:/tensorflow2/models/research/object_detection/test.record”

label_map_path: “C:/tensorflow2/models/research/object_detection/training/labelmap_narenltk.pbtxt”

5. Eğitimi Gerçekleştirme

Eğitimi çalıştırmak için aşağıdaki komutu /object_detection klasörü içerisinde çalıştırın. En az 50 bin adım eğitmeniz , modelinizin daha başarılı sonuçlar vermesine olanak sağlayacaktır.

python train.py --logtostderr --train_dir=training/ --pipeline_config_path=training/faster_rcnn_inception_v2_pets.config

Eğitimi Tensorboard’da takip etmek için yeni bir komut penceresi açıp aşağıdaki komutu çalıştırın:

(tensorflow1) C:\tensorflow2\models\research\object_detection>tensorboard --logdir=training

Tensorboard’u açmak için verilen adrese gidebilirsiniz. Veya tarayıcınızda bu adrese gidebilirsiniz: localhost:6006

Tensorboard’u kapatmak için Tensorboard’un açılı olduğu komut penceresinde Ctrl+C’ye basın.

6. Inference Graph

Eğitim işleminden Modeli kullanabilmek için frozen inference graph oluşturacağız. Bunun için aşağıdaki komutu çalıştırabilirsiniz. Komutta yazan XXXX yerine training klasöründe .ckpt dosyalarından sayısı en büyük olanı yazın. Mesela training klasöründen en büyük sayı olarak “ model.ckpt-55841” görüyorsanız XXXX yerine 55841 yazacaksınız.

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-XXXX --output_directory inference_graph

7. Programı Kullanma

Eğer konsolu kapattıysanız her defasında set komutu ile klasörün yerini belirlemelisiniz.

activate tensorflow1

set PYTHONPATH=C:\tensorflow2\models;C:\tensorflow2\models\research;C:\tensorflow2\models\research\slim

object_detection klasöründeyken idle yazın ve resim üzerinden nesne tanıma yapacaksanız ilgili scripti(Object_detection_image.py) açın.

cd C:\tensorflow2\models\research\object_detection

idle komutu ile programı çalıştırma

Resim, video ve webcam için python scriptleri mevcuttur. Bu scriptleri çalıştırmadan önce açın ve NUM_CLASSES değişkenine sınıf sayınızı atayın.

Object_detection_image.py’ı çalıştırdığınız zaman object_detection dosyasında test1.jpg isimli resim üzerinde tanıma yapacak. Bu kodlarla istediğiniz gibi oynayarak nesne tanıma yapabilirsiniz.

Örnek resim üzerinden test işlemi sonucu :

test.jpg

Kaynaklar

  1. Edje Electronics : https://www.youtube.com/watch?v=Rgpfk6eYxJA

Tensorflow Object Detection Api kullanılarak Nesne Tanıma Uygulaması için katkılarından dolayı @narenltk teşekkürler.

--

--