· Hakan Çelik · OpenCV / Temel İşlemler · 3 dk okuma

Performans Ölçüm Ve Geliştirme Teknikleri

Herkese merhaba arkadaşlar bu bölümde opencv'de yaptığımız çalışmaları nasıl daha permormanslı yani daha hızlı vb olayları öğrenmeye çalışacağız.Biliyor olmanız gerektiği gibi opencv gibi teknolojiler
OpenCV Serisi 16/64
  1. 1. Boya Fırçası Olarak Fare
  2. 2. Canny Kenar Algılama
  3. 3. Görüntü Geçişleri
  4. 4. Görüntü Piramitleri
  5. 5. Görüntülerde Aritmetik İşlemler
  6. 6. Görüntülerle İlgili Temel İşlemler
  7. 7. Görüntünün Geometrik Dönüşümleri
  8. 8. Görüntüyü Yumuşatma - ( Smoothing Images )
  9. 9. Histogramlar
  10. 10. Konturler ( Contours )
  11. 11. Morfolojik Dönüşümler
  12. 12. Opencv Nedir Ve Kurulumu
  13. 13. Opencv Resim Işlemleri
  14. 14. Opencv Video Işlemleri
  15. 15. Opencv'de Çizim Fonksiyonları
  16. 16. Performans Ölçüm Ve Geliştirme Teknikleri
  17. 17. Renk Alanlarını Değiştirme
  18. 18. Renk Paleti Olarak Parça Çubuğu ( Trackbar )
  19. 19. Resim Eşikleme
  20. 20. Şablon Eşleştirme
  21. 21. Hough Doğru Dönüşümü
  22. 22. Hough Daire Dönüşümü
  23. 23. Fourier Dönüşümü
  24. 24. Histogram Eşitleme
  25. 25. 2B Histogramlar
  26. 26. Histogram Geri Projeksiyonu
  27. 27. Kontur Özellikleri
  28. 28. Kontur Nitelikleri
  29. 29. Konturlerle Daha Fazla İşlev
  30. 30. Kontur Hiyerarşisi
  31. 31. GrabCut ile Etkileşimli Ön Plan Çıkarma
  32. 32. Watershed Algoritması ile Görüntü Segmentasyonu
  33. 33. Özellikleri Anlamak
  34. 34. Harris Köşe Tespiti
  35. 35. Shi-Tomasi Köşe Dedektörü ve İzlenecek İyi Özellikler
  36. 36. SIFT'e Giriş (Ölçek Değişmez Özellik Dönüşümü)
  37. 37. SURF'e Giriş (Hızlandırılmış Sağlam Özellikler)
  38. 38. Köşe Tespiti için FAST Algoritması
  39. 39. BRIEF — İkili Sağlam Bağımsız Temel Özellikler
  40. 40. ORB (Yönlü FAST ve Döndürülmüş BRIEF)
  41. 41. Özellik Eşleştirme
  42. 42. Özellik Eşleştirme + Nesneleri Bulmak için Homografi
  43. 43. Meanshift ve Camshift ile Nesne Takibi
  44. 44. Optik Akış
  45. 45. Arka Plan Çıkarma
  46. 46. Kamera Kalibrasyonu
  47. 47. Poz Tahmini
  48. 48. Epipolar Geometri
  49. 49. Stereo Görüntülerden Derinlik Haritası
  50. 50. k-En Yakın Komşuyu Anlamak
  51. 51. kNN ile El Yazısı OCR
  52. 52. SVM'yi Anlamak
  53. 53. SVM ile El Yazısı OCR
  54. 54. K-Ortalamalar Kümeleme'yi Anlamak
  55. 55. OpenCV'de K-Ortalamalar Kümeleme
  56. 56. Görüntü Gürültü Giderme
  57. 57. Görüntü Onarımı (Inpainting)
  58. 58. Yüksek Dinamik Aralık (HDR) Görüntüleme
  59. 59. Haar Cascade ile Yüz Tespiti
  60. 60. pip ile OpenCV Kurulumu
  61. 61. Ubuntu'da OpenCV-Python Kurulumu
  62. 62. Fedora'da OpenCV-Python Kurulumu
  63. 63. Windows'ta OpenCV-Python Kurulumu
  64. 64. OpenCV-Python Bağlayıcıları Nasıl Çalışır?

Performans Ölçüm Ve Geliştirme Teknikleri

Herkese merhaba arkadaşlar bu bölümde opencv’de yaptığımız çalışmaları nasıl daha permormanslı yani daha hızlı vb olayları öğrenmeye çalışacağız.Biliyor olmanız gerektiği gibi opencv gibi teknolojilerle kodlama yaparken bir çok sayıda işlem yapılıyor bizim genel hedefimiz amacımıza uygun olarak doğru sonucu bulmak oluyor fakat en hızlı ve en güvenilir sekilde bu doğru sonucu elde etmek biz yazılımcıların çalışma sistemi olması gerek neyse konuya geçelim.

Hedefler

  • Kodunuzun performansını ölçmek için
  • Kodunuzun performansını artırmak için bazı ipuçları
  • Ve son olarak bu fonksiyonları öğrenip işlemi bitireceğiz cv2.getTickCount, cv2.getTickFrequency vs.

OpenCV ile Performans Ölçümü

İlk olarak cv2.getTickCount() fonksiyonu,saat devir sayısını veriyor, örnek olarak şu şekilde çıktı alıyoruz, bu fonksiyon bir referasn olayından sonra ( siz bir düymeyi açmişsiniz gibi ) bu fonksiyonu çağırana kadar geçen saat devrim sayısını döndürüyor, dolayısı ile bu yapılacak olan kodlamadan önce ve sonra çağrılarak geçen saat devrim sayıları alınıp aradaki fark’a bakara performans ile ilgili bir fikir edinebiliyorsunuz.

>>> import cv2
>>> e1 = cv2.getTickCount()
>>> e2 = cv2.getTickCount()
>>> e1
311581540258
>>> e2
311594815111

ikinci olarak cv2.getTickFrequency() fonksiyonu saat çevrimlerinin frekansını veya saniyedeki saat çevrim sayısını döndürür. Saniye olarak yürütme süresini bulmak için şunları yapabilirsiniz.

>>> e1 = cv2.getTickCount()
# burada sizin kodlarınızın olması gerek
>>> e2 = cv2.getTickCount()
>>> time = (e2-e1)/cv2.getTickFrequency()
>>> time # burada geçen zamanı bulmuş oluyoruz
0.6719153391030833

dökümandaki örneğe bakıcak olursak Aşağıdaki örnek, 5 ila 49 arasında değişen tek boyutlu bir çekirdek ile medyan filtreleme uygular. (sonuç önemsiz çünkü bu bizim amacımız değil):

import cv2
img1 = cv2.imread('messi5.jpg')
e1 = cv2.getTickCount() # kodlarımızı çalıştırmadan önce tick sayısını alıyoruz
for i in xrange(5,49,2):           # kodlarımız
    img1 = cv2.medianBlur(img1,i)  # kodlarımız ne yaptığı umrumuzda bile değil,çünkü amacımız bu işlemi kaç sanıyede yaptığı
e2 = cv2.getTickCount() # işlem bittikten sonra ikinci tick 'imizi alıyoruz
t = (e2 - e1)/cv2.getTickFrequency() # geçen zamanı hesaplıyoruz ,tick arasındaki fark ve 1 saniyede geçen tick sayısına bölerek geçen zamanı buluyoruz
print t
# sonuç 0.521107655 saniye çıkıyor, sizde deneyin sonuç fazla çıkarsa resmin boyutunu küçültün ,küçülme işlemi için python'un bir başka kütüphanesi olan PIl'i kullanabilirsiniz,bir şeyler yapın işte en hızlı hesaplamasını sağlayın amacımız bu değilmi ?

Aslında sizin şu sıralarda ulan ne gerek var ben bu zaman hesaplamasını python’un time modulü ile de yaparım demeniz gerek, evet yapabilirsiniz yine aynı şekilde kodlarınızı yazmadan önce e1 = time.time() diyip daha sonra kodlar bittikten sonra yine e2 = time.time() diyerek aradaki farka bakıp ne kadar süre geçtiğini bulabilirsiniz.

OpenCV’de Varsayılan Optimizasyon

OpenCV işlevlerinin birçoğu SSE2, AVX vb. Kullanılarak optimize edilmiştir. Ayrıca optimize edilmemiş kod içerir. Dolayısıyla, sistemimiz bu özellikleri destekliyorsa onları kullanmalıyız (hemen hemen tüm modern işlemciler onları destekliyor). Derleme sırasında varsayılan olarak etkindir. Yani OpenCV optimize edilmiş kod etkinse çalıştırır, aksi takdirde optimize edilmemiş kodu çalıştırır. Cv2.useOptimized() işlevinin etkin / devre dışı olup olmadığını kontrol etmek ve cv2.setUseOptimized() işlevini etkinleştirmek / devre dışı bırakmak için kullanabilirsiniz. Basit bir örnek görelim.

# bu kodlar galiba Ipython kullanılarak yapılmış pek emin değilim
import cv2
# kontrol ediyoruz eğer optimizasyon açık ise
# 5.satırada bu yüzden büyük ihtimal daha önceki satırlarda resmi yani img 'i  tanımlamış
In [5]: cv2.useOptimized()# önce optimizasyon açık iken kodları çalıştıracağız ve zaman bilgisini alacağız Ipython zaten her işlemden sonra bunu bize veriyor ama Ipython kullanmıyorsanız yukarıtaki anlatılanlar veya time modulünü kullanarak geçen zamanı hesaplayabilirsiniz.
Out[5]: True
In [6]: %timeit res = cv2.medianBlur(img,49)
10 loops, best of 3: 34.9 ms per loop # geçen süre 34.9 saniye iken
# devre dışı bırakıyoruz
In [7]: cv2.setUseOptimized(False) # optimizasyonu kapatıp deniyoruz
In [8]: cv2.useOptimized()
Out[8]: False # kapalı şuan
In [9]: %timeit res = cv2.medianBlur(img,49)
10 loops, best of 3: 64.1 ms per loop # ve 64.1 saniye , yani optimizasyon iyidir onu sevin

Kaynak: OpenCV Python Tutorials — Orijinal Döküman

Back to Blog

Related Posts

View All Posts »
OpenCV-Python Bağlayıcıları Nasıl Çalışır?

OpenCV-Python Bağlayıcıları Nasıl Çalışır?

OpenCV · 3 dk

OpenCV-Python bağlayıcılarının nasıl oluşturulduğunu öğrenin. C++ modüllerinin Python'a nasıl aktarıldığını, CV_EXPORTS_W, CV_WRAP gibi makroları ve gen2.py üreteci ile hdr_parser.py başlık ayrıştırıcısını anlattım.

Haar Cascade ile Yüz Tespiti

Haar Cascade ile Yüz Tespiti

OpenCV · 3 dk

OpenCV'de Haar Cascade sınıflandırıcılarını kullanarak yüz ve göz tespiti yapın. cv.CascadeClassifier ile gerçek zamanlı nesne tespitinin temellerini anlattım.

Görüntü Onarımı (Inpainting)

Görüntü Onarımı (Inpainting)

OpenCV · 2 dk

Eski fotoğraflardaki hasarları, çizikleri ve lekeleri OpenCV'nin cv.inpaint() fonksiyonu ile nasıl onaracağınızı öğrenin. Telea ve Navier-Stokes algoritmalarını anlattım.