YOLO - בינה מלאכותית שמזהה עצמים מרובים בתמונות
אחת הטכנולוגיות הנפוצות ביותר לזיהוי של עצמים היא YOLO .You Only Look Once במדריך הזה נלמד כיצד להשתמש ב-YOLO כדי לזהות מספר עצמים בתמונות בודדות.
זו התמונה המקורית שממנה נתחיל את המדריך:
וזו התוצאה. תמונה מכוסה מלבנים שמבחינים בין עצמים בתמונה:
YOLO מבחינה במספר עצמים בתמונה. זה בניגוד, לטכנולוגיות אחרות אליהם נחשפנו בסדרת המדריכים שמבחינים בעצם אחד בלבד בכל תמונה לדוגמה, זיהוי ספרות. לכל עצם מזוהה ניתן שם, מידת הביטחון בזיהוי ומלבן תוחם. במקרה שלנו, הטכנולוגיה מבחינה בקלות בין אנשים ורכבות. אבל היא גם טועה ומזהה את פסי הרכבת כמגלשי סקי ואופנוע מכוסה בברזנט כמזוודה.
לחץ כדי להוריד את הקוד המלא שנפתח במדריך ואת התמונה המקורית
YOLO מבוסס על רשת קונבולוציה מתוחכמת. למזלנו, חוקרים מצטיינים בתחום הבינה המלאכותית פיתחו אותה ושחררו לטובת הכלל. גם לא נאמן את המודל, אם כי אפשר, אלא נשתמש במודל מאומן. מה שאומר שהעצמים שנזהה יהיו בהכרח רק כאלו ש-YOLO נחשפה אליהם בזמן הפיתוח.
התקנות וסביבת העבודה
מדריך זה הורץ על סביבת Google Colab המצוידת במאיץ GPU. המאיץ חשוב כדי לשפר את ביצועי עיבוד התמונה.
ראשית, נייבא ונתקין את darkflow שהיא סביבת העבודה שעליה מריצים את YOLO.
# darkflow is the neural network framework that YOLO works on
!git clone //github.com/thtrieu/darkflow.git
סימן קריאה (!) מאפשר להריץ פקודות של הטרמינל בסביבת colab
!pip install ./darkflow/
נייבא את המודל המאומן הכולל את המשקלות, התגיות, ואת קבצי הקונפיגורציה של המודל המאומן לתוך תיקיות שיהיו זמינות לנו בהמשך.
# mount your drive to load YOLO config and weights
# here we don't train YOLO but use the models that
# the experts developers made for us
from google.colab import drive
drive.mount('/content/drive')
# create a 'projects/yolo' folder
# and download the files
!mkdir -p /content/drive/My\ Drive/projects
!mkdir -p /content/drive/My\ Drive/projects/yolo
!mkdir -p /content/drive/My\ Drive/projects/yolo/bin
!mkdir -p /content/drive/My\ Drive/projects/yolo/cfg
!wget https://raw.githubusercontent.com/thtrieu/darkflow/master/cfg/coco.names -O /content/drive/My\ Drive/projects/yolo/cfg/coco.names
!wget //raw.githubusercontent.com/thtrieu/darkflow/master/cfg/yolo.cfg -O /content/drive/My\ Drive/projects/yolo/cfg/yolo.cfg
!wget //pjreddie.com/media/files/yolov2.weights -O /content/drive/My\ Drive/projects/yolo/bin/yolo.weights
הרצת YOLO לצורך זיהוי עצמים
שורות הקוד להלן מאפשרות לנו להריץ את YOLO מנתיב מוגדר במערכת הקבצים.
from darkflow.net.build import TFNet
import cv2
import numpy as np
import os
from scipy import misc
from io import BytesIO
os.chdir('/content/drive/My Drive/projects/yolo')
options = {"model": "./cfg/yolo.cfg", "load": "./bin/yolo.weights", "threshold": 0.1, "gpu": 1.0}
tfnet = TFNet(options)
שימו לב לתיקייה שבתוכה אנחנו נמצאים.
# where are we?
!pwd
/content/drive/My Drive/projects/yolo
אחרי שהעלתי את התמונה המקורית, המרתי אותה למערך numpy.
# read the image to classify
file_name = '../../../../lisbon.jpg'
src_img = Image.open(file_name).convert('RGB')
img = np.array(src_img)
שורת הקוד הבאה מבצעת את התחזית בפועל:
# predict the labels in the image
result = tfnet.return_predict(img)
נראה את התחזיות הגולמיות ש-YOLO מנפק לנו:
for row in result:
print(row)
{'label': 'person', 'confidence': 0.13493723, 'topleft': {'x': 124, 'y': 250}, 'bottomright': {'x': 149, 'y': 325}} {'label': 'person', 'confidence': 0.21669194, 'topleft': {'x': 138, 'y': 298}, 'bottomright': {'x': 147, 'y': 335}} {'label': 'person', 'confidence': 0.10413194, 'topleft': {'x': 131, 'y': 279}, 'bottomright': {'x': 155, 'y': 352}} {'label': 'person', 'confidence': 0.29194283, 'topleft': {'x': 151, 'y': 302}, 'bottomright': {'x': 162, 'y': 339}} {'label': 'person', 'confidence': 0.2771185, 'topleft': {'x': 114, 'y': 341}, 'bottomright': {'x': 129, 'y': 380}} {'label': 'person', 'confidence': 0.52249455, 'topleft': {'x': 108, 'y': 330}, 'bottomright': {'x': 132, 'y': 396}} {'label': 'person', 'confidence': 0.12892048, 'topleft': {'x': 262, 'y': 344}, 'bottomright': {'x': 275, 'y': 380}} {'label': 'person', 'confidence': 0.4964886, 'topleft': {'x': 258, 'y': 334}, 'bottomright': {'x': 279, 'y': 408}} {'label': 'person', 'confidence': 0.10901723, 'topleft': {'x': 262, 'y': 368}, 'bottomright': {'x': 273, 'y': 402}} {'label': 'person', 'confidence': 0.7727701, 'topleft': {'x': 269, 'y': 338}, 'bottomright': {'x': 300, 'y': 434}} {'label': 'person', 'confidence': 0.79984426, 'topleft': {'x': 317, 'y': 349}, 'bottomright': {'x': 343, 'y': 435}} {'label': 'person', 'confidence': 0.7903174, 'topleft': {'x': 194, 'y': 447}, 'bottomright': {'x': 297, 'y': 703}} {'label': 'train', 'confidence': 0.6088825, 'topleft': {'x': 166, 'y': 289}, 'bottomright': {'x': 253, 'y': 432}} {'label': 'suitcase', 'confidence': 0.13715762, 'topleft': {'x': 41, 'y': 383}, 'bottomright': {'x': 84, 'y': 447}} {'label': 'skis', 'confidence': 0.1045904, 'topleft': {'x': 215, 'y': 679}, 'bottomright': {'x': 268, 'y': 716}}
אפשר לראות את התגיות החזויות, person, train, את מידת הביטחון בזיהוי (ערכים בין 0 ל-1), ואת גבולות המלבנים התוחמים כל אחד מהעצמים.
הקוד הבא, יוצר מלבנים מהתחזיות שאותם הוא רושם על גבי עותק של התמונה המקורית:
# show the classes inside rectangles
src_img = Image.open(file_name).convert('RGB')
out_file = '../../../../lisbon_a.jpg'
# draw rectangles that describe the predictions
draw = ImageDraw.Draw(src_img)
for row in result:
# the person is green
# the train is red
# other labels are white
color = 'rgb(255,255,255)'
if row['label'] == 'person':
color = 'rgb(0,255,0)'
elif row['label'] == 'train':
color = 'rgb(255,0,0)'
fnt = ImageFont.FreeTypeFont(size=14,font='/usr/share/fonts/truetype/liberation/LiberationMono-Regular.ttf')
confidence = str(round(row['confidence'],2))
draw.rectangle(((row['topleft']['x'], row['topleft']['y']), (row['bottomright']['x'], row['bottomright']['y'])), fill=None, outline=color)
draw.text((row['topleft']['x'] + 10, row['bottomright']['y'] - 20), '{}'.format(row['label']), fill=color, font=fnt)
src_img.save(out_file, 'JPEG')
סיכום
במדריך זה, למדנו כיצד לזהות מספר עצמים בתמונה באמצעות YOLO. ניתן להשתמש בטכנולוגיה זו כדי לזהות עצמים בתוך סרטון וידאו, ואפילו בזמן אמת, במידה ומחברים את הטכנולוגיה למצלמות. זו אפשרות מלהיבה שיכולים להיות לה שימושים רבים. לדוגמה, להזהיר הולכי רגל שצועדים על הפסים מפני רכבת מתקרבת.
לכל המדריכים בנושא של למידת מכונה
אהבתם? לא אהבתם? דרגו!
0 הצבעות, ממוצע 0 מתוך 5 כוכבים
המדריכים באתר עוסקים בנושאי תכנות ופיתוח אישי. הקוד שמוצג משמש להדגמה ולצרכי לימוד. התוכן והקוד המוצגים באתר נבדקו בקפידה ונמצאו תקינים. אבל ייתכן ששימוש במערכות שונות, דוגמת דפדפן או מערכת הפעלה שונה ולאור השינויים הטכנולוגיים התכופים בעולם שבו אנו חיים יגרום לתוצאות שונות מהמצופה. בכל מקרה, אין בעל האתר נושא באחריות לכל שיבוש או שימוש לא אחראי בתכנים הלימודיים באתר.
למרות האמור לעיל, ומתוך רצון טוב, אם נתקלת בקשיים ביישום הקוד באתר מפאת מה שנראה לך כשגיאה או כחוסר עקביות נא להשאיר תגובה עם פירוט הבעיה באזור התגובות בתחתית המדריכים. זה יכול לעזור למשתמשים אחרים שנתקלו באותה בעיה ואם אני רואה שהבעיה עקרונית אני עשוי לערוך התאמה במדריך או להסיר אותו כדי להימנע מהטעיית הציבור.
שימו לב! הסקריפטים במדריכים מיועדים למטרות לימוד בלבד. כשאתם עובדים על הפרויקטים שלכם אתם צריכים להשתמש בספריות וסביבות פיתוח מוכחות, מהירות ובטוחות.
המשתמש באתר צריך להיות מודע לכך שאם וכאשר הוא מפתח קוד בשביל פרויקט הוא חייב לשים לב ולהשתמש בסביבת הפיתוח המתאימה ביותר, הבטוחה ביותר, היעילה ביותר וכמובן שהוא צריך לבדוק את הקוד בהיבטים של יעילות ואבטחה. מי אמר שלהיות מפתח זו עבודה קלה ?
השימוש שלך באתר מהווה ראייה להסכמתך עם הכללים והתקנות שנוסחו בהסכם תנאי השימוש.