Nesne Tanıma Algoritması: Faster R-CNN Nedir?
Gün geçtikçe gelişim hızını daha da artırarak büyüyen yapay zeka dünyası ile makinelerin önemi daha da artmıştır. Yavaş yavaş insan dilini, Speech Konuşma tanıma ile tanımlayabilen makineler bilgisayarlı görme sayesinde insanlar gibi görerek nesneleri, yüzleri, hareketleri algılayabilmektedir.
Resimleri yüksek doğruluk oranları ile algılayabilen, sınıflandırabilen, yeniden yapılandırabilen derin öğrenmeli bilgisayarlı görme modellerinin vazgeçilmezi olan bir algoritma vardır. Daha önceki yazılarımda detaylı olarak incelediğimiz bu algoritma CNN (Convolutional Neural Networks), bir diğer adıyla evrişimli sinir ağlarıdır.
CNN Mimarisi Nedir?
CNN ağırlıklı olarak görüntü işlemede kullanılan ve girdi olarak görselleri alan bir derin öğrenme algoritmasıdır. Farklı işlemler ile görsellerdeki özellikleri yakalayan ve onları sınıflandıran bu algoritma farklı katmanlardan oluşmaktadır. Convolutional Layer, Pooling ve Fully Connected olan bu katmanlardan geçen görsel, farklı işlemlere tabii tutularak derin öğrenme modeline girecek kıvama gelir. CNN modelleri oluştururken, düzensiz veri ile uğraştığımızdan klasik algoritmalara kıyasla veri ön işleme kısmında çok uğraştırmaktadır.
Günümüzde belirli algoritmalar sayesinde görme yetisini makinelere kazandırmaya başlayan araştırmacılar bu konuda en büyük yardımı CNN (Convolutional Neural Network) algoritmaları sayesinde başarabilmekte. CNN algoritmaları görüntü sınıflandırma ve nesne tespiti gibi birçok alanda kullanılmaktadır. Fakat bu iyi algoritmanın bazı zaafları da bulunmakta. Çok işlevli olan CNN algoritmasının en büyük zaafı bir görselde aynı anda sadece bir obje tespit edebilmesi. Bu nedenle içinde birden fazla sınıfta obje bulunan görsellerde tek başına CNN algoritması pek de doğru bir tercih olmamakta. Görüntü işlemede bu sorunu çözmek için uzmanlar daha da derin nesne tanıma algoritmaları geliştirmiştir.
R-CNN (Bölgesel Tabanlı CNN)
R-CNN mimarisi, görüntülerde bulunan objelere ait sınıfları ve bu objelere ait bounding box’ları (sınırlayıcı kutular) tespit etmek için kullanılır. Çoklu objeye sahip görsellerde kolay bir şekilde CNN çalıştıramadığımızdan R-CNN mimarisi geliştirilmiştir
R-CNN’de, görüntü yaklaşık 2000 bölge tavsiyesine (bölge teklifleri) bölünür ve her bölgeye sırası ile CNN (ConvNet) uygulanır. Bölgelerin boyutu belirlenir ve yapay sinir ağına doğru bölge yerleştirilir. Resimdeki her bir bölge ayrı olarak CNN uyguladığından, eğitim süresi yaklaşık 84 saat ve tahmin süresi yaklaşık 47 saniyedir.
R-CNN ile ilgili sorun
- Her görüntünün 2000 bölge önerisini sınıflandırması gerektiği için ağı eğitmek çok zaman alır.
- GPU’daki bir görüntüdeki nesnelerin algılanması 49 saniye gerektirir
- Çok fazla disk alanı da gereklidir.
- Pahalıdır
Fast R-CNN
R-CNN’de görüntü 2000 bölge tavsiyesine bölündüğünden dolayı R-CNN de eğitmenin çok zaman alacağını ve bunun maliyetinin yüksek olacağını söyledik. R-CNN’in bu sorununu çözmek için Fast R-CNN önerildi.Tüm görüntüyü ve bölge tavsiyelerini CNN mimarisinde girdi olarak tek bir ileri yaymada alır.(Önce resmi bölge tavsiyelerine göre ayırmaz.) Ayrıca, mimarilerin farklı bölümlerini (ConvNet, RoI havuzu ve sınıflandırma katmanı gibi) tek bir eksiksiz mimaride birleştirir. Bu aynı zamanda bir özellik haritası saklama gereksinimini ortadan kaldırır ve disk alanından tasarruf sağlar. Ayrıca, SVM’den(Support Vector Machine) daha hızlı olduğu ve daha iyi doğruluk sağladığı kanıtlanan bölge önerisi sınıflandırmasında SVM yerine softmax katmanını kullanır.
Fast R-CNN, eğitimi (8.75 saat — 84 saat) tamamlar ve R-CNN’e göre algılama süresini büyük ölçüde iyileştirir . Ayrıca, R-CNN ile karşılaştırıldığında, Ortalama Hassasiyeti (mAP) iyileştirir.
Fast R-CNN ile ilgili sorunlar:
- Algılama sırasında Fast R-CNN tarafından alınan bölge çoğunlukla, seçici bir arama bölgesi önerisi oluşturma algoritmasıdır. Bu nedenle, Faster R-CNN’de ele alınan bu mimarinin başlıca sorunudur.
Fast R-CNN’de:
1- Tüm görsel CNN ile işlenir ve öznitelik haritaları çıkarılır.
2- Her bölge önerisi için gerekli öznitelikler toplanır. Bunlara region proposal feature map denir. Ardından bu haritalar max pooling ile belirli boyutlara indirgenir. Bu havuzlama katmanına ise RoI pooling layer adı verilir.
3- Ardından bu öznitelik haritaları tek boyutlu vektör haline indirgenir.
4- Bu vektörler sinir ağına sokulur ve softmax ile bölgedeki objeye ait sınıf, bounding box regressor ile de objenin sınırlayıcı kutusu belirlenir.
Faster R-CNN Mimarisi
Genel olarak Faster R-CNN nesne tanıma algoritması bu şekilde özetlenebilir. Şimdi de bu algoritmanın bir örnekle daha iyi anlaşılmasını sağlayalım.
Metal Levhalar Üzerindeki Hata Tiplerinin Tespiti
Şimdi Faster R-CNN algoritmasını kullanarak metal levhalar üzerindeki hata tiplerini tespit edip bu hataların sınıflandırılmasına ilişkin bir modelin kurulumunu gerçekleştireceğiz.
Biz bu projeyi “Anaconda Prompt” üzerinden “Virtual Environment” oluşturarak gerçekleştirdik. Öncelikle Anaconda’ nın bilgisayarımızda kurulu olması gerekmektedir.
Bu çalışmada Tensorflow v1.15 (CPU) kullandık. Buna uygun python sürümlerine buradan bakabilirsiniz. Tensorflow GPU kullanmak isteyenler CUDA ve cuDNN indirmeleri gerekmektedir. Ekran kartınıza uygun versiyonları öğrenmek için buraya göz atabilirsiniz.
1. İlk olarak https://github.com/tensorflow/models adresindeki dosyayı .zip formatında indirelim.(TensorFlow Object Detection API repository)
2. C:/ dizininde “tensorflow1” isimli bir dosya açın ve indirdiğimiz “models_master.zip” dosyasını buraya çıkartalım ve ismini “models” olarak değiştirelim.
3. Bu linkten “faster_rcnn_ inception_ v2_coco” eğitilmiş modelini indirelim. Bu dosyayı C:\tensorflow1\models\research\object_detection klasörüne çıkartalım.
4. Github repomdaki “object_detection.zip” adlı dosyayı indirin ve ..\object_detection klasörü içerisine çıkartalım.
5. Bu işlemleri yaptıktan sonra şimdi “Virtual Environment” oluşturalım. Anaconda Prompt’ a aşağıdaki komutu yazalım ve bunu aktif hale getirelim.
6. Kullanacağımız kütüphaneleri sırası ile indirelim. Tüm kütüphanelerin düzgün yüklendiğinden emin olun.
7 . Pythonpath’ i belirtmemiz gerekiyor. “Virtual Environment” i aktif hale getirdiğimizde bu komutuda her zaman çalıştırmanız gerekiyor.
8. tf_slim’ i kullanacağımız için bunu da yüklemeliyiz.
9. Şimdi protobufları derlememiz gerekiyor. İlk önce komut satırında aşağıdaki komutu çalıştırın ve dizini ayarlayın. Daha sonra diğer komutu çalıştıralım.
10. Devamında kurulum dosyalarını çalıştıralım.
11. Şimdi verileri Labelimg programı ile etiketleyelim. İlk önce aşağıdaki komutu çalıştıralım ve daha sonra command prompt a “labelimg” yazalım.
12. Fotoğrafları bu şekilde hem eğitim hemde test kümesi için etiketleyelim. Xml dosyaları ile birlikte fotoğrafları C:\tensorflow1\models\research\object_detection\images
dizininde train ve test dosyaları oluşturarak buraya atalım.
Xml dosyalarını .csv formatına dönüştürmek için aşağıdaki komutu çalıştıralım.
13. Bundan sonra “object_detection” klasörü içerisinde ki “generate_tfrecord.py” isimli dosyayı bir text editörü ile açalım. Sınıfları kendi verimize göre düzenleyelim.
14. “Record” dosyalarını oluşturmak için aşağıdaki komutları çalıştıralım. Öncesinde dizini şu şekilde ayarlayalım: C:\tensorflow1\models\research\object_detection
15. ..\object_detection\training dosyası içerisindeki “labelmap.pptxt” dosyasını bir editör yardımı ile açalım ve kendi sınıflarımıza göre düzenleme yapalım.
16. Faster_rcnn_inception_v2.. klasörü içerisinde ki “pipeline.config” dosyasını ve ..\object_detection\samples\configs dosya konumunda ki “faster_rcnn_inception_v2_pets.config” dosyasını ..\object_detection\training dosyası içerisine kopyalayalım.
17. Daha sonra “faster_rcnn_inception_v2_pets.config” dosyasını bir text editörü ile açalım. Bazı düzenlemeler yapmalıyız.
#(9. satır) num_classes değerini 3 olarak değiştirelim.
#(110. satır) faster_rcnn_v2_coco modeliniz nerede ise dosya yolunu doğru bir şekilde ayarlayın. fine_tune_checkpoint : "C:/tensorflow1/models/research/object_detection/faster_rcnn_inception_v2_coco_2018_01_28/model.ckpt"
#(126 ve 128. satır) input_path : "C:/tensorflow1/models/research/object_detection/train.record"
Bu şekilde görünmelidir.
label_map_path: "C:/tensorflow1/models/research/object_detection/training/labelmap.pbtxt"
#(132. satır) Test kümemizde kaç adet fotoğraf varsa belirtiniz.(num_examples)
#(140 ve 142. satır) input_path : "C:/tensorflow1/models/research/object_detection/test.record"
Bu şekilde gözükmelidir ve ya sizin dosya konumlarınıza göre değişebilir.
label_map_path: "C:/tensorflow1/models/research/object_detection/training/labelmap.pbtxt"
18. “inference_graph” dosyası içerisindeki her şeyi ve “training” dosyası içerisindeki kontrol noktalarını silelim. Daha sonra dizini ..\object_detection olacak şekilde ayarlayıp aşağıdaki komutu çalıştıralım ve modelimizi eğitmeye başlayalım.
Kayıp değeri kalıcı bir şekilde 0.05 in altına düştüğünde “anaconda prompt” u kapatabiliriz.
19. “inference_graph” dosyası oluşturalım. XXXX yazan yere son kontrol noktasına ait değeri girelim. ..\object_detection\training dosyasına bakabilirsiniz.
20. Modeli test etmek için komut satırına “idle” yazalım. Açılan pencerede sol üst köşeden “Object_detection_image.py” dosyasını seçelim. “num_classes” değişkenine sınıf sayımızı girelim ve test etmek istediğimiz resmin dosya yolunu aşağıda belirtelim. F5 ile çalıştırabiliriz.
Şimdi sonuçları görelim.
Sonraki yazımızda görüşmek üzere …