خانه > مقالات آموزشی > استفاده از ماژول شبکه های عصبی عمیق OpenCV با GPU های انویدیا ، CUDA و cuDNN

استفاده از ماژول شبکه های عصبی عمیق OpenCV با GPU های انویدیا ، CUDA و cuDNN

در این آموزش، شما یاد یاد خواهید گرفت که چگونه از ماژول شبکه های عصبی عمیق (DNN)  OpenCV با GPU های انویدیا (Nvidia) ،  CUDA  و  cuDNN برای ۲۱۱-۱۵۴۹% استنباط سریع تر، استفاده کنید.

در آگوست سال ۲۰۱۷، من اولین آموزشم در مورد استفاده از ماژول شبکه های عصبی عمیق (DNN) OpenCV را برای طبقه بندی تصویر منتشر کردم.

خوانندگان سایت PyImageSearch، راحتی و سهولت استفاده از ماژول شبکه های عصبی عمیق (DNN) OpenCV را آنقدر دوست داشتند که بعد از آن به انتشار آموزش های اضافی در مورد ماژول DNN، از جمله موارد زیر پرداختیم:

هر کدام از این راهنما ها از ماژول شکبه عصبی عمیق DNN OpenCV برای (۱) بارگذاری یک شبکه از قبل آموزش دیده از دیسک، (۲) انجام پیش بینی روی یک تصویر ورودی و سپس (۳) نمایش نتایج، استفاده شده که به شما امکان می دهد بینایی رایانه یا خط لوله ( Pipeline ) یادگیری عمیق برای پروژه خاصتان را بسازید.

با این حال، بزرگترین مشکل ماژول شکبه عصبی عمیق ( DNN ) OpenCV عدم پشتیبانیGPU  های انویدیا و  CUDAاست – با استفاده از این مدل ها شما به راحتی نمی توانید از یک GPU برای بهبود فریم در ثانیه (FPS) نرخ فرایند خط لوله خود استفاده کنید.

این موضوع برای آموزش های SSD (Single Shot Detector)، که به راحتی می توانید با سرعت بیش از ۲۵ الی ۳۰ فرم بر ثانیه روی یک CPU اجرا کنند، مشکل بزرگی نبود، اما برای YOLO و Mask R-CNN که برای دریافت نرخ فریم از ۱ الی ۳ فریم بر ثانیه روی یک CPU تلاش می کنند، یک مشکل بزرگ محسوب می شود.

همه ی این ها در  برنامه ی Google Summer Of Code (GSoC یک برنامه جهانی است که توسعه دهندگان دانشجویی دانشگاه ها را از سراسر جهان جذب می کند تا در پروژه های منبع باز مشارکت کنند ) سال ۲۰۱۹ تغییر کرد.

OpenCV 4.2 که تحت رهبری دیویس کینگ از تیم کتابخانه منبع باز dlib ، و توسط یاشاس ساماگا پیاده سازی شده، اکنون از GPU های انویدیا برای استنباط با استفاده از ماژول شکبه عصبی عمیق ( DNN ) OpenCV پشتیبانی می کند و سرعت استنباط را تا ۱۵۴۹٪ بهبود می بخشد!

در آموزش امروز، به شما نشان می دهیم که چگونه OpenCV را کامپایل و نصب کنید تا از  GPUهای انویدیا خود برای استنباط شبکه عصبی عمیق بهره ببرید.

سپس در آموزش هفته آینده کد SSD، YOLO و Mask R-CNN را برای شما ارائه می دهیسم که می توانید برای بهره بردن از GPU با اسفاده از OpenCV استفاده کنید.

سپس نتایج را محک می زنیم و آن ها را با تنها استنتاج CPU مقایسه می کنیم، بنابراین می دانید که کدام مدل ها می توانند بیشترین مزیت را از استفاده یک GPU داشته باشند.

برای یادگیری نحوه کامپایل و نصب ماژول شکبه عصبی عمیق ( DNN ) OpenCV با پشتیبانی GPU های انویدیا ، CUDA و cuDNN، به خواندن ادامه دهید!

نحوه استفاده از ماژول OpenCV شبکه های عصبی عمیق (OpenCVs DNN) با  GPU های انویدیا ،  CUDA  و  cuDNN

در ادامه این آموزش به شما نحوه کامپایل OpenCV از منبع را نشان می دهیم تا بتوانید از استنتاج شتاب داده شده پردازنده گرافیکی انویدیا برای شبکه های عصبی عمیق از قبل آموزش دیده بهره ببرید.

فرضیات هنگام کامپایل OpenCV برای پشتیبانی GPU های انویدیا

برای تهیه و نصب ماژول OpenCV “شبکه عصبی عمیق” با پشتیبانی انویدیا GPU، فرض های زیر را در نظر می گیریم:

  • شما یک پردازنده گرافیکی انویدیا دارید. این باید یک فرض آشکار باشد. اگر پردازنده گرافیکی انویدیا ندارید، نمی توانید ماژول OpenCV “شبکه عصبی عمیق” با پشتیبانی پردازنده گرافیکی انویدیا را کامپایل کنید.
  • شما در حال استفاده از Ubuntu 18.04 (یا یک سیستم تحت دبیان دیگر) هستید. وقتی بحث یادگیری عمیق پیش می آید، مطمئنا ماشین های یونیکس را بیش از سیستم های ویندوز توصیه می کنیم. اگر قصد دارید از یک GPU برای یادگیری عمیق استفاده کنید، با Ubuntu کار کنید تا macOS یا ویندوز – پیکربندی آن بسیار ساده تر است.
  • شما می دانید چگونه از خطوط دستور (command line ) استفاده کنید. ما در این آموزش از خطوط دستور استفاده خواهیم کرد. اگر با خطوط دستور آشنا نیستید، توصیه می کنم ابتدا این مقدمه را در مورد خطوط دستور بخوانید و سپس چند ساعت (یا حتی چند روز) را به تمرین بپردازید. این آموزش برای کسانی که تازه وارد در خطوط دستور هستند نیست.
  • شما قادر به خواندن خروجی ترمینال و تشخیص مشکلات هستید. کامپایل کردن OpenCV از منبع می تواند چالش برانگیز باشد اگر قبلاً این کار را نکرده باشید – تعدادی کار وجود دارد که می تواند به شما کمک کند، از جمله بسته های مفقود شده، مسیرهای نادرست کتابخانه و غیره. حتی با راهنما های دقیق ما، به احتمال زیاد در طول مسیر به اشتباهاتی بر خواهید خورد. دلسرد نشوید! وقت بگذارید تا دستوراتی را که اجرا می کنید، کارهایی که انجام می دهند را بفهمید و از همه مهم تر، خروجی دستورات را بخوانید! کور کورانه کپی و چسباندن نکنید. شما فقط به خطا می روید.

با تمام آنچه گفته شد، بیایید پیکربندی ماژول OpenCV شبکه عصبی عمیق را برای استنتاج پردازنده گرافیکی انویدیا (NVIDIA GPU) شروع کنیم.

مرحله شماره ۱: درایورهای NVIDIA CUDA ، جعبه ابزار CUDA و cuDNN را نصب کنید

درایور های شبکه های عصبی عمیق انویدیا

این آموزش این فرض در نظر گرفته می شود که شما این موارد را در اختیار دارید:

  • یک پردازنده گرافیکی انویدیا.
  • درایورهای CUDA برای آن GPU خاص نصب شده است.
  • جعبه ابزار CUDA و cuDNN پیکربندی و نصب شده است.

اگر شما یک پردازنده گرافیکی انویدیا در سیستم خود دارید اما هنوز نصب درایورهای CUDA، جعبه ابزار CUDA و cuDNN را ندارید، ابتدا باید دستگاه خود را پیکربندی کنید – ما پیکربندی و نصب CUDA در این راهنما را پوشش نمی دهیم.

برای یادگیری نحوه نصب درایور های  NVIDIA CUDA،جعبه ابزار CUDA و cuDNN، توصیه می کنیم راهنمای نصب Ubuntu 18.04 و TensorFlow / Keras GPU را مطالعه کنید – پس از نصب درایور های مناسب NVIDIA، می توانید دوباره به این آموزش مراجعه کنید.

مرحله شماره ۲: OpenCV و پیوست های GPU مربوط به شبکه عصبی عمیق “dnn” را نصب کنید.

اولین قدم برای پیکربندی ماژول شبکه عصبی عمیق OpenCV برای استنباط پردازنده گرافیکی انویدیا ، نصب پیوست های مناسب است:

$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get install build-essential cmake unzip pkg-config
$ sudo apt-get install libjpeg-dev libpng-dev libtiff-dev
$ sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev
$ sudo apt-get install libv4l-dev libxvidcore-dev libx264-dev
$ sudo apt-get install libgtk-3-dev
$ sudo apt-get install libatlas-base-dev gfortran
$ sudo apt-get install python3-dev

در صورت دنبال کردن راهنمای پیکربندی یادگیری عمیق Ubuntu 18.04، باید اکثر این بسته ها نصب شده باشند، اما من توصیه می کنم که دستور فوق را فقط برای ایمن بودن اجرا کنید.

مرحله شماره ۳: کد منبع OpenCV را بارگیری کنید.

هیچ نسخه ی نصبی با قابلیت pip (مدیریت پکیج استاندارد برای پایتون) از OpenCV وجود ندارد که از پشتیبانی پردازنده گرافیکی انویدیا برخوردار باشد – در عوض، ما نیاز داریم تا OpenCV از پایخ با تنظیمات پیکربندی مناسب پردازنده گرافیکی انویدیا کامپایل کنیم.

اولین قدم برای این کار بارگیری کد منبع برای OpenCV v4.2 است:

$ cd ~
$ wget -O opencv.zip https://github.com/opencv/opencv/archive/4.2.0.zip
$ wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/4.2.0.zip
$ unzip opencv.zip
$ unzip opencv_contrib.zip
$ mv opencv-4.2.0 opencv
$ mv opencv_contrib-4.2.0 opencv_contrib

اکنون می توانیم نسخه ی خودمان را پیکربندی کنیم.

مرحله شماره ۴: محیط مجازی پایتون را پیکربندی کنید

شبکه های عصبی عمیق opencv در محیط مجازی پایتون

اگر راهنمای پیکربندی Ubuntu 18.04،  TensorFlow  و یادگیری عمیق  Keras را دنبال کرده اید، پس باید تا الان virtualenv و virtualenvwrapper را نصب داشته باشید:

  • اگر ماشین شما تا الان پیکربندی شده است، در این بخش به دستورات mkvirtualenv بروید.
  • در غیر این صورت، برای پیکربندی ماشین خود، با هر یک از این مراحل همراه باشید.

محیط های مجازی پایتون بهترین تمرین در مورد توسعه پایتون است. آن ها به شما امکان می دهند نسخه های مختلفی از کتابخانه های پایتون را در محیط های بسته و ی مستقل، توسعه و تولید کنید. محیط های مجازی پایتون بهترین تمرین در دنیای پایتون محسوب می شود – من از آن ها روزانه استفاده می کنم و شما نیز باید آن ها را بکار بگیرید.

اگر هنوز pip ، مدیر بسته پایتون را نصب نکرده اید، می توانید با استفاده از دستور زیر این کار را انجام دهید:

$ wget https://bootstrap.pypa.io/get-pip.py
$ sudo python3 get-pip.py

پس از pip ، می توانید هر دو virtualenv و virtualenvwrapper را نصب کنید:

$ sudo pip install virtualenv virtualenvwrapper
$ sudo rm -rf ~/get-pip.py ~/.cache/pip

سپس می بایست فایل bashrc~/. خود را باز کرده و هر وقت یک ترمینال را باز می کنید آن را به بارگیری به طور خودکار virtualenv / virtualenvwrapper به روز کنید.

من ترجیح می دهم از ویرایشگر متن nano استفاده کنم، اما شما می توانید از هرکدام از ویرایشگر ها که راحت تر هستید استفاده کنید:

$ nano ~/.bashrc

پس از باز کردن فایل ~ / .bashrc ، به پایین فایل بروید و موارد زیر را وارد کنید:

# virtualenv and virtualenvwrapper
export WORKON_HOME=$HOME/.virtualenvs
export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3
source /usr/local/bin/virtualenvwrapper.sh

از آنجا ، ترمینال خود را ذخیره کرده و از آن خارج شوید (ctrl + x , y , enter).سپس می توانید فایل ~ / .bashrc  خود را در دوره آموزشی ترمینال خود مجددا بارگیری کنید:

$ source ~/.bashrc

فقط باید یکبار دستور فوق را اجرا کنید – از آنجا که فایل ~ / .bashrc خود را به روز کردید، هر زمان که یک پنجره ترمینال جدید باز می کنید، متغیرهای محیط virtualenv / virtualenvwrapper به طور خودکار تنظیم می شوند.

مرحله آخر ایجاد محیط مجازی پایتون است:

$ mkvirtualenv opencv_cuda -p python3

دستور mkvirtualenv با استفاده از پایتون ۳، یک محیط مجازی جدید پایتون با نام opencv_cuda ایجاد می کند.

سپس باید NumPy را در محیط opencv_cuda نصب کنید:

$ pip install numpy

اگر ترمینال خود را ببندید یا محیط مجازی پایتون خود را غیرفعال کنید، می توانید دوباره از طریق دستور workon به آن دسترسی پیدا کنید:

$ workon opencv_cuda

اگر در محیط های مجازی پایتون تازه وارد هستید، پیشنهاد می کنم که یک لحظه وقت بگذارید و نحوه کار آن ها را مطالعه کنید – آن ها بهترین تمرین در دنیای پایتون هستند.

اگر تصمیم به استفاده از آن ها ندارید، اصلا مشکلی ندارد، اما به خاطر داشته باشید که انتخاب شما، شما را از یادگیری بهترین تمرین های پایتون بی نیاز نمی کند. اکنون وقت خود را برای سرمایه گذاری در دانش خود بگذرانید.

مرحله شماره ۵: نسخه معماری CUDA خود را تعیین کنید

هنگام کامپایل ماژول شبکه عصبی عمیق کتابخانه باز OpenCV با پشتیبانی پردازنده گرافیکی انویدیا ، ما باید نسخه معماری پردازنده گرافیکی انویدیا خود را تعیین کنیم:

  • این شماره نسخه زمانی مورد نیاز است که متغیر CUDA_ARCH_BIN را در دستور cmake خود در قسمت بعدی تنظیم کنیم.
  • نسخه معماری پردازنده گرافیکی انویدیا بستگی به GPU مورد استفاده شما دارد، بنابراین اطمینان حاصل کنید که مدل GPU خود را قبل می شناسید.
  • عدم تنظیم صحیح متغیر CUDA_ARCH_BIN شما می تواند باعث شود OpenCV هنوز در حال کامپایل باشد اما در استفاده از GPU شما برای استنباط، شکست بخورد (تشخیص و رفع اشکال آن را مشکل ساز می کند).

یکی از ساده ترین راه ها برای تعیین  نسخه معماری پردازنده گرافیکی انویدیا استفاده از دستور nvidia-smi می باشد:

$ nvidia-smi
Mon Jan 27 14:11:32 2020
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 410.104      Driver Version: 410.104      CUDA Version: 10.0     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   ۰  Tesla V100-SXM2...  Off  | 00000000:00:04.0 Off |                    0 |
| N/A   35C    P0    38W / 300W |      0MiB / 16130MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+

با بررسی خروجی، می توانید ببینید که من از یک NVIDIA Tesla V100 GPU استفاده می کنم. حتماً دستور nvidia-smi را خودتان اجرا کنید تا قبل از ادامه مدل GPU خود را تشخیص دهید.

اکنون که مدل پردازنده گرافیکی انویدیا خود را دارم، می توانم برای تعیین نسخه معماری به مرحله بعد بروم.

با استفاده از این صفحه می توانید نسخه معماری پردازنده گرافیکی انویدیا را برای GPU خاص خود بیابید:

https://developer.nvidia.com/cuda-gpus

به لیست محصولات  Tesla،  QuadroT NVS، GeForce/Titan و  Jetson دارای CUDA بروید.

لیست Cuda انویدیا
شکل ۱: نحوه فعال سازی CUDA در نصب OpenCV برای پردازنده های گرافیکی انویدیا

از آنجا که من از V100 استفاده می کنم، روی بخش “CUDA-Enabled Tesla Products” کلیک می کنم:

کارت گرافیک های انویدیا Cuda
شکل ۲: به عنوان مرحله بعدی بر روی بخش “CUDA-Enabled Tesla Products” کلیک کنید تا CUDA را در نصب OpenCV برای پردازنده گرافیکی انویدیا خود نصب کنید.

با حرکت به سمت پایین فهرست، می توانم V100 GPU خود را ببینم:

مشخصات کارت گرافیک انویدیا
شکل ۳: نسخه معماری پردازنده گرافیکی انویدیا خود را برای نصب CUDA با OpenCV انتخاب کنید.

همانطور که مشاهده می کنید ، نسخه معماری پردازنده گرافیکی انویدیا من ۷٫۰ است – شما باید همین رویه را برای مدل GPU خود انجام دهید.

وقتی نسخه معماری پردازنده گرافیکی انویدیا خود را شناسایی کردید، آن را در نظر بگیرید و سپس به بخش بعدی بروید.

مرحله شماره ۶: OpenCV را با پشتیبانی NVIDIA GPU پیکربندی کنید.

در این مرحله ما آماده هستیم تا نسخه خود را با استفاده از دستور cmake پیکربندی کنیم.

دستور cmake به دنبال وابستگی ها جستجو می کند، نسخه را پیکربندی می کند و فایل های لازم را برای make، به منظور درواقع کامپایل OpenCV ایجاد می کند.

برای پیکربندی سیستم، ابتدا از حصول اطمینان این که شما در محیط مجازی پایتون، در حال استفاده اید تا OpenCV را با پشتیبانی پردازنده گرافیکی انویدیا کامپایل کنید، شروع کنید:

$ workon opencv_cuda

بعد، مسیر را در جایی که کد منبع OpenCV را بارگیری کرده اید تغییر دهید، و سپس یک مسیر نسخه ایجاد کنید:

$ cd ~/opencv
$ mkdir build
$ cd build

سپس می توانید دستور cmake زیر را اجرا کنید، مطمئن شوید که متغیر CUDA_ARCH_BIN را بر اساس نسخه معماری پردازنده گرافیکی انویدیا خود، که در بخش قبلی پیدا کرده اید، تنظیم کنید:

$ cmake -D CMAKE_BUILD_TYPE=RELEASE \
  -D CMAKE_INSTALL_PREFIX=/usr/local \
  -D INSTALL_PYTHON_EXAMPLES=ON \
  -D INSTALL_C_EXAMPLES=OFF \
  -D OPENCV_ENABLE_NONFREE=ON \
  -D WITH_CUDA=ON \
  -D WITH_CUDNN=ON \
  -D OPENCV_DNN_CUDA=ON \
  -D ENABLE_FAST_MATH=1 \
  -D CUDA_FAST_MATH=1 \
  -D CUDA_ARCH_BIN=7.0 \
  -D WITH_CUBLAS=1 \
  -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib/modules \
  -D HAVE_opencv_python3=ON \
  -D PYTHON_EXECUTABLE=~/.virtualenvs/opencv_cuda/bin/python \
  -D BUILD_EXAMPLES=ON ..

در اینجا می بینید که ما در حال کامپایل OpenCV با پشتیبانی CUDA و پشتیبانی cuDNN فعال شده (به ترتیب با CUDA و CUDNN) هستیم.

ما همچنین به OpenCV دستور می دهیم ماژول “dnn” را با پشتیبانی CUDA بسازد (OPENCV_DNN_CUDA).

ما همچنین FAST_MATH ، CUDA_FAST_MATH و WITH_CUBLAS را برای اهداف بهینه سازی فعال می کنیم.

پیکربندی مهمترین بخش و مستعد خطا CUDA_ARCH_BIN شماست – مطمئن شوید که آن را به درستی تنظیم کرده اید!

متغیر CUDA_ARCH_BIN باید نسخه معماری پردازنده گرافیکی انویدیا شما که در بخش قبلی یافت شد را، دنبال کند.

اگر این مقدار را نادرست تنظیم کنید، OpenCV هنوز ممکن است کامپایل شود، اما وقتی می خواهید با استفاده از ماژول dnn، استنباط را انجام دهید، خطای زیر را دریافت خواهید کرد:

File "ssd_object_detection.py", line 74, in 
    detections = net.forward()
cv2.error: OpenCV(4.2.0) /home/a_rosebrock/opencv/modules/dnn/src/cuda/execution.hpp:52: error: (-217:Gpu API call) invalid device function in function 'make_policy'

اگر با این خطا روبرو شدید، آن وقت می فهمید که CUDA_ARCH_BIN شما به درستی تنظیم نشده است.

می توانید با نگاه کردن به خروجی، اجرای صحیح دستور cmake خود را بررسی کنید:

...
--   NVIDIA CUDA:                   YES (ver 10.0, CUFFT CUBLAS FAST_MATH)
--     NVIDIA GPU arch:             70
--     NVIDIA PTX archs:
-- 
--   cuDNN:                         YES (ver 7.6.0)
...

در اینجا می بینید که OpenCV و cmake به طور صحیح GPU با قابلیت CUDA، نسخه معماری پردازنده گرافیکی انویدیا و نسخه cuDNN را شناسایی کرده اند.

همچنین می خواهم به بخش ماژول های OpenCV، به ویژه بخش To be built نگاهی بیندازم:

--   OpenCV modules:
--     To be built:                 aruco bgsegm bioinspired calib3d ccalib core cudaarithm cudabgsegm cudacodec cudafeatures2d cudafilters cudaimgproc cudalegacy cudaobjdetect cudaoptflow cudastereo cudawarping cudev datasets dnn dnn_objdetect dnn_superres dpm face features2d flann fuzzy gapi hdf hfs highgui img_hash imgcodecs imgproc line_descriptor ml objdetect optflow phase_unwrapping photo plot python3 quality reg rgbd saliency shape stereo stitching structured_light superres surface_matching text tracking ts video videoio videostab xfeatures2d ximgproc xobjdetect xphoto
--     Disabled:                    world
--     Disabled by dependency:      -
--     Unavailable:                 cnn_3dobj cvv freetype java js matlab ovis python2 sfm viz
--     Applications:                tests perf_tests examples apps
--     Documentation:               NO
--     Non-free algorithms:         YES

در اینجا می توانید تعدادی از ماژول های مختلف cuda را مشاهده کنید، نشان می دهد که cmake در حال آموزش OpenCV برای ساخت ماژول های دارای قابلیت CUDA (از جمله ماژول OpenCV’s dnn) است.

شما همچنین می توانید به بخش پایتون ۳ نگاه کنید تا تأیید کنید که مترجم و نام پای (numpy) هم به محیط مجازی پایتون شما اشاره دارند:

--   Python 3:
--     Interpreter:                 /home/a_rosebrock/.virtualenvs/opencv_cuda/bin/python3 (ver 3.5.3)
--     Libraries:                   /usr/lib/x86_64-linux-gnu/libpython3.5m.so (ver 3.5.3)
--     numpy:                       /home/a_rosebrock/.virtualenvs/opencv_cuda/lib/python3.5/site-packages/numpy/core/include (ver 1.18.1)
--     install path:                lib/python3.5/site-packages/cv2/python-3.5

حتماً به مسیر نصب نیز توجه داشته باشید!

شما هنگام اتمام نصب OpenCV به آن مسیر نیاز خواهید داشت.

مرحله شماره ۷: OpenCV را با پشتیبانی dnn GPU کامپایل کنید

با ارائه دستور cmake بدون خطا، می توانید OpenCV را با پشتیبانی پردازنده گرافیکی انویدیا با استفاده از دستور زیر کامپایل کنید:

$ make -j8

می توانید “۸” را با تعداد هسته موجود در پردازنده خود جایگزین کنید.

از آنجا که پردازنده من دارای هشت هسته است، من یک ۸ را تدارک دیدم. اگر پردازنده شما فقط دارای چهار هسته است، “۴” را با “۸” جایگزین کنید.

همانطور که می بینید، کامپایل من بدون خطا کامل شد:

opencv در cuda پردازنده گرافیکی انویدیا

یک خطای رایج که مشاهده می کنید مورد زیر است:

$ make
make: * No targets specified and no makefile found.  Stop.

اگر این اتفاق بیفتد باید به مرحله شماره ۶ برگردید و خروجی cmake خود را چک کنید – دستور cmake احتمالاً با خطا خارج شده است. اگر cmake با یک خطا خارج شود، نمی توان فایل های نسخه را برای ساختن ایجاد کرد، بنابراین دستور make گزارش می دهد که اصلا فایل های نسخه ای برای کامپایل از آن وجود ندارد. در صورت بروز چنین اتفاقی، به سراغ خروجی cmake خود بروید و به دنبال اشتباه باشید.

مرحله شماره ۸: OpenCV را با پشتیبانی dnn GPU نصب کنید

دستور make آماده خود از مرحله شماره ۷ با موفقیت تکمیل شده، اکنون می توانید OpenCV را از طریق مورد زیر نصب کنید:

$ sudo make install
$ sudo ldconfig

مرحله آخر پیوند دادن کتابخانه OpenCV به محیط مجازی پایتون شماست.

برای انجام این کار، باید از مکانی که اتصالات OpenCV در آن نصب شده بود مطلع شوید – می توانید از طریق پیکربندی مسیر نصب در مرحله شماره ۶ آن مسیر را مشخص کنید.

در مورد من، مسیر نصب این بود:

 lib/python3.5/site-packages/cv2/python-3.5

این بدان معنی است که اتصالات OpenCV من باید در ایجا باشد:

/usr/local/lib/python3.5/site-packages/cv2/python-3.5

من می توانم با استفاده از دستور ls مکان را تأیید کنم:

$ ls -l /usr/local/lib/python3.5/site-packages/cv2/python-3.5
total 7168
-rw-r--r-
۱ root staff 7339240 Jan 17 18:59 cv2.cpython-35m-x86_64-linux-gnu.so

در اینجا می توانید ببینید که اتصالات OpenCV من به صورت cv2.cpython-35m-x86_64-linux-gnu نامگذاری شده است. بنابراین مال شما نیز باید بر اساس نسخه پایتون و معماری CPU خودتان، نام مشابه خود را داشته باشید.

اکنون که محل اتصالات OpenCV خود را می دانم، باید با استفاده از دستور ln آنها را به محیط مجازی پایتون خود متصل کنم:

$ cd ~/.virtualenvs/opencv_cuda/lib/python3.5/site-packages/
$ ln -s /usr/local/lib/python3.5/site-packages/cv2/python-3.5/cv2.cpython-35m-x86_64-linux-gnu.so cv2.so

چند لحظه را برای تأیید مسیرهای فایل خود صرف کنید – اگر مسیر اتصالات OpenCV نادرست باشد، فرمان ln “بی صدا شکست می خورد”.

تاکید می کنیم ، کورکورانه دستور بالا را کپی و جایگذاری نکنید! دوباره و سه باره مسیرهای فایل خود را بررسی کنید!

مرحله شماره ۹: تأیید کنید که OpenCV از GPU شما با ماژول “dnn” استفاده می کند

مرحله آخر تأیید این است که:

  • OpenCV را می توان به ترمینال شما وارد کرد.
  • OpenCV می تواند به پردازنده گرافیکی انویدیا شما برای استنباط از طریق ماژول dnn دسترسی پیدا کند.

بیایید با تأیید اینکه می توانیم کتابخانه cv2 را وارد کنیم، شروع کنیم:

$ workon opencv_cuda
$ python
Python 3.5.3 (default, Sep 27 2018, 17:25:39)
[GCC 6.3.0 20170516] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>> cv2.__version__
'۴٫۲٫۰'
>>>

توجه داشته باشید که من برای دستیابی به محیط مجازی پایتون خود ابتدا از دستور workon استفاده می کنم – اگر از محیط های مجازی استفاده می کنید، شما باید همین کار را انجام دهید.

از آنجا کتابخانه cv2 را وارد می کنم و نسخه را نمایش می دهم.

مطمئناً، نسخه OpenCV گزارش شده v4.2 است که در واقع نسخه OpenCV است که ما از آن کامپایل کردیم.

بعد، بیایید بررسی کنیم که ماژول OpenCV’s dnn می تواند به GPU ما دسترسی پیدا کند. کلید اطمینان یافتن از استفاده ماژول OpenCV’s dnn از GPU می تواند با اضافه کردن دو خط زیر بلافاصله پس از بارگیری یک مدل و قبل از انجام استنباط، حاصل شود:

net.setPreferableBackend(cv2.dnn.DNN_BACKEND_CUDA)
net.setPreferableTarget(cv2.dnn.DNN_TARGET_CUDA)

دو خط فوق به OpenCV دستور می دهد که پردازنده گرافیکی انویدیا ما برای استنباط استفاده شود.

برای دیدن نمونه ای از مدل OpenCV + GPU در عمل، با استفاده از بخش “بارگیری ها”ی این آموزش اقدام به بارگیری کد منبع نمونه ما و تشخیص دهنده شیء SSD از قبل آموزش داده شده کنید.

از آنجا، یک ترمینال را باز کنید و دستور زیر را اجرا کنید:

$ python ssd_object_detection.py --prototxt MobileNetSSD_deploy.prototxt \
  --model MobileNetSSD_deploy.caffemodel \
  --input guitar.mp4 --output output.avi \
  --display 0 --use-gpu 1
[INFO] setting preferable backend and target to CUDA...
[INFO] accessing video stream...
[INFO] elasped time: 3.75
[INFO] approx. FPS: 65.90

فلگ –use-gpu 1 به OpenCV دستور می دهد تا از پردازنده گرافیکی انویدیا ما برای استنتاج از طریق ماژول OpenCV’s dnn استفاده کند.

همانطور که می بینید ، من با استفاده از NVIDIA Tesla V100 GPU خودم ~۶۵٫۹۰  فرم در ثانیه دریافت می کنم.

من می توانم خروجی خود را با استفاده از تنها CPU مقایسه کنم (یعنی بدون GPU):

$ python ssd_object_detection.py --prototxt MobileNetSSD_deploy.prototxt \
  --model MobileNetSSD_deploy.caffemodel --input guitar.mp4 \
  --output output.avi --display 0
[INFO] accessing video stream...
[INFO] elasped time: 11.69
[INFO] approx. FPS: 21.13

در اینجا من فقط ~۲۱٫۱۳ فرم در ثانیه دریافت می کنم، این بدان معناست که با استفاده از GPU، من ۳ برابر افزایش عملکرد را بدست می آورم!

کمک! من با خطای “make_policy” روبرو می شوم

این فوق العاده، فوق العاده برای بررسی مهم است، دوباره، و سه باره متغیر CUDA_ARCH_BIN را چک کنید.

اگر آن را اشتباه تنظیم کرده باشید، ممکن است هنگام اجرای اسکریپت ssd_object_detection.py از قسمت قبلی با خطای زیر روبرو شوید:

File "real_time_object_detection.py", line 74, in 
    detections = net.forward()
cv2.error: OpenCV(4.2.0) /home/a_rosebrock/opencv/modules/dnn/src/cuda/execution.hpp:52: error: (-217:Gpu API call) invalid device function in function 'make_policy'

این خطا نشان می دهد که هنگام اجرای cmake مقدار CUDA_ARCH_BIN شما نادرست تنظیم شده است.

باید به مرحله شماره ۵ (که در آن نسخه معماری NVIDIA CUDA خود را شناسایی می کنید) برگردید و سپس cmake و make را دوباره اجرا کنید.

من همچنین به شما پیشنهاد می کنم دایرکتوری نسخه خود را پاک کنید و قبل از اجرای cmake و make آن را از نو بسازید:

$ cd ~/opencv
$ rm -rf build
$ mkdir build
$ cd build

از آنجا می توانید هر دو cmake و make را دوباره اجرا کنید – انجام این کار در یک دایرکتوری جدید به شما اطمینان می دهد که نسخه درستی دارید و پیکربندی های قبلی (نادرست) از بین رفته است.

جمع بندی

در این آموزش شما یاد گرفتید که چگونه ماژول “OpenCV شبکه های عصبی عمیق (OpenCV’s DNN)” با پشتیبانی GPU های انویدیا ، CUDA و “cuDNN” را کامپایل و نصب کنید و به شما امکان می دهد که استنتاج و پیش بینی را ۲۱۱ الی ۱۵۴۹ درصد سریع تر بدست آورید.

استفاده از ماژول (OpenCV’s DNN) شما را ملزم به کامپایل از منبع می کند – شما نمی توانید OpenCV را با پشتیبانی GPU ” “pip install کنید.

در آموزش هفته آینده، من الگوهای یادگیری عمیق معروف را برای سرعت استنباط CPU و GPU ارزیابی خواهم کرد، از جمله:

  • Single Shot Detectors (SSD)
  • You Only Look Once (YOLO)
  • Mask R-CNNs

با استفاده از این اطلاعات، خواهید دانست که کدام مدل ها با استفاده از GPU بیشترین بهره را خواهند داشت، به شما اطمینان می دهد که می توانید تصمیم هوشمندانه ای را در مورد اینکه آیا یک GPU انتخاب خوبی برای پروژه خاص شما محسوب می شود یا نه، بگیرید.

بیشتر بخوانید :

منبع pyimagesearch
0/5 (0 نظر)

درباره‌ی احمدرضا جعفری

همچنین ببینید

شبکه های تنسور عصبی بازگشتی RNTN

یادگیری عمیق به زبان ساده : شبکه های تنسور عصبی بازگشتی – قسمت یازدهم

برخی از الگو های ذاتاً سلسله مراتبی هستند ، مانند تجزیه درختی یک جمله از …

پاسخی بگذارید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *