Image Labeling — to zadanie wizji komputerowej, w którym sieć neuronowa przypisuje obrazowi etykiety z predefiniowanego zestawu klas: od prostych (kot, pies, samochód) do specyficznych (gatunek rośliny, model smartfona, zdjęcie medyczne). W tworzeniu aplikacji mobilnych Image Labeling jest używany do automatycznego tagowania zdjęć w galerii, moderacji treści użytkowników, wizualnego wyszukiwania produktów po zdjęciu i aplikacji AR. Według Google ML Kit, 2025, wbudowany klasyfikator rozpoznaje 400+ kategorii w 10–20 ms na klatkę z dokładnością 91% (top-1).
Najważniejsze
Image Labeling — podgatunek klasyfikacji obrazów, gdzie model przyjmuje obraz i zwraca prawdopodobieństwa dla każdej klasy z zestawu uczącego. W przeciwieństwie do object detection, Image Labeling nie określa położenia obiektu na obrazie — tylko jego obecność lub brak. W przeciwieństwie do image segmentation, nie wyodrębnia konturu obiektu. Image Labeling rozwiązuje zadanie “co jest na zdjęciu?”, a nie “gdzie i co jest na zdjęciu?”.
Architektura klasyfikatora: CNN backbone (MobileNet, ResNet, EfficientNet) wyodrębnia feature map z obrazu, Global Average Pooling zwija wymiary przestrzenne, warstwa w pełni połączona (Dense) z aktywacją Softmax zwraca prawdopodobieństwa klas. MobileNetV2 — najpopularniejszy backbone dla urządzeń mobilnych: 3.5M parametrów, 0.5–2 ms wnioskowania na Pixel 6 przez GPU. EfficientNet-Lite — alternatywa z lepszym stosunkiem accuracy/parametry.
Top-1 vs Top-5 accuracy: top-1 — model poprawnie odgadł główną klasę (91% dla ML Kit); top-5 — poprawna klasa znajduje się w pięciu najbardziej prawdopodobnych (98% dla ML Kit). Do zastosowań produkcyjnych używaj top-5 i pokazuj użytkownikowi kilka wariantów etykiet. Do moderacji treści — top-1 z progiem confidence >= 0.8 (zmniejsza współczynnik false positive o 40%).
| Architektura | Parametry | Latency | Top-1 | Rozmiar |
|---|---|---|---|---|
| MobileNetV2 | 3.5M | 0.5–2 ms | 90.2% | 14 MB |
| MobileNetV3 | 2.5M | 0.3–1.5 ms | 91.5% | 10 MB |
| EfficientNet-Lite0 | 4.7M | 1–3 ms | 92.3% | 18 MB |
| ResNet-50 | 25.6M | 10–30 ms | 95.2% | 98 MB |
On-device vs Cloud: klasyfikacja na urządzeniu (ML Kit, Core ML) daje latency 1–20 ms z pełną prywatnością danych. Cloud API (Google Cloud Vision, AWS Rekognition) — latency 500–2000 ms + koszt za zapytanie, ale dokładniejsza (97–99%) dzięki większym modelom (ViT, CLIP). Do aplikacji czasu rzeczywistego (kamera, AR) wybieraj on-device. Do złożonych scenariuszy (medycyna, ekspertyza) — cloud z fallbackiem na on-device.
ML Kit Image Labeling — gotowa biblioteka od Google do klasyfikacji obrazów na urządzeniu. Dostępna w dwóch trybach: on-device (bezpłatnie, 400+ etykiet, 10–20 ms) i cloud (płatnie, 10000+ etykiet, 500+ ms). Wersja on-device używa MobileNetV3 + kwantyzacja INT8, zajmuje 4 MB na dysku. ML Kit automatycznie określa orientację obrazu i optymalizuje rozmiar przed klasyfikacją.
API ML Kit: InputImage (z Bitmap, media.Image, filePath) → ImageLabeler → OnSuccessListener z listą ImageLabel (label, confidence, index). MillisThreshold (domyślnie 0.5) — minimalna pewność do zwrócenia etykiety. Podniesienie progu do 0.7 zmniejsza liczbę etykiet na klatkę, ale zwiększa dokładność każdej. Do moderacji treści ustaw próg 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) }
ML Kit na iOS: API analogiczne do Androida, używa UIImage lub CMSampleBuffer. ML Kit automatycznie używa Core ML + ANE na urządzeniach A12+. Dla iOS 16+ ML Kit Image Labeling daje 8–15 ms latency na iPhone 15 Pro. Aby zminimalizować opóźnienie, przesyłaj obraz w minimalnej możliwej rozdzielczości (224x224 dla MobileNet) — ML Kit sam skaluje, ale konwersja dużych obrazów dodaje 2–5 ms narzutu.
Core ML —框架 Apple do uruchamiania modeli ML na urządzeniu. W parze z Vision Framework (VNCoreMLRequest) Core ML pozwala klasyfikować obrazy z minimalnym kodem. Apple udostępnia wbudowane modele: SqueezeNet (5 MB, 80.5% top-1), ResNet50 (98 MB, 95.2%), MobileNetV2 (14 MB, 90.2%). Modele w formacie .mlmodel lub .mlpackage konwertowane są przez coremltools z TensorFlow, PyTorch.
VNCoreMLRequest — Vision API, który przejmuje wstępne przetwarzanie obrazu (skalowanie, crop-to-fill, konwersję przestrzeni kolorów) i przekazuje wynik do modelu. Vision zwraca VNClassificationObservation z identifier (nazwa klasy) i confidence (0..1). MaxCandidates — maksymalna liczba zwracanych etykiet (domyślnie 1). Do klasyfikacji z automatycznym doborem użyj VNCoreMLRequest z imageCropAndScaleOption = .centerCrop.
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("Wnioskowanie modelu niestandardowego TFLite")
}
}
request.imageCropAndScaleOption = .centerCrop
let handler = VNImageRequestHandler(cgImage: cgImage, options: [:])
try handler.perform([request])
Core ML vs ML Kit na iOS: Core ML — natywny, nie wymaga dodatkowych SDK, lepiej zoptymalizowany pod ANE (silnik neuronowy Apple). ML Kit — dokładniejszy na złożonych scenach dzięki modelom Google. Core ML obsługuje dowolne modele (skonwertowane przez coremltools), ML Kit — tylko swoje. Dla szybkości wdrożenia — ML Kit. Dla maksymalnej kontroli nad modelem — Core ML. Praktyczny wybór: oba frameworki w jednej aplikacji — ML Kit do standardowych etykiet, Core ML do niestandardowych.
Modele niestandardowe Image Labeling — uczenie własnego klasyfikatora do specyficznego zadania: rozpoznawanie jakości owoców, wykrywanie wad na linii produkcyjnej, klasyfikacja ras psów. Proces obejmuje zbiór zestawu danych (1000+ obrazów na klasę), adnotację, uczenie przez transfer learning na wstępnie wytrenowanym MobileNetV2 lub EfficientNet oraz konwersję do TFLite / Core ML.
Transfer Learning — główna metoda uczenia klasyfikatorów mobilnych. Bierze się model wstępnie wytrenowany na ImageNet, zamraża dolne warstwy (CNN backbone), doucza górne warstwy (Fine-tuning). Wymaga to tylko 100–500 obrazów na klasę i zajmuje 1–2 godziny na Google Colab (GPU). Biblioteki: TensorFlow Keras (Android), PyTorch + coremltools (iOS). Wynik: 95–98% accuracy na docelowych klasach.
// Image Labeling z Core ML do wyszukiwania wizualnego
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 — alternatywa: nie trzeba pisać kodu dla TFLite Interpreter — ML Kit sam ładuje model i obsługuje wstępne przetwarzanie. Custom Image Labeler przyjmuje model TFLite z wejściem size 224x224x3 i wyjściem score float[NUM_CLASSES]. Wystarczy przekazać plik modelu i otrzymać standardowe etykiety. ML Kit Custom Model API jest zalecany, jeśli model odpowiada formatowi TFLite. Jeśli wymagana jest bardziej precyzyjna kontrola nad wnioskowaniem (progi, threshold per class) — używaj TFLite Interpreter bezpośrednio.
TFLite (TensorFlow Lite) — format modeli Google dla urządzeń mobilnych i edge. Obsługuje kwantyzację (FP16, INT8), która zmniejsza rozmiar modelu 4-krotnie i zwiększa prędkość 2–3x kosztem niewielkiej utraty dokładności (1–2%). TFLite działa na Android przez GPU Delegate (OpenGL/OpenCL), na iOS — przez Core ML Delegate. TFLite Task API zapewnia ujednolicony interfejs dla Image Classifier, Object Detector i innych zadań.
Core ML — format Apple (.mlpackage — nowy, .mlmodel — stary). Obsługuje kwantyzację (FP16), paletyzację wag (weight palettization do 1/2/4/6/8 bitów), co daje kompresję modelu do 80%. Core ML używa ANE (Neural Engine), GPU i CPU — system automatycznie wybiera optymalny silnik. Konwersja z PyTorch przez torch.onnx.export + coremltools, z TensorFlow — przez tf-keras + coremltools. iOS 18+ obsługuje uczenie na urządzeniu przez Core ML Training API.
| Cecha | TFLite | Core ML |
|---|---|---|
| Rozmiar (MobileNetV2) | 14 MB (FP32) / 3.5 MB (INT8) | 14 MB (FP16) / 2.8 MB (4-bit) |
| Silnik wnioskowania | GPU / NNAPI / XNNPACK | ANE / GPU / CPU (auto) |
| Kwantyzacja | FP16, INT8, DynamicRange | FP16, Palettization (1-8 bit) |
| Wydajność iOS | Core ML Delegate (2–5 ms) | Natywny ANE (1–3 ms) |
| Narzędzia | TFLite Model Maker, Task API | coremltools, Create ML |
ONNX jako format pośredni: konwertuj modele do ONNX (PyTorch → ONNX, TensorFlow → ONNX) a następnie do TFLite / Core ML przez onnx2tf lub onnx2coreml. ONNX — jednolity format obsługiwany przez 70+ frameworków. To upraszcza pipeline: jeden wytrenowany model → ONNX → natywne formaty dla obu platform. Uczenie w PyTorch + konwersja do ONNX → TFLite (Android) / Core ML (iOS) — zalecany pipeline dla projektów wieloplatformowych.
Automatyczne tagowanie zdjęć — aplikacje galeryjne (Google Photos, Apple Photos) automatycznie przypisują etykiety obrazom: “plaża”, “zachód słońca”, “pies”, “jedzenie”. ML Kit Image Labeling przetwarza każde zdjęcie z galerii w tle — 1–2 sekundy na 100 zdjęć (batch). Użytkownik otrzymuje wyszukiwanie po etykietach bez ręcznego sortowania. Google Photos używa klasyfikacji na urządzeniu z późniejszą weryfikacją serwerową dla złożonych scen.
Moderacja treści — automatyczne wykrywanie niepożądanych obrazów w treściach użytkowników (media społecznościowe, marketplace, platformy UGC). ML Kit Custom Model wykrywa treści NSFW, przemoc, propagandę z dokładnością 92–96%. Próg zadziałania — confidence 0.8. Aby zmniejszyć false positives (legalne obrazy medyczne), używaj komitetu klasyfikatorów: Image Labeling + Object Detection + Blur Detection. Moderacja na urządzeniu jest szybsza i chroni prywatność użytkowników.
Wizualne wyszukiwanie produktów — użytkownik fotografuje produkt (buty, torba, mebel), aplikacja określa etykietę i znajduje podobne produkty w katalogu. Image Labeling zawęża wyszukiwanie do kategorii, następnie deskryptory cech (feature vectors) znajdują wizualnie podobne egzemplarze. Pinterest Lens, Google Lens, Amazon StyleSnap używają tego podejścia. Klasyfikacja na urządzeniu daje wynik w 10–30 ms, cloud — wyszukiwanie w bazie produktów w 200–500 ms.
// Image Labeling with Core ML for visual search
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 i aplikacje edukacyjne — Image Labeling klasyfikuje obiekty w czasie rzeczywistym przez kamerę. Użytkownik kieruje telefon na roślinę — aplikacja pokazuje nazwę, pielęgnację, podlewanie. Kieruje na część mechanizmu — podpowiada przeznaczenie. Wymaganie: latency < 30 ms. EfficientNet-Lite na urządzeniach Flagship daje 15–25 ms. Przy słabym oświetleniu dokładność spada — używaj automatycznego progu confidence (obniżaj próg przy low-light, aby skompensować spadek jakości wejścia).
Często zadawane pytania
Image Labeling określa, jakie obiekty znajdują się na obrazie, ale nie wskazuje ich położenia. Object Detection — znajduje obiekty i zwraca bounding box każdego. Image Labeling jest szybszy (1–20 ms vs 20–100 ms), wymaga mniej danych do uczenia, ale nie daje informacji pozycyjnej. Do prostej klasyfikacji (kot/pies) — Image Labeling. Do precyzyjnego rozpoznawania (ile obiektów, gdzie się znajdują) — Object Detection.
Nie, ML Kit Image Labeling działa w pełni na urządzeniu. Model ładowany jest przy pierwszym uruchomieniu (tryb pobrany — 4 MB) i przechowywany lokalnie. Modele Core ML ładowane są wraz z aplikacją. TFLite Custom Model — część APK. Wszystkie obliczenia wykonywane są na urządzeniu, dane nie są wysyłane na serwer. Gwarantuje to prywatność użytkownika i działanie bez internetu. Klasyfikacja w chmurze (Google Cloud Vision) — alternatywa z internetem i wyższą dokładnością.
Dla transfer learning na MobileNetV2: minimum 50–100 obrazów na klasę, optymalnie 300–500. Im większa zmienność (kąty, oświetlenie, tło), tym wyższa dokładność. Do uczenia od zera (bez wstępnie wytrenowanego modelu) wymagane jest minimum 1000 obrazów na klasę. Zalecenie: zacznij od 200 obrazów na klasę, oceń accuracy, dodawaj dane dla klas o niskiej dokładności. Data augmentation (obroty, skala, przesunięcia) zwiększa efektywny zestaw danych 3–5x bez zbierania nowych danych.
Główne metody: kwantyzacja INT8 po uczeniu (post-training quantization) — zmniejsza rozmiar 4x z utratą 1–2% accuracy; pruning (odrzucanie mało znaczących wag) — do 50% kompresji; distillation (mniejszy model student, uczony na wyjściach dużego modelu nauczyciela) — do 80% kompresji. MobileNetV2 INT8 zajmuje 3.5 MB, SqueezeNet — 5 MB. Docelowy rozmiar — nie więcej niż 10 MB dla natychmiastowego ładowania bez wskaźnika postępu.
ML Kit Image Labeling v2 pokazuje top-1 accuracy 91% na zestawie testowym Google (400+ klas). Top-5 accuracy — 98%. Przy niestandardowych kątach i warunkach oświetleniowych dokładność może spaść do 75–85%. Do produkcji zaleca się używanie progu confidence 0.7 dla stabilnej filtracji niskiej jakości przewidywań. Jeśli dokładność jest niewystarczająca — użyj modelu niestandardowego, uczonego na specyficznym zestawie danych: accuracy 95–98% na docelowych klasach.
Podsumowanie
Opracujemy aplikację mobilną pod klucz
IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.
Przeczytaj również