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

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

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

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

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

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

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

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

בסשן ARCore חדש, בודקים אם המכשיר של המשתמש תומך ב-Scene Semantics API. חלק מהמכשירים שתואמים ל-ARCore לא תומכים ב-Scene 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.
}