Discover area mode for Object Capture

니냐뇨·2024년 8월 5일
0

Spatial Computing

목록 보기
13/19

예전에 Object Capture를 소개해줬었다.

Object Capture는 당신이 실내에서 걸어다니며 모든 각도에서 캡쳐할 수 있는 Movable object에서 가장 잘 동작 했다.

하지만 몇 오브젝트는 bounding box의 구조안에서 잘 동작하지 않았다.

그래서 Area mode를 소개한다.

이제 평평하지 않은 외부 물체, 모든 각도에서 찍기 어려운 물체, 2.5d 물체 도 캡처가능하다.

Area mode로 생성된 모델은 3D 환경이나 예술적인 작품 에서 사용하기 이상적이다.

sample app을 열어서 Area 모드를 선택한다.

캡처 시에는 주변을 잘 살피고 이미지간에 중첩이 일어날 수 있게 천천히 움직여야 한다.

최상의 결과를 위해 각 표면을 parallel하게 캡쳐해라.

완성!

오늘의 순서

iOS API

Best Practices

Diffuse Lights

그림자가 생기지 않도록, 흐리거나 fully shaded area면 좋다.

Visual Overlap

천천히 움직여서 feature들이 충분히 겹쳐지도록 한다.

Multiple viewpoints

다른 높이에서 여러 row들을 캡쳐하여 object를 모든 각도에서 볼 수 있도록 한다.
6 feet보다 큰 area는 맥에서 higher detail level을 설정하지 않는 이상 mesh, texture의 퀄리티가 낮아질 수 있다.

Supported Devices

Using area mode

이전에는 startDetecting에서 오브젝트를 감지하고 bounding box를 설정한다.
박스가 설정되면 startCapturing을 통해 캡쳐를 시작한다.

Area mode는 setting해야하는 new call이나 configuration이 없어서 훨씬 쉽다.

Area mode에서는 startDetecting을 생략하고 startCapturing로 바로 진행할 수 있다.
bounding box를 감지하는 단계가 없다.
transition이 seamless하게 보이기 위해서 object reticle frame을 끄는 것을 추천한다. 이것은 당신이 이용중인 모드가 무엇인지 인지하는 것에도 도움을 준다.

hideObjectReticle() modifier를 사용하면

seamless transition이 가능해진다.

macOS example

맥에서 프로세싱하게 되면 더 많은 옵션과 더 높은 퀄리티가 가능해진다.

샘플 앱으로 쉽게 만들 수 있다.

두가지 mesh 중에 선택할 수 있다.

Quad Mesh는 UV를 수정하고 3D 물체를 움직이기 쉽게 만든다. 또한 알고리즘은 아티스트 친화적인 edge를 형성하게 해준다.

detail level도 설정할 수 있다.

scene이 클수록 큰 차이가 있으며 VFX와 같은 오프라인 render에서 사용하기 좋다.

16K texture처럼, 더 많은 이미지를 지원하는 것은 더 큰 영역을 높은 퀄리티로 처리할 수 있다는 것이다.
많은 unified memory가 있는 Mac model에서 당신은 2000장까지의 이미지를 처리할 수 있다.

요 두가지 옵션을 추가했다.

프로세싱을 시작한다.

만든 뒤 비전프로에서 수정한 모델이다.

디테일은 여기서 확인해라.

Reality Composer Pro에서 추가적으로 편집하고 어셋을 추가하여 Quicklook을 통해 Apple Vision Pro로 살펴본 모습이다.

Data Loading API

새롭게 추가된 Data Loading feature!

Custom object mask

capture시에 배경을 조정할 수 없거나 배경이 역동적으로 바뀐다면, 각 이미지에 mask를 적용하여 어디가 전면이라 reconstructed되어야 하는지 어디가 배경이라 reconstruct되면 안되는지를 보여줄 수 있다.

이 이미지의 경우 손이 용과를 가리고 있고, 손이 움직여서 자동적으로 segmentation에 포함될 수 있다.

각 이미지에 대한 비트맵 마스크를 생성했다고 해보자. 이들을 reconstruction에 어떻게 포함시킬 수 있을까?

Photogrammetry session은 model을 image로부터 reconstruct하는데 사용된다. session을 만들 수 있는 두가지의 Input source가 있다.
Folder of images나 photogrammetry sample의 sequence다.

Custom bitmap에 대해, 우리는 reconstruction에 사용되는 샘플에 마스크를 추가한 sequence를 생성할 수 있다.

Sample에는 제공할 수 있는 다양한 속성들이 있다.
가장 중요한 것은 RGB image data지만 metric scale을 recover하기 위한 depth map과 uprighting을 위한 gravity vector, extra information을 위한 metadata dictionary, object mask도 있다.

예전에는 이것들을 전부 수동으로 로드했어야 했는데, 이것은 꽤 복잡했다.

올해 Phtogrammetry sample을 위한 API는 이를 더 간단하게 만들었다.
이미지 파일을 로드 할 때 이미지에서 얻을 수 있는 정보들을 자동으로 채운다.

DSLR로 찍은 JPEG는 이미지만 load하지만, Object Capture UI를 통해 얻은 이미지에서는 depth data와 gravity도 load한다.

여기 보면 sync와 async 버전 두가지를 제공해주고 있다.

async version은 SwiftUI inspector같은 경우에 사용된다.
반면, photogrammetry session은 synchronous version을 필요로 한다.

image URL을 매개변수로 받고 object mask와 같은 이미지의 데이터를 포함하고 있는 PhotogrammetrySample을 반환하는 간단한 함수가 있다.
새로운 API를 사용하여 image file을 sync initializer로 불러오고 있다. 성공한다면 이미지에서 발견된 모든 데이터를 가지고 있는 photogrammetry sample을 얻게 될 것이다.

다음으로 각 이미지에 저장된 object mask를 불러오는 helper function을 가지고 있다고 가정해보자.
마스크를 불러서 objectMask property에 할당해준다.

이 과정이 끝나면 sample을 반환한다.

지금은 단순히 nil을 throw하는데, 이를 다루는 것은 나중에 보여주겠다.

이제 sample을 불러와서 custom mask를 더할 수 있으니 custom photogrammetry session을 만들기 위해 이 sample을 sequence에 넣어야 한다.

reconstruction에 사용되는 이미지들의 URL의 배열을 제공받았다고 하자.
내가 해야할 것은 session에 넣을 수 있는 lazy sequence를 생성하기 위해 새로운 loadSampleAndMask 함수를 이 배열에 적용시키는 것이다.

몇가지 살펴봐야하는 포인트가 있는데,
첫번째는 array를 lazy로 만들어서 모든 이미지를 메모리에 한번에 불러오지 않아도 되게 하는 것이다. 이것은 session은 sequence를 반복하는 동안 이 요소들을 한번에 불러온다는 것이다.

두번째는 그냥 map이 아니라 compactMap을 사용했다는 것이다. compactMap은 file을 불러 올 수 없을 때 발생하게 되는 nil 값을 가지는 element를 무시한다.

sequence를 Input으로 사용하는 session을 반환한다.

최종적인 reconstruction은 보기에 좋다. 손도 피해서 형성 되었다.

이전에는 깊이 등의 데이터를 불러오기 위해 많은 코드가 필요했지만 새로운 initializer를 통해 몇 줄 안되는 코드로 이 작업이 이루어지게 되었다.

존재하는 data property를 불러오는 것에 추가로

ObjectCaptureSession capture UI를 통해 생성되면 읽기 전용의 새로운 프로퍼티들도 저장할 수 있다. 이는 inspectorUI나 own custion reconstruction의 pipeline에 도움이 될 수 있다.

각각의 자세한 내용은 문서에서 확인 할 수 있으나 하나 중요한 것은 다루고 싶다.
shot을 위한 카메라 데이터다.

당신 만의 백엔드 reconstruction pipline을 만들기 위해 이 데이터의 사용에 흥미가 있는지 혹은 data capture에 더 발전한 시각 효과를 제공하고 싶은지.

Object Capture session으로 사진을 찍으려면 각 shot이 sample에 유효하게 하기 위해서 camera transform이 필요하다.

data loading API가 새로운 시각화, custom pipeline 등의 많은 가능성을 열게 된다고 생각한다.

profile
열심히 살자.

0개의 댓글