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

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

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

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

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

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

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

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

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

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

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

אפשר גם לבצע שאילתה לגבי חלק הפיקסלים במסגרת הנוכחית ששייכים למחלקה מסוימת, למשל שמיים. השאילתה הזו יעילה יותר מהחזרת התמונה הסמנטית וביצוע חיפוש ברמת הפיקסלים עבור תווית ספציפית. השבר המוחזר הוא ערך מסוג מספר ממשי (float) בטווח [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.
}