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

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

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

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

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

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

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

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

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

כדי לחסוך במשאבים, סמנטיקה של סצנה מושבתת כברירת מחדל ב-ARCore. מפעילים את המצב הסמנטי כדי שהאפליקציה תשתמש ב-Scene 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.
}