YOLOv9 모델을 TensorFlow Lite로 안드로이드에 3단계로 배포하기

모바일 AI 애플리케이션 개발을 시도하다가 복잡한 모델 배포 과정 때문에 포기한 적이 있다면, 이 가이드가 해결책이 될 수 있습니다. YOLOv9 모델을 TensorFlow Lite(TFLite) 형식으로 변환하고 안드로이드 앱에 통합하는 과정을 단 3단계로 정리했습니다. 딥러닝 전문 지식 없이도 기본적인 CLI 사용 경험만 있으면 충분합니다.

  • 모델 양자화 기법을 활용해 용량을 75%까지 줄이는 방법
  • TFLite 모델을 안드로이드 프로젝트에 임베드하는 실제 구현 예시
  • 배포 중 자주 발생하는 호환성 문제와 해결 전략

1. 환경 구성 및 필수 라이브러리 설치

먼저 Python 3.8 이상 버전과 필요한 패키지들이 설치되어 있어야 합니다. 프로젝트의 requirements.txt 파일에 포함된 핵심 의존성 중 TensorFlow 관련 항목은 주석 처리되어 있으므로, 직접 해제해야 합니다:

# 기본 의존성 설치
pip install -r requirements.txt

# TFLite 변환 도구 추가 설치
pip install tensorflow>=2.4.1 tensorflowjs>=3.9.0

가상환경(virtualenv 또는 conda)을 사용하면 버전 충돌을 피할 수 있어 권장됩니다.

2. 모델 내보내기 및 양자화 적용

2.1 내보내기 스크립트 핵심 로직

export.py 스크립트는 모델을 TFLite로 변환하는 중심 도구입니다. 특히 FP16과 INT8 두 가지 양자화 옵션을 지원하며, INT8은 별도의 캘리브레이션 데이터셋이 필요합니다.

2.2 변환 명령어 실행

터미널에서 다음 명령어를 입력해 YOLOv9-t 모델을 INT8 양자화된 TFLite로 변환하세요:

python export.py \
  --weights yolov9-t.pt \
  --include tflite \
  --int8 \
  --data data/coco.yaml \
  --imgsz 320 320

주요 옵션 설명:

  • --weights: 원본 모델 경로 (예: yolov9-t.pt)
  • --int8: INT8 양자화 활성화 (데이터셋 필수)
  • --imgsz: 입력 이미지 크기를 320x320으로 설정하여 모바일 성능 최적화

변환 완료 후 생성된 yolov9-t-int8.tflite 파일은 약 8MB로, 원본 32MB 대비 75% 감소한 크기입니다.

3. 안드로이드 앱에 모델 통합

3.1 에셋 폴더에 모델 배치

생성된 .tflite 파일을 안드로이드 프로젝트의 app/src/main/assets/ 하위에 복사합니다. 기능별로 분류하려면 다음과 같은 구조를 추천합니다:

assets/
  object_detection/
    yolov9-t-int8.tflite
  instance_segmentation/
    yolov9-c-seg-int8.tflite

3.2 추론 코드 구현

TensorFlow Lite Interpreter를 이용해 모델을 로드하고 추론을 수행하는 코드 예시입니다:

// TFLite 인터프리터 초기화
Interpreter.Options options = new Interpreter.Options();
options.setNumThreads(4);
Interpreter tfLite = new Interpreter(loadModelFile(context.getAssets(), "object_detection/yolov9-t-int8.tflite"), options);

// 입력 텐서 준비 (320x320 RGB)
float[][][][] inputBuffer = new float[1][320][320][3];
// ... 이미지 데이터를 inputBuffer에 복사 ...

// 추론 실행
float[][][] outputBuffer = new float[1][100][84]; // [batch][box_count][coords+classes]
tfLite.run(inputBuffer, outputBuffer);

// 결과 파싱
List<BoundingBox> detections = decodePredictions(outputBuffer);

3.3 성능 최적화 팁

  • 멀티스레딩: setNumThreads(N)로 CPU 코어 수만큼 스레드 할당
  • NNAPI 가속: 하드웨어 가속을 위해 options.setUseNNAPI(true) 설정
  • 입력 전처리: Bitmap의 getPixels() 메서드로 직접 픽셀 배열 추출

자주 발생하는 문제 해결법

문제 해결 방법
모델 로드 실패 AndroidManifest.xmlandroid:usesCleartextTraffic="true" 추가
추론 속도 저하 입력 해상도 320x320 유지 + NNAPI 활성화
정확도 저하 FP16 양자화 사용 또는 yolov9-m.yaml 모델로 전환

태그: TensorFlowLite YOLOv9 AndroidML 모델양자화 모바일AI

8월 25일 00:38에 게시됨