เริ่มต้นใช้งาน Scene Semantics และ Geospatial Depth API ใน ARCore

1. ก่อนเริ่มต้น

ARCore คือเฟรมเวิร์กของ Google สำหรับการสร้างประสบการณ์ Augmented Reality (AR) บนสมาร์ทโฟน API ความหมายของฉากและความลึกเชิงพื้นที่ช่วยให้ประสบการณ์ AR เข้าใจสภาพแวดล้อมรอบตัวผู้ใช้

Scene Semantics API ใช้โมเดลแมชชีนเลิร์นนิง (ML) เพื่อวิเคราะห์รูปภาพของกล้องและแสดงรูปภาพของพิกเซลที่มีป้ายกำกับ โดยสามารถแยกแยะป้ายกลางแจ้งที่แตกต่างกัน 11 แบบ

Geospatial Depth API จะรวมข้อมูลเชิงลึกจากการเคลื่อนไหวและเซ็นเซอร์ฮาร์ดแวร์ที่ใช้งานอยู่ เช่น เวลาในการบิน เข้ากับข้อมูล Streetscape Geometry API ซึ่งจะช่วยปรับปรุงข้อผิดพลาดในการสังเกตเชิงลึกได้ไกลถึง 65 เมตร

ในโค้ดแล็บนี้ คุณจะได้สร้างแอป AR ที่แสดงผลลัพธ์ของ Scene Semantics API และ Geospatial Depth API

ข้อกำหนดเบื้องต้น

  • ความรู้พื้นฐานเกี่ยวกับ AR

สิ่งที่คุณจะได้เรียนรู้

  • วิธีเปิดใช้ Scene Semantics API
  • วิธีรับและแสดงภาพเชิงความหมาย
  • วิธีรับและแสดงภาพความเชื่อมั่นเชิงความหมาย
  • วิธีพิจารณาว่าพิกเซลกี่เปอร์เซ็นต์ที่สอดคล้องกับป้ายกำกับที่กำหนด
  • วิธีตั้งค่าโปรเจ็กต์ Google Cloud ที่ใช้ ARCore Geospatial API ได้
  • วิธีเปิดใช้ Geospatial Depth API
  • วิธีแสดงภาพเชิงลึก

สิ่งที่คุณต้องมี

2. ตั้งค่าสภาพแวดล้อม

เราได้จัดเตรียมโปรเจ็กต์เริ่มต้นที่มีพื้นฐานของโปรเจ็กต์ ARCore และฟังก์ชันตัวช่วยบางอย่างไว้ให้เพื่อช่วยให้คุณเริ่มต้นใช้งาน Geospatial API ได้

หากต้องการตั้งค่าโปรเจ็กต์เริ่มต้น ให้ทำตามขั้นตอนต่อไปนี้

  1. เปิด Android Studio แล้วทำอย่างใดอย่างหนึ่งต่อไปนี้
    • หากเปิดโปรเจ็กต์อยู่แล้ว ให้คลิกไฟล์ > ใหม่ > โปรเจ็กต์จากการควบคุมเวอร์ชัน
    • หากเห็นหน้าต่างยินดีต้อนรับสู่ Android Studio ให้คลิกรับจาก VCS รับจากตำแหน่ง VCS
  2. เลือก Git แล้วป้อน https://github.com/google-ar/codelab-scene-semantics-geospatial-depth.git เพื่อนำเข้าโปรเจ็กต์

3. แสดงข้อมูล Scene Semantics API ด้วยภาพ

เปิดใช้ Scene Semantics API

ระบบจะปิดใช้ Scene Semantics API โดยค่าเริ่มต้นเพื่อประหยัดพลังการประมวลผล

หากต้องการเปิดใช้ Scene Semantics API ให้ทำตามขั้นตอนต่อไปนี้

  1. ในไฟล์ CodelabActivity.kt ให้ค้นหาบรรทัดต่อไปนี้
    // TODO: Enable the Scene Semantics API.
    
  2. หลังจากบรรทัดนั้น หากอุปกรณ์รองรับ ให้เปิดใช้ Scene Semantics API ในการกำหนดค่าของเซสชัน
    if (session.isSemanticModeSupported(Config.SemanticMode.ENABLED)) {
      semanticMode = Config.SemanticMode.ENABLED
    }
    

รับและแสดงภาพเชิงความหมาย

รูปภาพเชิงความหมายเป็นผลลัพธ์ของโมเดล ML ของ ARCore ที่กำหนด SemanticLabel Enum ให้กับแต่ละพิกเซลในฟีดกล้อง

ตัวอย่างรูปภาพเชิงความหมาย

หากต้องการรับรูปภาพเชิงความหมายและแสดงบนหน้าจอ ให้ทำตามขั้นตอนต่อไปนี้

  1. ในไฟล์ CodelabRenderer.kt ให้ค้นหาบรรทัดต่อไปนี้
    // TODO: Obtain the semantic image for this frame.
    
  2. หลังจากบรรทัดนั้น ให้รับรูปภาพเชิงความหมาย
    frame.acquireSemanticImage().use { image ->
      semanticRenderer.updateCameraSemanticsTexture(image)
      activity.view.semanticLabelAtCenter = getLabelAt(image, image.width/2, image.height/2)
    }
    
    ระบบจะใช้รูปภาพเชิงความหมายในคลาส SemanticRenderer เพื่อแสดงบนหน้าจอ คุณอัปเดตตัวแปร semanticLabelAtCenter เพื่อแสดงป้ายกำกับเชิงความหมายที่กึ่งกลางหน้าจอในมุมมองของแอป
  3. เรียกใช้แอปและเล็งกล้องไปยังวัตถุต่างๆ ภายนอก การแสดงป้ายกำกับเชิงความหมายจะเปลี่ยนไปเมื่อคุณดูออบเจ็กต์ประเภทต่างๆ
  4. แตะไอคอนการตั้งค่า การตั้งค่าเพื่อเปิดใช้การซ้อนทับรูปภาพที่มีความเชื่อมั่นเชิงความหมาย

รับและแสดงภาพความเชื่อมั่นเชิงความหมาย

รูปภาพความมั่นใจเชิงความหมายจะบ่งบอกถึงความมั่นใจของ ARCore ในป้ายกำกับเชิงความหมายที่พิกเซลที่ตรงกัน

หากต้องการรับรูปภาพเชิงความหมายและแสดงบนหน้าจอ ให้ทำตามขั้นตอนต่อไปนี้

  1. ในไฟล์ CodelabRenderer.kt ให้ค้นหาบรรทัดต่อไปนี้
    // TODO: Obtain the confidence image for this frame.
    
  2. หลังจากบรรทัดนี้ ให้รับรูปภาพเชิงความหมาย
    frame.acquireSemanticConfidenceImage().use { image ->
      semanticRenderer.updateConfidenceSemanticsTexture(image)
      activity.view.confidenceAtCenter = getConfidenceAt(image, image.width/2, image.height/2)
    }
    
    ระบบจะใช้รูปภาพที่มีความเชื่อมั่นเชิงความหมายในคลาส SemanticRenderer เพื่อแสดงบนหน้าจอ คุณอัปเดตตัวแปร confidenceAtCenter เพื่อแสดงป้ายกำกับเชิงความหมายที่กึ่งกลางหน้าจอในมุมมองของแอป
  3. เรียกใช้แอปและเล็งกล้องไปยังวัตถุต่างๆ ภายนอก การแสดงความเชื่อมั่นเชิงความหมายจะเปลี่ยนไปเมื่อคุณดูออบเจ็กต์ประเภทต่างๆ
  4. แตะไอคอนการตั้งค่า การตั้งค่าเพื่อเปิดใช้การซ้อนทับรูปภาพที่มีความเชื่อมั่นเชิงความหมาย

พิจารณาความแพร่หลายของป้ายกำกับ

ความแพร่หลายของป้ายกำกับคือเปอร์เซ็นต์ของรูปภาพเชิงความหมายที่เท่ากับป้ายกำกับที่กำหนด เช่น หาก 26% ของรูปภาพมีค่า SemanticLabel.SKY ค่าความชุกสำหรับค่า SemanticLabel.SKY จะเป็น 0.26f

หากต้องการดูความแพร่หลายของป้ายกำกับและแสดงบนหน้าจอ ให้ทำตามขั้นตอนต่อไปนี้

  1. ในไฟล์ CodelabRenderer.kt ให้ค้นหาบรรทัดต่อไปนี้
    // TODO: Obtain the prevalence of the selected label for this frame.
    
  2. หลังจากบรรทัดนั้น ให้รับความแพร่หลายสำหรับป้ายกำกับที่เลือก
    activity.view.fractionOfLabel = frame.getSemanticLabelFraction(activity.view.selectedSemanticLabel)
    
  3. เรียกใช้แอปและเล็งกล้องไปยังวัตถุต่างๆ ภายนอก ค่าเศษส่วนจะเปลี่ยนแปลงเมื่อคุณดูออบเจ็กต์ประเภทต่างๆ แตะ ไอคอนการตั้งค่า Settings เพื่อเปลี่ยนเศษส่วนของป้ายกำกับที่แสดง เช่น ลองสร้างและพยายามเติมวิวพอร์ตด้วยอาคาร แล้วดูว่าการดำเนินการดังกล่าวส่งผลต่อเศษส่วนอย่างไร

4. แสดงภาพข้อมูล Geospatial Depth API

Geospatial Depth API ช่วยปรับปรุงการอ่านค่าความลึกเมื่อเปิดใช้ Geospatial API และ Streetscape Geometry API หากต้องการใช้ Geospatial Depth API กับ Kotlin และ Android Studio คุณต้องมีโปรเจ็กต์ Google Cloud

ตั้งค่าโปรเจ็กต์ Google Cloud

ARCore Geospatial API จะเชื่อมต่อกับ Google Cloud เพื่อให้ข้อมูลการแปลจากระบบกำหนดตำแหน่งด้วยภาพ (VPS) ของ Google ในพื้นที่ที่ Google Street View ครอบคลุม

หากต้องการใช้เซิร์ฟเวอร์นี้ในโปรเจ็กต์ ให้ทำตามขั้นตอนต่อไปนี้

  1. สร้างโปรเจ็กต์ใน Google Cloud

    สร้างโปรเจ็กต์ Google Cloud
  2. ในช่องชื่อโปรเจ็กต์ ให้ป้อนชื่อที่เหมาะสม เช่น ARCore Geospatial API project แล้วเลือกสถานที่ตั้ง
  3. คลิกสร้าง
  4. ในคอนโซล Google Cloud ในหน้าตัวเลือกโปรเจ็กต์ ให้คลิกสร้างโปรเจ็กต์
  5. คลิกลิงก์ต่อไปนี้เพื่อดู ARCore API สำหรับโปรเจ็กต์นี้ แล้วคลิกเปิดใช้
  6. สร้างคีย์ API สำหรับโปรเจ็กต์ของคุณ
    1. ในส่วน API และบริการ ให้เลือกข้อมูลเข้าสู่ระบบ
    2. คลิกสร้างข้อมูลเข้าสู่ระบบ แล้วเลือกคีย์ API
    3. จดคีย์ไว้เนื่องจากคุณต้องใช้ในภายหลัง

คุณสร้างโปรเจ็กต์ Google Cloud ด้วยการให้สิทธิ์คีย์ API และพร้อมที่จะใช้ Geospatial API ในโปรเจ็กต์ตัวอย่างแล้ว

ผสานรวมคีย์ API กับโปรเจ็กต์ Android Studio

หากต้องการเชื่อมโยงคีย์ API จาก Google Cloud กับโปรเจ็กต์ ให้ทำตามขั้นตอนต่อไปนี้

  1. ใน Android Studio ให้คลิก app > src แล้วดับเบิลคลิก AndroidManifest.xml
  2. ค้นหารายการ meta-data ต่อไปนี้
    <meta-data
        android:name="com.google.android.ar.API_KEY"
        android:value="API_KEY" />
    
  3. แทนที่ตัวยึดตำแหน่ง API_KEY ด้วยคีย์ API ที่คุณสร้างในโปรเจ็กต์ Google Cloud ค่าที่จัดเก็บไว้ใน com.google.android.ar.API_KEY จะให้สิทธิ์แอปนี้ในการใช้ Geospatial API

ยืนยันโปรเจ็กต์

  • หากต้องการยืนยันโปรเจ็กต์ ให้เรียกใช้แอปในอุปกรณ์ที่ใช้พัฒนา คุณควรเห็นมุมมองกล้องและข้อมูลการแก้ไขข้อบกพร่องเชิงพื้นที่ที่ด้านบนของหน้าจอ

ข้อมูลทางภูมิศาสตร์จะแสดงในแอป

เปิดใช้การกำหนดค่าที่จำเป็น

Geospatial Depth API ต้องเปิดใช้การตั้งค่า 3 รายการในการกำหนดค่าเซสชันของแอป

หากต้องการเปิดใช้ ให้ทำตามขั้นตอนต่อไปนี้

  1. ในไฟล์ CodelabRenderer.kt ให้ค้นหาบรรทัดต่อไปนี้
    // TODO: Enable the Geospatial API, the Streetscape Geometry API, and the Depth API.
    
  2. ในบรรทัดถัดไป ให้เพิ่มโค้ดต่อไปนี้
    val isDepthSupported = session.isDepthModeSupported(Config.DepthMode.AUTOMATIC)
    val isGeospatialSupported = session.isGeospatialModeSupported(Config.GeospatialMode.ENABLED)
    if (isDepthSupported && isGeospatialSupported) {
      // These three settings are needed to use Geospatial Depth.
      geospatialMode = Config.GeospatialMode.ENABLED
      streetscapeGeometryMode = Config.StreetscapeGeometryMode.ENABLED
      depthMode = Config.DepthMode.AUTOMATIC
    }
    

แสดงข้อมูลความลึกเป็นภาพ

  1. เรียกใช้แอปและไปที่อาคารในพื้นที่ของคุณ
  2. หลังจากทำการแปลเป็นภาษาท้องถิ่นเชิงพื้นที่เสร็จแล้ว ให้แตะไอคอนการตั้งค่า Settings แล้วเปิดใช้การแสดงภาพความลึกเชิงพื้นที่
  3. ดูอาคารใน AR และเปรียบเทียบกับข้อมูลเชิงลึกที่ไม่มีความลึกเชิงพื้นที่

5. บทสรุป

ยินดีด้วย คุณสร้างแอป AR ที่แสดงภาพความหมายของฉากและความลึกเชิงพื้นที่

ดูข้อมูลเพิ่มเติม