개발 관련/SW, App 관련

Unity에 Yolov3-tiny onnx 모델 적용

소서리스25 2024. 10. 9. 21:47
반응형

Unity에 Yolov3-tiny onnx 모델 적용

 

지난번 Darknet을 통한 yolo3-tiny 훈련을 진행했고 onnx로 컨버팅 진행에 대한 내용을 게시했었다.

 

다만 이전 게시물에서 잘못된 사항이 있어서 수정해 주었다.

수정 부분은 다음과 같다.

기존 내용
input_names='input1', image_input_names='input1', output_names=['output2', 'output1'], image_scale=1/255.,

수정 내용
input_names='input1', image_input_names='input1', output_names=['output1', 'output2'], image_scale=1/255.,

 

output의 위치가 바뀌어야 했던 것이다. 

 

컨버팅은 정상적이어도 netron에서 확인하면 출력이 제대로 안 된 것으로 확인된다.

 

이제 onnx로 컨버팅 하면 Unity의 몇 가지 설정이 필요하다.

Unity의 barracuda 문서중 지원하는 아키텍처를 확인해 보면 사실 모든 버전에서 yolo v3를 지원한다는 내용이 없다.

 

아래와 같이 가장 최종 버전에도 나오지 않는다.

Supported neural architectures and models | Barracuda | 3.0.1 (unity3d.com)

 

Supported neural architectures and models | Barracuda | 3.0.1

Supported neural architectures and models Barracuda currently supports the following neural architectures and models:

docs.unity3d.com

 

분명 본 거 같은데 나오질 않는다. 

 

그래서 더 찾아보면 change log에 있는데 일단은 지원하는 버전은 1.2.0부터이다. yolov3-tiny까지 지원한단다..

Release notes | Barracuda | 1.2.0-preview (unity3d.com)

 

Release notes | Barracuda | 1.2.0-preview

 

docs.unity3d.com

 

그러면 이 버전만 설치하면 되냐.. 안된다.. 그냥 높은 버전을 설치하면 모두 해결된다.

아래와 같이 제대로 된 버전을 인식한다.

yolov3-tiny 인식
yolov3-tiny 인식

 

그리고 이제 기존의 yolov2-tiny를 구동하는 scripts 코드를 수정해줘야 한다.

 

이전 게시물에서 수정한 것이 먼저 filters였다. 이것을 Unity에서도 거기에 맞게 코드를 수정해 줘야 한다.

수정한 사항은 다음과 같다.

 

Detector.cs 파일의 일부만 수정

기존의 yolov2-tiny는 5, v3-tiny는 3
public const int BOXES_PER_CELL = 3;

anchors 값 수정 : 훈련했을때의 값을 입력, v2-tiny를 하면 너무 작게 나온다
private float[] anchors = new float[]
{
    10,14,  23,27,  37,58,  81,82,  135,169,  344,319
};

바운딩박스의 w, h 크기 변경
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) * anchors[6 + box * 2],
        Height = (float)Math.Exp(boxDimensions.Height) * anchors[6 + box * 2 + 1],
    };
}

 

 

그리고 빌드하고 테세트해 보면 제대로 인식된다.

다만 카메라 프레임율은 yolov2-tiny보다는 좋고 되기는 하는 거 같은데 인식율이 너무 형편없다. 

물론 둘다 인식율이 나쁘긴 하다. 아무래도 사진을 더 찍어서 데이터를 늘려서 훈련하는 게 좋을 듯하다.

yolov3-tiny 인식결과
yolov3-tiny 인식결과-1

 

yolov3-tiny 인식결과
yolov3-tiny 인식결과-2

 

 

반응형