AEGLOSLAB Arduino UNO Q 완전 가이드

제9부 AI·엣지 응용

9.2 One-Click AI로 모델 배포하기

UNO Q 발표 초기 마케팅 자료(Qualcomm·Arduino 공동 보도자료, 2025년 10월)는 "One-Click AI"라는 이름으로 "사전학습 모델을 Qualcomm AI 엔진에 곧바로 배포하는" 기능을 소개했다. 이 장 집필 시점에 docs.arduino.cc의 기술 문서를 직접 확인한 결과, 같은 기능은 현재 App Lab 안에서 "Bricks > AI Models" 워크플로우로 문서화돼 있고, 페이지 제목도 "One-Click AI"가 아니라 "Custom AI Models for Arduino App Lab"이다. 즉 "One-Click AI"는 제품 발표 시점의 마케팅 명칭이고, 실제 조작 화면·현재 문서의 용어는 조금 다르다 — 같은 기능을 가리키는 것으로 보이지만, 이 책 집필 시점 기준 명칭이 완전히 고정됐다고 단정하기는 어렵다. 아래에서는 실제 화면에서 접하게 될 이름("Bricks", "AI Models" 탭)을 기준으로 서술한다.

9.2.1 두 가지 시작점 — 사전학습 모델 vs 직접 훈련

App Lab에서 AI 모델을 앱에 통합하는 방법은 두 가지다.

  1. 사전학습(pre-loaded) 모델을 그대로 쓴다 — Brick을 앱에 추가하면 기본 제공되는 모델(객체 탐지, 얼굴 탐지 등)을 그대로 실행. 코드 작성 없이 즉시 동작.
  2. 자신의 데이터로 새 모델을 훈련한다 — Edge Impulse Studio 연동을 통해 커스텀 데이터셋으로 학습한 모델을 App Lab에 설치.

이 장은 둘 다 다룬다. 9.2.2는 ①, 9.2.3은 ②다.

9.2.2 사전학습 모델 목록 — 실제로 무엇이 들어 있나

Arduino 공식 Brick 구현 저장소(arduino/app-bricks-py, GitHub 공개)에는 보드별로 어떤 사전학습 모델을 설치할 수 있는지 정의한 매니페스트(models/models-list.yaml)가 들어 있다. 이 책 집필 시점에 그 파일을 직접 확인한 결과는 다음과 같다(일부 발췌, UNO Q 지원 모델 위주).

모델용도출처UNO Q 지원
Lightweight-Face-Detection얼굴 바운딩박스 탐지Qualcomm AI Hub예
YOLOX-Nano 기반 객체 탐지COCO 80종 범용 객체 탐지Edge Impulse예
MobileNet 이미지 분류범용 이미지 분류Edge Impulse예
Person classification사람 유무 분류Edge Impulse예
Concrete crack anomaly detection콘크리트 균열 이상 탐지Edge Impulse예
Keyword spotting — "Hey Arduino!"음성 웨이크워드Edge Impulse예
Continuous motion detectionIMU 기반 동작 감지Edge Impulse예
Fan anomaly detection진동 기반 이상 탐지Edge Impulse예
Glass breaking classifier유리 파손음 분류Edge Impulse예
Hand gestures손 제스처 분류Edge Impulse예
Gemma 3 1B / Qwen 3.5 0.8B (llama.cpp)소형 언어모델Hugging Face예(UNO Q + VENTUNO Q 공통)

흥미로운 점은 마지막 줄이다 — UNO Q도 llama.cpp 기반의 아주 작은 LLM(Gemma 3 1B, Qwen 3.5 0.8B)은 지원 목록에 포함되어 있다. 다만 이 실행이 CPU인지 GPU 가속을 동반하는지는 매니페스트만으로는 알 수 없다(⚠️ 확인 필요).

반면 다음 모델들은 매니페스트에 supported_boards: ["ventunoq"]로만 등록돼 있어 UNO Q에서는 쓸 수 없는 것으로 보인다.

  • hw_acceleration_backend: qnn 태그가 붙은 모든 모델(얼굴 탐지 QNN판, YOLOX QNN판, EfficientNet-B4 QNN판, 고해상도 콘크리트 균열 탐지 등)
  • Qwen 3-4B/2.5-VL-7B/3-VL-4B 같은 대형 언어·비전언어모델(Qualcomm AI Hub의 Genie 런타임 경유)
  • Whisper Small(quantized), Melo TTS, Piper TTS 등 음성 계열 대형 모델
  • Gemma 4 E2B/E4B(llama.cpp)

이 패턴은 9.1.5·9.4에서 다루는 "UNO Q에는 QNN(NPU) 가속 경로가 공식적으로 열려 있지 않은 것으로 보인다"는 정황과 정확히 들어맞는다 — VENTUNO Q 전용으로 등록된 모델은 예외 없이 규모가 더 크거나 QNN 가속이 필요한 것들이다.

9.2.3 나만의 모델 훈련하기 — Edge Impulse 연동

docs.arduino.cc의 "Custom AI Models for Arduino App Lab" 문서(집필 시점 실제 확인)를 기준으로 절차를 정리하면 다음과 같다.

App Lab에서 새 앱 생성 또는 기존 예제 열기 Vision/Audio Brick 추가 (예: Object Detection) AI Models 탭 → Train new AI model Arduino 계정으로 로그인 (Edge Impulse 권한 승인) Edge Impulse Studio에서 데이터 업로드·라벨링· 훈련 App Lab로 복귀 — 훈련된 모델이 목록에 나타남 Install 클릭 — .eim 파일을 보드에 설치 Brick 설정에서 방금 만든 모델 선택 Run — 보드에서 추론 실행

단계별 요점:

  1. 하드웨어 준비: 이미지 모델이면 USB 카메라, 오디오 모델이면 USB 마이크가 필요하다(App Lab이 실행되는 UNO Q 기준).
  2. 계정: Arduino 계정과 Edge Impulse 계정이 사실상 통합돼 있어, App Lab에서 로그인하면 Edge Impulse Studio 접근 권한도 함께 부여된다.
  3. 훈련은 클라우드에서: 실제 학습(훈련) 연산은 보드가 아니라 Edge Impulse Studio(클라우드)에서 일어난다. 보드는 훈련된 결과물(.eim)을 내려받아 추론만 한다 — "온디바이스 학습"이 아니라 "온디바이스 추론"이라는 점을 혼동하지 말아야 한다.
  4. 모델 컨테이너: 내보낸 결과물은 .eim(Edge Impulse Model) 파일이다. 로직·가중치를 모두 담은 컨테이너이며, App Lab의 Brick이 이 파일을 로드해 추론한다.
  5. Logic 플로우 연동: 커스텀 모델을 감지 이벤트에 연결해 LED를 켜거나 알림을 보내는 등 App Lab의 Logic 플로우에 바로 통합할 수 있다.

Arduino 블로그(2026년 3월 공개)가 예시로 든 모델은 두 가지다 — Edge Impulse 팀의 "고무오리 탐지" 모델과 Arduino 팀(Christopher Méndez)이 만든 "사과 vs 바나나" MobileNetV2-SSD 객체 탐지 모델(공개 Edge Impulse 프로젝트로 clone 가능하다고 소개됨). 둘 다 튜토리얼용 데모이며, 실전 프로젝트에서는 자신의 데이터셋으로 다시 훈련해야 한다.

9.2.4 모델은 어디서 오는가 — 세 가지 공급원

app-bricks-py 저장소의 models-handlers.yaml을 보면, App Lab이 모델을 가져오는 경로가 세 종류로 구분돼 있다.

핸들러공급원성격
ei-handlerEdge Impulse9.2.3의 커스텀 훈련 결과물, .eim 포맷
ai-hub-handlerQualcomm AI HubQualcomm이 사전 최적화해 배포하는 모델(예: 얼굴 탐지, 포즈 추정, 제스처 인식)
hf-handlerHugging Face오픈소스 커뮤니티 모델(예: llama.cpp용 Gemma/Qwen GGUF)

세 경로 모두 최종적으로는 /var/lib/arduino-app-cli/models 아래 다운로드되고, Docker 컨테이너(app-bricks/models-downloader)가 다운로드·삭제·검증을 담당한다. 이는 App Lab 내부가 컨테이너 기반으로 동작한다는 힌트이기도 하다 — 자세한 아키텍처는 3.3(App Lab 아키텍처)를 참고.

9.2.5 실전 — 사전학습 모델을 Brick으로 통합하기

App Lab 앱은 app.yaml(사용할 Brick 선언)과 python/main.py(로직)로 구성된다. Arduino 공식 예제 저장소(arduino/app-bricks-examples, MPL-2.0 라이선스)의 정지 이미지 객체 탐지 예제를 살펴보면 구조가 드러난다.

# SPDX-FileCopyrightText: Copyright (C) Arduino s.r.l. and/or its affiliated companies
# SPDX-License-Identifier: MPL-2.0
# 출처: arduino/app-bricks-examples,
#   core-and-foundational/09-computer-vision/01-simple-object-detection

from arduino.app_utils import App
from arduino.app_utils import Logger
from arduino.app_bricks.object_detection import ObjectDetection
from PIL import Image
import time

PATH_IMAGE = "assets"
IMAGE_FILE = "input_image.png"
CONFIDENCE_THRESHOLD = 0.5

logger = Logger("ObjectDetectionApp")
object_detection = ObjectDetection()
pil_image = Image.open(f"{PATH_IMAGE}/{IMAGE_FILE}")

def loop():
    start_time = time.time() * 1000
    results = object_detection.detect(pil_image, confidence=CONFIDENCE_THRESHOLD)
    diff = time.time() * 1000 - start_time

    if results is None:
        logger.info("No objects detected in the image.")
    else:
        logger.info(f"Detected {len(results.get('detection', []))} objects in {diff:.2f} ms.")

    time.sleep(60)

App.run(user_loop=loop)

app.yaml은 이 앱이 어떤 Brick에 의존하는지만 선언한다.

name: Simple Object Detection
icon: 🏞️
description: Detect objects in an image, log the results, and display them in a new output image with bounding boxes.

bricks:
  - arduino:object_detection

ObjectDetection() 생성자를 호출할 때 모델을 지정하지 않으면, 위 9.2.2의 매니페스트에 등록된 UNO Q용 기본 모델(YOLOX-Nano 등)이 자동으로 쓰인다. 커스텀 .eim 모델을 쓰려면 Brick 설정에서 EI_OBJ_DETECTION_MODEL 환경변수(또는 App Lab UI의 모델 선택 드롭다운)로 경로를 지정한다 — 매니페스트의 model_configuration 항목이 바로 이 매핑이다.

이 예제는 이미 time.time() 기반의 지연시간 측정 코드를 포함하고 있다. 이 패턴을 확장한 정식 벤치마크 방법은 9.5.5에서 다룬다.

9.2.6 한계와 확인 필요 사항

  • 모델 크기: 매니페스트의 사전학습 모델은 대체로 17MB 안팎으로 작다. 더 큰 커스텀 모델을 적재하면 보드 RAM(2GB 또는 4GB 모델, 1.1 참고)과 eMMC 저장 공간(5.4)을 압박할 수 있다.
  • 훈련은 클라우드 의존: Edge Impulse Studio 훈련은 인터넷 연결이 필요하다. 완전 오프라인 환경에서는 이 워크플로우를 쓸 수 없다 — 오프라인 대안은 9.4의 커뮤니티 경로를 참고하되, 그쪽도 미검증 상태다.
  • 가속 여부 불투명: App Lab UI는 모델이 CPU에서 실행되는지, GPU/DSP 가속을 받는지를 명시적으로 보여주지 않는다. 9.2.2의 매니페스트 분석이 사실상 유일한 간접 증거였다.
  • "One-Click AI"라는 이름 자체: 위에서 언급했듯 현재 공식 문서 페이지 제목과 다르다. 이 책을 읽는 시점에 화면 문구가 달라져 있을 수 있으니, 실제 App Lab UI의 메뉴 이름을 우선 신뢰하기 바란다.

9.2.7 다음 장으로

  • 9.3: App Lab Bricks를 거치지 않고 Python에서 TensorFlow Lite·ONNX Runtime을 직접 호출하는 방법과 CPU 대비 가속 실험 설계.
  • 9.4: Adreno 702 GPU에 App Lab 없이 직접 접근하려는 커뮤니티 시도.
  • 9.5: 카메라 비전 예제(정지 이미지·실시간 비디오)와 추론 성능을 직접 측정하는 방법.
  • 3.3: App Lab 전체 아키텍처(Brick·컨테이너 구조)는 별도 장에서 다룬다.