Gemini API מאפשר לבחון יכולות של ראייה ממוחשבת

לצפייה בכתובת ai.google.dev רוצים לנסות notebook של Colab? הצגת ה-notebook ב-GitHub

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

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

Gemini נוצר כפלטפורמה מולטימודאלית מלכתחילה, ואנחנו ממשיכים להרחיב את גבולות האפשר.

קלט תמונה

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

עבודה עם קובצי אימג' מקומיים

אם אתם משתמשים בספריית התמונות של Python‏ (Pillow ), תוכלו להשתמש גם באובייקטים של תמונות PIL.

from google import genai
from google.genai import types

import PIL.Image

image = PIL.Image.open('/path/to/image.png')

client = genai.Client(api_key="GEMINI_API_KEY")
response = client.models.generate_content(
    model="gemini-2.0-flash",
    contents=["What is this image?", image])

print(response.text)

תמונות בקידוד Base64

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

from google import genai
from google.genai import types

import requests

image_path = "https://goo.gle/instrument-img"
image = requests.get(image_path)

client = genai.Client(api_key="GEMINI_API_KEY")
response = client.models.generate_content(
    model="gemini-2.0-flash-exp",
    contents=["What is this image?",
              types.Part.from_bytes(image.content, "image/jpeg")])

print(response.text)

כמה תמונות

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

from google import genai
from google.genai import types

import pathlib
import PIL.Image

image_path_1 = "path/to/your/image1.jpeg"  # Replace with the actual path to your first image
image_path_2 = "path/to/your/image2.jpeg" # Replace with the actual path to your second image

image_url_1 = "https://goo.gle/instrument-img" # Replace with the actual URL to your third image

pil_image = PIL.Image.open(image_path_1)

b64_image = types.Part.from_bytes(
    pathlib.Path(image_path_2).read_bytes(), "image/jpeg")

downloaded_image = requests.get(image_url_1)

client = genai.Client(api_key="GEMINI_API_KEY")
response = client.models.generate_content(
    model="gemini-2.0-flash-exp",
    contents=["What do these images have in common?",
              pil_image, b64_image, downloaded_image])

print(response.text)

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

עומסי נתונים גדולים של תמונות

אם השילוב של הקבצים וההוראות המערכת שאתם מתכוונים לשלוח גדול מ-20MB, תוכלו להשתמש ב-File API כדי להעלות את הקבצים האלה.

משתמשים ב-method‏ media.upload של File API כדי להעלות תמונה בכל גודל.

אחרי העלאת הקובץ, אפשר לשלוח בקשות GenerateContent שמתייחסות למזהה ה-URI של File API. בוחרים את המודל הגנרטיבי ומספקים לו הנחיה בטקסט ואת התמונה שהועלו.

from google import genai

client = genai.Client(api_key="GEMINI_API_KEY")

img_path = "/path/to/Cajun_instruments.jpg"
file_ref = client.files.upload(path=img_path)
print(f'{file_ref=}')

client = genai.Client(api_key="GEMINI_API_KEY")
response = client.models.generate_content(
    model="gemini-2.0-flash-exp",
    contents=["What can you tell me about these instruments?",
              file_ref])

print(response.text)

תאימות ל-OpenAI

אפשר לגשת ליכולות של Gemini להבנת תמונות באמצעות ספריות OpenAI. כך תוכלו לשלב את Gemini בתהליכי העבודה הקיימים ב-OpenAI על ידי עדכון של שלוש שורות קוד ושימוש במפתח ה-API של Gemini. בדוגמה להבנת תמונות מופיע קוד שמראה איך לשלוח תמונות בקידוד Base64 כמטען שימושי.

הצגת הנחיות באמצעות תמונות

במדריך הזה תלמדו איך להעלות תמונות באמצעות File API או כנתונים בתוך שורה, וליצור תוכן על סמך התמונות האלה.

פרטים טכניים (תמונות)

ב-Gemini 1.5 Pro וב-Gemini 1.5 Flash יש תמיכה ב-3,600 קובצי תמונות לכל היותר.

התמונות צריכות להיות באחד מסוגי ה-MIME הבאים של נתוני תמונה:

  • PNG –‏ image/png
  • JPEG –‏ image/jpeg
  • WEBP –‏ image/webp
  • HEIC – image/heic
  • HEIF –‏ image/heif

טוקנים

כך מחושבים האסימונים לתמונות:

  • Gemini 1.0 Pro Vision: כל תמונה נספרת כ-258 אסימונים.
  • Gemini 1.5 Flash ו-Gemini 1.5 Pro: אם שני המימדים של התמונה קטנים מ-384 פיקסלים או שווים להם, נעשה שימוש ב-258 אסימונים. אם מימד אחד של תמונה גדול מ-384 פיקסלים, התמונה תוחתוך לריבועים. ברירת המחדל של כל גודל משבצת היא הממד הקטן ביותר (רוחב או גובה) חלקי 1.5. אם צריך, כל משבצת מותאמת כך שהיא לא תהיה קטנה מ-256 פיקסלים ולא גדולה מ-768 פיקסלים. לאחר מכן, המערכת משנה את הגודל של כל משבצת ל-768x768 ומשתמשת ב-258 אסימונים.
  • Gemini 2.0 Flash: קלט תמונות שבשני הממדים שלהן יש פחות מ-384 פיקסלים נספר כ-258 טוקנים. תמונות גדולות יותר במאפיין אחד או בשניהם חתוכות וממוזערות לפי הצורך, כך שיתאימו לתמונות בגודל 768x768 פיקסלים. כל תמונה נספרת כ-258 אסימונים.

כדי לקבל את התוצאות הטובות ביותר

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

יכולות

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

אחזור של תיבת מלבנית לאובייקט

המודלים של Gemini מאומנים להחזיר קואורדינטות של תיבות תוחמות (bounding box) כרוחב או גובה יחסיים בטווח [0, 1]. לאחר מכן הערכים האלה מוגדלים ב-1,000 ומומרים למספרים שלמים. למעשה, הקואורדינטות מייצגות את תיבת המלבן של התמונה בגרסה בגודל 1,000x1,000 פיקסלים. לכן, כדי למפות את תיבות הסימון בצורה מדויקת, צריך להמיר את הקואורדינטות האלה בחזרה למימדים של התמונה המקורית.

from google import genai

client = genai.Client(api_key="GEMINI_API_KEY")

prompt = (
  "Return a bounding box for each of the objects in this image "
  "in [ymin, xmin, ymax, xmax] format.")

response = client.models.generate_content(
  model="gemini-1.5-pro",
  contents=[sample_file_1, prompt])

print(response.text)

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

יתרונות עיקריים

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

פרטים טכניים

  • קלט: ההנחיה והתמונות או הפריימים של הסרטון המשויכים.
  • פלט: תיבות מלבניות בפורמט [y_min, x_min, y_max, x_max]. הפינה השמאלית העליונה היא המקור. הצירים x ו-y נמצאים בכיוון אופקי ואנכי, בהתאמה. ערכי הקואורדינטות מנורמלים ל-0 עד 1,000 לכל תמונה.
  • ויזואליזציה: משתמשי AI Studio יראו תיבות גבול שמתוארות בממשק המשתמש.

למפתחי Python, מומלץ לנסות את ה-notebook של הבנת המרחב התלת-ממדי או את ה-notebook הניסיוני של הצבעה תלת-ממדית.

נורמליזציה של קואורדינטות

המודל מחזיר את הקואורדינטות של תיבת המלבן המקיפה בפורמט [y_min, x_min, y_max, x_max]. כדי להמיר את הקואורדינטות המנורמליות האלה לקווי הרוחב והאורך בתמונה המקורית, פועלים לפי השלבים הבאים:

  1. מחלקים כל אחת מהקואורדינטות של הפלט ב-1000.
  2. מכפילים את קואורדינטות ה-x ברוחב התמונה המקורית.
  3. מכפילים את קואורדינטות ה-y בגובה התמונה המקורית.

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

הצגת הנחיות באמצעות סרטון

במדריך הזה תלמדו איך להעלות סרטון באמצעות File API וליצור תוכן על סמך התמונות האלה.

פרטים טכניים (סרטון)

ב-Gemini 1.5 Pro וב-Flash יש תמיכה בנתוני וידאו של עד שעה בערך.

הסרטון חייב להיות באחד מסוגי ה-MIME הבאים של פורמט וידאו:

  • video/mp4
  • video/mpeg
  • video/mov
  • video/avi
  • video/x-flv
  • video/mpg
  • video/webm
  • video/wmv
  • video/3gpp

שירות File API מחלץ פריימים של תמונות מסרטונים בקצב של פריים אחד לשנייה (FPS) ואודיו בקצב של 1Kbps, בערוץ יחיד, ומוסיף חותמות זמן בכל שנייה. השיעורים האלה עשויים להשתנות בעתיד כדי לשפר את ההסקה.

פריימים נפרדים הם 258 אסימונים, ואודיו הוא 32 אסימונים לשנייה. כשמשתמשים במטא-נתונים, כל שנייה בסרטון הופכת ל-300 טוקנים בערך, כלומר חלון הקשר של מיליון טוקנים יכול להכיל פחות משעה של סרטון.

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

לקבלת התוצאות הטובות ביותר:

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

העלאת קובץ וידאו באמצעות File API

‏File API מקבל פורמטים של קובצי וידאו ישירות. בדוגמה הזו נעשה שימוש בסרטון הקצר של NASA‏ "Jupiter's Great Red Spot Shrinks and Grows". קרדיט: מרכז טיסות החלל גודארד (GSFC)/David Ladd (2018).

התמונה 'הכתם האדום הגדול של צדק מתכווץ וגדל' נמצאת ברשות הציבור ולא מוצגים בה אנשים שאפשר לזהות. (הנחיות לשימוש בתמונות ובמדיה של NASA)

מתחילים באחזור הסרטון הקצר:

wget https://storage.googleapis.com/generativeai-downloads/images/GreatRedSpot.mp4

מעלים את הסרטון באמצעות File API ומדפיסים את ה-URI.

from google import genai

client = genai.Client(api_key="GEMINI_API_KEY")

print("Uploading file...")
video_file = client.files.upload(path="GreatRedSpot.mp4")
print(f"Completed upload: {video_file.uri}")

אימות העלאת הקובץ ובדיקת הסטטוס

כדי לוודא שה-API קיבל את הקבצים, צריך להפעיל את השיטה files.get.

import time

# Check whether the file is ready to be used.
while video_file.state.name == "PROCESSING":
    print('.', end='')
    time.sleep(1)
    video_file = client.files.get(name=video_file.name)

if video_file.state.name == "FAILED":
  raise ValueError(video_file.state.name)

print('Done')

הנחיה עם וידאו וטקסט

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

from IPython.display import Markdown

# Pass the video file reference like any other media part.
response = client.models.generate_content(
    model="gemini-1.5-pro",
    contents=[
        video_file,
        "Summarize this video. Then create a quiz with answer key "
        "based on the information in the video."])

# Print the response, rendering any Markdown
Markdown(response.text)

להפנות לחותמות הזמן בתוכן

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

prompt = "What are the examples given at 01:05 and 01:19 supposed to show us?"

response = client.models.generate_content(
    model="gemini-1.5-pro",
    contents=[video_file, prompt])

print(response.text)

תמלול סרטונים ומתן תיאורים חזותיים

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

prompt = (
    "Transcribe the audio from this video, giving timestamps for "
    "salient events in the video. Also provide visual descriptions.")

response = client.models.generate_content(
    model="gemini-1.5-pro",
    contents=[video_file, prompt])

print(response.text)

הצגת רשימה של קבצים

אפשר לקבל רשימה של כל הקבצים שהועלו באמצעות File API ואת מזהי ה-URI שלהם באמצעות files.list.

from google import genai

client = genai.Client(api_key="GEMINI_API_KEY")

print('My files:')
for f in client.files.list():
  print(" ", f'{f.name}: {f.uri}')

מחיקת קבצים

קבצים שמעלים באמצעות File API נמחקים באופן אוטומטי אחרי יומיים. אפשר גם למחוק אותם באופן ידני באמצעות files.delete.

from google import genai

client = genai.Client(api_key="GEMINI_API_KEY")

# Upload a file
poem_file = client.files.upload(path="poem.txt")

# Files will auto-delete after a period.
print(poem_file.expiration_time)

# Or they can be deleted explicitly.
dr = client.files.delete(name=poem_file.name)

try:
  client.models.generate_content(
      model="gemini-2.0-flash-exp",
      contents=['Finish this poem:', poem_file])
except genai.errors.ClientError as e:
  print(e.code)  # 403
  print(e.status)  # PERMISSION_DENIED
  print(e.message)  # You do not have permission to access the File .. or it may not exist.

המאמרים הבאים

במדריך הזה מוסבר איך להעלות קובצי תמונות וסרטונים באמצעות File API, ואז ליצור פלט טקסט ממידע קלט של תמונות וסרטונים. מידע נוסף זמין במשאבים הבאים:

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