Image Labeling은 신경망이 미리 정의된 클래스 세트에서 이미지에 레이블을 할당하는 컴퓨터 비전 작업입니다. 단순한 것(고양이, 개, 자동차)부터 특정한 것(식물 종, 스마트폰 모델, 의료 스캔)까지 다양합니다. 모바일 개발에서 Image Labeling은 갤러리 사진 자동 태깅, 사용자 콘텐츠 관리, 사진으로 제품 시각 검색 및 AR 애플리케이션에 사용됩니다. Google ML Kit, 2025에 따르면, 내장 분류기는 91% 정확도(top-1)로 프레임당 10–20ms에 400개 이상의 카테고리를 인식합니다.
핵심 포인트
Image Labeling은 모델이 입력으로 이미지를 받아 학습 세트의 각 클래스에 대한 확률을 반환하는 이미지 분류의 하위 유형입니다. 객체 탐지와 달리 Image Labeling은 이미지 내 객체의 위치를 결정하지 않습니다. 단지 존재 유무만 판단합니다. 이미지 분할과 달리 객체의 윤곽을 추출하지 않습니다. Image Labeling은 “사진에 무엇이 있나요?”라는 질문에 답하며, “사진에서 어디에 무엇이 있나요?”가 아닙니다.
분류기 아키텍처: CNN 백본(MobileNet, ResNet, EfficientNet)이 이미지에서 특징 맵을 추출하고, Global Average Pooling이 공간 차원을 축소하며, Softmax 활성화 함수를 가진 완전 연결 계층(Dense)이 클래스 확률을 출력합니다. MobileNetV2는 모바일 기기에서 가장 인기 있는 백본입니다: 350만 파라미터, Pixel 6 GPU에서 0.5–2ms 추론. EfficientNet-Lite는 더 나은 정확도/파라미터 비율을 가진 대안입니다.
Top-1 vs Top-5 정확도: top-1 — 모델이 주요 클래스를 올바르게 예측(ML Kit에서 91%); top-5 — 올바른 클래스가 상위 5개에 포함됨(ML Kit에서 98%). 프로덕션 애플리케이션의 경우 top-5를 사용하고 사용자에게 여러 레이블 옵션을 표시합니다. 콘텐츠 관리의 경우 신뢰도 임계값 >= 0.8로 top-1을 사용합니다(위양성률 40% 감소).
| 아키텍처 | 파라미터 | 지연 시간 | Top-1 | 크기 |
|---|---|---|---|---|
| MobileNetV2 | 350만 | 0.5–2ms | 90.2% | 14 MB |
| MobileNetV3 | 250만 | 0.3–1.5ms | 91.5% | 10 MB |
| EfficientNet-Lite0 | 470만 | 1–3ms | 92.3% | 18 MB |
| ResNet-50 | 2560만 | 10–30ms | 95.2% | 98 MB |
온디바이스 vs 클라우드: 온디바이스 분류(ML Kit, Core ML)는 완전한 데이터 프라이버시와 함께 1–20ms 지연 시간을 제공합니다. 클라우드 API(Google Cloud Vision, AWS Rekognition)는 500–2000ms 지연 시간과 요청당 비용이 있지만, 더 큰 모델(ViT, CLIP)로 인해 더 높은 정확도(97–99%)를 제공합니다. 실시간 애플리케이션(카메라, AR)의 경우 온디바이스를 선택합니다. 복잡한 시나리오(의료, 전문가 분석)의 경우 온디바이스 폴백과 함께 클라우드를 사용합니다.
ML Kit Image Labeling은 Google의 기기 내 이미지 분류를 위한 즉시 사용 가능한 라이브러리입니다. 두 가지 모드로 제공됩니다: 온디바이스(무료, 400개 이상의 레이블, 10–20ms) 및 클라우드(유료, 10000개 이상의 레이블, 500ms 이상). 온디바이스 버전은 INT8 양자화를 사용하는 MobileNetV3를 사용하며, 디스크 공간 4MB를 차지합니다. ML Kit는 자동으로 이미지 방향을 감지하고 분류 전에 크기를 최적화합니다.
ML Kit API: InputImage(Bitmap, media.Image, filePath에서) → ImageLabeler → ImageLabel(레이블, 신뢰도, 인덱스) 목록과 함께 OnSuccessListener. 신뢰도 임계값(기본값 0.5)은 레이블을 반환하기 위한 최소 신뢰도입니다. 임계값을 0.7로 높이면 프레임당 레이블 수가 줄어들지만 각 레이블의 정확도가 향상됩니다. 콘텐츠 관리의 경우 임계값을 0.8로 설정합니다.
val labeler = ImageLabeling.getClient(
ImageLabelerOptions.DEFAULT_OPTIONS
)
labeler.process(inputImage)
.addOnSuccessListener { labels ->
labels
.filter { it.confidence >= 0.7f }
.forEach { label ->
log("Label: ${label.label}")
log("Confidence: ${label.confidence}")
}
}
.addOnFailureListener { error -> handleError(error) }
iOS의 ML Kit: API는 Android와 유사하며 UIImage 또는 CMSampleBuffer를 사용합니다. ML Kit는 A12+ 기기에서 자동으로 Core ML + ANE를 활용합니다. iOS 16+의 경우 ML Kit Image Labeling은 iPhone 15 Pro에서 8–15ms 지연 시간을 제공합니다. 지연 시간을 최소화하려면 가능한 가장 작은 이미지 해상도(MobileNet의 경우 224x224)를 전달합니다. ML Kit가 자동으로 크기를 조정하지만, 큰 이미지를 변환하면 2–5ms 오버헤드가 추가됩니다.
Core ML은 기기에서 ML 모델을 실행하기 위한 Apple의 프레임워크입니다. Vision Framework(VNCoreMLRequest)와 결합하여 Core ML은 최소한의 코드로 이미지 분류를 가능하게 합니다. Apple은 내장 모델을 제공합니다: SqueezeNet(5MB, 80.5% top-1), ResNet50(98MB, 95.2%), MobileNetV2(14MB, 90.2%). .mlmodel 또는 .mlpackage 형식의 모델은 TensorFlow 또는 PyTorch에서 coremltools를 통해 변환됩니다.
VNCoreMLRequest는 이미지 전처리(크기 조정, 자르기, 색 공간 변환)를 처리하고 결과를 모델에 전달하는 Vision API입니다. Vision은 identifier(클래스 이름)와 confidence(0..1)가 포함된 VNClassificationObservation을 반환합니다. MaxCandidates는 반환되는 레이블의 최대 수(기본값 1)입니다. 자동 선택 분류의 경우 imageCropAndScaleOption = .centerCrop과 함께 VNCoreMLRequest를 사용합니다.
guard let model = try? VNCoreMLModel(for: MobileNetV2().model) else { return }
let request = VNCoreMLRequest(model: model) { request, _ in
guard let results = request.results as? [VNClassificationObservation] else { return }
results.prefix(5).forEach { obs in
print("레이블: \(obs.identifier), 신뢰도: \(obs.confidence)")
}
}
request.imageCropAndScaleOption = .centerCrop
let handler = VNImageRequestHandler(cgImage: cgImage, options: [:])
try handler.perform([request])
iOS에서 Core ML vs ML Kit: Core ML은 기본적이며 추가 SDK가 필요 없고 ANE(Apple Neural Engine)에 더 잘 최적화되어 있습니다. ML Kit는 Google의 모델 덕분에 복잡한 장면에서 더 정확합니다. Core ML은 모든 모델(coremltools로 변환)을 지원하는 반면, ML Kit는 자체 모델만 지원합니다. 빠른 구현을 위해서는 ML Kit를 사용합니다. 최대 모델 제어를 위해서는 Core ML을 사용합니다. 실용적인 접근 방식: 하나의 앱에서 두 프레임워크를 모두 사용합니다. 표준 레이블에는 ML Kit, 사용자 정의 레이블에는 Core ML을 사용합니다.
사용자 정의 Image Labeling 모델 — 특정 작업을 위한 자체 분류기 학습: 과일 품질 인식, 생산 라인 결함 감지, 개 품종 분류. 프로세스에는 데이터 세트 수집(클래스당 1000개 이상의 이미지), 주석, 사전 학습된 MobileNetV2 또는 EfficientNet에서 전이 학습을 통한 학습, TFLite / Core ML로 변환이 포함됩니다.
전이 학습 — 모바일 분류기를 학습하는 주요 방법입니다. ImageNet에서 사전 학습된 모델을 가져와 하위 계층(CNN 백본)을 고정하고 상위 계층을 재학습합니다(미세 조정). 이를 위해 클래스당 100–500개의 이미지만 필요하며 Google Colab(GPU)에서 1–2시간이 소요됩니다. 라이브러리: TensorFlow Keras(Android), PyTorch + coremltools(iOS). 결과: 대상 클래스에서 95–98% 정확도.
// TFLite 사용자 정의 모델 추론
val interpreter = Interpreter(loadModelFile(context))
val inputImage = TensorImage.fromBitmap(bitmap)
.apply { load(Bitmap.createScaledBitmap(bitmap, 224, 224, true)) }
val output = Array(1) { FloatArray(NUM_CLASSES) }
interpreter.run(inputImage.tensorBuffer, output)
val probabilities = TensorLabel.mapIndexToLabels(output[0])
val topClass = probabilities.maxByOrNull { it.value }
ML Kit Custom Model API — 대안: TFLite Interpreter 코드를 작성할 필요가 없습니다. ML Kit가 모델을 로드하고 전처리를 자동으로 처리합니다. 사용자 정의 Image Labeler는 입력 크기 224x224x3 및 출력 score float[NUM_CLASSES]의 TFLite 모델을 허용합니다. 모델 파일만 제공하면 표준 레이블을 얻을 수 있습니다. 모델이 TFLite 형식과 일치하는 경우 ML Kit Custom Model API가 권장됩니다. 추론에 대한 더 세밀한 제어(클래스별 임계값)가 필요한 경우 TFLite Interpreter를 직접 사용합니다.
TFLite(TensorFlow Lite)는 모바일 및 에지 기기를 위한 Google의 모델 형식입니다. 양자화(FP16, INT8)를 지원하여 모델 크기를 4배 줄이고 속도를 2–3배 향상시키며 약간의 정확도 손실(1–2%)이 있습니다. TFLite는 Android에서 GPU Delegate(OpenGL/OpenCL)를 통해, iOS에서 Core ML Delegate를 통해 실행됩니다. TFLite Task API는 Image Classifier, Object Detector 및 기타 작업에 통합 인터페이스를 제공합니다.
Core ML은 Apple의 형식입니다(.mlpackage — 신규, .mlmodel — 구형). 양자화(FP16) 및 가중치 팔레트화(1/2/4/6/8비트까지)를 지원하여 최대 80%의 모델 압축을 달성합니다. Core ML은 ANE(Neural Engine), GPU 및 CPU를 사용합니다. 시스템이 최적의 엔진을 자동으로 선택합니다. PyTorch에서 torch.onnx.export + coremltools를 통해, TensorFlow에서 tf-keras + coremltools를 통해 변환합니다. iOS 18+는 Core ML Training API를 통한 온디바이스 학습을 지원합니다.
| 특성 | TFLite | Core ML |
|---|---|---|
| 크기(MobileNetV2) | 14 MB(FP32) / 3.5 MB(INT8) | 14 MB(FP16) / 2.8 MB(4비트) |
| 추론 엔진 | GPU / NNAPI / XNNPACK | ANE / GPU / CPU(자동) |
| 양자화 | FP16, INT8, DynamicRange | FP16, 팔레트화(1-8비트) |
| iOS 성능 | Core ML Delegate(2–5ms) | 기본 ANE(1–3ms) |
| 도구 | TFLite Model Maker, Task API | coremltools, Create ML |
중간 형식으로서의 ONNX: 모델을 ONNX(PyTorch → ONNX, TensorFlow → ONNX)로 변환한 다음 onnx2tf 또는 onnx2coreml을 통해 TFLite / Core ML로 변환합니다. ONNX는 70개 이상의 프레임워크에서 지원되는 통합 형식입니다. 이렇게 하면 파이프라인이 간소화됩니다: 하나의 학습된 모델 → ONNX → 두 플랫폼 모두의 기본 형식. 교차 플랫폼 프로젝트의 경우 PyTorch에서 학습 + ONNX로 변환 → TFLite(Android) / Core ML(iOS)이 권장 파이프라인입니다.
사진 자동 태깅 — 갤러리 앱(Google 포토, Apple 포토)이 이미지에 자동으로 레이블을 할당합니다: “해변”, “일몰”, “개”, “음식”. ML Kit Image Labeling은 백그라운드에서 갤러리의 각 사진을 처리합니다(100장의 사진에 1–2초, 배치). 사용자는 수동 정렬 없이 레이블로 검색할 수 있습니다. Google 포토는 복잡한 장면에 대해 온디바이스 분류와 이후 서버 확인을 함께 사용합니다.
콘텐츠 관리 — 사용자 생성 콘텐츠(소셜 네트워크, 마켓플레이스, UGC 플랫폼)에서 원치 않는 이미지를 자동으로 감지합니다. ML Kit Custom Model은 92–96% 정확도로 NSFW 콘텐츠, 폭력 및 선전을 감지합니다. 트리거 임계값은 신뢰도 0.8입니다. 위양성(합법적 의료 이미지)을 줄이기 위해 분류기 위원회(Image Labeling + Object Detection + Blur Detection)를 사용합니다. 온디바이스 관리가 더 빠르고 사용자 프라이버시를 보호합니다.
시각적 제품 검색 — 사용자가 제품(운동화, 가방, 가구)을 촬영하면 앱이 레이블을 확인하고 카탈로그에서 유사한 제품을 찾습니다. Image Labeling이 검색을 카테고리로 좁히고 특징 설명자(특징 벡터)가 시각적으로 유사한 항목을 찾습니다. Pinterest Lens, Google Lens 및 Amazon StyleSnap이 이 접근 방식을 사용합니다. 온디바이스 분류는 10–30ms, 클라우드 검색은 200–500ms에 결과를 제공합니다.
// 시각 검색을 위한 Core ML과 Image Labeling
let request = VNCoreMLRequest(model: productClassifier) { req, _ in
guard let result = req.results?.first as? VNClassificationObservation,
result.confidence > 0.6 else { return }
SearchService.findSimilarProducts(
category: result.identifier,
image: capturedPhoto,
limit: 10
) { products in
DispatchQueue.main.async {
self.showResults(products)
}
}
}
AR 및 교육 앱 — Image Labeling이 카메라를 통해 실시간으로 객체를 분류합니다. 사용자가 식물에 휴대전화를 대면 앱이 이름, 관리 방법 및 물주기 일정을 표시합니다. 기계 부품에 대면 그 목적을 설명합니다. 요구 사항: 지연 시간 30ms 미만. 플래그십 기기의 EfficientNet-Lite는 15–25ms를 제공합니다. 저조도에서는 정확도가 떨어지므로 적응형 신뢰도 임계값을 사용합니다(입력 품질 저하를 보상하기 위해 저조도에서 임계값을 낮춤).
자주 묻는 질문
Image Labeling은 이미지에 어떤 객체가 있는지 결정하지만 위치는 표시하지 않습니다. Object Detection은 객체를 찾아 각각의 경계 상자를 반환합니다. Image Labeling은 더 빠르고(1–20ms vs 20–100ms), 더 적은 학습 데이터가 필요하지만 위치 정보를 제공하지 않습니다. 단순 분류(고양이/개)에는 Image Labeling을 사용합니다. 특정 인식(객체 수, 위치)에는 Object Detection을 사용합니다.
아니요, ML Kit Image Labeling은 완전히 기기에서 작동합니다. 모델은 첫 실행 시 다운로드되며(다운로드 모드 — 4MB) 로컬에 저장됩니다. Core ML 모델은 앱에 번들로 포함됩니다. TFLite 사용자 정의 모델은 APK의 일부입니다. 모든 계산은 기기에서 실행되며 서버로 데이터가 전송되지 않습니다. 이는 사용자 프라이버시와 오프라인 기능을 보장합니다. 클라우드 분류(Google Cloud Vision)는 인터넷이 필요하며 더 높은 정확도를 제공하는 대안입니다.
MobileNetV2에서 전이 학습의 경우: 클래스당 최소 50–100개, 최적 300–500개입니다. 다양성(각도, 조명, 배경)이 많을수록 정확도가 높아집니다. 처음부터 학습(사전 학습된 모델 없음)하려면 클래스당 최소 1000개의 이미지가 필요합니다. 권장 사항: 클래스당 200개로 시작하고 정확도를 평가한 후 정확도가 낮은 클래스에 데이터를 추가합니다. 데이터 증강(회전, 크기 조정, 이동)은 새 데이터를 수집하지 않고도 유효 데이터 세트를 3–5배 늘립니다.
주요 방법: 학습 후 INT8 양자화 — 1–2% 정확도 손실로 크기를 4배 감소; 프루닝(중요하지 않은 가중치 제거) — 최대 50% 압축; 증류(더 큰 교사 모델의 출력으로 학습된 더 작은 학생 모델) — 최대 80% 압축. MobileNetV2 INT8은 3.5MB, SqueezeNet은 5MB를 차지합니다. 목표 크기는 진행 표시기 없이 즉시 로딩할 수 있도록 10MB 이하입니다.
ML Kit Image Labeling v2는 Google 테스트 세트(400개 이상의 클래스)에서 91% top-1 정확도를 보여줍니다. Top-5 정확도는 98%입니다. 비표준 각도 및 조명 조건에서는 정확도가 75–85%로 떨어질 수 있습니다. 프로덕션의 경우 낮은 품질의 예측을 안정적으로 필터링하기 위해 신뢰도 임계값 0.7을 사용하는 것이 좋습니다. 정확도가 충분하지 않은 경우 특정 데이터 세트로 학습된 사용자 정의 모델을 사용합니다: 대상 클래스에서 95–98% 정확도.
요약
턴키 방식의 모바일 애플리케이션을 개발해 드립니다
IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.