YOLO - בינה מלאכותית שמזהה עצמים מרובים בתמונות

מחבר:
בתאריך:

אחת הטכנולוגיות הנפוצות ביותר לזיהוי של עצמים היא YOLO .You Only Look Once במדריך הזה נלמד כיצד להשתמש ב-YOLO כדי לזהות מספר עצמים בתמונות בודדות.

זו התמונה המקורית שממנה נתחיל את המדריך:

the input image for YOLO - object detection

וזו התוצאה. תמונה מכוסה מלבנים שמבחינים בין עצמים בתמונה:

the result of object detection with 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 כוכבים