이 글은 기술 질문입니다.
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 에러
- 12클래스처럼 COCO(80클래스)가 아닌 커스텀 클래스 수를 가진 YOLOv8 모델을 변환할 때, 추가로 맞춰야 하는 조건이 있을까요?
add_detection_post_process(frozen 모듈,nn.post_process.python_yolo_post_process)가 grid shape을 검증할 때 실제로 비교하는 두 값이 무엇인지 알 수 있을까요? (에러 메시지에 구체적인 숫자가 나오지 않아 어떤 shape끼리 비교되는지 파악이 어렵습니다.)--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