합성 데이터는 자율 모바일 로봇(AMR)에 배포되는 인식 AI 모델을 학습할 때 중요한 역할을 할 수 있습니다. 이 프로세스는 제조업에서 점점 더 중요해지고 있습니다. 합성 데이터를 사용하여 창고에서 팔레트를 감지할 수 있는 사전 학습된 모델을 생성하는 예는 OpenUSD 및 합성 데이터를 사용한 팔레트 감지 모델 개발을 참조하세요.
이 게시물에서는 합성 데이터를 사용하여 창고 팔레트 잭을 감지하도록 AMR을 훈련하는 방법을 살펴봅니다. 팔레트 잭은 일반적으로 창고에서 무거운 팔레트를 들어 올리고 운반하는 데 사용됩니다. 혼잡한 창고에서는 AMR이 팔레트 잭을 감지하고 충돌을 피하는 것이 중요합니다.
이 목표를 달성하려면 다양한 조명 조건과 폐색 상태에서 대규모의 다양한 데이터 세트로 AI 모델을 학습시켜야 합니다. 실제 데이터로는 모든 잠재적 시나리오를 포착할 수 있는 경우가 드뭅니다. 개발자는 3D 시뮬레이션에서 생성된 주석이 달린 데이터인 합성 데이터 생성(SDG)을 통해 데이터 격차를 극복하고 모델 훈련 프로세스를 부트스트랩할 수 있습니다.
이 사용 사례에서는 데이터에 맞게 모델 파라미터를 변경하는 대신 데이터를 조작하여 데이터 중심 접근 방식을 취합니다. 이 프로세스는 NVIDIA Isaac Sim에서 NVIDIA Omniverse 리플리케이터를 사용하여 합성 데이터를 생성하는 것으로 시작됩니다. 그런 다음 NVIDIA TAO 툴킷에서 합성 데이터로 모델을 훈련합니다. 마지막으로 실제 데이터에서 모델의 성능을 시각화하고 파라미터를 수정하여 원하는 수준의 성능에 도달할 수 있도록 더 나은 합성 데이터를 생성합니다.
Omniverse 리플리케이터는 개인과 팀이 유니버설 씬 디스크립션(OpenUSD)을 기반으로 워크플로우를 개발할 수 있도록 지원하는 컴퓨팅 플랫폼인 NVIDIA Omniverse의 핵심 확장 기능입니다. 개발자는 리플리케이터를 통해 맞춤형 합성 데이터 생성 파이프라인을 구축하여 컴퓨터 비전 모델의 트레이닝을 부트스트랩하기 위한 데이터를 생성할 수 있습니다.
합성 데이터로 반복하여 모델 성능 개선하기
아래 섹션에서는 물체 감지 모델의 실제 성능을 개선하기 위해 합성 데이터로 반복 작업을 수행한 방법에 대해 설명합니다. 이 섹션에서는 Omniverse Replicator API와 함께 작동하는 Python 스크립트를 사용하여 단계를 안내합니다.
각 반복마다 모델의 다양한 파라미터를 점진적으로 변경하고 새로운 학습 데이터 세트를 생성했습니다. 그런 다음 실제 데이터에 대해 모델의 성능을 검증했습니다. 시뮬레이션과 실제의 차이를 좁힐 수 있을 때까지 이 과정을 계속했습니다.
오브젝트 또는 장면 파라미터를 변경하는 프로세스를 도메인 무작위화라고 합니다. 오브젝트와 장면의 위치, 색상, 텍스처, 배경, 조명 등 다양한 파라미터를 무작위로 지정하여 모델 학습을 위한 새로운 데이터를 빠르게 생성할 수 있습니다.
확장 가능한 프레임워크, 3D 씬 설명 및 NVIDIA Omniverse의 기반인 OpenUSD를 사용하면 씬의 다양한 파라미터를 쉽게 실험할 수 있습니다. 개별 레이어에서 파라미터를 수정하고 테스트할 수 있으며, 사용자는 해당 레이어 위에 비파괴 오버라이드를 작성할 수 있습니다.
준비
이 예제를 시작하려면 NVIDIA RTX GPU가 탑재된 시스템과 최신 버전의 NVIDIA Isaac Sim이 설치되어 있어야 합니다. Isaac Sim은 합성 데이터 생성을 위해 Omniverse Replicator의 핵심 기능을 활용하는 확장 가능한 로보틱스 시뮬레이션 애플리케이션입니다. 설치 및 구성에 대한 자세한 내용은 문서 섹션을 참조하세요.
Isaac Sim이 실행되고 나면 GitHub의 NVIDIA-AI-IOT/synthetic_data_generation_training_workflow에서 모든 에셋을 다운로드할 수 있습니다.
1단계: 색상 및 카메라 위치 변경하기
첫 번째 단계에서 팀은 팔레트 잭의 색상과 포즈, 카메라의 포즈를 변경했습니다. 이 시나리오를 자신의 세션에서 재현하려면 아래 단계를 따르세요.
먼저 스테이지를 불러옵니다:
ENV_URL = "/Isaac/Environments/Simple_Warehouse/warehouse.usd"
open_stage(prefix_with_isaac_asset_server(ENV_URL))
그런 다음 장면에 팔레트 잭과 카메라를 추가합니다. 팔레트 잭은 SimReady 에셋 라이브러리에서 불러올 수 있습니다.
PALLETJACKS = ["http://omniverse-content-production.s3-us-west-2.amazonaws.com/Assets/DigitalTwin/Assets/Warehouse/Equipment/Pallet_Trucks/Scale_A/PalletTruckScale_A01_PR_NVD_01.usd",
"http://omniverse-content-production.s3-us-west-2.amazonaws.com/Assets/DigitalTwin/Assets/Warehouse/Equipment/Pallet_Trucks/Heavy_Duty_A/HeavyDutyPalletTruck_A01_PR_NVD_01.usd",
"http://omniverse-content-production.s3-us-west-2.amazonaws.com/Assets/DigitalTwin/Assets/Warehouse/Equipment/Pallet_Trucks/Low_Profile_A/LowProfilePalletTruck_A01_PR_NVD_01.usd"]
cam = rep.create.camera(clipping_range=(0.1, 1000000))
SimReady 또는 시뮬레이션 지원 에셋은 정확한 물리적 속성과 동작을 포함하는 물리적으로 정확한 3D 오브젝트입니다. 모델 훈련에 필요한 메타데이터와 주석이 미리 포함되어 있습니다.
다음으로 팔레트 잭과 카메라에 도메인 무작위화를 추가합니다:
with cam:
rep.modify.pose(position=rep.distribution.uniform((-9.2, -11.8, 0.4), (7.2, 15.8, 4)),look_at=(0, 0, 0))
# Get the Palletjack body mesh and modify its color
with rep.get.prims(path_pattern="SteerAxles"):
rep.randomizer.color(colors=rep.distribution.uniform((0, 0, 0), (1, 1, 1)))
# Randomize the pose of all the added palletjacks
with rep_palletjack_group:
rep.modify.pose(
position=rep.distribution.uniform((-6, -6, 0), (6, 12, 0)),
rotation=rep.distribution.uniform((0, 0, 0), (0, 0, 360)),
scale=rep.distribution.uniform((0.01, 0.01, 0.01), (0.01, 0.01, 0.01)))
마지막으로 데이터에 주석을 달기 위한 작성자를 구성합니다:
writer = rep.WriterRegistry.get("KittiWriter")
writer.initialize(output_dir=output_directory,
omit_semantic_type=True,)
이 예에서는 리플리케이터와 함께 제공되는 KittiWriter를 사용하여 객체 감지 레이블에 대한 주석을 KITTI 형식으로 저장합니다. 이렇게 하면 훈련 파이프라인과의 호환성이 더 쉬워집니다.
결과
이 첫 번째 합성 데이터 배치에서 팀은 실제 모델 성능을 시각화하기 위해 물류 관련 물체를 감지하는 문제를 다루는 물류용 장면 이해 데이터 세트인 LOCO 데이터 세트를 사용했습니다.
결과 이미지는 모델이 혼잡한 창고에서 팔레트 잭을 감지하려고 시도하고 있음을 보여줍니다(그림 2). 팔레트 잭을 둘러싼 물체 주변에 많은 경계 상자가 생성되었습니다. 이 결과는 첫 번째 훈련 반복이므로 어느 정도 예상할 수 있는 결과입니다. 도메인 간격을 줄이는 것이 후속 반복의 초점이 될 것입니다.
2단계: 텍스처 추가 및 주변 조명 변경
이 반복에서는 첫 번째 반복에서 팔레트 색상과 카메라 위치 외에 텍스처와 주변 조명을 무작위로 지정했습니다.
텍스처와 조명 모두에 대해 무작위화를 활성화합니다:
# Randomize the lighting of the scene
with rep.get.prims(path_pattern="RectLight"):
rep.modify.attribute("color", rep.distribution.uniform((0, 0, 0), (1, 1, 1)))
rep.modify.attribute("intensity", rep.distribution.normal(100000.0, 600000.0))
rep.modify.visibility(rep.distribution.choice([True, False, False, False, False, False, False]))
# select floor material
random_mat_floor = rep.create.material_omnipbr(diffuse_texture=rep.distribution.choice(textures), roughness=rep.distribution.uniform(0, 1), metallic=rep.distribution.choice([0, 1]), emissive_texture=rep.distribution.choice(textures), emissive_intensity=rep.distribution.uniform(0, 1000),)
with rep.get.prims(path_pattern="SM_Floor"):
rep.randomizer.materials(random_mat_floor)
결과
이 반복 작업은 텍스처 및 조명 무작위화를 추가하여 오탐지 수가 감소했음을 보여줍니다. 합성 데이터를 생성할 때 중요한 요소 중 하나는 결과 데이터 세트에 데이터의 다양성을 확보하는 것입니다. 합성 도메인의 유사하거나 반복적인 데이터는 실제 모델 성능을 개선하는 데 도움이 되지 않을 가능성이 높습니다.
데이터 세트의 다양성을 개선하려면 무작위화를 통해 씬에 더 많은 오브젝트를 추가합니다. 이 작업은 세 번째 반복에서 처리되며 모델 견고성을 개선하는 데 도움이 됩니다.
3단계: 방해 요소 추가하기
이 반복에서는 장면에 방해 요소라고 하는 추가 오브젝트를 도입합니다. 이러한 방해 요소는 데이터 세트에 더 많은 다양성을 추가합니다. 이 반복에는 처음 두 반복에서 표시된 모든 변경 사항도 포함됩니다.
장면에 디스트릭터를 추가합니다:
DISTRACTORS_WAREHOUSE = ["/Isaac/Environments/Simple_Warehouse/Props/S_TrafficCone.usd",
"/Isaac/Environments/Simple_Warehouse/Props/S_WetFloorSign.usd",
"/Isaac/Environments/Simple_Warehouse/Props/SM_BarelPlastic_A_01.usd",
"/Isaac/Environments/Simple_Warehouse/Props/SM_BarelPlastic_A_02.usd",
"/Isaac/Environments/Simple_Warehouse/Props/SM_BarelPlastic_A_03.usd"]
# Modify the pose of all the distractors in the scene
with rep_distractor_group:
rep.modify.pose(
position=rep.distribution.uniform((-6, -6, 0), (6, 12, 0)),
rotation=rep.distribution.uniform((0, 0, 0), (0, 0, 360)),
scale=rep.distribution.uniform(1, 1.5))
이 프로젝트에 사용된 모든 에셋은 기본 Isaac Sim 설치에서 사용할 수 있습니다. 뉴클리어 서버에서 경로를 지정하여 로드합니다.
결과
그림 6은 세 번째 반복의 결과를 보여줍니다. 이 모델은 팔레트 잭을 정확하게 감지할 수 있으며 경계 상자가 더 적습니다. 첫 번째 반복에 비해 모델 성능이 크게 향상되었습니다.
계속 반복
이 팀은 5,000개의 이미지를 사용하여 각 반복에 대해 모델을 학습시켰습니다. 원하는 수준의 정확도에 도달하기 위해 합성 데이터의 크기를 늘리고 더 많은 변형을 생성하여 이 워크플로우를 계속 반복할 수 있습니다.
이러한 실험을 위해 NVIDIA TAO 툴킷을 사용하여 resnet18 백본이 있는 DetectNet_v2 모델을 훈련했습니다. 이 모델을 사용하는 것은 워크플로 요구 사항이 아닙니다. 주석과 함께 생성된 데이터를 활용하여 원하는 아키텍처 및 프레임워크의 모델을 훈련할 수 있습니다.
저희는 실험에서 KITTI 작성기를 활용했습니다. 하지만 Omniverse Replicator를 사용하여 자체 커스텀 작성기를 작성하여 올바른 주석 형식으로 데이터를 생성할 수 있습니다. 이렇게 하면 교육 워크플로우와 원활하게 호환됩니다.
또한 훈련 과정에서 실제 데이터와 합성 데이터를 혼합하여 실험할 수도 있습니다. 만족스러운 평가 메트릭을 얻은 후 최종 모델을 최적화하여 실제 환경에서 NVIDIA Jetson에 배포할 수 있습니다.
Omniverse Replicator로 합성 데이터 파이프라인 개발
Omniverse Replicator를 사용하면 자체 맞춤형 합성 데이터 생성 파이프라인 또는 툴을 구축하여 다양한 합성 데이터의 대규모 세트를 프로그래밍 방식으로 생성하여 모델을 부트스트랩하고 빠르게 반복할 수 있습니다. 다양한 유형의 무작위화를 도입하면 데이터 세트에 필요한 다양성을 추가하여 모델이 다양한 조건에서 관심 있는 객체를 인식할 수 있습니다.
이 포스팅에 소개된 워크플로우를 시작하려면 GitHub의 NVIDIA-AI-IOT/synthetic_data_generation_training_workflow를 방문하세요. 전체 워크플로우가 실제로 작동하는 모습을 보려면 NVIDIA의 리샤브 차다(Rishabh Chadha)와 엣지 임펄스의 제니 플런켓(Jenny Plunkett)이 Omniverse 리플리케이터와 합성 데이터를 사용하여 제조 공정용 물체 감지 모델을 훈련하는 방법을 소개하는 비디오 2에 참여하세요.
나만의 맞춤형 합성 데이터 생성 파이프라인을 구축하려면 Omniverse를 무료로 다운로드하고 Omniverse 코드에서 Replicator 시작하기 지침을 따르세요. 또한 컴퓨터 비전 모델 트레이닝을 위한 합성 데이터 생성이라는 자기 주도형 온라인 강좌를 수강하고 최신 Omniverse Replicator 튜토리얼을 시청할 수도 있습니다
NVIDIA는 최근 로우코드 SDG 워크플로우를 구축하는 개발자를 위한 새로운 지원이 포함된 Omniverse Replicator 1.10을 출시했습니다. 자세한 내용은 NVIDIA Omniverse Replicator 1.10의 로우코드 워크플로우로 합성 데이터 생성 속도를 높이세요를 참조하세요.
성능 인식 및 고충실도 시뮬레이션에 대한 주요 업데이트가 포함된 NVIDIA Isaac ROS 2.0 및 NVIDIA Isaac Sim 2023.1도 이제 사용할 수 있습니다. 자세한 내용은 NVIDIA Isaac 플랫폼의 고급 시뮬레이션 및 인식 도구로 AI 지원 로봇 공학 가속화를 참조하세요.
뉴스레터를 구독하고 Instagram, LinkedIn, Medium, Threads, Twitter에서 Omniverse를 팔로우하여 NVIDIA Omniverse에 대한 최신 소식을 받아보세요. 자세한 내용은 포럼, Discord 서버, Twitch 및 YouTube 채널에서 확인하세요.