Unity/Barracuda & Sentis

[Unity Sentis] 2.x 버전으로 샘플 코드 업그레이드 하기 (실패)

pnltoen 2025. 1. 6.
반응형

Sentis

Unity Technologies


서론

 

오늘은 가볍게 구버전의 샘플을 2.x 버전으로 업그레이드 하고자 합니다.

진행할 버전은 2.1.1 버전이고 샘플은 unity/sentis - Yolov8n을 사용하였습니다.

 

unity/sentis-YOLOv8n · Hugging Face

YOLOv8n validated for Unity Sentis (Version 1.4.0-pre.3*) *Version 1.3.0 sentis files are not compatible with 1.4.0 and will need to be recreated/downloaded YOLOv8n is a real-time multi-object recognition model confirmed to run in Unity 2023. How to Use Fi

huggingface.co

 

본론

샘플 프로젝트를 다운로드 후 열어보면 다음과 같은 오류가 발생합니다.

 

보면 IWorker, TensorFloat, Functional, Compile, InputDef, WorkerFactory로 정리할 수 있습니다.

 

이중 Functional 및 Compile을 제외한 부분은 공식 문서 Upgrade from Sentis 1.6 to Sentis 2.0에서 쉽게 바뀐 내용을 확인할 수 있습니다. 

 

Upgrade from Sentis 1.6 to Sentis 2 | Sentis | 2.1.1

Upgrade from Sentis 1.6 to Sentis 2 To upgrade from Sentis 1.6 to Sentis 2, do the following: Replace uses of TensorFloat with Tensor and uses of TensorInt with Tensor . Replace uses of TensorFloat.AllocZeros(shape) with new Tensor (shape) and uses of Tens

docs.unity3d.com

 

 

예로 단순하게 TensorFloat를 Tensor<float>로 변경한다는 것과 같이 쉽게 문제를 수정할 수 있으니 바로 Functional 및 Compile을 보도록 하겠습니다.

 

Functional의 개념

기본 수준의 Sentis 단계에서는 pre-trianed된 onnx 파일을 읽어오고 이를 inference 하는 과정으로 표현할 수 있습니다.

하지만 대표적으로 NMS (Non Maximum Suppression)과 같이 추가적으로 후처리가 필요한 경우 Functional을 사용하고 Compile할 수 있습니다.

 

자세한 내용은 Edit a model 문서에서 확인할 수 있습니다.

 

Edit a model | Sentis | 2.0.0

Edit a model Use the Sentis Functional API to edit a model after you create or load it. Preprocess inputs or postprocess outputs Sometimes your model expects inputs or returns outputs in a format that doesn't match your tensor data. Use the Functional API

docs.unity3d.com

 

Forum의 최근 글인 Problem of Upgrade from Sentis 1.4 to Sentis 2.1.1에서 실제 개발자가 전달한 조언을 확인할 수 있습니다. 개인적으로 몇몇 부분을 이해하지 못하였는데 첫번째는 FromTensor입니다.

 

Sentis 1.4에서 FromTensor 함수는 Tensor를 Functional Tensor로 변환시키는 역할을 진행하였습니다.

 

 

Sentis 2.0의 경우 FromTensor를 찾을 수 없었는데 Forum에서 다음의 내용을 확인할 수 있었습니다 (Link)

결과적으로 Functional.Constant를 대체하여 사용할 수 있습니다.

 

이 외적으로는 사실 변경된 사항이 없었기 때문에 바로 코드를 적용하였지만 다음과 같은 오류가 발생되게 되었습니다.

 

좌측 1.4의 경우에는 정상 작동하기 때문에 각 텐서의 값을 뽑아서 비교해보도록 하겠습니다.

 

가장 의심이 되는 문제는 NMS 함수입니다. 이번 2.0에서 NMS 함수가 리팩토리 되었습니다.

따라서 NMS 전 값인 scores, classIDs와 NMS 이 후 값인 indices, coords, labelIDs를 비교해보았습니다.

 

결과적으로 NMS 연산전 Input인 Scores, classIDs는 Sentis 1.4 그리고 2.1에서 모두 동일한 값을 얻을 수 있었습니다.

Tensor 값 추출이 버전 별로 달라서 조금 헷갈렸는데 문제는 NMS 연산 이 후 값인 indices에서 찾을 수 있었습니다.

 

 

오류 코드를 무시했을 때 좌측의 값과 우측의 값의 차이와 같이 차이가 발생하였습니다.

 

 

Sentis 문서의 인자는 차이가 없는데... NMS rework로 발생한 문제임으로 bug report 후 포스팅을 마무리 하도록 하겠습니다.

 

추가적으로 이전 NMS 코드를 2.1에서 사용하고자 하였으나 layer 및 non maxium suppreson layer 자체 구조가 많이 변경되었음으로 스킵하였습니다.

반응형

댓글