AI-G보드 Convert 관련 문의

이 글은 기술 질문입니다.

on

사용 보드

AI-G

보드 이미지 또는 펌웨어

Ubuntu

사용자 PC 또는 빌드 환경

Windows + WSL

사용자 PC 운영체제 버전

Ubuntu 22.04

SDK/BSP 버전

EnlightSDK v0.9.9 (Telechips NPU Toolkit / Enlight SDK)

기술 분야

NPU/AI 모델

사용 예제 또는 모델

YOLOV8

질문 내용

[Converter] 12클래스 커스텀 YOLOv8 모델에서 grid shape mismatch 에러

  1. 12클래스처럼 COCO(80클래스)가 아닌 커스텀 클래스 수를 가진 YOLOv8 모델을 변환할 때, 추가로 맞춰야 하는 조건이 있을까요?
  2. add_detection_post_process (frozen 모듈, nn.post_process.python_yolo_post_process)가 grid shape을 검증할 때 실제로 비교하는 두 값이 무엇인지 알 수 있을까요? (에러 메시지에 구체적인 숫자가 나오지 않아 어떤 shape끼리 비교되는지 파악이 어렵습니다.)
  3. --num-class가 80이 아닌 값일 때 알려진 이슈나 제약사항이 있는지 궁금합니다.

현재 상태 또는 발생 증상

동일한 절차로 만든 yolov8n.pt(COCO, 80클래스)는 converter → quantizer → compiler까지 전부 정상 완료됩니다.

커스텀 학습한 12클래스 YOLOv8n 모델(best.pt, Roboflow 데이터셋으로 학습)만 converter 단계에서 위 에러가 재현됩니다.

실행한 명령 또는 코드

python ./EnlightSDK/converter.py \
  ./input_networks/best.onnx \
  --model-config ./input/yolov8_model_zoo/best.json

best.json은 yolov8.json의 파일을 복사해서 수정할 부분만 수정한 파일입니다.

오류 로그

converter 실행 시 아래 에러가 발생합니다.

File "<frozen network>", line 1237, in add_detection_post_process
File "<frozen nn.post_process.python_yolo_post_process>", line 175, in init_grid
Exception: [Error] YOLO grid file is invalid. Network output and grid shape do not match

이미 시도한 방법

지금까지 확인/배제한 원인 목록

아래 항목들을 전부 yolov8n.onnx(정상 동작)와 best.onnx(에러 재현) 사이에서 직접 비교했으며, 모두 일치하거나 정상 값으로 확인되었습니다.

항목 확인 방법 결과
ONNX opset / ir_version onnx.load()opset_import, ir_version 확인 둘 다 opset=12, ir_version=7로 일치
입력 shape graph.input 확인 둘 다 [1, 3, 640, 640]
Detection head 그래프 구조 node output 이름 비교 둘 다 Slice 기반 (Split 아님) — opset 12로 통일 후 일치 확인
cv2(box) 레이어 output shape shape_inference 후 확인 둘 다 [1,64,80,80], [1,64,40,40], [1,64,20,20]
Grid .bin 파일 default_box_generator.py로 생성, 파일 크기 비교 둘 다 정확히 67,328 bytes로 동일
Grid .bin 헤더 값 struct unpack으로 직접 파싱 둘 다 grid_shape = (1, 1, 16800)으로 동일
value_info 중복 이름 기준 dedup 스크립트로 확인/제거 best.onnx에서 중복 없음 확인 (240개 전부 고유)
output0 shape graph.output 확인 best.onnx: [1, 16, 8400] (4+12클래스로 정상 계산됨)
num_class 영향 여부 진단용으로 best.json의 num-class를 80으로 임시 변경 후 재시도 80으로 바꿔도 동일 에러 재현 → num_class 자체는 원인 아님
dfl_reg_max dfl conv weight shape 확인: (1, 16, 1, 1) reg_max=16으로 정상, json 설정과 일치
dfl 관련 중간 텐서 shape Reshape/Softmax output shape 확인 [1,4,16,8400] 등 정상
가중치 NaN/Inf 모든 initializer를 numpy로 변환 후 np.isnan/isinf 검사 문제 없음
--type unknown으로 우회 시도 --type unknown으로 실행 model_config가 "auto"로 인식되어 여전히 동일 grid 로직이 적용되고 동일 에러 재현

원하는 결과

사용자 지정 학습 모델(yolov8)의 Build Guide

위 파일들은 프로젝트에 사용한 파일 목록입니다!

안녕하세요.
yolo 모델의 경우 후처리단에서 지원하지 않는 레이어가 존재합니다.
때문에 해당 레이러를 제거하는 작업을 거쳐야하며 컴파일러의 tc-nn-toolkit/input_networks 해당 경로에 존재하는 export_yolo_onnx.sh, extract_yolo_onnx.sh, gen_yolo_defaultbox.sh 3가지 스크립트를 사용하여 yolo 변환을 위한 onnx파일과 bin 파일을 만드셔야합니다.
이후에 변환 명령어는 다음과 같습니다.

python EnlightSDK/converter.py ./input_networks/yolov8s_extracted.onnx \​
--type obj \​
--add-detection-post-process ./input_networks/yolov8s.bin \​
--dataset Custom --dataset-root my_dataset_path \​
--output ./output_networks/yolov8s.enlight \​
--enable-track --mean 0 0 0 --std 1 1 1 \​
--num-class 80 --yolo-version v8 --enable-letterbox --dfl-reg-max 16 \​
--output-order cl
진행하시고 막히시면 다시 댓글 남겨주시면 빠르게 도와드릴게요.
감사합니다.

1 Like