Skip to content

Latest commit

 

History

History
112 lines (65 loc) · 11 KB

File metadata and controls

112 lines (65 loc) · 11 KB

מבוא לראייה ממוחשבת

ראייה ממוחשבת היא תחום שמטרתו לאפשר למחשבים להבין ברמה גבוהה תמונות דיגיטליות. זו הגדרה רחבה למדי, כי הבנה יכולה להתייחס לדברים רבים, כולל זיהוי אובייקט בתמונה (זיהוי אובייקטים), הבנת מה מתרחש (זיהוי אירועים), תיאור תמונה בטקסט, או שחזור סצנה בתלת-ממד. יש גם משימות מיוחדות הקשורות לתמונות של בני אדם: הערכת גיל ורגשות, זיהוי פנים וזיהוי זהות, והערכת תנוחה בתלת-ממד, בין היתר.

אחת המשימות הפשוטות ביותר בראייה ממוחשבת היא סיווג תמונות.

ראייה ממוחשבת נחשבת לעיתים קרובות כענף של בינה מלאכותית. כיום, רוב המשימות בתחום זה נפתרות באמצעות רשתות נוירונים. נלמד יותר על סוג מיוחד של רשתות נוירונים המשמשות לראייה ממוחשבת, רשתות נוירונים קונבולוציוניות, לאורך החלק הזה.

עם זאת, לפני שמעבירים תמונה לרשת נוירונים, במקרים רבים יש הגיון להשתמש בטכניקות אלגוריתמיות לשיפור התמונה.

ישנן מספר ספריות Python זמינות לעיבוד תמונה:

  • imageio יכולה לשמש לקריאה/כתיבה של פורמטים שונים של תמונות. היא גם תומכת ב-ffmpeg, כלי שימושי להמרת פריימים של וידאו לתמונות.
  • Pillow (המוכרת גם כ-PIL) היא חזקה יותר, ותומכת גם במניפולציות תמונה כמו עיוותים, התאמות פלטה, ועוד.
  • OpenCV היא ספריית עיבוד תמונה חזקה שנכתבה ב-C++, והפכה לסטנדרט דה פקטו לעיבוד תמונה. יש לה ממשק נוח ב-Python.
  • dlib היא ספריית C++ שמיישמת אלגוריתמים רבים של למידת מכונה, כולל כמה אלגוריתמים של ראייה ממוחשבת. יש לה גם ממשק Python, וניתן להשתמש בה למשימות מאתגרות כמו זיהוי פנים ונקודות ציון בפנים.

OpenCV

OpenCV נחשבת לסטנדרט דה פקטו לעיבוד תמונה. היא מכילה הרבה אלגוריתמים שימושיים, שמיושמים ב-C++. ניתן להשתמש ב-OpenCV גם מ-Python.

מקום טוב ללמוד על OpenCV הוא הקורס Learn OpenCV. בתוכנית הלימודים שלנו, המטרה היא לא ללמוד OpenCV, אלא להראות לכם כמה דוגמאות שבהן ניתן להשתמש בה, וכיצד.

טעינת תמונות

תמונות ב-Python מיוצגות בצורה נוחה באמצעות מערכים של NumPy. לדוגמה, תמונות בגווני אפור בגודל 320x200 פיקסלים יאוחסנו במערך בגודל 200x320, ותמונות צבעוניות באותו גודל יהיו בעלות צורה של 200x320x3 (עבור 3 ערוצי צבע). כדי לטעון תמונה, ניתן להשתמש בקוד הבא:

import cv2
import matplotlib.pyplot as plt

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

באופן מסורתי, OpenCV משתמש בקידוד BGR (כחול-ירוק-אדום) לתמונות צבעוניות, בעוד שאר הכלים ב-Python משתמשים בקידוד RGB (אדום-ירוק-כחול) המסורתי יותר. כדי שהתמונה תיראה נכון, יש להמיר אותה למרחב הצבעים RGB, או על ידי החלפת ממדים במערך NumPy, או על ידי קריאה לפונקציה של OpenCV:

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

אותה פונקציה cvtColor יכולה לשמש לביצוע המרות אחרות של מרחבי צבע, כמו המרת תמונה לגווני אפור או למרחב הצבעים HSV (גוון-רוויה-ערך).

ניתן גם להשתמש ב-OpenCV לטעינת פריימים של וידאו אחד-אחד - דוגמה לכך ניתנת בתרגיל OpenCV Notebook.

עיבוד תמונה

לפני שמעבירים תמונה לרשת נוירונים, ייתכן שתרצו לבצע מספר שלבי עיבוד מקדימים. 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, שלעיתים עדיף על התאמת בהירות או ניגודיות.
  • יישום טרנספורמציות שונות על התמונה:
    • טרנספורמציות אפיניות יכולות להיות שימושיות אם צריך לשלב סיבוב, שינוי גודל ועיוות בתמונה, וידועים מיקומי המקור והיעד של שלוש נקודות בתמונה. טרנספורמציות אפיניות שומרות על קווים מקבילים.
    • טרנספורמציות פרספקטיבה יכולות להיות שימושיות כאשר ידועים מיקומי המקור והיעד של 4 נקודות בתמונה. לדוגמה, אם מצלמים תמונה של מסמך מלבני באמצעות מצלמת סמארטפון מזווית מסוימת, ורוצים ליצור תמונה מלבנית של המסמך עצמו.
  • הבנת תנועה בתוך התמונה באמצעות זרימה אופטית.

דוגמאות לשימוש בראייה ממוחשבת

ב-OpenCV Notebook שלנו, אנו מציגים כמה דוגמאות לשימוש בראייה ממוחשבת לביצוע משימות ספציפיות:

  • עיבוד מקדים של צילום ספר ברייל. אנו מתמקדים כיצד ניתן להשתמש בסף, זיהוי תכונות, טרנספורמציית פרספקטיבה ומניפולציות NumPy כדי להפריד סמלי ברייל בודדים לסיווג נוסף על ידי רשת נוירונים.
תמונה של ברייל תמונה מעובדת של ברייל סמלי ברייל

תמונה מתוך OpenCV.ipynb

  • זיהוי תנועה בווידאו באמצעות הבדל פריימים. אם המצלמה קבועה, אז הפריימים מהמצלמה צריכים להיות די דומים זה לזה. מכיוון שפריימים מיוצגים כמערכים, פשוט על ידי חיסור המערכים של שני פריימים עוקבים נקבל את ההבדל בפיקסלים, שאמור להיות נמוך עבור פריימים סטטיים, ולהפוך לגבוה יותר כאשר יש תנועה משמעותית בתמונה.

תמונה של פריימים בווידאו והבדלי פריימים

תמונה מתוך OpenCV.ipynb

  • זיהוי תנועה באמצעות זרימה אופטית. זרימה אופטית מאפשרת להבין כיצד פיקסלים בודדים בפריימים של וידאו נעים. ישנם שני סוגים של זרימה אופטית:

    • זרימה אופטית צפופה מחשבת את שדה הווקטורים שמראה לכל פיקסל לאן הוא נע.
    • זרימה אופטית דלילה מבוססת על לקיחת תכונות ייחודיות בתמונה (למשל, קצוות), ובניית מסלולן מפריים לפריים.

תמונה של זרימה אופטית

תמונה מתוך OpenCV.ipynb

✍️ מחברות לדוגמה: OpenCV נסו את OpenCV בפעולה

בואו נעשה כמה ניסויים עם OpenCV על ידי חקר OpenCV Notebook

סיכום

לפעמים, משימות יחסית מורכבות כמו זיהוי תנועה או זיהוי קצה אצבע יכולות להיפתר אך ורק באמצעות ראייה ממוחשבת. לכן, חשוב מאוד להכיר את הטכניקות הבסיסיות של ראייה ממוחשבת, ומה ספריות כמו OpenCV יכולות לעשות.

🚀 אתגר

צפו בסרטון הזה מתוך תוכנית AI Show כדי ללמוד על פרויקט Cortic Tigers וכיצד הם בנו פתרון מבוסס בלוקים להנגשת משימות ראייה ממוחשבת באמצעות רובוט. בצעו מחקר על פרויקטים נוספים כמו זה שמסייעים למתחילים להיכנס לתחום.

סקירה ולימוד עצמי

קראו עוד על זרימה אופטית במדריך הנהדר הזה.

במעבדה זו, תצלמו וידאו עם מחוות פשוטות, והמטרה שלכם היא לחלץ תנועות למעלה/למטה/שמאלה/ימינה באמצעות זרימה אופטית.

פריים תנועת כף יד