הבנת סביבת המשתמש ב-Android SDK (Kotlin/Java)

כאן אפשר ללמוד איך להשתמש ב-Scene Semantics API באפליקציות שלכם.

ה-Sene Semantics API מאפשר למפתחים להבין את הסצנה סביב המשתמש באמצעות מידע סמנטי בזמן אמת שמבוסס על מודל של למידת מכונה. כשנותנים ל-API תמונה של סצנה בחוץ, הוא מחזיר תווית לכל פיקסל מתוך קבוצה של סיווגים סמנטיים שימושיים, כמו שמים, בניין, עץ, כביש, מדרכה, רכב, אדם ועוד. בנוסף לתוויות פיקסלים, Scene Semantics API מציע גם ערכי ביטחון לכל תווית פיקסלים ודרך קלה להריץ שאילתות לגבי שכיחות התווית בסצנה בחוץ.

דוגמאות של תמונת קלט, התמונה הסמנטית של תוויות הפיקסלים ותמונת הסמך המתאימה: משמאל לימין:

דוגמה לתמונה קלט, לתמונה סמנטית ולתמונה של רמת האמון בסמנטיקה.

דרישות מוקדמות

חשוב לוודא שאתם מבינים את המושגים הבסיסיים של AR ואיך להגדיר סשן ARCore לפני שממשיכים.

הפעלת הסמנטיקה של הסצנות

בסשן ARCore חדש, בודקים אם המכשיר של המשתמש תומך ב-Scene Semantics API. לא כל המכשירים התואמים ל-ARCore תומכים ב-Scene Semantics API בגלל מגבלות של כוח עיבוד.

כדי לחסוך במשאבים, התכונה 'סמנטיקה של סצנה' מושבתת כברירת מחדל ב-ARCore. יש להפעיל את המצב הסמנטי כדי שהאפליקציה שלך תשתמש ב-Sene Semantics API.

Java

Config config = session.getConfig();

// Check whether the user's device supports the Scene Semantics API.
boolean isSceneSemanticsSupported =
    session.isSemanticModeSupported(Config.SemanticMode.ENABLED);
if (isSceneSemanticsSupported) {
  config.setSemanticMode(Config.SemanticMode.ENABLED);
}
session.configure(config);

Kotlin

val config = session.config

// Check whether the user's device supports the Scene Semantics API.
val isSceneSemanticsSupported = session.isSemanticModeSupported(Config.SemanticMode.ENABLED)
if (isSceneSemanticsSupported) {
  config.semanticMode = Config.SemanticMode.ENABLED
}
session.configure(config)

קבלת התמונה הסמנטית

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

משתמשים ב-Frame.acquireSemanticImage() כדי להוסיף את התמונה הסמנטית:

Java

// Retrieve the semantic image for the current frame, if available.
try (Image semanticImage = frame.acquireSemanticImage()) {
  // Use the semantic image here.
} catch (NotYetAvailableException e) {
  // No semantic image retrieved for this frame.
  // The output image may be missing for the first couple frames before the model has had a
  // chance to run yet.
}

Kotlin

// Retrieve the semantic image for the current frame, if available.
try {
  frame.acquireSemanticImage().use { semanticImage ->
    // Use the semantic image here.
  }
} catch (e: NotYetAvailableException) {
  // No semantic image retrieved for this frame.
}

תמונות סמנטיות של הפלט אמורות להיות זמינות אחרי כ-1-3 מסגרות מתחילת הסשן, בהתאם למכשיר.

אחזור של קובץ האימג' של האמון

בנוסף לתמונה הסמנטית, שמספקת תווית לכל פיקסל, ה-API מספק גם תמונת סמך של ערכי הסמך של הפיקסלים המתאימים. תמונת האמון היא תמונה מסוג ImageFormat.Y8, שבה כל פיקסל תואם לערך בטווח [0, 255], בהתאם להסתברות שמשויכת לתווית הסמנטית של כל פיקסל.

משתמשים ב-Frame.acquireSemanticConfidenceImage() כדי לקבל את תמונת האמון הסמנטית:

Java

// Retrieve the semantic confidence image for the current frame, if available.
try (Image semanticImage = frame.acquireSemanticConfidenceImage()) {
  // Use the semantic confidence image here.
} catch (NotYetAvailableException e) {
  // No semantic confidence image retrieved for this frame.
  // The output image may be missing for the first couple frames before the model has had a
  // chance to run yet.
}

Kotlin

// Retrieve the semantic confidence image for the current frame, if available.
try {
  frame.acquireSemanticConfidenceImage().use { semanticConfidenceImage ->
    // Use the semantic confidence image here.
  }
} catch (e: NotYetAvailableException) {
  // No semantic confidence image retrieved for this frame.
}

תמונות של רמת האמון בפלט אמורות להיות זמינות אחרי כ-1-3 מסגרות מתחילת הסשן, בהתאם למכשיר.

שליחת שאילתה לגבי החלק של הפיקסלים בתווית סמנטית

אפשר גם לשלוח שאילתה לגבי החלק של הפיקסלים בפריים הנוכחי ששייכים לקבוצה מסוימת, כמו 'שמים'. השאילתה הזו יעילה יותר מהחזרת התמונה הסמנטית וביצוע חיפוש ברמת הפיקסלים עבור תווית ספציפית. השבר המוחזר הוא ערך מסוג מספר ממשי (float) בטווח [0.0, 1.0].

משתמשים בפקודה Frame.getSemanticLabelFraction() כדי לקבל את החלק של תווית נתונה:

Java

// Retrieve the fraction of pixels for the semantic label sky in the current frame.
try {
  float outFraction = frame.getSemanticLabelFraction(SemanticLabel.SKY);
  // Use the semantic label fraction here.
} catch (NotYetAvailableException e) {
  // No fraction of semantic labels was retrieved for this frame.
}

Kotlin

// Retrieve the fraction of pixels for the semantic label sky in the current frame.
try {
  val fraction = frame.getSemanticLabelFraction(SemanticLabel.SKY)
  // Use the semantic label fraction here.
} catch (e: NotYetAvailableException) {
  // No fraction of semantic labels was retrieved for this frame.
}