SON DAKİKA

Nvdia

Sentetik Veri ile Aksiyon Tanıma Modellerinin Ölçeklendirilmesi

İnsan hareketlerini tanıma modelleri, PoseClassificationNet gibi sistemlerin, yürümek, sallamak ya da nesne almak gibi insan eylemlerini tanıyıp sınıflandırmasına yardımcı olmuştur. Bu konu iyi bir şekilde yerleşmişken, zorluk, farklı senaryolar arasında eylemleri doğru bir şekilde tespit edebilen sağlam bir bilgisayarlı görü modelini inşa etmekte yatmaktadır. Bu, belirli bir alan veya kullanım durumu için özelleştirilmiştir.

En büyük engellerden biri, belirli kullanım durumları için gereken sınıfları eklemek ve bu tür bir modeli etkili bir şekilde eğitmek için yeterli miktarda eğitim verisi toplamaktadır. Zaman alıcı ve maliyetli olan gerçek dünya verilerine bel bağlamak yerine, sintetik veri üretimi (SDG), hızlı bir şekilde etkili ve pratik bir çözüm haline gelmektedir.

SDG, gerçek dünya verilerini taklit eden fiziksel olarak doğru 3D simülasyonlardan yapay veri oluşturma sürecidir. Model eğitim süreci yineleyici olup, belirli sahneleri, yeni sınıfları kapsayan daha fazla veriye ihtiyaç duyar ve çeşitli sahneler oluşturarak modelin verimli bir şekilde gelişmesini sağlamaktadır.

Bu yazıda, NVIDIA Isaac Sim kullanarak dört farklı alan – Perakende, Spor, Depo ve Hastane – için sentetik veri oluşturma adımları açıklanacaktır.

Isaac Sim ile İnsan Hareket Tanıma Video Veri Seti Oluşturma

Isaac Sim kullanmaya başlamak için Isaac Sim Hello World videosunu izleyebilirsiniz. Eylem tanıma modeli oluşturmak için bir elmayı alma gibi eylemlere ihtiyacınız vardır. Bu eylemlerden anahtar noktalar çıkarabilir ve bu da AR modelinin girişi olur. Eylem animasyonlarını herhangi bir üçüncü taraf tedarikçiden edinebilir veya gerçek videolar kullanarak oluşturabilirsiniz.

A diagram shows starting from action animation to NVIDIA Isaac Sim, preprocess animation USD, set ORA config options, and set advanced options such as custom code. Before deployment, Isaac Sim offers SetCameraAngle, Scene Generation, and Set Data Config.
Şekil 1. Hareket tanıma için veri simülasyon pipeline’ı 

Omni.Replicator.Agent (ORA), insan karakterleri ve robotlar için 3D ortamlarda sentetik veri üretmeyi hedefleyen bir Isaac Sim uzantısıdır. ORA uzantısının sunduğu özellikler şunlardır:

  • Çoklu kamera tutarlılığı
  • Çoklu sensör kaydı
  • Özelleştirilmiş DataWriter desteği (iskelet verisi, 2D konum ve segmentasyon)
  • Karakterler, ajanlar ve nesneler için pozisyon ve yönlendirme rastgeleleştirme

Omniverse’de SimReady Varlıkları ve Ortamları Seçin

Isaac Sim, 3D simülasyonlarınızda kullanılacak birden fazla SimReady varlık sunmaktadır. Hastane sahneleri, depo dijital ikizleri ve perakende mağazası gibi çevreler tasarlanmış olup, 10 binden fazla kullanılabilir varlık seçeneği mevcuttur. Mevcut seçimleri görüntülemek için Windows > Browsers > Assets seçeneğini kullanabilirsiniz.

Omniverse’de özelleştirilmiş varlıklar ve ortamlar da oluşturabilirsiniz. Daha fazla bilgi için Çevresel ayarlar bölümüne göz atabilirsiniz.

A picture shows a sample warehouse Omniverse environment with warehouse floor, aisles, boxes, and forklift.
Şekil 2. Omniverse ortam örneği

Şekil 3, bazı SimReady varlıkların örneklerini gösterir.

A picture shows an array of boxes, pallets, barrels, fuel cans, and machinery.
Şekil 3. Isaac Sim’de mevcut olan SimReady varlık örnekleri

ORA Ana Uzantı Konfigürasyon Dosyasını Ayarlama

Her görev, sahne ve karakter varlıklarının yolu gibi bilgileri belirtmek için bir config dosyası kullanır. Ajan çekirdek SDG uzantısı görev bilgilerini yüklerken daha fazla özellik eklenebilir.

omni.replicator.agent:
  character:
    asset_path: http://omniverse-content-production.s3-us-west-2.amazonaws.com/Assets/Isaac/4.2/Isaac/People/Characters/
    num: 1
  global:
    camera_num: 4
    seed: 1777061627
  replicator:
    parameters:
      bbox: true
      output_dir: /media/scratch.metropolis2/sdg_data_action_recognition/sdg_warehouse/warehouse_aisle_walking_f_0
      rgb: true
      video: true
    writer: ActionWriter
  scene:
    asset_path: http://omniverse-content-production.s3-us-west-2.amazonaws.com/Assets/Isaac/4.2/Isaac/Environments/Simple_Warehouse/full_warehouse.usd
  version: 0.1.0

Yenileyici konfigürasyonda karakter varlıkları, üretim ayarları, çıktı konfigürasyonları ve sahne ortamları belirlenebilir ve özel veri kaydı ve çeşitli çıktı modları için seçenekler mevcuttur.

Kameraları Yapılandırma ve Yerleştirme

Uzantının çoklu görüntü kamera tutarlılığını, konfigürasyon dosyasında camera_num özelliğini istenen görünüm sayısına ayarlayarak ve sahnede kameraları manuel olarak yerleştirerek kullanabilirsiniz.

ORA Uzantısını Özelleştirme (İleri Düzey)

ORA uzantısının kaynak kodunu /isaac-sim-4.0.0-rc.20/extscache/omni.replicator.agent.core-0.2.3 dosya yolunda görebilirsiniz.

|-- data_generation.py
|-- randomization
|   |-- camera_randomizer.py
|   |-- character_randomizer.py
|-- simulation.py

ORA uzantısı Python ile yazılmıştır. Aşağıda ORA uzantısındaki ana değiştirilebilir dosyaların ve klasörlerin bir dökümü bulunmaktadır:

  • simulation.py: SimulationManager sınıfını içeren, bağlam sahnesini açma ve iş sahnesini çeşitli iş sayılarıyla yenileme kodunu barındıran dosya.
  • data_generation.py: SimulationManager tarafından istem üzerine bir konfigürasyon dosyasını yükler ve simulasyon verilerini asenkron olarak kaydetmeye başlar.
  • /randomization: Kamera ve karakter oluşturma özelliklerinin (dönüş ve pozisyon aralıkları) mantıksal olarak yeniden yazılabileceği klasör.
  • /writers: Farklı türde verileri kaydedip /output_dir klasöründe saklamak için özel yazarlar eklenebilecek yerdir (segmantasyon haritaları, özel iskelet verileri vb.).

refresh_auto_job_anim fonksiyonu simulation.py içinde verilerin üretilmesi için geri çağırmaları içerir.

Bir karakter için yeni bir eylem programlama örneği, karakterin yürüyerek sahneye girmesi ve ardından oturması şeklinde olabilir. Bunun için refresh_auto_job_anim içine özel mantık ekleyebilirsiniz. Bu, her yeniden çizimden önce animasyon ve karakter prim (Prim) USD nesneleri arasındaki ilişkileri yeniden yazar. Daha fazla bilgi için Prim terimine göz atabilirsiniz.

Aşağıdaki kod, bir yeni karakterin oluşturulması ve animasyon dizisine yeni bir eylemin eklenmesi gibi bir uygulama örneğini göstermektedir.

<simulation.py>
def refresh_auto_job_anim(self, num):
///...
stage = omni.usd.get_context().get_stage()
# Get the animation graph for the current character in the scene
        anim_prims = stage.GetPrimAtPath("/World/Characters/Biped_Setup/Animations").GetAllChildren()

# Get the new animation to attach to the character in the scene
        curr_paths = []
        for i in pick_index_list:
            curr_paths.append(anim_prims[i])
        if self.yaml_data["character"]["animation_name"] == '':
            pick_prim = anim_prims[self.yaml_data["character"]["animation_num"]]
            pick_name = str(pick_prim.GetPrimPath()).split('/')[-1]
            new_anim_graph_node = "/World/Characters/Biped_Setup/AnimationGraph/" + pick_name
        else:
            pick_prim = None
            for prim in anim_prims:
                if self.yaml_data["character"]["animation_name"] in str(prim.GetPrimPath()).split('/')[-1]:
                    pick_prim = prim
            new_anim_graph_node = "/World/Characters/Biped_Setup/AnimationGraph/" + str(prim.GetPrimPath()).split('/')[-1]

	  # Code to attach the new animation Prim to the character in the scene
        omni.kit.commands.execute("CreatePrimCommand", 
                                  prim_type = "AnimationClip",
                                  prim_path = new_anim_graph_node,
                                  select_new_prim = True)
        omni.kit.commands.execute("AnimGraphUISetNodePositionCommand",
                                  prim = stage.GetPrimAtPath(new_anim_graph_node),
                                  position_attribute_name="ui:position",
                                  value=(-331, 57))
        omni.kit.commands.execute("AnimGraphUISetRelationshipTargetsCommand",
                                  relationship = stage.GetPrimAtPath(new_anim_graph_node).GetRelationship("inputs:animationSource"),
                                  targets=[pick_prim.GetPrimPath()])
        omni.kit.commands.execute("AddRelationshipTargetCommand",

Rastgeleleştirme ile ilgili özel işlevler ekleyebilir ve örneğin, Reallusion üzerindeki animasyonların USD formatını hızlı bir şekilde belirleyerek en kısa döngü süresini bulabilirsiniz. Bu, her çalışma için simülasyon süresini özelleştirmenizi sağlar. Aşağıda, bunun uygulanmasıyla ilgili bir örnek verilmiştir.

<simulation.py>
def find_times(self):
        stage = omni.usd.get_context().get_stage()
        anim_prims = stage.GetPrimAtPath("/World/Characters/Biped_Setup/Animations").GetAllChildren()
        times = {}
        for anim in anim_prims:
            counter = 0
            attr = anim.GetAttribute("translations")
            prev_val = None
            curr_val = attr.Get(counter)
            while prev_val != curr_val:
                counter += 1
                prev_val = curr_val
                curr_val = attr.Get(counter)
            if(attr.Get(counter + 1) == attr.Get(counter + 2)):
                times[anim] = counter
        return times

Kamera rastgeleleştirme ayarları için settings.py dosyasında daha fazla ayar yapılabilir. character_focus özelliği True olarak ayarlanabilir ve character_radius gibi parametreler değiştirilebilir, böylece kameralar karakter pozisyonlarına göre göreceli olarak yerleştirilir ve karakterlerin görünüm alanında kalması sağlanır.

An image of a person standing shows the various ways to randomize various parameters of the cameras, such as location from the subject, height from the ground, its projection angle, and more.
Şekil 4. Isaac Sim konfigürasyon dosyalarında kameraların rastgeleleştirilmesi ve yerleştirilmesi için kullanılan parametreler.

Isaac Sim, ayarlar yapılandırıldıktan sonra konteyner içinde başsız olarak çalıştırılabilir.

A diagram shows Omni.Replicator.Agent.Core at the center, above Isaac Sim and Replicator. The top two layers are agent core SDG features such as character randomization and camera angle. The user’s key modifications to control the data generation include custom animation length or positioning the character in the frame.
Şekil 5. Isaac Sim uygulamasında gerçekleştirilen değişiklikler ve dağıtım için konteynerleştirilen bölüm.

Tüm Isaac Sim uygulama örneği, istediğiniz Isaac Sim konteynerini NGC’den çekerek ve uzantı değişikliklerini konteyner içindeki /extscache alt klasörüne taşıyarak konteynerleştirilebilir.

./python.sh tools/isaac_people/sdg_scheduler.py -c 
/isaac-sim/curr_sdg_data/mount_sports_config_files/{filename} -n 1

Büyük Ölçekli Veri Üretimini Etkinleştirme

Veri üretim sürecini ölçeklendirmeye ve organize etmeye yardımcı olmak için NVIDIA OSMO’yu kullanabilirsiniz. OSMO, karmaşık, çok aşamalı ve çok konteynerli robotik işlemeyi ölçeklendirmek için bulut tabanlı bir yönetim platformudur. OSMO ile veri üretimini 10 NVIDIA A40 GPU’su ile 10 kat hızlandırdık.

Bunlarla birlikte, 84 eylem animasyonu ve 40 farklı karakter için 4-5 kamera açısı ile 25,880 örnek oluşturdum:

  • 8400 depo
  • 6600 hastane
  • 4800 perakende
  • 7600 spor
GIF shows generated action data for retail use cases. In this GIF, a customer is checking out.
Şekil 6. Bir perakende ortamı için oluşturulan SDG sahnesi.

Sintetik Verilerle Hareket Tanıma Modeli Eğitimi

Şimdi, sintetik verilerinizi, iskelet bilgilerine dayalı insan hareketlerini tespit eden bir makine öğrenimi modeli olan uzamsal-zamansal grafik konvolüsyonel ağ (ST-GCN) modelinin yeteneklerini genişletmek için kullanabilirsiniz.

Bu örnekte, PoseClassificationNet modelini (ST-GCN mimarisi) NVIDIA TAO ile eğitip ince ayar yaparak, Isaac Sim’den üretilen 3D iskelet verileri üzerinde eğitim gerçekleştirdik.

A workflow diagram shows an input layer, normalization layer, 10 ST-GCN blocks, global average pooling, a fully connected layer, and the final output layer.
Şekil 7. Uzamsal-zamansal grafik konvolüsyon ağı mimarisi.

Isaac Sim’den gelen iskelet verileri öncelikle bir anahtar noktaya dönüştürülmektedir. Bir anahtar nokta, ya karakter iskeletindeki bir eklemi doğrudan temsil eder ya da karşılık gelen bir eklem bulunamadığında hesaplanır. Karakter iskeleti Renderpeople rigged varlıklarıyla tanımlanmaktadır. Daha fazla bilgi için Bundle Casual Rigged 002’ye göz atabilirsiniz.

Model eğitildikten sonra, karakterlerin ve eylem çerçevelerinin sayısını değiştirerek farklı veri bölümleri geliştirdik. Eylem dizisi uzunluğunun 650 çerçeveye kesilmesi veya doldurulması durumunda en iyi performansı bulduk ve eğitim için 35 karakter ile birlikte rastgele titreme ve döngülere maruz kalan beş ek karakter ile eğitim gerçekleştirdik.

NVIDIA TAO ile ST-GCN modelini eğittikten sonra, 85 eylem tanıma sınıfında %97’lik bir test doğruluğu elde ettik. Modelin gerçek verilere karşı dayanıklılığını daha da test etmek için, bizim özel SDG veri setimizle iyi örtüşen eylem sınıfları için NTU-RGB+D veri setinin 25 anahtar nokta iskelet verisini kullandık.

NTU Eylemi Örnek Sayısı SDG İle Eğitilen Modelin NTU Üzerinde Testi (İLK 5) NTU Üzerinde Eğitilen Modelin NTU Üzerinde Testi (İlk 5)
Su İçme 948 89.14% 92.347%
Ayakta İken Oturmaya Geçiş 948 98.73% 100%
Otururken Kalkma 948 99.37% 100%
Düşme 948 82.17% 95.82%
Ayrı Yürüyüş 948 87.45% 94.68%
Zafer İşareti Yapma 948 99.46% 100%
Tablo 1. Sintetik hareket tanıma ST-GCN modelinin (3. sütun) gerçek veri üzerinde test edilmiş yüksek doğruluk oranları.

En güncel performanslarla karşılaştırıldığında, özelleştirilmiş model, sadece sentetik veri ile eğitilmesine rağmen iyi bir performans sergilemektedir. Model, eğitim sırasında yer almayan ve çok farklı eylem sınıfları için %97’lik bir doğruluk sağlamaktadır.

Eğitim süreci yineleyicidir. Başlangıçta model bazı sınıflarda iyi performans gösterirken, diğerlerinde zayıf kalmıştır. Veri setini dengelemek için, oturma sınıfı gibi sınıflarda daha fazla varlık ve varyasyon ekledik.

Bu iyileştirme, tüm sınıflardaki doğruluğu artırmıştır ve SDG sürecimizi ölçeklendirmeyi kolay hale getirmiştir.

A bar chart shows different classes such as falling, crane operation, examining, lifting heavy objects, and walking and the number of assets for each.
Şekil 8. Daha fazla varlık eklendikten sonraki sınıf başına veri seti dağılımı.

Bugün Deneyin

Sintetik veri üretimi (SDG), gerçek dünya verilerinin kısıtlı olduğu durumlarda yüksek kaliteli, yapay veri oluşturarak model eğitimini hızlandırmaktadır. Bu, veri çeşitliliğini artırabilir ve modeli çok çeşitli kullanım durumları ve senaryolar için genelleştirebilir. SDG, modelin doğruluğunu ve performansını geliştirmektedir.

Açık kaynaklı frameworkler, örneğin SynthDa, Isaac Sim ile birlikte kullanılabilir ve böylece gerçek dünya verilerinden daha fazla biçimde sentetik veri üretilmesine olanak tanır.

Bugün Isaac Sim ile başlamaya hazırsanız:

Teşekkürler

Bu yazıya ve projeye katkılarından dolayı Jiajun Li, Haoquan Liang, Anil Ubale ve Aik Beng Ng’ye teşekkür ederiz.

Kaynak

Nvdia Blog

Düşüncenizi Paylaşın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

İlgili Teknoloji Haberleri