Hailo Model Zoo : hailomz API를 이용한 커스텀 YOLOv8 모델을 Hailo에서 동작가능한 바이너리파일(
.hef
)로 컴파일 및 테스트
실행환경
Build PC
- CPU: Intel(R) Xeon(R) w5-3423 @ 12cores
- RAM: 256GB
- OS: Ubuntu-22.04 LTS
- GPU: NVIDIA RTX A6000 x 2ea
- Target Hailo System: Hailo8
Hailo Version
- Hailo DFC: 3.27.0
- Hailo Model Zoo: 2.11.0
사전설치
- (Hailo) Hailo Dataflow Compiler 설치의 내용을 참고하여 설치
Dataflow Compiler (DFC)
- Dataflow Compiler v3.27.0 Install guid 를 따라 가상환경 생성 후 라이브러리 설치
Hailo Model Zoo
- GitHub - hailo-ai/hailo_model_zoo: The Hailo Model Zoo includes pre-trained models and a full building and evaluation environment 데이터플로우 가상환경에서 설치
준비물
1. ONNX
- 커스텀 데이터셋으로 학습한 YOLOv8 모델(.pt)을 ONNX로 변환한 파일
ultralytics
환경에서model.export(format="onnx")
로 변환 가능- 커스텀 데이터셋 학습 방법: (YOLO) YOLOv8 학습
2. 스크립트 파일
- 파싱, 최적화(양자화), 컴파일 과정을 위한 각각의 스크립트 파일
- Hailo Model Zoo에서 제공한 YOLOv8 스크립트를 기반으로 커스텀 모델에 맞게 수정
3. 데이터셋
- 학습에 사용한 데이터셋의 일부를
tfrecord
로 변환한 파일 - 양자화의 캘리브레이션 과정과 사후학습(파인튜닝)을 위해 1024개 이상을 추천
스크립트 준비
- 아래 스크립트 파일은 Hailo Model Zoo에 기본 제공되는 스크립트를 기반하여 optimization level, compression level 등 임의의 최적화 방법을 설정한 것으로 최적의 성능을 보장할 수는 없음
- custom_yolov8n.yaml : 컴파일 전 과정에서 필요한 config 파일
- custom_yolov8n.alls : 최적화(양자화) 및 컴파일을 위한 함수가 명시되어있는 파일
- custom_yolov8n_nms_config_640.json : postprocessing 과정인 NMS 알고리즘에 대한 파라미터
최적화 및 컴파일
1. 파싱 (Parsing)
- 헤일로에서 이해하는 구문파일(
.har
)로 변환하는 과정 CKPT
및ONNX
포맷을 지원하며hailomz parse
명령어를 통해 실행함
parse
$ hailomz parse --ckpt custom_yolov8n.onnx --yaml custom_yolov8n.yaml
2. 최적화 (Optimization)
- 파싱 과정을 통해 변환된
.har
파일을 파라미터 양자화하며 에러를 줄이는 과정 - 양자화 성능 보장을 위해 기존 모델의 훈련 시 사용한 일부 데이터셋이 필요
config
파일에 명시되어있는.alls
파일의 함수들이 적용됨- 양자화 캘리브레이션 및 파인튜닝을 위해
.alls
파일에 명시되어있는 데이터셋인.tfrecord
파일이 적용됨- 커스텀 데이터셋
tfrecord
파일은 Hailo Model Zoo의create dataset.py
를 수정하여 생성 가능
- 커스텀 데이터셋
- postprocessing(nms)를 위해
.alls
파일에 명시되어있는.json
파일이 적용됨
optimize
$ hailomz optimize --har custom_yolov8n.har --yaml custom_yolov8n.yaml
+) YOLOv8 양자화 고려해야할 것
normalization1 = normalization([0.0, 0.0, 0.0], [255.0, 255.0, 255.0])
change_output_activation(conv42, sigmoid)
change_output_activation(conv53, sigmoid)
change_output_activation(conv63, sigmoid)
quantization_param([conv42, conv53, conv63], force_range_out=[0.0, 1.0])
nms_postprocess("../../postprocess_config/yolov8n_nms_config.json", meta_arch=yolov8, engine=cpu)
입력 데이터 정규화
normalization1 = normalization([0.0, 0.0, 0.0], [255.0, 255.0, 255.0])
- 데이터의 일관성을 위한 정규화
- 헤일로 디바이스에서 처리되므로
.hef
인퍼런스 코드에서 반복 처리하지 않도록 주의
시그모이드 추가
change_output_activation(conv*, sigmoid)
- 클래스 카테고리 점수에 대한 연산 및 nms 단계와 연결을 위한 sigmoid 활성화함수 변경
quantization_param([conv42, conv53, conv63], force_range_out=[0.0, 1.0])
- [0-1] 범위로 잘 수렴하지 않는 문제가 있으면 강제로 출력 범위를 정해줌
Posetprocessing (nms)
nms_postprocess("../../postprocess_config/yolov8n_nms_config.json", meta_arch=yolov8, engine=cpu)
- nms postprocess 과정으로 자신의 모델에 맞게
.json
파일을 수정하여 사용함
3. 컴파일 (Compile)
- Optimize 완료된
.har
파일을 헤일로에서 실행가능한 바이너리파일인.hef
파일로 컴파일하는 과정 ONNX
파일을 입력으로, 파싱, 최적화, 컴파일 과정을 한꺼번에 실행도 가능
Compile
hailomz compile --har custom_yolov8n.har --yaml custom_yolov8n.yaml
+) 컴파일 고려해야할 것
.alls
파일에 컴파일 관련 기능을 추가하여 컴파일 세팅을 할 수 음performance_param(compiler_optimization_level=max)
: 헤일로 디바이스에서 최적의 FPS 성능을 보장하지만 컴파일 시간이 길어짐
결과 및 실행
- 컴파일이 완료되면
.hef
파일과 함께 컴파일까지의 과정을 담은 모델.har
이 생성됨
결과 확인
profiler
- 컴파일된
.har
파일을 이용해 최종 네트워크 구조를 시각화함
hailo profiler custom_yolov8n_compiled.har
실행
Hailo Sample Code
- Hailo 디바이스가 설치된 Host PC에서 Hailo Sample Code를 이용해 원하는 테스크를 실행할 수 있음
- GitHub - hailo-ai/Hailo-Application-Code-Examples 참고
- YOLOv8 모델의 경우 (Hailo) YOLOv8 모델 입력 데이터를 참고하여 입출력 데이터를 적절히 처리해야함