유니티(Unity)는 실시간 3D 시뮬레이션 환경을 제공하여 AI 모델의 훈련과 테스트를 효과적으로 지원한다. 특히, 물리 기반 시뮬레이션을 통해 로봇 제어, 자율주행차, 가상 환경에서의 사용자 행동 예측과 같은 다양한 AI 응용 사례를 개발할 수 있다. 이를 통해 유니티는 높은 확장성과 유연성을 바탕으로 AI 기술과의 통합을 가능하게 한다. 유니티에서 인공지능 모델을 활용할 수 있는 방법은 센티스, 바라쿠다, ML Agent 등이 있다.
센티스(Sentas)는 유니티 내에서 AI 및 머신러닝 모델의 실행을 지원하는 도구로, TensorFlow, PyTorch와 같은 프레임워크로 학습된 모델을 가져와 유니티 환경에서 빠르게 추론을 실행할 수 있다. 바라쿠다(Barracuda)는 유니티에서 제공하는 경량화된 머신러닝 라이브러리로, CPU와 GPU에서 모두 작동 가능하며 온디바이스(On-device) AI 추론에 최적화되어 있다. ML-에이전트(ML-Agents)는 유니티에서 강화학습과 같은 AI 훈련을 위한 도구 세트를 제공하며, 시뮬레이션 환경을 통해 에이전트가 환경과 상호작용하며 스스로 학습하도록 한다. 이 세 가지 도구는 유니티의 강력한 시뮬레이션 엔진과 결합되어 AI 연구와 응용 개발에 유용한 생태계를 형성한다.
1. 유니티 AI - 센티스 (Sentis) & 뮤즈 (Muse)
유니티6는 Sentis와 Muse를 통해 자체적으로 AI 기능을 제공한다. Sentis는 유니티 내에서 다양한 머신러닝 모델을 실시간으로 효율적으로 실행할 수 있도록 지원하며 저지연과 저메모리 사용을 목표로 최적화되어 AI 추론을 빠르고 정확하게 처리한다. 이를 통해 경로 탐색, 자율주행, 물리적 상호작용 등 복잡한 AI 기능을 실현할 수 있다. Muse는 창의적 AI 시스템을 활용하여 예술, 음악, 디자인, 게임 콘텐츠 생성에 혁신을 가져오며, AI를 통한 실시간 콘텐츠 생성과 자동화된 창작 작업을 지원한다. 유니티는 이 두 도구를 통해 AI 기술을 게임과 시뮬레이션, 창작 환경에 통합하여 더 몰입감 있고 창의적인 경험을 제공한다. Muse는 유니티 제작에 이용되는 도구이기에 지금은 Sentis 위주로 다룰 것이다.
유니티 센티스(Unity Sentis)는 유니티 엔진을 기반으로 AI와 머신러닝을 쉽게 통합할 수 있는 플랫폼이다. 예를 들어, 게임 개발자가 AI를 사용해 캐릭터의 자연스러운 움직임을 구현하거나, 자율주행차를 위한 가상 시뮬레이션 환경을 만들 수 있다. 복잡한 머신러닝 모델을 간단히 유니티 환경에 적용할 수 있어 개발 과정이 훨씬 편리해지며, 그래픽 렌더링 기술과 결합해 사실적인 시뮬레이션을 제공한다. 이를 통해 게임, 로봇 공학, 의료, 스마트 시티 등 다양한 분야에서 실시간으로 AI 실험과 최적화가 가능하다.
1단계: 지원되는 AI 모델 찾기
Unity Sentis를 사용하려면 먼저 프로젝트에 맞는 AI 모델을 선택해야 한다. 예를 들어, 자연어 처리, 이미지 분석, 또는 게임 내 캐릭터의 행동 예측을 위한 모델을 선택할 수 있다. Hugging Face, Keras, PyTorch와 같은 플랫폼에서 다양한 사전 훈련된 모델을 찾을 수 있으며, 이 모델들은 ONNX 파일 형식으로 변환해야 Unity에서 사용이 가능하다. ONNX 변환기를 활용하면 텐서플로우 모델(TF2ONNX)도 쉽게 변환할 수 있다. 예를 들어, Hugging Face에서 자연어 처리 모델을 선택하고 이를 ONNX로 변환하여 Unity에서 사용할 수 있다.
2단계: Unity에 모델 로드
모델을 선택하고 변환했다면, Unity에서 이를 로드하는 과정이 필요하다. Unity 에디터 내에서 모델 파일을 프로젝트의 Asset 폴더에 드래그하면 Sentis가 자동으로 모델을 최적화하고, 런타임에서 사용할 수 있도록 준비한다. Unity에서는 임포트된 모델을 런타임 중에 불러와 다양한 인퍼런스를 실행할 수 있다.
3단계: 입력과 인퍼런스 만들기
모델에 데이터를 입력하기 위해서는 먼저 모델이 요구하는 입력 형태를 확인해야 한다. ONNX 모델은 보통 텐서를 입력으로 받으므로, 이 텐서를 만들어주는 과정이 필요하다. 예를 들어, 이미지 분류 모델의 경우, 입력 이미지의 크기와 채널 수를 맞추는 텐서를 생성해야 한다. 여러 입력이 필요한 경우, 이를 딕셔너리 형태로 저장하여 하나의 모델에 전달할 수 있다. 예를 들어, 이미지와 텍스트 입력이 모두 필요한 모델이라면, 두 가지 데이터를 각각 처리하여 하나의 딕셔너리로 통합할 수 있다.
4단계: 모델 실행 및 최적화
모델이 로드되고 입력이 준비되었다면, 이제 모델을 실제로 실행하는 작업이 필요하다. Unity에서 모델을 실행하기 위해서는 워커를 설정해야 하는데, 워커는 모델을 분할하여 각 작업을 CPU나 GPU에서 실행하는 단위이다. 예를 들어, 실시간 게임에서 AI 모델을 사용하려면 워커가 모델을 여러 프레임에 걸쳐 분할하여 처리하도록 할 수 있다. 또한, 실행 후에는 프로파일러를 통해 모델의 성능을 측정하고 예산을 초과하는 부분을 최적화할 수 있다. 성능이 부족하다면 모델을 최적화하거나, 여러 프레임에 걸쳐 작업을 분할하는 방법도 있다.
5단계: 모델 테스트 및 배포
마지막 단계는 게임에서 AI 모델을 테스트하고 배포하는 것이다. Unity에서는 모델을 빌드에 임베드하거나, 필요할 때만 다운로드하도록 스트리밍 에셋으로 설정할 수 있다. 예를 들어, 게임이 시작될 때 모든 AI 모델을 미리 다운로드하지 않고, 필요한 시점에만 스트리밍하여 네트워크 사용을 최적화할 수 있다. 또한, 보안이 중요한 경우 모델을 암호화하여 배포할 수도 있다. 게임에서 AI 모델을 성공적으로 통합했다면, 다양한 플랫폼에서 테스트를 거쳐 최적화된 상태로 배포하면 된다.
2. ML Agent
3. Baraccuda
Unity Barracuda는 Unity에서 딥러닝 모델을 효율적으로 실행할 수 있도록 지원하는 고성능 머신 러닝 추론 엔진이다. Barracuda는 TensorFlow와 ONNX(Open Neural Network Exchange) 모델을 Unity 환경에서 손쉽게 사용할 수 있게 해주며, 주로 게임이나 실시간 애플리케이션에서 인공지능(AI) 기능을 통합할 때 유용하다. Baraccuda GPU와 CPU에서 모두 실행 가능하며, 모델을 최적화하여 성능을 극대화하는 기능도 제공하여, Unity의 다양한 플랫폼에서 효율적으로 AI를 구현할 수 있다.
1. Unity Barracuda 세팅 방법
barracuda-release/Documentation~/Installing.md at release/3.0.0 · Unity-Technologies/barracuda-release
Contribute to Unity-Technologies/barracuda-release development by creating an account on GitHub.
github.com
"com.unity.barracuda" : 2.0.0을 Packages/manifest.json 파일에 추가하면, 해당 패키지가 프로젝트에 포함된다. 버전이 맞지 않아도 Unity는 설치된 버전에 맞는 적절한 버전을 자동으로 추천하고 설치해준다. 패키지를 설치하고 나면, 이제부터 해당 패키지를 사용하여 AI 모델을 Unity 프로젝트에 통합할 수 있게 된다.

ONNX 기반의 MNIST 분류 모델을 다운로드하여 Unity에서 사용하는 방법은, 먼저 딥러닝 프레임워크에 관계없이 사전 학습된 ONNX 모델을 다운로드한 후, Unity에서 사용할 준비를 하는 것이다. 또는 바라쿠다에서 제공하는 기본 모델을 사용할 수도 있는데, 모델 파일을 다운로드한 후 Unity 프로젝트 내에서 Assets > Models 폴더를 만들고 해당 폴더로 다운로드한 ONNX 모델 파일을 드래그 앤 드롭하여 넣으면 된다.

Unity 프로젝트에서 모델 추론을 수행하기 위해 코드를 작성해야한다. 아래는 XR및 딥러닝 기반 ADHD 스크리닝 및 증상 개선 프로젝트에서 다른 팀원이 설계했던 코드이다. 수행 스크립트는 주로 TensorFlow 또는 ONNX 모델을 사용하여 데이터를 입력받고, 해당 모델을 통해 추론 결과를 얻는 역할을 한다. 스크립트 내부에서는 모델 로딩, 입력 데이터 준비, 추론 실행, 결과 처리 등을 담당하는 함수들이 포함됩니다. 또한, 이 과정에서 바라쿠다(Baracuda)라는 Unity의 AI 추론 라이브러리를 사용할 경우 바라쿠다의 API를 통해 모델을 로드하고 추론을 실행하며 최종적으로 결과를 Unity 환경에서 활용할 수 있도록 반환하는 방식으로 구현된다. 이를 통해 모델의 예측 결과를 Unity에서 실시간으로 처리하고, 게임이나 애플리케이션에 적용할 수 있다.

ONNX(Open Neural Network Exchange)는 인공지능(AI) 모델을 저장하고 실행하는 표준 형식이다. 쉽게 말해, 한 곳에서 만든 AI 모델을 다른 곳에서도 쓸 수 있게 만들어주는 파일 형식이라고 보면 된다. 예를 들어, Python에서 PyTorch나 TensorFlow 같은 도구를 사용해 AI를 학습시켰다면, 이 모델을 ONNX 형식으로 저장하면 Unity에서도 쓸 수 있게 된다.
예를 들면 사용자가 VR 환경에서 카메라로 와인 병의 라벨을 스캔하면, AI가 이 라벨을 분석해 "이 와인은 2020년산 프랑스산 샤도네이입니다"와 같은 정보를 실시간으로 제공하는 시스템을 생각해보자. 이를 구현하려면 먼저 AI 모델을 학습시켜야 한다. AI 모델은 기본적으로 데이터에서 패턴을 배우는 알고리즘이다. 이 경우, 와인 라벨을 포함한 수천 장의 이미지를 AI에게 보여주며, 각 이미지에 해당하는 정답(예: 와인 이름, 연도, 원산지)을 알려주는 방식으로 학습시킨다. 이 과정은 Python에서 PyTorch나 TensorFlow 같은 딥러닝 프레임워크를 사용해 진행된다.
학습이 완료되면 AI 모델은 새로운 이미지에서도 와인 정보를 예측할 수 있는 능력을 갖추게 된다. 이 학습된 모델을 ONNX 형식으로 변환하면 Unity의 Barracuda에서 쉽게 불러와 사용할 수 있다. Unity에서는 VR 카메라로 들어온 이미지를 ONNX 모델에 전달하고 모델의 예측 결과를 VR 사용자에게 실시간으로 보여준다. 이러한 방식은 AI의 복잡한 학습 과정(Python에서의 모델 설계 및 학습)과 Unity에서의 구현(실시간 AI 적용)을 매끄럽게 연결하며, 개발자는 학습된 AI 모델을 간단히 활용하여 인터랙티브한 환경을 만들 수 있다.
using Unity.Barracuda;
using UnityEngine;
public class ADHDModelRunner : MonoBehaviour
{
public NNModel modelAsset; // Drag your .onnx file here in the inspector
private IWorker worker;
private Model model;
void Start()
{
// Load the model and create a worker for inference
model = ModelLoader.Load(modelAsset);
worker = WorkerFactory.CreateWorker(WorkerFactory.Type.ComputePrecompiled, model);
}
public float[] RunModel(float[] inputArray)
{
// Prepare the input tensor
Tensor inputTensor = new Tensor(1, 1, 6, 3, inputArray);
// Execute the model
worker.Execute(inputTensor);
// Get the output tensor
Tensor outputTensor = worker.PeekOutput();
float[] outputArray = outputTensor.ToReadOnlyArray();
// Dispose tensors to avoid memory leaks
inputTensor.Dispose();
outputTensor.Dispose();
return outputArray;
}
void OnDestroy()
{
worker.Dispose();
}
}
'Development > 3D Engine Programming' 카테고리의 다른 글
Unity Programming [5] : 유니티 소프트웨어 설계 (Attribute, Gizmos) (1) | 2024.12.27 |
---|---|
Unity Programming [3] : 시스템 로직 (Unity System Logics) (2) | 2024.11.15 |
Unity Programming [2] : C# 입출력 연산 (Input/Output (I/O) operations) (2) | 2024.11.08 |
Unity Programming [1]: 병행성 추상화 프레임워크 (Concurrency Abstraction Framework) (0) | 2024.10.28 |
Unity Programming [0] : C# 프로그래밍 (1) | 2024.10.11 |