홍든램지의 보일러실

[Unity Perception Package] 2.데이터셋 만들기 본문

오픈소스 프로젝트

[Unity Perception Package] 2.데이터셋 만들기

예비보일 2023. 4. 5. 23:26
반응형

</p>

<p data-ke-size="size16">&nbsp;</p>

keypoint labeling, 3D bounding boxes, 2D bounding boxes, object counts, object information (pixel counts and ids), instance segmentation, semantic segmentation, occlusion, depth, normals, and more. 

Unity Perception package의 설명은 다음과 같이 설명한다.


Perception 패키지는 Object detection, Semantic Segmentation, Pose estimation 등과 같은 인식 기반 기계 학습 작업에 사용하기 위한 합성 데이터 세트를 생성하기 위한 다양한 도구를 제공한다.

 

이러한 데이터 세트는 시뮬레이션 센서를 사용하여 캡처한 프레임의 형태입니다.

이러한 프레임에는 실측 정보가 주석으로 표시되어 있어서 머신 러닝 모델을 학습하고 검증하는 데 사용한다.

 

이 데이터와 함께 번들된 지상 실측 자료의 유형은 의도한 기계 학습 작업에 따라 다르겠지만,

Perception 패키지에는 합성 데이터를 더 쉽게 생성하고 활용할 수 있는

9개 이상의 일반적인 Ground-truth 자료 레이블이 함께 제공된다.

 

여기서는 컴퓨터에 Unity를 설정하는 것부터 객체 탐지 모델을 교육하기 위한 대규모 합성 데이터 세트를 생성하는 것까지

모든 과정을 보여준다.

 

튜토리얼을 따르기 위해 Unity 또는 C#에 대한 정확한 지식이나 경험이 필요로 하지않는다고 설명한다.

 

Perception 패키지에 포함된 샘플, 구성 요소 및 asset만을 사용하여 전체 데이터 세트를 생성한다.

튜토리얼은 관련 작업의 복잡성에 따라 두 개의 높은 수준의 단계로 나뉩니다.

 

자습서를 진행하면서 Perception 패키지를 통해 수행할 수 있는 고급 도구 및 워크플로우를 점차 알게 될 것이다.


Phase 1: Setup and Basic Randomizations

  • Unity Editor 및 Perception 패키지 다운로드
  • Unity Editor 내의 기본 상호 작용 – Unity 프로젝트로 샘플 asset 가져오기, 사전 탭 및 장면 작업, 객체 및 사전 탭에 구성 요소 추가 등.
  • Perception 패키지의 기본 구성 요소에 대해 알아보고 이러한 구성 요소로 기본 시뮬레이션 만들기.
  • 컴퓨터에서 시뮬레이션을 실행하고 다양한 실제 데이터의 실시간 시각화를 관찰.
  • 시뮬레이션에서 생성된 합성 데이터 확인.

 

이제 데이터셋을 만들기 위한 실행단계이다. 

이전에 perception 패키지를 설치하는 방법은 아래 포스터를 참고하고 그다음부터 시작한다.

2023.04.04 - [오픈소스 프로젝트] - [Unity Perception Package] 1.데이터셋 생성 준비하기

 

[Unity Perception Package] 1.데이터셋 생성 준비하기

우선 Ubuntu에서 Unity hub를 설치한다. 우분투 설치 링크로 들어가면 설치하는 방법이 나오는데 따라서 설치를 해보겠다. 1. 설치: Debian 또는 Ubuntu Linux 배포판에 Unity Hub을 설치하려면 공용 서명 키

minhong.tistory.com

1. 예제 추가 Import Sample

예제를 Import하기 위해서 패키지 매니저에서 Perception 패키지 아래 sample을 클릭하면 튜토리얼 파일과 예제들이 나온다. 

전부 Import버튼을 클릭하여 추가한다.

추가를 하게 되면 위와 같이 프로젝트 폴더에 임폴트한 폴더가 생성된다.

 

 

2. 시뮬레이션을 위한 장면 설정 Setup a Scene for Your Perception Simulation 

Unity에서 장면에는 세상에 존재하는 모든 개체가 포함된다.

이 세상은 게임이 될 수도 있고, 우리는 시뮬레이션이 될 수도 있다.

모든 새 프로젝트에는 프로젝트가 생성될 때 자동으로 열리는 SampleScene이라는 이름의 씬(scene)이 포함됩니다.

 

이 씬(scene)에는 필요 없는 여러 개체와 설정이 함께 제공되므로 새 씬(scene)을 생성해보자.

 

프로젝트 탭에서 asset폴더에서 오른쪽 마우스 버튼을 통해서 scenes 폴더를 생성한다.

생성된 폴더에 오른쪽 마우스 클릭을 통해 Create → Scenes 을 클릭한다.

새로 생긴 Scene을 TutorialScene 이라고 이름을 지정하고 두 번 클릭하여 엽니다.

생성하면 위와 같은 화면으로 구성된다.

Hierarchy 탭에는 현재 로드된 모든 Scene과 로드된 각 Scene에 현재 생성된 모든 개체가 표시된다.

 

위에서 본 것처럼 새 장면에는 이미 카메라(Main camera)와 라이트(Directional Light)가 포함되어 있다.

이제 카메라의 시야와 위치를 수정하여 튜토리얼을 진행해보자.

 

Main Camera를 클릭하고 오른쪽 Inspector 탭에서 카메라의 Position, Rotation, Projection 및 Field of View(보기 영역)가

아래 스크린샷과 일치하는지 확인하자.

이번 튜토리얼에서 빛에 그림자가 생기지 않도록 하기 위해 아래와 같이 진행하면된다.

Hierarchy 탭에서 Directional Light를 클릭하고 Inspector 탭에서 Light 부분에 Shadow Map을 해제해 준다.

 

이제 Perception Workflow를 위해 카메라에 필요한 구성 요소를 추가한다.

그러기 위해서 Perception Camera 구성 요소를 추가해야 한다.

그런 다음 이 카메라를 사용하여 생성하려는 지상 실측 정보 유형(bounding box, Segmentation 등)을 정의할 수 있다.

 

Main Camera를 다시 선택하고 Inspector 탭에서 Add Component 버튼을 클릭.

왼쪽에 [#] 아이콘을 사용하여 Perception Camera 스크립트를 찾는다.

찾은 컴포넌트를 추가한다. 그러면 선택한 Main Camera는 Perception Camera의 기능을 쓸 수 있다.

 

추가 했다면 이제 진행을 해야하는 데 아래 그림처럼 몇가지 오류랑 경고 메시지가 나타난다.

keypoint labeling, 3D bounding boxes, 2D bounding boxes, object counts, object information (pixel counts and ids), instance segmentation, semantic segmentation, occlusion, depth, normals, and more. 

위 와 같은 오류를 수정하고 넘어가자.

수정방법

Edit -> Project Setting -> Editor 로 들어가서 Asynchronous Shader Compilation를 해제 하도록 하자.

그러면 경고메시지가 지워진다.

 

Edit -> Project Setting -> Editor

그리고 아래 그림 처럼프로젝트에 asset 중에 HDRP High Fidelity 라는 asset을 찾아서 Inspector 탭에서 Lit Shader Mode를 Deferred Only에서 Both로 변경해준다. 나머지 HDRP Balanced / HDRP Performant 또한 Lit Shader Modeboth로 변경해준다. 이렇게 되면 HDRP 관련 오류 메시지 3개가 지워진다.

 

Component를 추가하는 것은 Unity에서 객체 또는 물체가 다양한 종류의 논리와 데이터를 첨부할 수 있는 방법이다.

여기에는 위의 카메라나 방향등과 같이 장면(Scene) 내에 배치된 객체나 물체(GameObject) 또는 장면(Scene), 외부 프로젝트에서 가져오는 물체나 객체(Prefabs)를 포함한다.

 

Component인 Perception Camera는 합성 프레임 생성 및 주석(Annotation)의 다양한 측면에서 수정하고

실측(Ground-truth) 정보를 추가하거나 제거하기 위한 자체 UI를 제공한다.

아래 표시된 각필드위에 파우스 포인터를 갖다 놓으면 각 요소가 어떤건지 설명되어 있다.

위에서 보듯이 Perception Camera UI에 Camera Labelers 목록이 비어 있다.

이부분에 어떤 유형으로 라벨링을 할 것인지를 추가하면된다.

+버튼을 누르면 다양한 유형이 나오는데 모두 추가하면 총 12개에 다양한 라벨러가 있다.

이중에 필요한게 있다면 C# 코드를 생성하여 사용자 정의 레이블러도 생성할 수 있다.

2D bounding boxes, 3D bounding boxes, Depth, Instant Segmentation, Semantic Segmentation, Keypoint, Metadata Reporter, Normal Labeler, Object Count, Occlusion, Pixel Position, Render object 

 

본 글에서는 4개정도만 사용방법을 알아본다.

BoundingBox 2D / ObjectCount / RenderedObjectInfo / SemanticSegmentation 을 사용해본다.

전부는 아니지만 일부 라벨러는 시뮬레이션이 실행되는 동안 실시간 시각화를 표시할 수 있다.

예를들어 BoundingBox 라벨러는 객체 주위에 2D boudndingBox를 표시할 수 있고 Segmentation의 경우 카메라 뷰에 오버레이 할수 있다.

 

3. Ground-Truth  지정 및 객체 레이블 설정

이제 Perception Camera에 추가된 각 라벨러에 생성된 데이터 세트에서 어떤 개체에 레이블을 지정해야 하는지 알아보자

 

예를 들어,

"의자"를 감지하기 위한 실제 자료를 생성하는데 사용되는 경우 라벨러는 장면내에서 "의자"라는 레이블이 지정된 객체를 찾아야한다. 또한 의자는 라벨러가 볼 수 있도록 "의자"라는 라벨을 붙여야한다.

 

이러한 작업을 하는 방법에 대해서 알아보자.

 

Camera Labelers 에 추가된 각 라벨러에는 라벨 구성 필드가 있다. 여기에 라벨 구성을 추가하면 장면에서 특정 라벨이 있는 객체만 찾고 나머지는 무시하도록 라벨러를 지정할 수 있다. 이를 진행하기 위해 라벨 구성(Label Configuration)을 만든다.

 

Asset 폴더에 오른쪽 마우스 클릭을해서 Create -> Perception -> ID Label Config 클릭하여

새로운 asset 인 IdLbelConfig 파일을 생성한다. 

위 그림과 같이 생성된 파일의 이름을 TutorialIdLabelConfig 로 변경해서 사용하겠다.

 

생성된 TutorialIdLabelConfig의 Inspector 탭을 보면 아래와 같이 나타난다.

 

여기에서 Added Labels를 통해 라벨을 입력하고 추가할수 있다.

추가된 label의 경우 Json 파일로 가져오거나 내보낼수 있다. 위에는 새로만든 거라 목록이 비어있다.

 

이 튜토리얼에서는 일상용품 10가지를 인식하기 위한 데이터셋을 생성하는 것을 예시로 한다.

여기서 사용할 객체는 

Assets/Samples/Perception/<Perception Package Version>/Tutorial Files/Foreground Objects/Phase 1/Prefabs

아래 그림과같이 위치로 들어가면 보인다. 

 

위에서 생성한 TutorialIdLabelConfig 는 IdLabelConfig 형태이고, Perception Camera에서 선택한 라벨4개중에 3개와 호환된다.

라벨 구성 유형은 각 라벨을 고유한 숫자와 ID로 연결한다.

 

반면, SementicSegmentation 라벨러는 특정 색상으로 연결하는 다른 형태의 LabelConfig가 필요하다. 이 라벨러의 출력은 표시되는 각 객체가 고유한 색상으로 칠해진 이미지 집합이기 때문이다.

 

따라서 다른 LabelConfig를 추가하면된다.

위 그림과 같이 Asset 폴더에 오른쪽 마우스 클릭을해서 Create -> Perception -> Semantic Segmentation Label Config 클릭해서 TutorialSemanticSegmentationLabelConfig 로 이름을 수정하여 생성한다.

 

이렇게 생성된 LabelConfig를 Perception Camera를 추가한 카메라에 선택하여 할당한다.

아까 생성했던 TutorialIdLabelConfig를 선택한다.

 

SemanticSegmentation의 경우 위에서 생성한 TutorialSegmentationLabelConfig를 선택한다.

 

선택된 모습은 아래와 같다.

 

이제 최종적으로 객체 인식 모델이 인식해야하는 객체에 라벨을 하당하고 이러한 라벨을 우리가 만든 라벨 구성에 추가할 수 있다. 

인식할 객체의 위치는 위에서 언급한거같이

Assets/Samples/Perception/<Perception Package Version>/Tutorial Files/Foreground Objects/Phase 1/Prefabs

에 있다.

 

Unity에서 Prefabs는 다른 프로젝트에서 생성된 하나의 GameObject라고 생각하면되고 불러오게되면 구성요소와 속성갑이 유지된상태로 불러올 수 있다.

 

Sample에서 Prefab이 존재하는 경로에 Drink_whippingcream_lucerne.prefab을 더블클릭하면 아래와 같이 생성된다.

Prefab에는 Transform, Mesh Filter, Mesh Renderer 및 Labeling 구성 요소(위 이미지에서 강조 표시됨)를 포함한 여러 구성 요소가 포함되어 있다. 이 중 처음 세 개는 공통 Unity 구성 요소이지만, 네 번째 구성 요소는 Perception 패키지에만 있고 개체에 레이블을 할당하는 데 사용된다. 여기에서 Prefab에는 이미 추가된 레이블이 하나 있으며 추가된 레이블 목록에 표시됩니다.

 

여기서 UI는 개체에 레이블을 할당할 수 있는 다양한 방법을 제공합니다. asset에 자동 레이블링을 사용하도록 선택하거나(자동 레이블링 사용을 활성화하여) 수동으로 레이블을 추가할 수 있습니다. 자동 레이블링의 경우 asset 이름 또는 폴더 이름과 같은 여러 레이블링 체계 중에서 선택할 수 있습니다. 수동 경로로 이동하면 레이블을 입력하거나 프로젝트의 레이블 구성에서 레이블을 추가하거나 Prefab의 이름과 경로를 기반으로 제안된 레이블 목록에서 추가할 수 있습니다.

 

또한 각 객체에는 여러개의 레이블이 할당될 수 있기 때문에 레이블 구성이 다른 라벨러에는 다른 객체로 표시된다.

예를 들어 Semantic Segmentation 라벨러가 모든 크림 살자를 유제품으로 인식하나 BoundingBox 라벨러는 다른 유형의 유제품을 구별하도록한다. 이렇게 구성하기 위해서는 모든 유제품에 각유제품 라벨을 추가한다음 Semantic Segmentation 라벨구성에는 유제품 라벨만 추가하고 특정제품의 이름을 갖지 않도록한다.

</p>

다양한 모델의 경우 3D로 스캔하여 만들 수 있거나 Unity asset store를 이용하면 구할 수 있다.

 

 

기존에 있는 Tutorial File에 Object를 전체 선택한다.

 

선택한 Object에 Inspector 탭에 Usb Automatic Labeling for All Selected Item 과 Use asset name을 선택한다.

 

그리고 Add Automatic Labels of All Selected Assets to Config 를 클릭한다.

클릭하면 아래 그림과 같이 구성되고 여기에서 TutorialIdLableConfigTutorialSemeanticSegmentationLabelConfig에서 Add All Label 을 클릭한다.

그후 옆에있는 Open 버튼을 클릭하면 Inspector 탭에 다음과 같은 구성을 볼 수 있다.

그 다음으로 해당 화면에서 Prefabs가 있는 경로에서 객체를 드래그에 드롭한다.

드롭된 위치를 수정하기 위해서는 Transformation 좌표값을 수정한다. 이렇게 되면 객체는(0,0,0)에 해당하는 위치에 놓여진다.

 

그리고 화면 중앙에 ▷ 플레이 버튼을 누르면 시뮬레이션이 시작 된다.

 

위치를 바꾸어 시작하게 되면 아래화면과 같다.

 

4. 배경 램더마이저 설정하기

다양한 배경을 생성해서 객체가 다양한 환경에서 인식되도록하기 위함이다. 이를 진행하는이유는 많은 데이터 셋을 생성하기 위함이다.

 

시뮬레이션 랜덤화를 진행하기 위해서는 배경 장명에 시나리오를 추가해야한다.

시나리오에는 추가된 모든 랜덤화가 구성요소를 조정한다.

 

Perception 패키지에는 객체를 Scene에 빠르게 배치하고 다양한 배경을 생성하면서 객체의 위치, 스케일, 회전, 카메라 뷰 및 객체수 등 시간에 따른 시뮬레이션의 다양한 매개 변수를 랜덤화 할 수 있는 랜더마이저가 제공된다.

 

랜더마이저는 기본적으로 랜덤한 동작을 정의 하는 여러 매개 변수를 조정해서 실행한다.

예를 들어 소수점, 벡터, 색상과 같은 연속적인 변수의 경우 모수는 랜더마이저를 위한 범위 및 표본 분포를 정의할 수 있다.

 

시나리오를 요약하자면 위와 같다.

 

이번 튜토리얼에서는 랜더마이저를 어떻게 사용하는지 알아보자.

일단 새로운 GameObject를 생성한다. Hierarchy 탭에서 버튼을 클릭하여 Create Empty를 선택한다.

생성된 GameObject를 Simulation Scenario 라고 이름을 변경한다.

생성된 Simulation Scenario를 선택하고 우측 Inspector 탭에서 Add Component를 클릭하여

Fixed Length Scenario 컴포넌트를 추가한다.

추가된 모습은 아래 화면과 같다.

각 시나리오는 많은 반복 실행을 하고 각 반복은 다수의 프레임에 대해서 실행된다. 시나리오와 랜더마이저 시기를 사용자가 정의하는 타이밍 요소이다.

 

이번 튜토리얼에서는 Fixed Length Scenario를 사용하며 고정된 길이는 각 반복 동안 고정된 프레임수에 대해 실행되는 시나리오다. Unity 측에서는 이것만 사용해도 충분하다고 한다.

 

위에 설정되어 있는 반복수는 100 (Iteration) 으로 설정되어 있는 것을 볼수 있다.

 

다음으로 랜더마이저를 추가한다. Add Randomizer 를 클릭하고 BackgroundObjectPlacementRandomizer를 선택한다.

이 랜더마이저는 포아송 디스크 샘플링을 사용하며 지정된 영역에서 임의의 위치를 선택하고 선택된 위치에서 임의로 선택된 객체의 복사본을 생성한다.

 

그리고 Add Folder를 클릭한다. 

Assets/Samples/Perception/<Perception Package Version>/Tutorial Files/Background Objects/Prefabs 폴더로 이동한후 선택한다.

그리고 Depth = 0, Layer Count = 2, Separation Distance = 0.5, Placement Area = (6, 6) 으로 지정한다.

실행을 하게 되면 하얀색 배경의 오브젝트가 랜덤하게 생성되는 것을 볼 수 있다.

 

창의 오른쪽 상단 모서리에 시각화 제어판이 표시된다.

이 패널을 사용하여 개별 라벨러에 대한 시각화를 활성화하거나 비활성화할 수 있다.

Scene에는 아직 레이블이 지정된 개체가 없으면 경계 상자나 의미 분할 오버레이가 표시되지 않는다.

 

라벨러에 대한 시각화를 비활성화해도 생성된 데이터에는 영향을 주지 않는다.

시뮬레이션을 실행하기 전에 활성화된 모든 레이블러의 주석이 계속 기록되고 출력 데이터에 나타납니다.

 

데이터를 최대한 빨리 생성하기 위해 시뮬레이션은 비동기 처리를 사용하여 프레임을 신속하게 처리하고 각 프레임의 객체를 재정렬 및 랜덤화할 수 있다.

 

개별 프레임을 체크아웃하고 실시간 시각화를 검사하려면 재생 옆에 있는 일시 중지 버튼을 클릭하면 된다.

 

씬(scene) 보기로 다시 전환하여 각 개체를 개별적으로 검사할 수도 있다.

(Perception Camera의 Inspector 보기에서) 성능상의 이유로 대규모 데이터 세트를 생성할 준비가 되면 시각화를 모두 비활성화하는 것이 좋다. 

 

위의 이미지에서 볼 수 있듯이, 지금 가지고 있는 건 베이지색 모양의 벽이다.

왜냐하면 몇 개의 하얀 모양을 산란하고 있고, 우리의 빛의 따뜻한 색이 그들에게 이런 모습을 주는 것이기 때문이다.

또한 이미지의 물체는 흐릿한데 여기서 주목해야하는 효과는 모션 블러다.

 

우리가 사용한 배치 랜덤라이저가 인스턴스화된 개체를 한 반복에서 다음 반복으로 캐시하고 각 반복에서 해당 개체를 제거하고 새 개체를 만드는 대신 새 위치로 이동하기 때문입니다. 물체의 이 "동작"은 모션 블러 효과를 만든다. HDRP 프로젝트에는 모션 블러와 여러 가지 다른 후처리 효과가 기본적으로 활성화되어 있습니다. 모션 블러 또는 기타 효과를 비활성화하려면 아래와 같이 진행하면 된다.

 

Hierarchy에서 + 버튼을 통해 Create empty를 눌러 GameObject 를 생성한후 Inspector 탭에 Add componenet를 통해 Volume 컴포넌트를 추가한다.

추가된 Volume 컴포넌터의 Profile의 New를 클릭한 후 Add Override 를 클릭한후 Motion Blur를 검색하여 추가한다. 다음과 같이 설정하면 모션블러 효과가 제거된다.

 

추가적으로 화면 Scene 탭 옆에 Game 탭에서  카메라의 해상도를 설정할 수 있다.

 

본론으로 돌아가서 학습 모델의 배경을 산만하게 하기 위해서 랜더마이저에 다양한 효과를 추가한다.

Simulation Scenario를 선택하고 추가적인 랜더마이즈 Scenario를 추가해보자

추가할 랜더마이저는 TextureRandomizer, HueOffsetRandomizer, RotationRandomizer 가 있다.

 

Simulation Scenario 의 Inspector 탭에 이미 생성되어 있는 Fixed Lenth Scenario 하단에 있는 Add Rndomizer를 선택한다.

위에서 언급한 랜더마이저를 추가하게 되면 아래와 같은 화면이 생성된다.

 

여기에서 TextureRandomizer 의 Add Folder를 클릭하고

Assets/Samples/Perception//Tutorial Files/Background Textures/ 경로에 있는 모든 폴더를 선택한다.

다음으로는 RotationRandomizer 의 각 축의 minimum 값과 Maximum 값이 각가 0, 360 인지 확인한다.

확인후 결과는 아래와 같다.

 

여기에서 모든 랜더마이저가 정상적으로 작동하기 위해서는 하나의 작업이 남았다.

Background Object Placement Randomizer는 객체를 생성하고 Scene에서 어떤 객체를 처리하는지를 알지만 추가한 나머지는 객체를 생성하지 않기 때문에 어떤 객체를 대상으로 해야하는지 모르는 상황이다.

따라서 각 Randomizer가 어떤 객체와 동작을 할지 알려줘야한다. 알려주는 방법은 아래와 같이 진행하면된다.

 

Project 탭에서 Assets/Samples/Perception/<Perception Package Version>/Tutorial Files/Background Objects/Prefabs 로 들어간다.

들어간후 모든 오브젝트 Prefab을 선택한후 Inspector 탭에서TextureRandomizerTag / HueOffsetRandomizerTag / RotationRandomizerTag 를 추가 한다.

 

시작버튼을 누르고 일시정지 버튼을 누르게 되면 아래와 같은 화면 구성이됨을 볼 수 있다.

 

5. 인식 객체 전방 램더마이저 설정하기

기존에 생성했던 Simulation Scenario에 추가했던 Fixed Length Scenario 에 Add Randomizer를 클릭하여 ForegroudObjectPlacementRandomizer를 추가한다.

 

추가된 ForegroudObjectPlacementRandomizer의 Add Folder를 클릭하여 Assets/Samples/Perception/<Perception Package Version>/Tutorial Files/Foreground Objects/Phase 1/Prefabs 폴더를 선택한다.

 

그리고 생성된 랜더마이저의 Depth = -3, Separation Distance = 1.5, Placement Area = (5, 5)로 설정한다.

 

 

다음으로 인식할 객체가 있는 경로로 가서 모두 선택후 RotationRandomizerTag 컴포넌트를 추가한다.

 

 

반응형
Comments