Google AI Edge를 통해 LiteRT (.tflite)로 변환된 YOLOv10을 사용하여 Android에서 실시간 온디바이스 객체 탐지 (Object Detection)를 수행합니다.
변환 과정은 외부에서 보기에 명확하지 않은 몇 가지 단계를 거칩니다. Ultralytics는 TFLite로 직접 내보내지 않습니다. 먼저 PyTorch 모델을 ONNX로 변환한 다음, onnx2tf를 사용하여 TensorFlow SavedModel을 생성하고, 마지막으로 이를 .tflite로 변환합니다. yolov10_litert.py 스크립트는 단일 --export 플래그로 이 전체 체인을 처리합니다.
Android에 탑재되면, 추론 (Inference)은 Detector 클래스를 사용하여 LiteRT 런타임 (구 TFLite)을 통해 실행되며, 이 클래스는 다음을 수행합니다:
- 카메라 프레임을 640×640 float32 텐서 (Tensor)로 전처리
[1, 300, 6] 형태의 모델 출력 텐서 읽기 — 300개의 후보 탐지 결과이며, 각 결과는 정규화된 좌표의 (x_min, y_min, x_max, y_max, confidence, class_id)를 포함함
- 박스 좌표를 다시 화면 크기에 맞게 스케일링
- 신뢰도 임계값 (Confidence threshold)에 따라 필터링하고 결과를
OverlayView로 전달
OverlayView는 Android의 Canvas API를 사용하여 카메라 프리뷰 위에 경계 상자 (Bounding boxes)와 라벨을 직접 그리며, 최신 기기에서 지연을 거의 느낄 수 없는 라이브 오버레이를 제공합니다.
라벨 맵 (Labelmap)은 Ultralytics가 내보낸 모델과 함께 작성하는 metadata.yaml에서 추출되어 labels.json 파일로 저장되며, Android 앱은 시작 시 이 파일을 로드합니다.
모델을 내보낸 후에는 Google AI Edge의 Model Explorer를 사용하여 전체 신경망 구조 (Neural network architecture)를 대화형으로 시각화할 수도 있습니다:
import model_explorer
model_explorer.visualize("yolov10n_saved_model/yolov10n_float32.tflite")
이를 통해 브라우저 기반의 그래프 뷰가 열리며, 여기서 모든 레이어 (Layer)를 검사하고, 네트워크를 통해 흐르는 텐서 형태 (Tensor shapes)를 확인하며, YOLOv10의 헤드 (Head)가 어떻게 [1, 300, 6] 탐지 출력을 생성하는지 이해할 수 있습니다. 이는 양자화 (Quantization) 문제를 디버깅하거나 모델 내부를 이해하는 데 유용합니다.
pip install -r requirements.txt
# YOLOv10n을 TFLite로 내보내기 (가중치를 자동으로 다운로드함)
python yolov10_litert.py --export --model yolov10n.pt
...
이 앱은 모든 과정을 온디바이스 (on-device)에서 실행합니다 — 네트워크 호출이나 서버가 필요하지 않습니다.
Medium Blog — 단계별 가이드
- Ultralytics의 YOLOv10 문서
- Google AI Edge LiteRT
이 프로젝트는 Google의 ML Developer Programs AI Sprint 기간 동안 개발되었습니다. 이 프로젝트를 지원하기 위해 Google Cloud 크레딧을 제공해 주신 MLDP 팀에 감사드립니다.