Rehber VisionOS İçin Nesne Takibi Nasıl Çalışıyor

  • Konuyu Başlatan Konuyu Başlatan Eagle
  • Başlangıç tarihi Başlangıç tarihi

Eagle

İçerik Üreticisi
Developer
Katılım
26 Ekim 2024
Puan
3
XR Başlığı
Quest 2
WWDC 2024 sırasında Nesne İzleme ve Nesne Yeniden Oluşturma ile yayınlanan önemli özellikleri test etmeye odaklanan son iki haftadaki çalışmamı paylaşmak istiyorum. İyi, kötü ve sinir bozucu yönlerini paylaşacağım. Bununla ilgili söylenecek birçok harika şey olsa da, pek de beğenmediğim birkaç şey de vardı. Ancak, her zaman olduğu gibi, pozitif kalmaya çalışıyorum ve bunu sadece bir başlangıç olarak görüyorum. Apple genellikle bu şekilde başlıyor ve zamanla büyük ölçüde gelişiyor.

Nesne Takibi Nedir? Nesne Takibi Neden Bu Kadar Gerekli Bir Mekansal Özelliktir?​

Nesne Takibi oldukça açıklayıcı bir terimdir, ancak neyle uğraştığımıza dair daha net bir resim elde etmek için Apple'ın bunu nasıl tanımladığını anlamak önemlidir. Apple bu ARKit özelliğini "bir kişinin ortamındaki gerçek dünya nesnelerini bulmak ve izlemek için 3 boyutlu referans nesneleri kullanma" olarak tanımlar ve bu artık daha mantıklı olmalı. Ancak "Dilmer, bu 3 boyutlu referans nesneleri nelerdir? Apple bunları sağlıyor mu, yoksa bu özelliği uygulamadan önce bunları modellememiz mi gerekiyor?" diye sorabilirsiniz. Hayır, Apple bu 3 boyutlu referans nesnelerini sağlamaz. Bunları modelleme konusunda, bu yanıtlara yardımcı olmak için aşağıdaki iş akışını ele alacağım.

Sonra, Nesne Takibi neden bu kadar gerekli bir mekansal özelliktir? Nesne Takibi, yıllar boyunca birlikte çalıştığım abonelerimin ve müşterilerimin birçoğundan büyük bir talepti. Buna özellikle Nesne Takibi değil, Bilgisayar Görüntüsü diyor olabilirler. Size daha fazla bağlam sağlamak için, ayda en az 2-3 kez Meta Quest 2-3, Meta Quest Pro, Magic Leap 2 ve en son Apple Vision Pro'da kamera erişimi hakkında soru soruluyor. "Bunun ne önemi var? İnsanlar neden kamera erişimi hakkında soru soruyor?" diye sorabilirsiniz. Çünkü Nesne Takibi veya benzer bir çözüme ihtiyaçları var. Çoğu kullanım durumunda, insanlar kamera erişimi hakkında soru sorduğunda, kullanıcıların merceklerden ne gördüklerini daha iyi anlamak isterler ve Nesne Takibi bu çözüme doğru büyük sıçramalar yapar.

Nesne İzleme Gereksinimleri:​

  • macOS Sequoia (Beta 15.2 veya üzeri)
  • macOS Sequoia, Apple Silicon'lu Mac bilgisayarlarda ve T2 Güvenlik Çipi'ne sahip Intel tabanlı Mac bilgisayarlarda kullanılabilir
  • Xcode Sürüm 16.0 beta 2 veya üzeri, visionOS desteği
    • Bunlara “ML Oluştur” ve “Reality Composer Pro” dahildir
  • visionOS 2.0 veya üzeri sürüme sahip Apple Vision Pro
  • Nesne izleme iş akışını ele alırken Ek Gereksinimler aşağıda sunulmaktadır.

visionOS Nesne Takibi İçin Fiziksel Nesneler Nasıl Hazırlanır?​

Öncelikle, fiziksel bir nesneyi sanal bir nesneye dönüştürmenin bir yolunu bulmamız gerekiyor, yani taramak istediğimiz nesneden üretilen bir 3D modele ihtiyacımız var. Bunu başarmak için bugünlerde birçok araç mevcut ve sadece bu konu hakkında sayısız makale yazabilirim. Ancak, konudan sapmamak için, Apple'ın geliştiricilere ücretsiz olarak sağladığı araçlara ve en son beta araçlarını kullanarak keşfettiğim bazı araçlara odaklanmak istiyorum.
  • Apple'ın Guided Capture iOS Uygulaması : Bu proje, fiziksel bir nesneyi tarama sürecinde size rehberlik eden tam teşekküllü bir uygulamadır. Dürüst olmak gerekirse, Apple burada çok güzel bir iş çıkarmış. Hedef nesnenizin etrafına bir sınırlayıcı kutu yerleştirip boyutunu değiştirerek başlıyorsunuz, ardından uygulama otomatik olarak görüntüleri yakalarken nesnenin etrafında dolaşıyorsunuz. Nesnenin etrafında her tam hareket belirli sayıda görüntü için sayılır ve ayrıca sağlanan bir düğmeyi kullanarak aynı uygulama ile daha fazlasını manuel olarak yakalayabilirsiniz. İşiniz bittiğinde, oluşturulan USDZ modelini iPhone'unuzun Dosya Dizinine kaydeder.
  • Apple'ın Nesne Yeniden Oluşturma macOS Uygulaması: Bu, nesne yeniden oluşturma için bir görüntü dizini belirtmenize olanak tanıyan bağımsız bir uygulamadır (bkz. şekil 1.0). Bu uygulama ayrıca ağ türünü (üçgen ağ veya dörtlü ağ), kaliteyi (önizleme, küçültülmüş, orta, tam, ham ve özel), maskelemeyi (nesneyi ortamdan izole etme veya nesnenin etrafındaki ortamı dahil etme) ve özel sınırlayıcı kutu sınırlarıyla kırpma seçeneklerini değiştirme seçenekleri de sağlar.
  • Apple'ın Fotogrametri Komut Satırı Uygulaması: Adından da anlaşılacağı gibi, bu, diğer uygulamalarla daha önce listelenen tüm özellikleri içeren bir komut satırı kodlama örneği projesidir. Ancak, bir kullanıcı arayüzüne sahip olmak yerine, komut satırını kullanarak onunla etkileşime girersiniz. Ayrıca, Apple'ın bu özellikleri kendi özel uygulamalarınızda kolayca uygulamanıza olanak tanıyan bir Fotogrametri API'si yayınladığını da belirtmek önemlidir.
  • Apple'ın Reality Composer Pro > Yeni Bir Nesne Yakalama Modeli Oluştur Seçeneği : Xcode 16'yı kullanırken Reality Composer Pro'da bu yeni seçeneği fark ettim. Bu seçenek, önceki uygulamalara benzer ancak Reality Composer Pro'ya yerleştirilmiş bir görüntü listesinden 3B bir model yeniden oluşturmanıza olanak tanır. Video için kullanmayı seçtiğim seçenek buydu ve garip bir şekilde, Guided Capture iOS veya komut satırını kullanmaktan çok daha iyi sonuçlar verdiğini gördüm. Ancak, Guided Capture tüm görüntüleri oluşturmak için harikaydı, bu yüzden nesne yeniden oluşturma için Reality Composer Pro ile birlikte ondan oluşturulan görüntüleri kullandım.
Bu seçeneklerden herhangi biriyle, Create ML'nin Spatial Object Tracking yeteneklerini kullanarak makine öğrenimi modelimizi eğitmek için kullanacağımız bir .usdz dosyası oluşturulur.

visionOS Nesne İzleme ile Bir Model Nasıl Eğitilir?​

Xcode 16 veya üzeri, Mac'inizi kullanarak makine öğrenimi modellerini eğitmenize olanak tanıyan Create ML adlı bir araç sunar . Şu anda, bu uygulama eğitim için kullanabileceğiniz çeşitli önceden tanımlanmış modeller sunar, ancak bu gönderiyi odaklı tutmak için, özellikle Spatial Object Tracking seçeneğine bakacağız.

Bir modeli eğitmek için şu adımları izleyin:
  • Xcode'u açın ve File > Open Developer Tool > Create ML'a tıklayın.
  • Create ML açıldığında File > New Project. tıklayın.
  • Mekansal altında Nesne İzleme şablonunu seçin.
  • Projenize bir isim verin ve yeni bir proje oluşturmak için Oluştur'a tıklayın.
  • Yeni bir Model Kaynağı ekleyin ve .usdz dosyanızı Ayarlar görünümüne sürükleyip bırakın.
  • Nesne izleme için kullanım durumunuza bağlı olarak görüntüleme açısını seçin. Modelinizi tüm açılardan izlemeniz gerekiyorsa, "All Angles" seçeneğini belirleyin. Örneğin, nesneniz her zaman duvardan asılıysa, açınız olarak "Front" seçin. Modeliniz her zaman bir masanın üstündeyse, "Upright." seçin.
  • Eğitime başlamak için Train’e tıklayın.
    • Bugün itibariyle, nesne takibi için eğitim modelleri 8 ila 16 saat veya daha fazla sürebilir. Benim durumumda, bir PS5 kontrolcüsünü eğitmek 16 saatten fazla sürdü, bir aksiyon figürü oyuncağını eğitmek ise yaklaşık 12 saat sürdü. Bu yüzden, çok sabırlı olun.
Eğitim tamamlandıktan sonra Çıktı seçeneğine tıklayın ve ardından eğitilmiş modelinizi indirmek için Al'a tıklayın. Modeliniz .referenceobject uzantısına sahip olacaktır.

Nesne İzleme 3D Referans Nesneleri Xcode'a Nasıl Entegre Edilir?​

Bunu başarmanın birkaç yolu vardır. Önce Xcode ile yeni bir visionOS projesi oluşturarak, ardından varsayılan Reality İçerik Sahnelerinden birini açarak ve bir dönüşüme bir sabitleme bileşeni ekleyerek Reality Composer Pro'yu kullanabilirsiniz. Alternatif olarak, Apple'ın visionOS kodlama örneğiyle yaptığı ve benim de sonunda yaptığım gibi, referans nesnesini çalışma zamanında ekleyebilirsiniz. Bu özellikleri test etmek için yaptığım şeyin tam kaynak koduna GitHub'dan erişebilirsiniz . Bu kadar çok kaynak sağladığı için Apple'a büyük teşekkürler, bunları bu gönderinin sonuna ekleyeceğim.

Sağladığım kodu kullanmanızı ve tüm .referenceobject dosyalarını projeden kaldırmanızı öneririm. Bir PS5 kontrolcünüz varsa, projeyi visionOS cihazınız için derleyebilir ve özelliklerini test etmeye başlayabilirsiniz. Yeni .referenceobject dosyalarınız varsa, bunları Xcode içindeki Reference Objects grubuna sürükleyip bırakın, ardından projeyi yeniden derleyin ve yeniden dağıtın.

Ayrıca, nesne izlemeyle ilgili uygulama akışını anlamanıza yardımcı olacağından, kaynak kodunu aşağıdaki sırayla incelediğinizden emin olun; bu, dünya algılama izinlerini alma, nesne izlemenin desteklenip desteklenmediğini kontrol etme ve bağlantı olaylarını yönetme gibi konuları içerir:
  • ReferenceObjectLoader.swift
  • AppState.swift
  • VisionOSObjectTrackingDemoApp.swift
  • HomeContentView.swift
  • ObjectTrackingRealityView.swift
  • ObjectAnchorVisualization.swift

Nesne İzleme Eğitimi Süresi, Performansı, Gecikmesi ve Doğruluğu:​

  • Nesne İzleme Eğitim Süreleri: Uzun zaman aldı! Makinemin eski olduğunu düşünüyordum ama 16 GB'lık bir M1 Pro'm var (2021 modeli). En hızlı veya en yeni model değil ama bu modelleri çok daha hızlı eğitebilmeli. Belki de bu sadece ilk versiyondur ve yakında önemli iyileştirmeler göreceğiz. Peki, her bir modeli eğitmek ne kadar sürdü? PS5 kontrolcüsünü eğitmek 16 saat 52 dakika, oyuncak içinse 11 saat 42 dakika sürdü ki bu benim için şaşırtıcıydı. Ancak, ne kadar çok düşünürsem, bunu bir sorun olarak görmemeye başladım. Gerçekten kullanım durumuna bağlı: örneğin, popüler bir kahve makinesinin üreticisiyseniz ve .USDZ dosyasına ve Referans Nesnesine sahipseniz, bunu geliştiricilere SDK'nızın bir parçası olarak sunabilir ve bu modelleri eğitim zahmetine girmeden uygulamalarına entegre etmelerine olanak tanıyabilirsiniz. Benzer şekilde, PS5 kontrolcüsü gibi yaygın olarak kullanılan bir modelde, bunu paylaşmak başkaları için faydalı olabilir.
  • Performans ve Gecikme: Mobil telefonlarda, cihazın performansının zirveye ulaştığını genellikle çok ısındığında veya uygulamalar yanıt vermediğinde anlayabilirsiniz. Apple Vision Pro ile herhangi bir büyük performans sorunu fark etmedim, ancak PS5 kontrol cihazının belirli senaryolarda tanımlanmasında zaman zaman sorun yaşandı veya çapanın son konumunu ve dönüşünü güncellemede gecikmeler yaşandı. Bunun nedeni, PS5 kontrol cihazının taradığım oyuncakla karşılaştırıldığında canlı renklere veya belirgin özelliklere sahip olmaması olabilir. Oyuncak takibi daha iyi hissettiriyordu, ancak mükemmel değildi. Bazı durumlarda, nesne algılandığında gecikme oluyordu ancak son hedef varış noktası hemen güncellenmiyordu.
  • Doğruluk: Bunun inanılmaz olduğunu söylemeliyim. Referans nesne modeli, algılanan fiziksel nesneyle mükemmel bir şekilde hizalandı ve nesnenin etrafındaki karmaşaya rağmen, izleme mekanizması fiziksel nesneleri sorunsuz bir şekilde bulabildi. Fiziksel nesnelerden yaklaşık 6 metreden daha fazla uzaklaştığımda birkaç sorun fark ettim. Nesneler küçülüyor ve izleme kalitesi mesafeyle azalıyor.
Genel olarak, bunun Vision Pro ile nesne algılamada önemli bir ilerleme olduğunu düşünüyorum. Evet, eğitim için bu kadar çok saat beklemek çok yavaş ve elverişsiz, ancak bunun dışında iş akışı oldukça iyi çalıştı. Deneyimi AVP cihazımda çalıştırırken Xcode entegrasyonu veya modellerin algılanmasıyla ilgili herhangi bir sorunla karşılaşmadım.

Apple'ın Reality Composer Pro'yu geliştirmesini gerçekten isterdim. Geliştiricilerin tasarım zamanında çapa görselleştirmeleri sırasında metin, sınırlayıcı hacimler ve 3B nesne modelleri ekleyebilmeleri, tüm bunları kodlamak zorunda kalmaktan daha faydalı olurdu. Neden, Apple? İşte Reality Composer Pro tasarımcısının bir parçası olması gereken bahsettiğim kod

Kod:
/*
See the LICENSE.txt file for this sample’s licensing information.

Abstract:
The visualization of an object anchor.
*/

import ARKit
import RealityKit
import SwiftUI
import UIKit

@MainActor
class ObjectAnchorVisualization {
    
    private let textBaseHeight: Float = 0.08
    private let alpha: CGFloat = 1
    
    var boundingBoxOutline: BoundingBoxOutline
    var entity: Entity

    init(for anchor: ObjectAnchor, withModel model: Entity? = nil) {
        boundingBoxOutline = BoundingBoxOutline(anchor: anchor, alpha: alpha)
        let entity = Entity()
        
        entity.transform = Transform(matrix: anchor.originFromAnchorTransform)
        entity.isEnabled = anchor.isTracked
        
        // create an anchor 3d text with reference object name
        let font = MeshResource.Font(name: "Helvetica", size: CGFloat(textBaseHeight))!
        let mesh = MeshResource.generateText(anchor.referenceObject.name.replacingOccurrences(of: "_", with: " "), extrusionDepth: textBaseHeight * 0.05, font: font)
        let material = UnlitMaterial(color: .white)
        let text = ModelEntity(mesh: mesh, materials: [material])
        text.transform.translation.x = anchor.boundingBox.center.x - mesh.bounds.max.x / 2
        text.transform.translation.y = anchor.boundingBox.extent.y
        
        entity.addChild(text)
        entity.addChild(boundingBoxOutline.entity)
        
        self.entity = entity
        
        if let model {
            var wireFrameMaterial = PhysicallyBasedMaterial()
            wireFrameMaterial.triangleFillMode = .lines
            wireFrameMaterial.faceCulling = .back
            wireFrameMaterial.baseColor = .init(tint: .red)
            wireFrameMaterial.blending = .transparent(opacity: 0.4)
            
            self.applyMaterialRecursively(withModel: model, withMaterial: wireFrameMaterial)
            
            self.entity.addChild(model)
        }
    }
    
    private func applyMaterialRecursively(withModel model: Entity, withMaterial material: RealityFoundation.Material){
        if let modelEntity = model as? ModelEntity {
            modelEntity.model?.materials = [material]
        }
        for child in model.children {
            applyMaterialRecursively(withModel: child, withMaterial: material)
        }
    }
    
    func update(with anchor: ObjectAnchor) {
        entity.isEnabled = anchor.isTracked
        guard anchor.isTracked else { return }
        
        entity.transform = Transform(matrix: anchor.originFromAnchorTransform)
        boundingBoxOutline.update(with: anchor)
    }
    
    @MainActor
    class BoundingBoxOutline {
        private let thickness: Float = 0.004
        
        private var extent: SIMD3<Float> = [0, 0, 0]
        
        private var wires: [Entity] = []
        
        var entity: Entity

        fileprivate init(anchor: ObjectAnchor, color: UIColor = .red, alpha: CGFloat = 1.0) {
            let entity = Entity()
            
            let materials = [UnlitMaterial(color: color.withAlphaComponent(alpha))]
            let mesh = MeshResource.generateBox(size: [1.0, 1.0, 1.0])

            for _ in 0...11 {
                let wire = ModelEntity(mesh: mesh, materials: materials)
                wires.append(wire)
                entity.addChild(wire)
            }
            
            self.entity = entity
            
            update(with: anchor)
        }
        
        fileprivate func update(with anchor: ObjectAnchor) {
            entity.transform.translation = anchor.boundingBox.center
            
            // Update the outline only if the extent has changed.
            guard anchor.boundingBox.extent != extent else { return }
            extent = anchor.boundingBox.extent

            for index in 0...3 {
                wires[index].scale = SIMD3<Float>(extent.x, thickness, thickness)
                wires[index].position = [0, extent.y / 2 * (index % 2 == 0 ? -1 : 1), extent.z / 2 * (index < 2 ? -1 : 1)]
            }
            
            for index in 4...7 {
                wires[index].scale = SIMD3<Float>(thickness, extent.y, thickness)
                wires[index].position = [extent.x / 2 * (index % 2 == 0 ? -1 : 1), 0, extent.z / 2 * (index < 6 ? -1 : 1)]
            }
            
            for index in 8...11 {
                wires[index].scale = SIMD3<Float>(thickness, thickness, extent.z)
                wires[index].position = [extent.x / 2 * (index % 2 == 0 ? -1 : 1), extent.y / 2 * (index < 10 ? -1 : 1), 0]
            }
        }
    }
}


Ek Kaynaklar:​

  • Apple Object Capture Landing Page
  • Exploring Object Tracking For visionOS
 
Geri