להבין את סביבת המשתמש ב-Android NDK (C)

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

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

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

דוגמה לתמונת קלט, תמונה סמנטית ותמונת מהימנות סמנטית.

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

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

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

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

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

// Check whether the user's device supports the Scene Semantics API.
int32_t is_scene_semantics_supported = 0;
ArSession_isSemanticModeSupported(ar_session, AR_SEMANTIC_MODE_ENABLED, &is_scene_semantics_supported);

// Configure the session for AR_SEMANTIC_MODEL_ENABLED.
ArConfig* ar_config = NULL;
ArConfig_create(ar_session, &ar_config);
if (is_scene_semantics_supported) {
  ArConfig_setSemanticMode(ar_session, ar_config, AR_SEMANTIC_MODE_ENABLED);
}
CHECK(ArSession_configure(ar_session, ar_config) == AR_SUCCESS);
ArConfig_destroy(ar_config);

השגת התמונה הסמנטית

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

משתמשים ב-ArFrame_acquireSemanticImage() כדי לצרף את התמונה הסמנטית:

// Retrieve the semantic image for the current frame, if available.
ArImage* semantic_image = NULL;
if (ArFrame_acquireSemanticImage(ar_session, ar_frame, &semantic_image) != AR_SUCCESS) {
  // 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.
  return;
}
// If a semantic image is available, use it here.

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

משיגים את תמונת הביטחון

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

שימוש ב-ArFrame_acquireSemanticConfidenceImage() כדי להשיג את תמונת המהימנות הסמנטית:

// Retrieve the semantic confidence image for the current frame, if available.
ArImage* semantic_confidence_image = NULL;
if (ArFrame_acquireSemanticConfidenceImage(ar_session, ar_frame, &semantic_confidence_image) != AR_SUCCESS) {
  // 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.
  return;
}
// If a semantic confidence image is available, use it here.

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

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

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

משתמשים ב-ArFrame_getSemanticLabelFraction() כדי לקבל את השבר לתווית נתונה:

// Retrieve the fraction of pixels for the semantic label sky in the current frame.
float out_fraction = 0.0f;
if (ArFrame_getSemanticLabelFraction(ar_session, ar_frame, AR_SEMANTIC_LABEL_SKY, &out_fraction) != AR_SUCCESS) {
  // No fraction of semantic labels was retrieved for this frame.
}