آموزش هوش مصنوعی با پایتون - بینایی کامپیوتر

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

بینایی کامپیوتر

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

سطوح بینایی کامپیوتر

بینایی کامپیوتر به سه دسته‌بندی اصلی زیر تقسیم می‌شود −

  • بینایی سطح پایین (Low-level vision) − شامل پردازش تصویر برای استخراج ویژگی‌ها می‌شود.

  • بینایی سطح متوسط (Intermediate-level vision) − شامل تشخیص اشیاء و تفسیر صحنه سه‌بعدی می‌شود.

  • بینایی سطح بالا (High-level vision) − شامل توصیف مفهومی یک صحنه مانند فعالیت، قصد و رفتار می‌شود.

مقایسه بینایی کامپیوتر و پردازش تصویر

پردازش تصویر به مطالعه تبدیل تصویر به تصویر می‌پردازد. ورودی و خروجی پردازش تصویر هر دو تصویر هستند.

بینایی کامپیوتر عبارت است از ساخت توصیف‌های صریح و معنادار از اشیای فیزیکی بر اساس تصویر آن‌ها. خروجی بینایی کامپیوتر یک توصیف یا تفسیر از ساختارها در صحنه سه‌بعدی است.

کاربردها

بینایی کامپیوتر در زمینه‌های زیر کاربرد دارد −

رباتیک

  • مکان‌یابی - تعیین خودکار موقعیت ربات

  • مسیریابی

  • اجتناب از موانع

  • مونتاژ (قرار دادن پین در سوراخ، جوشکاری، رنگ‌آمیزی)

  • دستکاری و جابه‌جایی اشیاء (مانند بازوی رباتیک PUMA)

  • تعامل انسان و ربات (HRI): رباتیک هوشمند برای تعامل با انسان‌ها و خدمت به آن‌ها

پزشکی

  • طبقه بندی و تشخیص (مانند طبقه‌بندی ضایعات یا سلول‌ها و تشخیص تومور)

  • قطعه‌بندی دوبعدی و سه‌بعدی

  • بازسازی سه‌بعدی اندام‌های بدن انسان (ام‌ارآی یا سونوگرافی)

  • جراحی رباتیک هدایت‌شده با بینایی

امنیت

  • زیست‌سنجی یا بیومتریک (تشخیص عنبیه، اثر انگشت، چهره)
  • نظارت - تشخیص فعالیت‌ها یا رفتارهای مشکوک خاص

حمل و نقل

  • خودروی خودران
  • ایمنی، مانند پایش هوشیاری راننده

کاربردهای اتوماسیون صنعتی

  • بازرسی صنعتی (تشخیص عیوب)
  • مونتاژ
  • خوانش بارکد و برچسب بسته‌بندی
  • جداسازی و دسته‌بندی اشیاء
  • درک سند (مانند OCR)

نصب پکیج‌های کاربردی

برای بینایی کامپیوتر با پایتون، می‌توانید از کتابخانه محبوب OpenCV (Open Source Computer Vision) استفاده کنید. این کتابخانه شامل توابع برنامه‌نویسی است که عمدتاً برای بینایی کامپیوتر برپایه پردازش واقعی و آنی (Real-time) هدف‌گذاری شده است. این کتابخانه به زبان ++C نوشته شده و رابط اصلی آن نیز ++C است. می‌توانید این پکیج را به کمک دستور زیر نصب کنید −

pip install opencv_python-X.X-cp36-cp36m-winX.whl

در اینجا X نشان‌دهنده نسخه پایتون نصب‌شده روی سیستم شما و همچنین ۳۲ بیتی یا ۶۴ بیتی بودن ویندوز است.

اگر از محیط anaconda استفاده می‌کنید، دستور زیر را برای نصب OpenCV به کار ببرید −

conda install -c conda-forge opencv

خواندن، نوشتن و نمایش تصویر

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

توابع OpenCV برای خواندن، نمایش و نوشتن فایل تصویری

کتابخانه OpenCV توابع زیر را برای این منظور ارائه می‌دهد −

  • تابع ()imread − این تابع برای خواندن یک تصویر استفاده می‌شود. تابع ()imread در OpenCV از فرمت‌های مختلف تصویر مانند PNG، JPEG، JPG، TIFF و غیره پشتیبانی می‌کند.

  • تابع ()imshow − این تابع برای نمایش یک تصویر در یک پنجره استفاده می‌شود. پنجره به‌طور خودکار با اندازه تصویر تنظیم می‌شود. تابع ()imshow در OpenCV از فرمت‌های مختلف تصویر مانند PNG، JPEG، JPG، TIFF و غیره پشتیبانی می‌کند.

  • تابع ()imwrite − این تابع برای نوشتن (ذخیره) یک تصویر استفاده می‌شود. تابع ()imwrite در OpenCV از فرمت‌های مختلف تصویر مانند PNG، JPEG، JPG، TIFF و غیره پشتیبانی می‌کند.

مثال

این مثال کد پایتون را برای خواندن یک تصویر با یک فرمت خاص، نمایش آن در یک پنجره و نوشتن همان تصویر با فرمتی دیگر نشان می‌دهد. مراحل زیر را در نظر بگیرید −

پکیج OpenCV را به شکل زیر وارد (Import) کنید −

import cv2

اکنون برای خواندن یک تصویر مشخص، از تابع ()imread استفاده کنید −

image = cv2.imread('image_flower.jpg')

برای نمایش تصویر، از تابع ()imshow استفاده کنید. نام پنجره‌ای که می‌توانید تصویر را در آن ببینید image_flower خواهد بود.

cv2.imshow('image_flower',image)
cv2.destroyAllwindows()

image flower

اکنون می‌توانیم همان تصویر را با استفاده از تابع ()imwrite در فرمت دیگری، مثلاً png. بنویسیم −

cv2.imwrite('image_flower.png',image)

خروجی True به این معنی است که تصویر با موفقیت به‌صورت فایل png. نیز در همان پوشه ذخیره شده است.

True

توجه − تابع ()destroyAllWindows به سادگی تمام پنجره‌هایی را که ایجاد کرده‌ایم می‌بندد و از بین می‌برد.

تبدیل فضاهای رنگی

در OpenCV، تصاویر با استفاده از رنگ مرسوم RGB ذخیره نمی‌شوند، بلکه به ترتیب معکوس یعنی ترتیب BGR ذخیره می‌شوند. بنابراین، کد رنگ پیش‌فرض هنگام خواندن یک تصویر BGR است. تابع تبدیل رنگ ()cvtColor برای تبدیل تصویر از یک کد رنگی به کد رنگی دیگر استفاده می‌شود.

مثال

این مثال را برای تبدیل تصویر از BGR به مقیاس خاکستری (Grayscale) در نظر بگیرید.

پکیج OpenCV را به شکل زیر وارد کنید −

import cv2

اکنون برای خواندن یک تصویر مشخص، از تابع ()imread استفاده کنید −

image = cv2.imread('image_flower.jpg')

حال اگر این تصویر را با استفاده از تابع ()imshow مشاهده کنیم، می‌توانیم ببینیم که این تصویر در فضای رنگی BGR قرار دارد.

cv2.imshow('BGR_Penguins',image)

penguine

اکنون از تابع ()cvtColor برای تبدیل این تصویر به مقیاس خاکستری استفاده کنید.

image = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
cv2.imshow('gray_penguins',image)

grey penguine

تشخیص لبه

انسان‌ها پس از دیدن یک طرح اولیه، می‌توانند به راحتی بسیاری از انواع اشیاء و حالت‌های آن‌ها را تشخیص دهند. به همین دلیل است که لبه‌ها نقش مهمی در زندگی انسان‌ها و همچنین در کاربردهای بینایی کامپیوتر ایفا می‌کنند. کتابخانه OpenCV تابع بسیار ساده و کاربردی به نام ()Canny را برای تشخیص لبه‌ها ارائه می‌دهد.

مثال

مثال زیر شناسه و تشخیص واضح لبه‌ها را نشان می‌دهد.

پکیج OpenCV را به شکل زیر وارد کنید −

import cv2
import numpy as np

اکنون برای خواندن یک تصویر مشخص، از تابع ()imread استفاده کنید.

image = cv2.imread('Penguins.jpg')

حال از تابع ()Canny برای تشخیص لبه‌های تصویر خوانده‌شده استفاده کنید.

cv2.imwrite(edges_Penguins.jpg,cv2.Canny(image,200,300))

اکنون برای نمایش تصویر همراه با لبه‌ها، از تابع ()imshow استفاده کنید.

cv2.imshow(edges, cv2.imread(edges_Penguins.jpg))

این برنامه پایتون تصوری با نام edges_penguins.jpg همراه با تشخیص لبه ایجاد خواهد کرد.

edges penguins

تشخیص چهره

تشخیص چهره یکی از کاربردهای جذاب بینایی کامپیوتر است که آن را واقعی‌تر و همچنین آینده‌نگرانه‌تر می‌کند. OpenCV دارای امکانات داخلی برای انجام تشخیص چهره است. ما قصد داریم از طبقه‌بند آبشاری Haar برای تشخیص چهره استفاده کنیم.

داده‌های Haar Cascade

ما برای استفاده از طبقه‌بند آبشاری Haar به داده نیاز داریم. می‌توانید این داده‌ها را در پکیج OpenCV پیدا کنید. پس از نصب OpenCV، می‌توانید پوشه‌ای به نام haarcascades را مشاهده کنید. در آنجا فایل‌های xml. برای کاربردهای مختلف وجود دارد. اکنون همه آن‌ها را برای استفاده‌های مختلف کپی کرده و در یک پوشه جدید زیر پروژه فعلی قرار دهید.

مثال

کد پایتون زیر با استفاده از Haar Cascade برای تشخیص چهره آمیتاب باچان که در تصویر زیر نشان داده شده، آمده است −

ab face

پکیج OpenCV را به شکل زیر وارد کنید −

import cv2
import numpy as np

اکنون از HaarCascadeClassifier برای تشخیص چهره استفاده کنید −

face_detection=
cv2.CascadeClassifier('D:/ProgramData/cascadeclassifier/
haarcascade_frontalface_default.xml')

اکنون برای خواندن یک تصویر مشخص، از تابع ()imread استفاده کنید −

img = cv2.imread('AB.jpg')

حال آن را به مقیاس خاکستری تبدیل کنید زیرا تصاویر خاکستری را می‌پذیرد −

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

اکنون با استفاده از face_detection.detectMultiScale تشخیص چهره واقعی را انجام دهید

faces = face_detection.detectMultiScale(gray, 1.3, 5)

اکنون یک مستطیل دور کل چهره رسم کنید −

for (x,y,w,h) in faces:
   img = cv2.rectangle(img,(x,y),(x+w, y+h),(255,0,0),3)
cv2.imwrite('Face_AB.jpg',img)

این برنامه پایتون تصویری با نام Face_AB.jpg با تشخیص چهره مطابق شکل ایجاد خواهد کرد

Face AB

تشخیص چشم

تشخیص چشم یکی دیگر از کاربردهای جذاب بینایی کامپیوتر است که آن را واقعی‌تر و همچنین آینده‌نگرانه‌تر می‌کند. OpenCV دارای امکانات داخلی برای انجام تشخیص چشم است. ما قصد داریم از طبقه‌بند Haar cascade برای تشخیص چشم استفاده کنیم.

مثال

مثال زیر کد پایتون با استفاده از Haar Cascade را برای تشخیص چشم در چهره آمیتاب باچان که در تصویر زیر ارائه شده، نشان می‌دهد −

Haar AB Face

پکیج OpenCV را به شکل زیر وارد کنید −

import cv2
import numpy as np

اکنون از HaarCascadeClassifier برای تشخیص چهره استفاده کنید −

eye_cascade = cv2.CascadeClassifier('D:/ProgramData/cascadeclassifier/haarcascade_eye.xml')

اکنون برای خواندن یک تصویر مشخص، از تابع ()imread استفاده کنید

img = cv2.imread('AB_Eye.jpg')

حال آن را به مقیاس خاکستری تبدیل کنید زیرا تصاویر خاکستری را می‌پذیرد −

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

اکنون به کمک eye_cascade.detectMultiScale تشخیص چهره واقعی را انجام دهید

eyes = eye_cascade.detectMultiScale(gray, 1.03, 5)

اکنون یک مستطیل دور کل چهره رسم کنید −

for (ex,ey,ew,eh) in eyes:
   img = cv2.rectangle(img,(ex,ey),(ex+ew, ey+eh),(0,255,0),2)
cv2.imwrite('Eye_AB.jpg',img)

این برنامه پایتون تصویری با نام Eye_AB.jpg همراه با تشخیص چشم مطابق شکل ایجاد خواهد کرد −

Eye AB

پیشرفت مطالعه: وضعیت خوانده‌شدن این درس فقط در همین مرورگر ذخیره می‌شود؛ بدون نیاز به حساب کاربری.