קריאת שפתיים עם AI: איך מפתחים כזה?

מאת Yuval Avidani
זמן קריאה: 3 דק'

תוכן עניינים

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

לפני הכל צפו רגע בזה:

יש כאן אדם שמדבר ומודל של למידת מכונה מצליח לקרוא את השפתיים שלו ולהציג את המילים שהוא אומר במסך, על אף שמעולם לא שמע אותן. איך זה קורה? איך אפשר להשתמש ב-AI (או מדויק יותר ב-Machine Learning) כדי לקרוא שפתיים ולהציג את המילים במסך?

האם אימון מודלים שמור ליחידי סגולה?

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

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

וכיום? הכל הופך לנגיש יותר ויותר. אמת, על מנת לאמן מודלים עדיין צריך ידע נרחב ומעמיק, זו מלאכה לא קלה וצריך לתת את הכבוד האדיר לאלה שעוסקים בה (כמו למשל ישי טובי, CTO ו-Head of AI בחברת Neural Vision ששנים רבות מאמן מודלים מתקדמים, חלקם משמשים חברות ענק, וד״ר עמיר גבעון, שגם הוא Head of AI שעבד 7 שנים בסוכנות החלל NASA בארה״ב וכיום מתעסק באלגוריתמיקה מתקדמת בשילוב אימון מודלים). יש הבדל עצום בין לדעת לטעון מודלים מוכנים מראש ולהשתמש בהם, בין אם זה באמצעות עזרה מידידינו ChatGPT או Claude או אפילו Cohere אהוביי (אני באמת מאוד מחבב אותם). הם עוזרים לנו לטעון, להשתמש. אבל יש הבדל תהומי בין זה לבין לאמן מודלים ולהבין את התהליכים שמתרחשים מתחת למכסה המנוע.

משמאל לימין: ד״ר עמיר גבעון, ישי טובי ואני

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

אין תירוצים, הכל נגיש

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

פשוט יותר ממה שנדמה לנו - פרומפט ואנחנו שם

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

code for machine learning vision that uses my computer camera and types to the screen the words it identify in my lips. i mean lip reading and printing it to the screen.

ומה קיבלתי בתמורה אתם בטח תוהים לעצמכם? את ההסבר הבא:

For building a lip-reading application that can detect words from lip movements and display them on the screen with a typing effect, you could consider using the LipNet model. LipNet is known for its ability to perform end-to-end sentence-level lip-reading from video input. It processes sequences of video frames and outputs text sequences, using a combination of spatiotemporal convolutional neural networks (STCNNs) and gated recurrent units (GRUs), trained with connectionist temporal classification (CTC) loss to handle sequence prediction without the need for pre-aligned data​ (ar5iv)​.

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

  
    import cv2
import numpy as np
import tensorflow as tf
from tensorflow.keras.models import load_model
import time

# Load the LipNet model
model = load_model('lipnet_model.h5')

# Function to preprocess the frame (implement according to your model's requirement)
def preprocess_frame(frame):
    # Example: Resize frame to 100x50, convert to grayscale
    frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    frame = cv2.resize(frame, (100, 50))
    frame = np.expand_dims(frame, axis=-1)
    return np.expand_dims(frame, axis=0)

# Function to extract lip region (you may need a more accurate method)
def extract_lips(frame):
    # Placeholder function: return the same frame passed
    return frame

# Initialize webcam
cap = cv2.VideoCapture(0)

if not cap.isOpened():
    print("Cannot open camera")
    exit()

predicted_text = ""
try:
    while True:
        ret, frame = cap.read()
        if not ret:
            print("Can't receive frame (stream end?). Exiting ...")
            break

        # Extract lips from the frame
        lips = extract_lips(frame)

        # Preprocess the lips image
        lips_processed = preprocess_frame(lips)

        # Predict text from the lips
        prediction = model.predict(lips_processed)
        # Assuming the model returns the character sequence as a string
        new_char = prediction[0]

        # Simple typing effect: append new character if it's different
        if new_char != predicted_text[-1:]:
            predicted_text += new_char
            print(predicted_text, end='\r', flush=True)
            time.sleep(0.5)  # Delay to mimic typing

        # Display the original frame
        cv2.imshow('frame', frame)
        if cv2.waitKey(1) == ord('q'):
            break
finally:
    cap.release()
    cv2.destroyAllWindows()
  

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

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

כי קיימת שורה בקוד:

  
    model = load_model('lipnet_model.h5')
  

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

דוגמא למימוש המודל הזה ניתן למצוא כאן:

GitHub - rizkiarm/LipNet: Keras implementation of ‘LipNet: End-to-End Sentence-level Lipreading’
Keras implementation of ‘LipNet: End-to-End Sentence-level Lipreading’ - rizkiarm/LipNet

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

והנה דוגמא: מצד ימין - המודל של LipNet שהומלץ ע״י ChatGPT, מצד שמאל - סביבת הפיתוח שלי ב-VSCODE, בה אני משתמש בקוד שקיבלתי.

יש יוטיובר מעולה בשם Nicholas Renotte שיש לו המון מדריכי וידאו על כל מיני פיתוחים ו-Machine Learning וכל מיני שטיקים. חלק מהסרטונים שלו מתישים, חלק מרתקים, בכללי יש לו אחלה תכנים. למשל הסרטון הבא:

זהו? צ'אט, טעינת מודל וסיימנו?

כן. עד כדי כך פשוט. אנחנו יכולים לבקש מהצ'אט או מקלוד 3.5 לשפר את הממשק, להוסיף יכולות, לשנות יכולות, אבל כדי להשתמש (שוב, לא לאמן, להשתמש בלבד) במודל Machine Learning וקצת להוסיף לוגיקה, לא צריך להיות גאון גדול. צריך לעיין בשורות שמקבלים מהצאט, לשאלות שאלות, להבין את הלוגיקה ואת מה שקורה, להוריד מודלים רלוונטים מהאינטרנט ושלום על ישראל. זה גן משחקים כיפי לחובבי Machine Learning.

לסיכום:

  1. או לכתוב קוד מאפס או לבקש מהצ'אט קוד שטוען מודל שאומן מראש למשימה מסוימת
  2. העתקת הקוד והדבקה שלו בסביבת פיתוח כמו VSCODE ושמירה בסיומת הרלוונטית (אם קיבלתם קוד פייתון - שמרו את הקובץ בסיומת py)
  3. הורדת המודל הרלוונטי לתיקייה של סביבת הפיתוח שלכם
  4. הרצת הקוד, תיקונים או עצמאית בפיתוח או פינג-פונג מול הצאט או קלוד
  5. גם אם אין לכם בכלל ידע וניסיון, אתם תופתעו כמה זה הופך נגיש יותר ויותר. ככל שתטעו יותר - תבינו יותר ותצליחו יותר.
  6. אימון מודלים זה משהו אחר, שאת הכבוד לתהליך המייגע הזה צריך לתת לאנשים הראויים לכך כפי שציינתי, ובצדק. אותם אי אפשר להחליף, זו גאונות שאין כדוגמתה ומגיע להם כל הקרדיט על העבודה הקשה הזו. זו באמת אמנות שלמה שכפי שציינתי, גם תותחים במקום עבודתי עוסקים בו, גם ישי טובי ועמיר גבעון, וגם אני.

מקווה שנהניתם מהמאמר הזה, אני מזכיר לכם שיש לי קורס שלם על אוטומציות ו-AI שהקלטתי, כ-15 שעות ו-60 פרקים עם תכנים מובילים שיעזרו לכם להיכנס לעולם ה-Gen AI עם סוכנים בוטים ואוטומציות בצורה כיפית ומוסברת היטיב. מחיר ההשקה יסתיים ב-17.7 אז ממליץ לכם לבחון:

עכשיו במחיר השקה מוגבל בזמן: קורס האוטומציות וה-AI שלי באוויר!! 🎉🎉🎉
עכשיו במבצע השקה: קורס האוטומציות וה-AI שלי באוויר!! 🎉🎉🎉

ובנוסף הקלטתי קורס חינמי לחלוטין למי שלא התעסק מעולם ב-AI ורוצה להתחיל מאפס. עשרה פרקים שיקחו אתכם מ-0 ל-100 עם כל מה שאתם צריכים, בחינם! ממש פה:

קורס מזורז: בינה מלאכותית למתחילים

נתראה בפוסטים הבאים,

יובל

עדכון אחרון יולי 10, 2024

אודות המחבר