İ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.
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.
Şekil 3, bazı SimReady varlıkların örneklerini gösterir.
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.
Isaac Sim, ayarlar yapılandırıldıktan sonra konteyner içinde başsız olarak çalıştırılabilir.
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
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.
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% |
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.
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:
- NVIDIA Omniverse’u indirip kurabilirsiniz ve ardından PoseClassificationNet modeliniNVIDIA TAO ile ince ayar yaparak kullanabilirsiniz.
- Konteyner olarak bulutta dağıtım yapın:
- Isaac SIM bulut dağıtımı
- NVIDIA OSMO ile konumdan bağımsız dağıtım
- TAO’yu bulutta çalıştırma
- NVIDIA Omniverse GPU-Optimize AMI’yi (AWS Marketplace) dağıtabilirsiniz.
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.