הערכת תנוחה/זיהוי נקודות מפתח עם YOLOv7 ב-Python PlatoBlockchain Data Intelligence. חיפוש אנכי. איי.

הערכת תנוחה/זיהוי נקודות מפתח עם YOLOv7 ב-Python

מבוא

זיהוי אובייקטים הוא תחום גדול בראייה ממוחשבת, ואחד היישומים החשובים יותר של ראייה ממוחשבת "בטבע".

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

זה הופך את זיהוי האובייקט למורכב יותר, בדרך כלל יותר מילולי (אך לא תמיד), ופחות נגיש מסיווג תמונה.

למזלם של ההמונים - Ultralytics פיתחה API פשוט, חזק מאוד ויפה לזיהוי אובייקטים סביב ה-YOLOv5 שלהם, אשר הורחב על ידי צוותי מחקר ופיתוח אחרים לגרסאות חדשות יותר, כמו YOLOv7.

במדריך הקצר הזה, נבצע הערכת תנוחה (זיהוי נקודות מפתח) ב-Python, עם YOLOv7 המתקדם.

נקודות מפתח יכולות להיות נקודות שונות - חלקי פנים, גפיים של גוף וכו'. הערכת תנוחה היא מקרה מיוחד של זיהוי נקודות מפתח - שבו הנקודות הן חלקים מגוף אדם, וניתן להשתמש בהן כדי להחליף חומרה יקרה למעקב אחר מיקום, אפשר שליטה ברובוטיקה באוויר, ומניע עידן חדש של ביטוי עצמי אנושי באמצעות AR ו-VR.

הערכת YOLO ופוזה

YOLO (אתה מסתכל רק פעם אחת) היא מתודולוגיה, כמו גם משפחה של מודלים שנבנו לזיהוי אובייקטים. מאז היווסדה בשנת 2015, YOLOv1, YOLOv2 (YOLO9000) ו-YOLOv3 הוצעו על ידי אותם מחבר/ים - וקהילת הלמידה העמוקה המשיכה בהתקדמות בקוד פתוח בשנים הבאות.

YOLOv5 של Ultralytics הוא ההטמעה הראשונה בקנה מידה גדול של YOLO ב-PyTorch, מה שהפך אותו לנגיש יותר מאי פעם, אבל הסיבה העיקרית לכך ש-YOLOv5 תפס דריסת רגל כזו היא גם ה-API הפשוט והחזק להפליא שנבנה סביבו. הפרויקט מפשט את הפרטים המיותרים, תוך שהוא מאפשר התאמה אישית, כמעט את כל פורמטי הייצוא השמישים, ומשתמש בפרקטיקות מדהימות שהופכות את הפרויקט כולו ליעיל ואופטימלי ככל שניתן.

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

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

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

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

התקנת YOLOv7

בואו נתחיל להתקין את הפרויקט מ-GitHub:

! git clone https://github.com/WongKinYiu/yolov7.git

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

%cd yolov7
!ls

/Users/macbookpro/jup/yolov7
LICENSE.md       detect.py        models           tools
README.md        export.py        paper            train.py
cfg              figure           requirements.txt train_aux.py
data             hubconf.py       scripts          utils
deploy           inference        test.py

הערה: Google Colab Notebooks מאופסים לספריית העבודה הראשית בתא הבא, גם לאחר שיחה %cd dirname, כך שתצטרך להמשיך לקרוא לו בכל תא שאתה רוצה שתתבצע בו פעולה. מחברות Jupyter מקומיות זוכרות את השינוי, כך שאין צורך להמשיך לקרוא לפקודה.

בכל פעם שתפעיל קוד עם קבוצה נתונה של משקלים - הם יורדו ויישמרו בספרייה הזו. כדי לבצע הערכת תנוחה, נרצה להוריד את המשקולות עבור דגם ה-YOLOv7 המאומן מראש למשימה זו, אשר ניתן למצוא תחת /releases/download/ לשונית ב-GitHub:

! curl -L https://github.com/WongKinYiu/yolov7/releases/download/v0.1/yolov7-w6-pose.pt -o yolov7-w6-pose.pt
%cd ..

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100  153M  100  153M    0     0  3742k      0  0:00:42  0:00:42 --:--:-- 4573k

/Users/macbookpro/jup

מעולה, הורדנו את yolov7-w6-pose.pt קובץ משקולות, שניתן להשתמש בו כדי לטעון ולשחזר מודל מיומן להערכת תנוחה.

טוען את מודל הערכת התנוחה של YOLOv7

בואו לייבא את הספריות שנצטרך כדי לבצע הערכת תנוחה:

import torch
from torchvision import transforms

from utils.datasets import letterbox
from utils.general import non_max_suppression_kpt
from utils.plots import output_to_keypoint, plot_skeleton_kpts

import matplotlib.pyplot as plt
import cv2
import numpy as np

torch ו torchvision פשוטים מספיק - YOLOv7 מיושם עם PyTorch. ה utils.datasets, utils.general ו utils.plots מודולים מגיעים מפרויקט YOLOv7, ומספקים לנו שיטות המסייעות בעיבוד מקדים והכנת קלט עבור המודל להפעלת מסקנות. בין אלה יש letterbox() לרפד את התמונה, non_max_supression_keypoint() להפעיל את האלגוריתם Non-Max Supression על הפלט הראשוני של המודל ולהפיק פלט נקי לפרשנות שלנו, כמו גם את output_to_keypoint() ו plot_skeleton_kpts() שיטות להוספת נקודות מפתח לתמונה נתונה, ברגע שהן צפויות.

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

def load_model():
    device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
    model = torch.load('yolov7/yolov7-w6-pose.pt', map_location=device)['model']
    
    model.float().eval()

    if torch.cuda.is_available():
        
        
        model.half().to(device)
    return model

model = load_model()

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

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

def run_inference(url):
    image = cv2.imread(url) 
    
    image = letterbox(image, 960, stride=64, auto=True)[0] 
    
    image = transforms.ToTensor()(image) 
    
    image = image.unsqueeze(0) 
    output, _ = model(image) 
    return output, image

כאן, החזרנו את התמונה שעברה טרנספורמציה (כי נרצה לחלץ את המקור ולעלות עליה) ואת הפלטים של הדגם. פלטים אלה מכילים 45900 תחזיות של נקודות מפתח, רובן חופפות. נרצה ליישם את ה-Non-Max Depression על התחזיות הגולמיות הללו, בדיוק כמו בחיזוי זיהוי אובייקטים (שם חזו תיבות תוחמות רבות ואז הן "ממוטטות" בהינתן ביטחון מסוים וסף IoU). לאחר ההדחקה, נוכל לשרטט כל נקודת מפתח בתמונה המקורית ולהציג אותה:

def visualize_output(output, image):
    output = non_max_suppression_kpt(output, 
                                     0.25, 
                                     0.65, 
                                     nc=model.yaml['nc'], 
                                     nkpt=model.yaml['nkpt'], 
                                     kpt_label=True)
    with torch.no_grad():
        output = output_to_keypoint(output)
    nimg = image[0].permute(1, 2, 0) * 255
    nimg = nimg.cpu().numpy().astype(np.uint8)
    nimg = cv2.cvtColor(nimg, cv2.COLOR_RGB2BGR)
    for idx in range(output.shape[0]):
        plot_skeleton_kpts(nimg, output[idx, 7:].T, 3)
    plt.figure(figsize=(12, 12))
    plt.axis('off')
    plt.imshow(nimg)
    plt.show()

כעת, עבור תמונת קלט כלשהי, כגון karate.jpg בספריית העבודה הראשית, אנו יכולים להפעיל הסקה, לבצע Non-Max Supression ולתכנן את התוצאות עם:

output, image = run_inference('./karate.jpg')
visualize_output(output, image)

זו התוצאה:

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

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

סיכום

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

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

הולך רחוק יותר - למידה עמוקה מעשית לראייה ממוחשבת

האופי הסקרן שלך גורם לך לרצות ללכת רחוק יותר? אנו ממליצים לבדוק את שלנו קורס: "למידה עמוקה מעשית עבור ראייה ממוחשבת עם Python".

הערכת תנוחה/זיהוי נקודות מפתח עם YOLOv7 ב-Python PlatoBlockchain Data Intelligence. חיפוש אנכי. איי.

עוד קורס ראיית מחשב?

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

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

מה יש בפנים?

  • העקרונות הראשונים של חזון וכיצד ניתן ללמד מחשבים "לראות"
  • משימות ויישומים שונים של ראייה ממוחשבת
  • כלי המקצוע שיקלו עליכם את העבודה
  • מציאת, יצירה וניצול של מערכי נתונים עבור ראייה ממוחשבת
  • התיאוריה והיישום של רשתות עצביות קונבולוציונליות
  • טיפול בהסטת תחום, התרחשות משותפת והטיות אחרות במערך נתונים
  • העבר למידה וניצול זמן ההדרכה ומשאבי החישוב של אחרים לטובתך
  • בנייה והדרכה של סיווג סרטן שד חדיש
  • כיצד ליישם מנה בריאה של ספקנות על רעיונות מיינסטרים ולהבין את ההשלכות של טכניקות מאומצות באופן נרחב
  • הדמיית "מרחב הקונספט" של ConvNet באמצעות t-SNE ו-PCA
  • תיאורי מקרה של האופן שבו חברות משתמשות בטכניקות ראייה ממוחשבת כדי להשיג תוצאות טובות יותר
  • הערכת מודל נכונה, הדמיית מרחב סמוי וזיהוי תשומת הלב של המודל
  • ביצוע מחקר תחום, עיבוד מערכי נתונים משלך והקמת בדיקות מודל
  • ארכיטקטורות חדשניות, התקדמות רעיונות, מה מייחד אותם וכיצד ליישם אותם
  • KerasCV – ספריית WIP ליצירת צינורות ודגמים מתקדמים
  • כיצד לנתח ולקרוא מאמרים וליישם אותם בעצמך
  • בחירת דגמים בהתאם ליישום שלך
  • יצירת צינור למידת מכונה מקצה לקצה
  • נוף ואינטואיציה על זיהוי אובייקטים עם R-CNN מהירים יותר, RetinaNets, SSDs ו-YOLO
  • מופע ופילוח סמנטי
  • זיהוי אובייקטים בזמן אמת עם YOLOv5
  • הכשרת גלאי אובייקטים של YOLOv5
  • עבודה עם רובוטריקים באמצעות KerasNLP (ספריית WIP בעלת חוזק בתעשייה)
  • שילוב רובוטריקים עם ConvNets ליצירת כיתובים של תמונות
  • חלום עמוק
  • אופטימיזציה של מודל Deep Learning לראייה ממוחשבת

בול זמן:

עוד מ Stackabuse