Unity/Unity Industrial

[Pixyz] Pixyz SDK 소개 및 Python을 통한 AI 기능 활용하기 (TripoSR)

pnltoen 2024. 9. 17.
반응형

Pixyz SDK

Unity Technologies


서론

지난 포스팅 [Pixyz] Pixyz SDK 소개 및 설치 방법에서 Pixyz SDK가 무엇인지 그리고 어떻게 설치 및 set up 하는지에 대해 알아보았습니다. 블로그에 Pixyz 기능 사용과 관련하여 많은 글이 작성되어 있기 때문에 기능적인 부분은 넘어가도록 하겠습니다.

 

보통 Pixyz를 사용할 때 3D CAD 데이터가 전처리가 되어있지 않은 경우 또는 3D CAD 데이터 자체가 존재하지 않는 경우가 많습니다. 두 상황을 모두 고려하기 위해 AI를 활용하여 해당 과정을 빠르게 진행해보고자 합니다. 

 

TripoSR (Feed-forward 3D reconstruction from a single image)

 

TripoSR은 간단하게 설명하면 image 데이터를 input으로 사용하고 3D CAD 모델을 output으로 출력하는 모델입니다.

간단한 테스트의 경우 웹 형식의 데모에서 이미지를 넣어서 체험할 수 있습니다.

 

TripoSR - a Hugging Face Space by stabilityai

Running on Zero

huggingface.co

 

SF3D라는 모델도 공개되었는데 해당 모델의 경우 오픈소스가 아니여서 TripoSR로 사용하게 되었습니다.

 

stabilityai/stable-fast-3d · Hugging Face

Stable Fast 3D Stable Fast 3D (SF3D) is a large reconstruction model based on TripoSR, which takes in a single image of an object and generates a textured UV-unwrapped 3D mesh asset. Please note: For individuals or organizations generating annual revenue o

huggingface.co

 

TripoSR 설정

 

설정의 경우 Github readme에 정리되어있습니다. 하지만 언제나 그렇듯이 한번에 되지 않아서 아래와 같이 readme에 없는 부분 정리해드립니다.

 

GitHub - VAST-AI-Research/TripoSR

Contribute to VAST-AI-Research/TripoSR development by creating an account on GitHub.

github.com

 

 

TripoSR 테스트

 

기본적으로 Example 폴더 안에 공식 샘플이 있습니다. 몇번 테스트 해본 결과 대칭 오브젝트의 경우 상대적으로 잘되는 편이지만, 얇은 파트의 경우 출력되지 않는 것을 확인하였습니다. 

 

단순한 구르마 이미지를 사용하였을 때는 아래와 같이 나름 배경 오브젝트로 쓸 수 있는 정도의 수준으로 출력됩니다.

 

 

아래의 명령어를 통해 파라미터 값 설정 및 obj로 저장하도록 하겠습니다.

기본적으로 TripoSR의 foreground ratio default 값은 0.85 저장 포맷은 obj이지만 가독성을 위해서 표시하였습니다.

 

python run.py examples/trolley.png --output-dir output/ --mc-resolution=320 --foreground-ratio=0.85 --model-save-format=obj

 

Output 문제점 분석

 

여기까지 읽으셨다면, 잘 2D에서 3D로 변환되었는데 Pixyz를 사용해야 하는 이유에 대해서 궁금할 수 있습니다.

따라서 GUI를 지원하는 Pixyz Studio에서 확인해보도록 하겠습니다.

 

 

기본적으로 문제가 3가지로 보입니다.

 

가장 먼저 첫째로는 좌표 축 문제입니다. 실제 해당 오브젝트의 경우 그 어떠한 좌표계를 따르고 있지 않습니다. 아마도 inference 당시에서 depth 값 추정을 위해 quaternion 좌표계를 사용해서 그런가...? (개인적인 추측) 원인 보다는 문제점 파악이 중요하니 넘어가도록 하겠습니다.

 

둘째로는 Scale 문제입니다. 전체 x 길이가 10mm로 약 1cm입니다. 유니티에서 VR 및 AR의 경우 실측에 맞게 오브젝트를 배치해야 합니다. 따라서 만약 해당 오브젝트를 XR 목적으로 사용할 경우 약 1cm로 적절하게 보이지 않을 것입니다.

 

셋째로는 Triagnles 문제입니다. 상대적으로 단순한 모형임에도 불구하고 polygone 수가 많습니다.

 

 

따라서 기본적으로 위의 4개의 문제를 해결해보도록 하겠습니다.

 

Pixyz Studio로 해결하기

 

좌표 축 문제 해결

첫번째로, Pivot 축 문제를 해결해보도록 하겠습니다.

 

 

1회성으로 각도를 찾는 번거로움이 있었지만 Occurrence Properties 값을 위와 같이 변경한 결과 아래와 같이 정상적인 rotation 값을 갖게 되었습니다.

 

 

영상 말미에 잠시 Pivot이 정상적이지 않은 모습을 확인하실 수 있습니다.

 

해당 부분을 해결하기 전 우선 occurence bounding box에 위치하기 위해 Center to Origin 후 Align Pivot Point to World 기능을 사용합니다. 1차적으로 bounding box의 중심점이 원점으로 이동하였으니 해당 점을 기준으로 Pivot을 수정하는 방법입니다. 

 

Scale 문제 해결

유니티에서 쉽게 사용할 수 있도록, Scale 문제를 수정해야 합니다. 크기는 대략 x축 기준으로 86cm 정도로 설정하였습니다.

 

 

Polygon 문제 해결 (GLB, GLTF)

해당 부분은 UV와 관련이 있음으로 Vertex Color를 지원하는 GLB 그리고 일반 CAD 포맷인 OBJ 포맷을 나눠서 설명하도록 하겠습니다.

 

GLB, GLTF

 

현재 모델의 경우, 이미 Tessellated 되어 있고 Brep 데이터를 포함하고 있지 않습니다. 

아마 output 자체를 mesh 형태로 출력하는 것으로 추측됩니다.

 

Decimate 기능을 사용하여 이미 mesh로 되어 있는 오브젝트를 최적화 할 수 있습니다. 이를 진행하기전 중간 중간 빈 픽셀 (disconnected mesh)를 수정해주도록 하겠습니다.

 

유니티의 Repair 기능은 Brep에서 mesh로 변환시 disconnected mesh를 자동 생성하는 기능을 지원합니다.

 

 

 

Repair mesh 기능을 활용하여, 다음과 같이 disconnected된 메쉬를 수정합니다.

 

개인적으로 ratio 설정을 선호하는 편입니다. 너무 과도하게 polygon이 많지만 비교용으로, 현재의 70%, 40%, 5%로 줄여보도록 하겠습니다.

 

 

5%도 많은 것으로 보입니다. 0.5%로 줄인 값은 다음과 같습니다.

 

 

188500개에서 decimate 후 942로 줄어든 것을 확인할 수 있습니다.

Polygon 문제 해결 (OBJ)

우선 OBJ의 경우 위의 GLB, GLTF와 같이 많은 polygone을 decimate 할 수 없습니다. 이는 Material 방식 즉 UV와 관련이 있습니다. 따라서 UV를 고려하여 작업을 진행하도록 하겠습니다.

 

해당 부분을 진행하기 위해 TripoSR의 run.py를 확인해보도록 하겠습니다.

 

parser.add_argument(
    "--bake-texture",
    action="store_true",
    help="Bake a texture atlas for the extracted mesh, instead of vertex colors",
)

 

TripoSR의 run.py에는 --bake-texture가 포함된 것을 확인할 수 있습니다. 해당 기능을 통해서 texture를 bake하게 되면 다음과 같은 문제가 발생하게 됩니다.

 

 

Pixyz Studio 2024.1 r35 버전에서 repair가 안되는 버그가 있어서... 해당 부분에서 시간을 많이 날리게 되었습니다.

결과적으로는 repair를 이용하면 다음과 같이 표면을 정리할 수 있습니다.

 

기본 polygon 값을 변수로 가져와서 retopology도 사용이 가능하지만 UV 문제가 발생할 수 있습니다. 2022 버전의 BakeUI 그리고 2024 버전의 TransferUV 모두 테스트 해보았지만 정상적으로 동작하지 않았고 방법이 복잡하기 때문에 repair 기능으로 다음과 같이 정리합니다.

 

 

이 후 bake된 texture를 이용해서 메테리얼을 할당해주면 됩니다.

 

 

alben 값을 texture로 설정 후 다음과 같이 생성하였습니다.

 

 

정상적으로 설정이 되었습니다. 유니티에서도 정상적으로 나타나는 것을 확인할 수 있습니다.

 

 

위의 내용에서는 직접 Polygone을 다루지는 않았지만 전반적인 개념을 서술하였습니다.

UV는 Polygone과 관련이 있기 때문에 Vertex Color를 사용하는 GLB와 같이 decimate를 과하게 할 경우 이상하게 보이는 현상이 나타날 수 있습니다 (아래 사진 참고)

 

 

별도의 UV 작업을 하지 않는다고 가정하였을 때 약 50% 정도의 Decimate를 진행하는 것이 해당 모델에서는 적합하다고 생각합니다. 

 

자세한 내용은 아래 사진을 참고하시길 바랍니다. 좌측의 사진의 경우 원본 obj + material 우측의 사진의 경우 50% decimated 오브젝트 + material 입니다.

 

 

여기까지 Pixyz Studio에서 직접 문제를 수정해보았습니다. 하지만 실제 해당 기능을 모두 손으로 적용하는 것은 시간이 많이 쓰이는 문제로 판단됩니다. 따라서 Pixyz Studio 및 Pixyz SDK의 기능을 사용하여 코드로 빠르게 실행해보도록 하겠습니다.

Python Sciprting을 이용한 자동화

전반적인 내용은 앞에서 설명하였기 때문에 빠르게 코드로 지나가도록 하겠습니다.

Pixyz Studio 2022 LTS 버전의 경우 공식 API 문서를 최신 2024 beta의 경우 최신 베타 API 문서를 참고해주시기 바랍니다.

 

해당 내용은 Github에 push해 놓았습니다. sdk_run.py를 확인해 주시길 바랍니다.

 

TripoSR_PiXYZ/sdk_run.py at main · pnltoen/TripoSR_PiXYZ

Contribute to pnltoen/TripoSR_PiXYZ development by creating an account on GitHub.

github.com

 

결론

 

지금까지 3D reconstruction 모델을 사용 후 실제 유니티, 언리얼 옴니버스에서 사용할 수 있도록 Pixyz Studio 기능을 사용하였고 이 과정을 python scripting으로 자동화하였습니다.

 

결과적으로 아직 3D reconstruction 모델 또한 사람이 만든 CAD 모델과 같이 별도의 후처리가 필요하다는 부분을 확인하였고 이 부분을 자동화하는 것 까지 완료하였습니다. 이와 같은 반복작업을 손으로 하는 것 보다는 Pixyz를 이용하여 자동화 하는 방법을 제안드립니다.

반응형

댓글