در بخش قبلی آموزش پردازش تصویر با نرم افزار OpenCV به عملیات محاسباتی در تصاویر پرداختیم. در این بخش و هفتمین قسمت از آموزش به تکنیک های اندازه گیری و بهبود عملکرد در نرم افزار OpenCV میپردازیم. در ادامه آموزش پردازش تصویر OpenCV رزبری پای با دیجی اسپارک، مرجع تخصصی رزبری پای به زبان فارسی همراه باشید.
اهداف اندازه گیری عملکرد
در پروژههای پردازش تصویر بسته به نوع حساسیت آن، در هر ثانیه عملیاتهای مختلفی انجام میگیرند. بنابراین لازم است کد بصورت بهینه از منابع سیستم استفاده کند تا با کندی یا حتی قطع شدن مواجه نشویم. بخصوص وقتی از رزبری پای استفاده میکنیم که منابع سیستم ما محدود هستند. به همین دلیل در این آموزش میخواهیم کدهای خود را بهبود عملکرد دهیم. برای اینکار از توابعی همچون cv2.getTickCount و cv2.getTickFrequency بهره خواهیم برد. البته این کار با ماژول تایم خود پایتون نیز امکان پذیر است ولی این توابع برای خود OpenCV بهینه شدهاند.
اندازه گیری عملکرد با OpenCV
تابع cv2.getTickCount به ما تعداد چرخههای ساعت (clock-cycles) را میدهد. بدین معنی که در واقع زمان از شروع برنامه را به ما دهید. تابع cv2.getTickFrequency فرکانس چرخههای ساعت (تعداد چرخه های ساعت در ثانیه) را میدهد. با دقت به مثال زیر متوجه خواهید شد که چگونه میتوان مدت زمان اجرای یک تابع یا یک تکه کد را اندازه گیری کرد:
e1 = cv2.getTickCount() # تابع یا یک تکه کد e2 = cv2.getTickCount() time = (e2 - e1)/ cv2.getTickFrequency()
حال به این مثال که میخواهیم در آن مدت زمان اجرای یک فیلترینگ را تست کنیم توجه کنید:
import cv2 img1 = cv2.imread('img.jpg') e1 = cv2.getTickCount() for i in xrange(5,49,2): img1 = cv2.medianBlur(img1,i) e2 = cv2.getTickCount() t = (e2 - e1)/cv2.getTickFrequency() print t # زمان دریافتی برای من ۳۳٫۸۰۹۸۸۷۸۶۱ ثانیه بود
این فقط یک تست بود و زمان دریافتی خیلی ملاک نیست.
بهینه سازی پیش فرض در OpenCV
بسیاری از توابع OpenCV با SSE2, AVX و غیره جهت بهبود عملکرد ، بهینه میشوند. با این حال هنوز بعضی از کدها بهینه نشدهاند. بنابراین اگر سیستم ما از این ویژگیها پشتیبانی کند، باید از آنها بهره برداری کنیم. تقریبا تمام پردازندههای روزمره از آنها پشتیبانی میکنند. برای اطلاع از فعال بودن این قابلیت با تابع cv2.useOptimized() میتوانید اطمینان حاصل پیدا کنید.
# چک کردن اینکه آیا قابلیت بهینه سازی فعال است یا خیر cv2.useOptimized() #True #به عنوان مثال اعمال فیلتر با بهینه سازی cv2.medianBlur(img,49) #۱۰ loops, best of 3: 34.9 ms per loop # غیر فعال کردن بهینه سازی cv2.setUseOptimized(False) #به عنوان مثال اعمال فیلتر بدون بهینه سازی cv2.medianBlur(img,49) #۱۰ loops, best of 3: 64.1 ms per loop
هماینطور که مشاهده میکنید، این قابلیت تقریبا سرعت توابع را دو برابر میکند.
تکنیک های بهینه سازی عملکرد
چندین تکنیک برای اجرای بهینه برنامه در پایتون وجود دارد. با انجام آنها برنامه مورد نظر بسیار روانتر و سریعتر اجرا خواهد شد.
- اجتناب از به کار بردن حلقه بخصوص حلقههای تو در تو
- الگوریتمها و کدهای خود را برداری کنید. به این دلیل که OpenCV و Numpy برای توابع برداری بهینه شدهاند.
- از کش استفاده کنید.
- هیچ موقع از آرایهای کپی برداری نکنید این کار بشدت زمان بر میباشد.
حتی اگر باز هم برنامه شما کند بود از کتابخانه هایی همچون Cython برای تسریع استفاده کنید.
چنانچه در مراحل راه اندازی و انجام این پروژه با مشکل مواجه شدید، بدون هیچ نگرانی در انتهای همین پست، به صورت ثبت نظر سوالتان را مطرح کنید. من در سریعترین زمان ممکن پاسخ رفع مشکل شما را خواهم داد. همچنین اگر ایرادی در کدها و یا مراحل اجرایی وجود دارند میتوانید از همین طریق اطلاع رسانی کنید.
پروژه و دریافت بن ارسال رایگان
برای دریافت بن خرید از دانشجو کیت، کاربران بایستی با استفاده از وسایل این آموزش، پروژه را اجرا کرده و یا حتی مدار جدیدی تعریف کنید. سپس از اجرای کار فیلم گرفته و در شبکههای اجتماعی از جمله آپارات و اینستگرام، با هشتگهای دیجی_اسپارک دانشجوکیت digispark daneshjookit منتشر کنند. سپس از طریق بخش نظرات در ادامه همین آموزش، جهت دریافت بن خرید ارسال رایگان به ارزش ۱۲۰۰۰ تومان از دانشجو کیت، لینک را زیر همین پست ارسال کنید.
در پایان نظرات و پیشنهادات خود را با ما درمیان بگذارید و با اشتراک گذاری این آموزش در شبکه های اجتماعی , از وبسایت دیجی اسپارک حمایت کنید.
سلام ممنونم از اینکه تجربیات ارزشمندتون رو با دیگران اشتراک میگذرید.
مطلب مفیدی بود
یه سوال دارم
من کدم رو به cython تبدیل کردم اما کد نصفه اجرا میشود یعنی وقتی به یک for بزرگ میرسد دیگر اجرا نمیکند
مشکل از کجاست؟ باید چه کار کنم؟