모바일 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.xml에 android:usesCleartextTraffic="true" 추가 |
| 추론 속도 저하 | 입력 해상도 320x320 유지 + NNAPI 활성화 |
| 정확도 저하 | FP16 양자화 사용 또는 yolov9-m.yaml 모델로 전환 |