→ بازگشت به بینایی کامپیوتری

مقدمه‌ای بر بینایی ماشین

بینایی ماشین شاخه‌ای از علوم کامپیوتر است که هدف آن ایجاد قابلیت درک عمیق‌تر تصاویر دیجیتال توسط کامپیوترها می‌باشد. این تعریف نسبتاً جامع است، زیرا درک می‌تواند معانی مختلفی را شامل شود، از جمله شناسایی یک شیء در یک تصویر (شناسایی شیء - object detection)، درک وقایع در حال وقوع (شناسایی رویداد - event detection)، توصیف یک تصویر به صورت متن، یا بازسازی یک صحنه به صورت سه‌بعدی (3D).

همچنین کارهای خاصی وجود دارند که به تصاویر انسانی مرتبط می‌شوند، از جمله تخمین سن و احساسات، شناسایی و اعتبارسنجی چهره، و تخمین موقعیت سه‌بعدی به عنوان چند مثال.

یکی از ساده‌ترین وظایف در بینایی ماشین، طبقه‌بندی تصویر (image classification) است.

بینایی ماشین به‌طور معمول به عنوان یکی از زیرشاخه‌های هوش مصنوعی شناخته می‌شود. در حال حاضر، بیشتر وظایف مرتبط با بینایی ماشین با استفاده از شبکه‌های عصبی حل می‌شوند. در این بخش، بیشتر به نوع خاصی از شبکه‌های عصبی که در بینایی ماشین کاربرد دارند، یعنی شبکه‌های عصبی پیچشی، خواهیم پرداخت.

با این حال، قبل از ارسال تصویر به یک شبکه عصبی، در بسیاری از موارد، استفاده از برخی تکنیک‌های الگوریتمی به منظور بهبود تصویر منطقی به نظر می‌رسد.

چندین کتابخانه پایتون برای پردازش تصویر در دسترس می‌باشند:

  • imageio برای خواندن و نوشتن فرمت‌های متنوع تصاویر به کار می‌رود. این کتابخانه همچنین از ffmpeg، ابزاری سودمند برای تبدیل فریم‌های ویدیویی به تصاویر، پشتیبانی می‌کند.
  • Pillow (که به نام PIL نیز شناخته می‌شود)، نسبت به imageio امکانات بیشتری دارد و از برخی تغییرات تصویر همچون مورفینگ و تنظیمات پالت پشتیبانی می‌کند.
  • OpenCV یک کتابخانه قدرتمند برای پردازش تصویر است که به زبان C++ نوشته شده و به استاندارد غیر رسمی برای پردازش تصویر تبدیل شده است. این کتابخانه دارای یک رابط کاربری راحت برای پایتون می‌باشد.
  • dlib یک کتابخانه C++ است که شامل بسیاری از الگوریتم‌های یادگیری ماشین، از جمله برخی از الگوریتم‌های بینایی ماشین می‌باشد. این کتابخانه همچنین دارای یک رابط Python است و می‌تواند برای وظایف چالشی نظیر شناسایی چهره و نقاط کلیدی صورت به کار رود.

OpenCV

OpenCV به عنوان استاندارد غیر رسمی برای پردازش تصویر شناخته می‌شود. این کتابخانه شامل الگوریتم‌های مفیدی است که به زبان C++ پیاده‌سازی شده‌اند. شما می‌توانید از OpenCV در زبان پایتون نیز استفاده کنید.

این دوره یادگیری OpenCV محل مناسبی برای یادگیری OpenCV می‌باشد. هدف ما در برنامه درسی اینجا، یادگیری OpenCV نیست، بلکه نشان دادن مثال‌هایی است که در آنها می‌توان از این کتابخانه استفاده نمود و شیوه‌های کار با آن را معرفی می‌کنیم.

بارگذاری تصاویر

در پایتون، تصاویر می‌توانند به آسانی با آرایه‌های NumPy نمایش داده شوند. به عنوان مثال، تصاویر خاکستری با اندازه 320x200 پیکسل در یک آرایه 200x320 ذخیره می‌شوند و تصاویر رنگی با همان ابعاد، دارای شکل 200x320x3 (برای 3 کانال رنگ) هستند. برای بارگذاری یک تصویر، می‌توان از کد زیر استفاده کرد:

import cv2
import matplotlib.pyplot as plt

im = cv2.imread('image.jpeg')
plt.imshow(im)

به‌طور رایج، OpenCV از کدگذاری BGR (آبی-سبز-قرمز) برای تصاویر رنگی استفاده می‌کند، در حالی که سایر ابزارهای پایتون از RGB (قرمز-سبز-آبی) بهره می‌برند. به منظور نمایش صحیح تصویر، باید آن را به فضای رنگ RGB تبدیل کرد، یا با تغییر ابعاد در آرایه NumPy، یا با استفاده از یک تابع OpenCV:

im = cv2.cvtColor(im,cv2.COLOR_BGR2RGB)

همچنین می‌توان از تابع cvtColor برای انجام سایر تبدیل‌های فضای رنگی، مانند تبدیل یک تصویر به خاکستری یا تبدیل آن به فضای رنگ HSV (Hue-Saturation-Value)، استفاده کرد.

شما همچنین می‌توانید از OpenCV برای بارگذاری ویدیو به صورت فریم به فریم استفاده کنید - مثالی در تمرین دفترچه یادداشت OpenCV ارائه شده است.

پردازش تصویر

قبل از ارسال یک تصویر به یک شبکه عصبی، ممکن است بخواهید چندین مرحله پیش‌پردازش را اعمال نمایید. OpenCV قادر به انجام کارهای زیادی است، از جمله:

  • تغییر اندازه تصویر با استفاده از im = cv2.resize(im, (320,200), interpolation=cv2.INTER_LANCZOS)
  • محو کردن تصویر با استفاده از im = cv2.medianBlur(im, 3) یا im = cv2.GaussianBlur(im, (3, 3), 0)
  • تغییر روشنایی و کنتراست تصویر می‌تواند با تغییرات آرایه NumPy انجام شود، همانطور که در این یادداشت Stackoverflow شرح داده شده است.
  • استفاده از آستانه‌گذاری با فراخوانی توابع cv2.threshold/cv2.adaptiveThreshold، که غالباً برای تنظیم روشنایی یا کنتراست مورد استفاده قرار می‌گیرد.
  • اعمال تبدیلات مختلف بر روی تصویر:
    • تبدیلات Affine ممکن است مفید باشد اگر بدانید کجا چرخش، تغییر اندازه و کج‌کردن را در تصویر ترکیب کنید و سه نقطه در تصویر را مشخص کنید. تبدیل‌های Affine خطوط موازی را موازی نگه می‌دارند.
    • تبدیلات پرسپکتیو زمانی کاربردی است که شما مکان‌های منبع و مقصد چهار نقطه در تصویر را می‌دانید. به عنوان مثال، اگر از یک سند مستطیلی با دوربین گوشی هوشمند از یک زاویه‌ای عکس بگیرید و بخواهید تصویری مستطیلی از آن سند تولید کنید.
  • درک حرکت در داخل تصویر با استفاده از جریان نوری.

مثال‌هایی از استفاده از بینایی ماشین

در دفترچه یادداشت OpenCV، به ارائه مثال‌هایی خواهیم پرداخت که می‌توان از بینایی ماشین برای انجام وظایف خاص استفاده کرد:

  • پیش‌پردازش عکسی از یک کتاب بریل. ما بر روی این موضوع تمرکز می‌کنیم که چگونه می‌توان از آستانه‌گذاری، شناسایی ویژگی، تبدیل پرسپکتیو و تغییرات NumPy برای جدا کردن نمادهای بریل به منظور طبقه‌بندی بیشتر توسط یک شبکه عصبی بهره جست.
تصویر بریلتصویر بریل پیش‌پردازش شدهنمادهای بریل

تصویر از OpenCV.ipynb

  • شناسایی حرکت در ویدیو با استفاده از تفاوت فریم. اگر دوربین ثابت باشد، فریم‌ها از تغذیه دوربین باید به یکدیگر نسبتاً مشابه باشند. از آنجایی که فریم‌ها به صورت آرایه‌ها نمایش داده می‌شوند، با کسر این آرایه‌ها برای دو فریم متوالی، ما اختلاف پیکسل را به دست خواهیم آورد که در فریم‌های استاتیک، بایستی کم باشد و زمانیکه حرکت قابل توجهی در تصویر وجود داشته باشد، افزایش یابد.

تصویر فریم‌های ویدیو و تفاوت فریم‌ها

تصویر از OpenCV.ipynb

  • شناسایی حرکت با استفاده از جریان نوری. جریان نوری به ما این امکان را می‌دهد که نحوه حرکت پیکسل‌های فردی را در فریم‌های ویدیو درک کنیم. دو نوع جریان نوری وجود دارد:

    • جریان نوری متراکم وکتور میدانی را محاسبه می‌کند که برای هر پیکسل نشان می‌دهد کجا در حال حرکت است.
    • جریان نوری پراکنده بر اساس شناسایی برخی ویژگی‌های متمایز در تصویر (به عنوان مثال، لبه‌ها) و ساختن مسیر آن‌ها از یک فریم به فریم دیگر شکل می‌گیرد.

تصویر جریان نوری

تصویر از OpenCV.ipynb

✍️ دفترچه‌های نمونه: OpenCV

بیایید با OpenCV تجربه کسب کنیم و دفترچه یادداشت OpenCV را مرور کنیم.

نتیجه‌گیری

گاهی اوقات، وظایف نسبتاً پیچیده‌ای مانند شناسایی حرکت یا شناسایی نوک انگشت می‌توانند به طور خالص توسط بینایی ماشین حل شوند. بنابراین، دانستن تکنیک‌های اولیه بینایی ماشین و آگاهی از قابلیت‌های کتابخانه‌هایی نظیر OpenCV بسیار مفید است.

مرور و مطالعه خود

بیشتر درباره جریان نوری در این آموزش جامع مطالعه کنید.

وظیفه

در این آزمایشگاه، شما یک ویدیو با حرکات ساده ثبت کرده و هدف شما استخراج حرکات بالا/پایین/چپ/راست با استفاده از جریان نوری است.

حالت حرکت کف دست