Yolov8 convert 관련 문의드립니다

안녕하십니까. 현재 yolov8 architecture 를 수정해서 enlight 로 변경 후 보드에서 사용할 예정입니다. 간단하게 커스텀 구조를 설명드리면 인풋 이미지가 한개가 아닌 두개 카메라에서 들어오고 동일 scene 에 대한 두 종류의 카메라 이미지를 보고 inference 를 하게 되는 구조입니다. 추가로 출력도 nc+4 에서 depth 값이 하나 더 추가되어 nc+5 로 나오게 됩니다.

현재 지원되지 않는 레이어 문제는 다 해결했고 dfl layer, box decoding and confidence score layer 를 onnx extractor 로 제거하고 box information 파일도 만들었지만 –add-detection-post-process 옵션을 넣을 시 첨부한 이미지와 같이 오류가 납니다. 넣지않으면 그냥 onnx 는 잘 변환됩니다.

따라서 첨부한 사진과 같이 질문은

onnx 를 자를 때와 bin 파일을 만들 때 명령어에 들어가는 layer 가 동일한 layer 들, 동일한 순서로 해야하는걸로 아는데 그게 맞는지와 지금 convert 할 때 yolov8 이지만 custom 구조이기 때문에 –type “Custom” 으로 했는데 이게 맞는지 질문드립니다. custom 이기 때문에 –yolo-version v8 을 제외한게 첫번째 이미지고 추가한데 두번째 이미지입니다.

하나는 원래 onnx 이고 하나는 extract 로 자른 모델입니다

안녕하세요 TOPST입니다.
혹시 컨버팅 시에 사용하신 명령어에 대해서 남겨주실 수 있으실까요?

감사합니다.

root@0f8e879ca158:/# ../venv/bin/python3 ./ws_topst/ENLIGHT_NPU_V20_SW_Toolkit_v0.9.9_ufldv2/EnlightSDK/converter.py ./best_dual_input_depth_extracted3.onnx --add-detection-post-process ./grid2.bin --model-config=./ws_topst/ENLIGHT_NPU_V20_SW_Toolkit_v0.9.9_ufldv2/input/hanyang.json --dfl-reg-max 16 --yolo-version v8 --enable-letterbox

이렇게 하고있습니다

yolov8의 커스텀 모델을 구현하셨기 때문에 --add-detection-post-process 및 –yolo-version과 같은 옵션 없이 타입을 custom으로 설정하시고 지원하지 않는 레이어를 제거 한 뒤 custom_postproc.c에서 나머지 연산들을 직접 구현하셔야 할것 같습니다.

감사합니다.

넵 답변 감사합니다. 말씀해주신대로 해서 enlight 로 변환하고 quantize 도 했는데 compile 시 아래와 같은 에러가 뜨는데 혹시 어느 부분이 문제인지 어떻게 찾을 수 있지 질문드립니다. 혹시 모델을 공유드리면 확인해주실 수 있는지도 질문드리고 싶습니다. 감사합니다

넵, 모델과 실행했던 명령어들 공유 부탁드립니다.

아래는 명령어와 enlight, quantized enlight 모델 들어있는 링크입니다!

root@0f8e879ca158:/# ../venv/bin/python3 ./ws_topst/ENLIGHT_NPU_V20_SW_Toolkit_v0.9.9_ufldv2/EnlightSDK/compiler.py ./output_network/hanyang_quantized.enlight --th-iou 0.3 --th-conf 0.3

onnx 파일과 컨버팅 명령어도 공유 부탁드립니다.
감사합니다.

root@0f8e879ca158:/# ../venv/bin/python3 ./ws_topst/ENLIGHT_NPU_V20_SW_Toolkit_v0.9.9_ufldv2/EnlightSDK/converter.py ./best_dual_input_depth_extracted2.onnx --model-config=./ws_topst/ENLIGHT_NPU_V20_SW_Toolkit_v0.9.9_ufldv2/input/hanyang.json --dfl-reg-max 16

사용한 명령어이고 yaml 과 onnx 는 위 구글드라이브 링크에 넣어놓았습니다!

우선 제가 아래 명령어로 변환을 시도하였습니다.

컨버팅 : python3 EnlightSDK/converter.py input/hanyang.enlight --type Custom --dataset Custom --dataset-root my_dataset_path/ --enable-track

양자화 : python3 EnlightSDK/quantizer.py input/hanyang.enlight

컴파일 : python3 EnlightSDK/compiler.py input/hanyang_quantized.enlight

컴파일 시에
[Error] 2 more or less than 1 inputs is not supported Compiler: error occurs. Please contact ENLIGHT NPU SW Toolkit developer with error messages file: ./output_code/hanyang_quantized/compile_debug.log
다음과 같이 에러가 발생하였습니다.
저희 쪽 툴킷에서는 현재 1개의 모델 입력만 지원하는 것으로 보입니다.

혹시 구현하시려는 내용이 정확히 어떤 것인지 설명부탁드립니다.
1개의 입력 이미지를 가지는 모델에 2개의 입력을 넣어서 1개의 클러스터를 번갈아 추론하는 방식과 같은 식으로 새롭게 구현해야 한다고 판단됩니다.
감사합니다.

현재 광각 협각 두개의 카메라를 사용해서 객체인지 및 depth 가 출력되는 모델로 설계를 했습니다. 간단하게 말씀드리면 두 이미지가 들어가면 내부적으로 사이즈가 변환되어 concat 하는 부분을 거쳐서 결과가 출력이 되고 백본에 상위 레이어가 custom 으로 구현되었고 head 는 depth 값이 나오는 것을 제외하고는 동일한 구조입니다.

결과를 내려면 동시에 두 카메라에서 나오는 인풋이 필요한데 초기에 인풋이 5d 가 안된다고 하여 channel 축으로 붙여서 4d 로 만들어서 unsupported layer 문제를 해결했었는데 혹시 제안해주신 방법에 대해 조금 더 알려주실 수 있으실까요?

광각과 협각에 대한 객체인지 및 depth로 총 4개의 출력이 결과로 나와야한다는 말씀이실까요?
그렇다면, 객체인지, depth 모델을 각각 구현한 뒤에 tc-nn-app내부에서 광각에 대한 입력과 협각에 대한 입력을 2개의 모델에 넣으시면서 추론하시면 될 것 같습니다.
AI-P의 API를 보시면 추론을 시작하는 network_run이라는 함수에서 input 버퍼에 해당 카메라에 대한 입력을 번갈아 넣으시면 됩니다.

제가 제시한 시나리오는 다음과 같습니다.

클러스터 1 (객체인식 모델) - 광각 입력 → 추론 → 출력 → 협각 입력 → 추론 → 출력
클러스터 2 (depth 모델) - 광각 입력 → 추론 → 출력→ 협각 입력 → 추론 → 출력

다음과 같이 구현하시면 될 것 같습니다.

객체인식 모델이랑 depth 모델이 따로 있는게 아니라 기존 yolo 출력이 nc + 4 라면 지금은 그냥 nc + 4 + 1(depth) 이런식으로 하나의 모델입니다. 간단하게 그냥 기존 yolo 에 두개의 카메라 인풋이 들어가는 구조를 구성했다고 보시면 될 것 같습니다. 광각 따로 협각 따로 출력이 아니라 두 이미지를 활용해서 광각 기준의 결과를 내는 모델입니다.

그래서 네트워크에 들어갈 때 두개의 이미지가 들어가야 할 것 같은데 혹시 다른 방법이 없을지 질문드립니다

듀얼 인풋에 대해 인풋을 수정했더니 아래와 같은 새로운 오류가 발생하는데 한번 확인해주시면 감사드리겠습니다. 구글드라이브에 onnx, enlight 다 새로 반영해놓았습니다. 명령어는 아래와 같이 했습니다.

root@0f8e879ca158:/# ../venv/bin/python3 ./ws_topst/ENLIGHT_NPU_V20_SW_Toolkit_v0.9.9_ufldv2/EnlightSDK/converter.py ./best_dual_input_depth_extracted2_1in.onnx --model-config=./ws_topst/ENLIGHT_NPU_V20_SW_Toolkit_v0.9.9_ufldv2/input/hanyang.json --dfl-reg-max 16 --disable-fuse-normalization --input-ch-pad repeat

root@0f8e879ca158:/# ../venv/bin/python3 ./ws_topst/ENLIGHT_NPU_V20_SW_Toolkit_v0.9.9_ufldv2/EnlightSDK/quantizer.py ./output_network/hanyang.enlight --model-config=./ws_topst/ENLIGHT_NPU_V20_SW_Toolkit_v0.9.9_ufldv2/input/hanyang.json

root@0f8e879ca158:/# ../venv/bin/python3 ./ws_topst/ENLIGHT_NPU_V20_SW_Toolkit_v0.9.9_ufldv2/EnlightSDK/compiler.py ./output_network/hanyang_quantized.enlight --model-config=./ws_topst/ENLIGHT_NPU_V20_SW_Toolkit_v0.9.9_ufldv2/input/hanyang.json

모델 변환을 위해서 컨버팅 시에 –enable-track 옵션을 사용해서 활성화 통계를 얻어야 합니다. 컨버팅 시에 해당 옵션을 사용하여 진행 후 확인 부탁드립니다.

Hanyang json 에 enable track 을 true 로 하고 진행한 부분입니다. False 로 하니 quantize 할 수 없어 말씀해주신대로 진행하여 compile 한 결과입니다

알겠습니다.
우선 컨버팅 시에 사용한 입력 데이터 셋도 올려주시면 다시 확인해보겠습니다.
감사합니다.

넵 위 구글드라이브 링크에 yaml 파일에 표시된 데이터셋 폴더 그대로 업로드하였습니다

현재 제가 컨버팅을 시도하였을때는 입력 이미지가 6채널이 들어와야하는데 3채널의 데이터셋을 사용하여 컨버팅 시에 문제가 발생하고 있습니다. 이 부분은 어떻게 해결하셔서 컨버팅 진행하셨을까요?