개발 관련/SW, App 관련

Yolov3을 이용한 Unity 사물인식 제작 정리(5)

by 소서리스25 2024. 11. 14.
반응형

Yolov3을 이용한 Unity 사물인식 제작 정리(5)

 

8. Unity의 App 설정

 

이제 지난번 훈련을 마치고 최종 컨버팅했던 onnx 파일과 label 텍스트를 Unity에서 사용할 차례이다.

 

처음부터 모든 코드를 다 만드는 것이 아닌 공개된 git을 활용하여 진행할 것이다.

다음의 깃을 clone 하거나 다운로드하여 준비한다. 아주 잘 되어 있으며 classifier 방식과 detecting 방식이 함께 있다.

GitHub - Syn-McJ/TFClassify-Unity-Barracuda: An example of using Tensorflow and ONNX models with Unity Barracuda inference engine for image classification and object detection.

 

GitHub - Syn-McJ/TFClassify-Unity-Barracuda: An example of using Tensorflow and ONNX models with Unity Barracuda inference engin

An example of using Tensorflow and ONNX models with Unity Barracuda inference engine for image classification and object detection. - Syn-McJ/TFClassify-Unity-Barracuda

github.com

 

이제 Unity를 실행하여 해당 프로젝트를 불러온다.

 

여기서 참고로 위의 git에서 소개한 프로젝트는 2018.4.3 버전보다 상위버전이다. 본인처럼 2018.4.3으로 사용하려면 오류등을 수정해 줘야 한다.

 

프로젝트를 열고 혹시나 barracuda가 설치되어 있지 않다면 barracuda를 설치해 줘야 한다. 아울러 버전이 낮으면 업데이트해야 한다.

설치 및 업데이트 방법은 menu > windows > package manager를 선택하면 아래와 같은 창이 나타난다.

이 중에서 barracuda를 먼저 선택한다.

여기서 우측 상단에 보면 현재 버전이 보일 것이다. 이 버전을 1.3.2 정도로 업데이트한다.

barracuda 선택 및 버전 업데이트
barracuda 선택 및 버전 업데이트

 

다음으로 Asset 폴더에서 Resources 폴더에 준비한 Label 텍스트 파일과 onnx 파일을 복사한다.

Unity내의 Asset에서 onnx파일을 선택하면 다음과 같은 정보가 보일 것이다.

-1 값이 없다면 정상적으로 불러와진 것이다. barracuda의 버전이 낮으면 -1 값이 나올 수 있다.

onnx 모델정보
onnx 모델정보

 

이제 현재 프로젝트에서 적용된 스크립트를 살펴볼 것이다.

Detect 씬에서 Detector 객체를 선택해 보면 Detector 스크립트가 적용된 것을 볼 수 있다.

여기에 model  file 항목과 labels file 항목에 각각 복사한 모델과 텍스트를 적용해 준다.

onnx 모델 적용하기
onnx 모델 적용하기

 

웹카메라가 설치되어 있다면 바로 확인할 수 있겠지만 아마 제대로 동작하지 않을 것이다.

 

왜냐면 현재 git의 프로젝트는 yolo v2 기준으로 되어 있다. 따라서 yolo v2라면 input과 output 이름, class 수 정도만 수정하고 바로 테스트해 보면 되겠지만 yolo v3은 스크립트를 수정해 줘야 한다.

 

앞의 포스트에서도 있는 내용이지만 우리가 우선적으로 변경해 줘야 할 것은 filters 값에 해당하는 것과 bounding box의 정보가 다른 사항을 수정해 줘야 하는 것이다.

 

이제 수정해야 하는 부분을 차례로 설명한다. 해당 내용만 참고하여 수정한다.

먼저 기존의 27줄부터 있는 Input_name와 Output_name를 yolov3-tiny의 내용으로 수정해줘야 한다. 위의 onnx 정보에 바로 나와 있다.

private const string INPUT_NAME = "input1";
private const string OUTPUT_NAME = "output1";

 

다음 40, 42줄의 내용을 수정해 준다. 

public const int BOXES_PER_CELL = 3; // yolov2 : 5 // yolov3 : 3
..
public const int CLASS_COUNT = 2;// 1; // 20;

 

다음은 47줄의 anchors 값이다. yolov2와 yolov3의 값에 차이가 있다. 기존 것은 주석처리하고 그냥 변경해 주도록 한다.

 

    private float[] anchors = new float[]
    {
        // 1.08F, 1.19F, 3.42F, 4.41F, 6.63F, 11.38F, 9.42F, 5.11F, 16.62F, 10.52F // yolov2
        10,14,  23,27,  37,58,  81,82,  135,169,  344,319  // yolov3
    };

 

다음 181줄 내용으로 bounding box를 cell 변환하는 크기를 정하는 함수의 내용을 yolov3로 변경하는 부분이다. 역시 기존 내용은 yolov2에서 사용할 수도 있으므로 주석처리해 놓자.

    private CellDimensions MapBoundingBoxToCell(int x, int y, int box, BoundingBoxDimensions boxDimensions)
    {
        return new CellDimensions
        {
            X = ((float)y + Sigmoid(boxDimensions.X)) * CELL_WIDTH,
            Y = ((float)x + Sigmoid(boxDimensions.Y)) * CELL_HEIGHT,
            //Width = (float)Math.Exp(boxDimensions.Width) * CELL_WIDTH * anchors[box * 2],           // yolov2
            //Height = (float)Math.Exp(boxDimensions.Height) * CELL_HEIGHT * anchors[box * 2 + 1],    // yolov2
            Width = (float)Math.Exp(boxDimensions.Width) * anchors[6 + box * 2],               // yolov3
            Height = (float)Math.Exp(boxDimensions.Height) * anchors[6 + box * 2 + 1],         // yolov3
        };
    }

 

수정 관련 부분은 이전 포스트도 참고하기 바란다.

Unity에 Yolov3-tiny onnx 모델 적용

 

Unity에 Yolov3-tiny onnx 모델 적용

Unity에 Yolov3-tiny onnx 모델 적용 지난번 Darknet을 통한 yolo3-tiny 훈련을 진행했고 onnx로 컨버팅 진행에 대한 내용을 게시했었다. 다만 이전 게시물에서 잘못된 사항이 있어서 수정해 주었다.수정

tipon.tistory.com

 

이제 Main Carmera를 선택해 Inspector에서 몇 가지를 다음과 같이 변경해 준다. Classifier를 사용하지 않고 Detect 모드를 사용하기 위함이다.

카메라의 Detect 선택
카메라의 Detect 선택

 

이제 마지막으로 빌드 세팅이 남아있다.

 

Android 폰에서 구동시킬 것이므로 build settings에서 Android로 스위칭해 준다.

그리고 Player settings에서 Graphic APIs를 Auto에서 해제하고 우선적으로 Vulkan을 넣어준다. OpenGLES3은 없어도 상관없을 것 같다. 하지만 일단 넣어줬다. 

 

가장 중요한 것은 Vulkan을 사용해야 한다는 것이다.

 

Api Level은 평균적으로 7~9 정도로 설정하였다. 전체적으로 다음의 설정을 참고하기 바라며 나머지 설정은 크게 중요하지 않다.

player의 other settings
player의 other settings

 

 

이제 모든 설정이 다 끝났다. 빠진 사항이 없는지 확인해 보자.

남은 사항은 빌드하여 Android 폰에 넣고 테스트하는 것이다.

 

 

9. 빌드 및 테스트

 

이제 모든 설정을 다 마쳤고 준비되었으니 빌드해 보자.

build 중...
build 중...

 

다행히도 오류 없이 성공적으로 build 되었다.

build 성공
build 성공

 

 

이제 Android 폰에 설치하여 테스트해 본다.

설치 시 폰의 개발자모드를 활성화시키고 알 수 없는 앱 설치 항목을 허용해 주어야 한다.

 

 

 

음.. 영상을 보면 알겠지만 bounding box의 위치가 다르다. andchor의 값이나 labeling 했을때의 rectbox의 크기의 설정 중 무언가 값이 틀어진 듯 한거 같다. 

 

하지만 그렇다 하더라도 weights 파일을 토대로 동영상을 촬영하여 훈련시키면 아마도 제대로 나올 것이다. 그런 경우에는 unity에서의 처리부분을 확인해 봐야 한다.

반응형

댓글