اذهب إلى المحتوى
  • 0

قياس الأداء وتحسينه في OpenCV

Ali Ismael

السؤال

Recommended Posts

  • 1

بالنسبة لقياس الأداء فهناك التابع getTickCount الذي يعطينا عدد دورات الساعة CK التي استغرقناها لتنفيذ عملية أو مجموعة عمليات ضمن الكود. وأيضاً التابع getTickFrequency الذي يعطينا تردد دورات الساعة، أو عدد دورات الساعة في الثانية. ولإيجاد زمن تنفيذ المقطع البرمجي الخاص بك بالثواني:

import cv2
e1 = cv2.getTickCount() # البداية
# الكود الخاص بك يكون هنا 
e2 = cv2.getTickCount() # النهاية
time = (e2 - e1)/ cv2.getTickFrequency()

مثال:

import cv2 as cv
import numpy as np
image = cv.imread("im.jpg")
t1 = cv.getTickCount()
# سنقوم بتجريب فلتر بقيم مختلفة للكيرنل
for i in range(3,30,2):
	img1 = cv.medianBlur(image,i)
t2 = cv.getTickCount()
time = (t2 - t1)/cv.getTickFrequency()
print(time)
# 0.432018214 seconds

أما بالنسبة لتحسين الأداء فهناك ما يسمى ب "الحل المثالي" حيث يمكنك تشغيل العديد من التوابع في OpenCV في هذا الوضع، لذا إذا كان لديك نظام يدعم خاصية "الحل المثالي" فيمكنك استخدام هذه الخاصية (حالياً جميع المعالجات تدعم ذلك).
لتفعيل هذه الخاصية نستخدم cv2.setUseOptimized حيث نمرر له True لتفعيلها و False لإلغاء التفعيل، ولمعرفة فيما إذا كان الكود ينفذ مع المحسَن optimizer أم لا، نقوم باستدعاء التابع cv2.useOptimized حيث يعيد True  إذا كانت الخاصية مفعلة وإلا False:

cv2.useOptimized() # False # أي أنها معطلة
%timeit cv.medianBlur(image,33)
# 10 loops, best of 3:66.3 ms per loop
# الآن سنقوم بتفعيلها
cv2.setUseOptimized(True)
cv2.useOptimized() # TRUE
%timeit cv.medianBlur(image,33)
# 10 loops, best of 3:30.3 ms per loop

 لاحظ أن الزمن قد تحسن بمقدار الضعف.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 1

يمكنك استخدام الدالة cv2.getTickCount() لقياس الوقت الذي يستغرقه الكود عن طريق بدء العد قبل بداية تنفيذ الكود ثم وقفه في نهاية الكود وحساب فرق الوقت بين البداية والنهاية ويكون هو الوقت الذي استغرقه الكود كالتالي:

e1 = cv2.getTickCount()  # البداية
ret, frame = cap.read()
cv2.imshow("cam",frame)
e2 = cv2.getTickCount()  # النهاية

كذلك يمكنك استخدام الدالة time ، أنظر المقارنة بين الطريقيتين واستخدامهم:

t_start=time.time()  # البداية
time1=0

while True:
    e1 = cv2.getTickCount()
    ret, frame = cap.read()
    cv2.imshow("cam",frame)
    e2 = cv2.getTickCount()
    time1 = (e2 - e1)/ cv2.getTickFrequency() + time1
    elapsedTime= time.time()-t_start  # النهاية

ولتحسين الأداء يمكننا استخدام cv2.setUseOptimized  كالتالي:

# التأكد من تشغيله
In [5]: cv.useOptimized()
Out[5]: True
In [6]: %timeit res = cv.medianBlur(img,49)
10 loops, best of 3: 34.9 ms per loop
# وقفه
In [7]: cv.setUseOptimized(False)
In [8]: cv.useOptimized()
Out[8]: False
In [9]: %timeit res = cv.medianBlur(img,49)
10 loops, best of 3: 64.1 ms per loop

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...