Detyra e Klasifikimit të Imazheve ju lejon të kryeni klasifikimin e imazheve. Ju mund ta përdorni këtë detyrë për të identifikuar se çfarë përfaqëson një imazh midis një grupi kategorish të përcaktuara në kohën e trajnimit. Këto udhëzime ju tregojnë se si të përdorni Klasifikuesin e Imazheve në aplikacionet iOS. Shembulli i kodit i përshkruar në këto udhëzime është i disponueshëm në GitHub .
Ju mund ta shihni këtë detyrë në veprim duke parë këtë demonstrim në ueb . Për më shumë informacion rreth aftësive, modeleve dhe opsioneve të konfigurimit të kësaj detyre, shihni Përmbledhjen .
Shembull kodi
Kodi i shembullit të MediaPipe Tasks është një zbatim bazë i një aplikacioni të Klasifikimit të Imazheve për iOS. Shembulli përdor kamerën në një pajisje fizike iOS për të klasifikuar vazhdimisht objektet, dhe gjithashtu mund të përdorë imazhe dhe video nga galeria e pajisjes për të klasifikuar objektet në mënyrë statike.
Mund ta përdorni aplikacionin si pikënisje për aplikacionin tuaj iOS ose t'i referoheni kur modifikoni një aplikacion ekzistues. Shembulli i kodit të Klasifikuesit të Imazhit është pritur në GitHub .
Shkarkoni kodin
Udhëzimet e mëposhtme ju tregojnë se si të krijoni një kopje lokale të kodit shembull duke përdorur mjetin e linjës së komandës git .
Për të shkarkuar kodin shembull:
Klononi depon e git duke përdorur komandën e mëposhtme:
git clone https://github.com/google-ai-edge/mediapipe-samples
Opsionale, konfiguroni shembullin tuaj të git për të përdorur arkëtimin e rrallë, në mënyrë që të keni vetëm skedarët për shembullin e aplikacionit "Klasifikimi i imazheve":
cd mediapipe git sparse-checkout init --cone git sparse-checkout set examples/image_classification/ios/
Pas krijimit të një versioni lokal të kodit shembull, mund të instaloni bibliotekën e detyrave MediaPipe, të hapni projektin duke përdorur Xcode dhe të ekzekutoni aplikacionin. Për udhëzime, shihni Udhëzuesin e konfigurimit për iOS .
Komponentët kryesorë
Skedarët e mëposhtëm përmbajnë kodin vendimtar për shembullin e aplikacionit të Klasifikimit të Imazheve:
- ImageClassifierService.swift : Inicializon klasifikuesin e imazhit, trajton zgjedhjen e modelit dhe ekzekuton konkluzionet në të dhënat hyrëse.
- CameraViewController.swift : Zbaton ndërfaqen e përdoruesit për modalitetin e hyrjes së furnizimit të drejtpërdrejtë të kamerës dhe vizualizon rezultatet.
- MediaLibraryViewController.swift Zbaton ndërfaqen e përdoruesit për modalitetin e futjes së imazheve dhe skedarëve video dhe vizualizon rezultatet.
Konfigurimi
Ky seksion përshkruan hapat kryesorë për konfigurimin e mjedisit tuaj të zhvillimit dhe projekteve të kodit për të përdorur Klasifikuesin e Imazhit. Për informacion të përgjithshëm mbi konfigurimin e mjedisit tuaj të zhvillimit për përdorimin e detyrave të MediaPipe, duke përfshirë kërkesat e versionit të platformës, shihni udhëzuesin e konfigurimit për iOS .
varësitë
Klasifikuesi i imazheve përdor bibliotekën MediaPipeTasksVision
, e cila duhet të instalohet duke përdorur CocoaPods. Biblioteka është e pajtueshme me të dy aplikacionet Swift dhe Objective-C dhe nuk kërkon ndonjë konfigurim shtesë specifik për gjuhën.
Për udhëzime për instalimin e CocoaPods në macOS, referojuni udhëzuesit të instalimit të CocoaPods . Për udhëzime se si të krijoni një Podfile
me pods-et e nevojshme për aplikacionin tuaj, referojuni Përdorimit të CocoaPods .
Shtoni podin MediaPipeTasksVision në Podfile
duke përdorur kodin e mëposhtëm:
target 'MyImageClassifierApp' do
use_frameworks!
pod 'MediaPipeTasksVision'
end
Nëse aplikacioni juaj përfshin objektiva testimi të njësisë, referojuni Udhëzuesit të konfigurimit për iOS për informacion shtesë mbi konfigurimin e skedarit tuaj Podfile
.
Model
Detyra MediaPipe Image Classifier kërkon një model të trajnuar që është në përputhje me këtë detyrë. Për më shumë informacion rreth modeleve të trajnuara të disponueshme për Klasifikuesin e Imazhit, shihni seksionin Modelet e përmbledhjes së detyrave.
Zgjidhni dhe shkarkoni një model dhe shtoni atë në drejtorinë e projektit tuaj duke përdorur Xcode. Për udhëzime se si të shtoni skedarë në projektin tuaj Xcode, referojuni Menaxhimi i skedarëve dhe dosjeve në projektin tuaj Xcode .
Përdorni veçorinë BaseOptions.modelAssetPath
për të specifikuar shtegun drejt modelit në paketën tuaj të aplikacionit. Për një shembull kodi, shihni seksionin tjetër.
Krijo detyrën
Ju mund të krijoni detyrën e Klasifikimit të Imazhit duke thirrur një nga inicializuesit e tij. Inicializuesi ImageClassifier(options:)
vendos vlerat për opsionet e konfigurimit duke përfshirë modalitetin e ekzekutimit, vendndodhjen e emrave të shfaqur, numrin maksimal të rezultateve, pragun e besimit, listën e lejeve të kategorive dhe listën e refuzimit.
Nëse nuk keni nevojë për një Klasifikues imazhi të inicializuar me opsione të personalizuara të konfigurimit, mund të përdorni iniciatorin ImageClassifier(modelPath:)
për të krijuar një Klasifikues imazhi me opsionet e paracaktuara. Për më shumë informacion rreth opsioneve të konfigurimit, shihni Përmbledhjen e konfigurimit .
Detyra e Klasifikimit të Imazheve mbështet 3 lloje të dhënash hyrëse: imazhe statike, skedarë video dhe transmetime video të drejtpërdrejta. Si parazgjedhje, ImageClassifier(modelPath:)
inicializon një detyrë për imazhet statike. Nëse dëshironi që detyra juaj të inicializohet për të përpunuar skedarë video ose transmetime video të drejtpërdrejta, përdorni ImageClassifier(options:)
për të specifikuar modalitetin e ekzekutimit të videos ose transmetimit të drejtpërdrejtë. Modaliteti i transmetimit të drejtpërdrejtë kërkon gjithashtu opsionin shtesë të konfigurimit të imageClassifierLiveStreamDelegate
, i cili i mundëson Klasifikuesit të Imazhit t'i japë delegatit rezultatet e klasifikimit të imazheve në mënyrë asinkrone.
Zgjidhni skedën që korrespondon me modalitetin tuaj të ekzekutimit për të parë se si të krijoni detyrën dhe të ekzekutoni konkluzionet.
Swift
import MediaPipeTasksVision let modelPath = Bundle.main.path(forResource: "model", ofType: "tflite") let options = ImageClassifierOptions() options.baseOptions.modelAssetPath = modelPath options.runningMode = .image options.maxResults = 5 let imageClassifier = try ImageClassifier(options: options)
import MediaPipeTasksVision let modelPath = Bundle.main.path(forResource: "model", ofType: "tflite") let options = ImageClassifierOptions() options.baseOptions.modelAssetPath = modelPath options.runningMode = .video options.maxResults = 5 let imageClassifier = try ImageClassifier(options: options)
import MediaPipeTasksVision // Class that conforms to the `ImageClassifierLiveStreamDelegate` protocol and // implements the method that the image classifier calls once it // finishes performing classification on each input frame. class ImageClassifierResultProcessor: NSObject, ImageClassifierLiveStreamDelegate { func imageClassifier( _ imageClassifier: ImageClassifier, didFinishClassification result: ImageClassifierResult?, timestampInMilliseconds: Int, error: Error?) { // Process the image classifier result or errors here. } } let modelPath = Bundle.main.path( forResource: "model", ofType: "tflite") let options = ImageClassifierOptions() options.baseOptions.modelAssetPath = modelPath options.runningMode = .liveStream options.maxResults = 5 // Assign an object of the class to the `imageClassifierLiveStreamDelegate` // property. let processor = ImageClassifierResultProcessor() options.imageClassifierLiveStreamDelegate = processor let imageClassifier = try ImageClassifier(options: options)
Objektivi-C
@import MediaPipeTasksVision; NSString *modelPath = [[NSBundle mainBundle] pathForResource:@"model" ofType:@"tflite"]; MPPImageClassifierOptions *options = [[MPPImageClassifierOptions alloc] init]; options.baseOptions.modelAssetPath = modelPath; options.runningMode = MPPRunningModeImage; options.maxResults = 5; MPPImageClassifier *imageClassifier = [[MPPImageClassifier alloc] initWithOptions:options error:nil];
@import MediaPipeTasksVision; NSString *modelPath = [[NSBundle mainBundle] pathForResource:@"model" ofType:@"tflite"]; MPPImageClassifierOptions *options = [[MPPImageClassifierOptions alloc] init]; options.baseOptions.modelAssetPath = modelPath; options.runningMode = MPPRunningModeVideo; options.maxResults = 5; MPPImageClassifier *imageClassifier = [[MPPImageClassifier alloc] initWithOptions:options error:nil];
@import MediaPipeTasksVision; // Class that conforms to the `MPPImageClassifierLiveStreamDelegate` protocol // and implements the method that the image classifier calls once it finishes // performing classification on each input frame. @interface APPImageClassifierResultProcessor : NSObject@end @implementation APPImageClassifierResultProcessor - (void)imageClassifier:(MPPImageClassifier *)imageClassifier didFinishClassificationWithResult:(MPPImageClassifierResult *)imageClassifierResult timestampInMilliseconds:(NSInteger)timestampInMilliseconds error:(NSError *)error { // Process the image classifier result or errors here. } @end NSString *modelPath = [[NSBundle mainBundle] pathForResource:@"model" ofType:@"tflite"]; MPPImageClassifierOptions *options = [[MPPImageClassifierOptions alloc] init]; options.baseOptions.modelAssetPath = modelPath; options.runningMode = MPPRunningModeLiveStream; options.maxResults = 5; // Assign an object of the class to the `imageClassifierLiveStreamDelegate` // property. APPImageClassifierResultProcessor *processor = [APPImageClassifierResultProcessor new]; options.imageClassifierLiveStreamDelegate = processor; MPPImageClassifier *imageClassifier = [[MPPImageClassifier alloc] initWithOptions:options error:nil];
Opsionet e konfigurimit
Kjo detyrë ka opsionet e mëposhtme të konfigurimit për aplikacionet iOS:
Emri i opsionit | Përshkrimi | Gama e vlerave | Vlera e paracaktuar |
---|---|---|---|
runningMode | Vendos modalitetin e ekzekutimit për detyrën. Ekzistojnë tre mënyra: IMAGE: Modaliteti për hyrjet e një imazhi të vetëm. VIDEO: Modaliteti për kornizat e dekoduara të një videoje. LIVE_STREAM: Modaliteti për një transmetim të drejtpërdrejtë të të dhënave hyrëse, si p.sh. nga një aparat fotografik. Në këtë modalitet, resultListener duhet të thirret për të vendosur një dëgjues për të marrë rezultatet në mënyrë asinkrone. | { RunningMode.image, RunningMode.video, RunningMode.liveStream } | RunningMode.image |
displayNamesLocale | Vendos gjuhën e etiketave për t'u përdorur për emrat e shfaqur të dhëna në meta të dhënat e modelit të detyrës, nëse disponohet. Parazgjedhja është en për anglisht. Ju mund të shtoni etiketa të lokalizuara në meta të dhënat e një modeli të personalizuar duke përdorur API-në e shkrimtarit metadata TensorFlow Lite | Kodi lokal | sq |
maxResults | Vendos numrin maksimal opsional të rezultateve të klasifikimit me pikët më të mira për t'u kthyer. Nëse < 0, të gjitha rezultatet e disponueshme do të kthehen. | Çdo numër pozitiv | -1 |
scoreThreshold | Vendos pragun e rezultatit të parashikimit që tejkalon atë të dhënë në meta të dhënat e modelit (nëse ka). Rezultatet nën këtë vlerë refuzohen. | Çdo noton | Nuk është vendosur |
categoryAllowlist | Vendos listën opsionale të emrave të kategorive të lejuara. Nëse nuk janë bosh, rezultatet e klasifikimit emri i kategorisë së të cilave nuk është në këtë grup do të filtrohen. Emrat e kopjuar ose të panjohur të kategorive shpërfillen. Ky opsion është reciprokisht ekskluziv me categoryDenylist dhe duke përdorur të dyja rezulton në një gabim. | Çdo varg | Nuk është vendosur |
categoryDenylist | Vendos listën opsionale të emrave të kategorive që nuk lejohen. Nëse nuk janë bosh, rezultatet e klasifikimit emri i kategorisë së të cilave është në këtë grup do të filtrohen. Emrat e kopjuar ose të panjohur të kategorive shpërfillen. Ky opsion është reciprokisht ekskluziv me categoryAllowlist dhe duke përdorur të dyja rezultatet në një gabim. | Çdo varg | Nuk është vendosur |
resultListener | Vendos dëgjuesin e rezultateve që të marrë rezultatet e klasifikimit në mënyrë asinkrone kur Klasifikuesi i imazhit është në modalitetin e transmetimit të drejtpërdrejtë. Mund të përdoret vetëm kur modaliteti i ekzekutimit është caktuar në LIVE_STREAM | N/A | Nuk është vendosur |
Konfigurimi i transmetimit të drejtpërdrejtë
Kur modaliteti i ekzekutimit vendoset në transmetim të drejtpërdrejtë, Klasifikuesi i Imazhit kërkon opsionin shtesë të konfigurimit të imageClassifierLiveStreamDelegate
, i cili i mundëson klasifikuesit të japë rezultatet e klasifikimit në mënyrë asinkrone. Delegati zbaton metodën imageClassifier(_:didFinishClassification:timestampInMilliseconds:error:)
, të cilën Klasifikuesi i imazhit e quan pas përpunimit të rezultateve të klasifikimit për çdo kornizë.
Emri i opsionit | Përshkrimi | Gama e vlerave | Vlera e paracaktuar |
---|---|---|---|
imageClassifierLiveStreamDelegate | Aktivizon "Klasifikuesin e imazheve" të marrë rezultatet e klasifikimit në mënyrë asinkrone në modalitetin e transmetimit të drejtpërdrejtë. Klasa instanca e së cilës është caktuar në këtë veti duhet të zbatojë metodën imageClassifier(_:didFinishClassification:timestampInMilliseconds:error:) . | E pazbatueshme | Nuk është vendosur |
Përgatitni të dhënat
Ju duhet të konvertoni imazhin ose kornizën hyrëse në një objekt MPImage
përpara se ta kaloni atë te Klasifikuesi i Imazhit. MPImage
mbështet lloje të ndryshme të formateve të imazhit iOS dhe mund t'i përdorë ato në çdo modalitet ekzekutimi për përfundime. Për më shumë informacion rreth MPImage
, referojuni MPImage API .
Zgjidhni një format imazhi iOS bazuar në rastin tuaj të përdorimit dhe mënyrën e ekzekutimit që kërkon aplikacioni juaj. MPImage
pranon formatet e imazhit UIImage
, CVPixelBuffer
dhe CMSampleBuffer
iOS.
UIIimazh
Formati UIImage
është i përshtatshëm për mënyrat e mëposhtme të funksionimit:
Imazhet: imazhet nga një grup aplikacioni, galeri përdoruesish ose sistem skedarësh të formatuar si imazhe
UIImage
mund të konvertohen në një objektMPImage
.Videot: përdorni AVAssetImageGenerator për të nxjerrë kornizat e videos në formatin CGImage , më pas i konvertoni ato në imazhe
UIImage
.
// Load an image on the user's device as an iOS `UIImage` object. // Convert the `UIImage` object to a MediaPipe's Image object having the default // orientation `UIImage.Orientation.up`. let image = try MPImage(uiImage: image)
// Load an image on the user's device as an iOS `UIImage` object. // Convert the `UIImage` object to a MediaPipe's Image object having the default // orientation `UIImageOrientationUp`. MPImage *image = [[MPPImage alloc] initWithUIImage:image error:nil];
Shembulli inicializon një MPImage
me orientimin e paracaktuar UIImage.Orientation.Up . Mund të inicializoni një MPImage
me ndonjë nga vlerat e mbështetura të UIImage.Orientation . Klasifikuesi i imazhit nuk mbështet orientime të pasqyruara si .upMirrored
, .downMirrored
, .leftMirrored
, .rightMirrored
.
Për më shumë informacion rreth UIImage
, referojuni Dokumentacionit të Zhvilluesit të UIImage Apple .
CVPixelBuffer
Formati CVPixelBuffer
është i përshtatshëm për aplikacionet që gjenerojnë korniza dhe përdorin kornizën iOS CoreImage për përpunim.
Formati CVPixelBuffer
është i përshtatshëm për mënyrat e mëposhtme të funksionimit:
Imazhet: aplikacionet që gjenerojnë imazhe
CVPixelBuffer
pas disa përpunimit duke përdorur kornizënCoreImage
të iOS mund të dërgohen te "Klasifikuesi i imazhit" në modalitetin e ekzekutimit të imazhit.Videot: kornizat video mund të konvertohen në formatin
CVPixelBuffer
për përpunim, dhe më pas të dërgohen në Klasifikuesin e Imazhit në modalitetin e videos.transmetim i drejtpërdrejtë: aplikacionet që përdorin një kamerë iOS për të gjeneruar korniza mund të konvertohen në formatin
CVPixelBuffer
për përpunim përpara se të dërgohen te "Klasifikuesi i imazhit" në modalitetin e transmetimit të drejtpërdrejtë.
// Obtain a CVPixelBuffer. // Convert the `CVPixelBuffer` object to a MediaPipe's Image object having the default // orientation `UIImage.Orientation.up`. let image = try MPImage(pixelBuffer: pixelBuffer)
// Obtain a CVPixelBuffer. // Convert the `CVPixelBuffer` object to a MediaPipe's Image object having the // default orientation `UIImageOrientationUp`. MPImage *image = [[MPPImage alloc] initWithUIImage:image error:nil];
Për më shumë informacion rreth CVPixelBuffer
, referojuni Dokumentacionit të Zhvilluesit të Apple CVPixelBuffer .
CMSampleBuffer
Formati CMSampleBuffer
ruan mostrat e mediave të një lloji uniform të medias dhe është i përshtatshëm për modalitetin e ekzekutimit të transmetimit të drejtpërdrejtë. Kornizat e drejtpërdrejta nga kamerat iOS shpërndahen në mënyrë asinkrone në formatin CMSampleBuffer
nga iOS AVCaptureVideoDataOutput .
// Obtain a CMSampleBuffer. // Convert the `CMSampleBuffer` object to a MediaPipe's Image object having the default // orientation `UIImage.Orientation.up`. let image = try MPImage(sampleBuffer: sampleBuffer)
// Obtain a `CMSampleBuffer`. // Convert the `CMSampleBuffer` object to a MediaPipe's Image object having the // default orientation `UIImageOrientationUp`. MPImage *image = [[MPPImage alloc] initWithSampleBuffer:sampleBuffer error:nil];
Për më shumë informacion rreth CMSampleBuffer
, referojuni Dokumentacionit të Zhvilluesit të Apple CMSampleBuffer .
Drejtoni detyrën
Për të ekzekutuar Klasifikuesin e Imazhit, përdorni metodën classify()
specifike për modalitetin e caktuar të ekzekutimit:
- Imazhi i palëvizshëm:
classify(image:)
- Video:
classify(videoFrame:timestampInMilliseconds:)
- transmetim i drejtpërdrejtë:
classifyAsync(image:timestampInMilliseconds:)
Klasifikuesi i imazhit kthen kategoritë e mundshme për objektin brenda imazhit ose kornizës hyrëse.
Shembujt e mëposhtëm të kodit tregojnë shembuj bazë se si të ekzekutohet Klasifikuesi i imazhit në këto mënyra të ndryshme ekzekutimi:
Swift
let result = try imageClassifier.classify(image: image)
let result = try imageClassifier.classify( videoFrame: image, timestampInMilliseconds: timestamp)
try imageClassifier.classifyAsync( image: image, timestampInMilliseconds: timestamp)
Objektivi-C
MPPImageClassifierResult *result = [imageClassifier classifyImage:image error:nil];
MPPImageClassifierResult *result = [imageClassifier classifyVideoFrame:image timestampInMilliseconds:timestamp error:nil];
BOOL success = [imageClassifier classifyAsyncImage:image timestampInMilliseconds:timestamp error:nil];
Shembulli i kodit të Klasifikuesit të Imazhit tregon implementimet e secilit prej këtyre mënyrave në mënyrë më të detajuar classify(image:)
, classify(videoFrame:timestampInMilliseconds:)
dhe classifyAsync(image:timestampInMilliseconds:)
. Kodi shembull i lejon përdoruesit të kalojë ndërmjet mënyrave të përpunimit që mund të mos kërkohen për rastin tuaj të përdorimit.
Vini re sa vijon:
Kur ekzekutoni në modalitetin e videos ose në modalitetin e transmetimit të drejtpërdrejtë, duhet të jepni gjithashtu vulën kohore të kornizës së hyrjes në detyrën "Klasifikimi i imazhit".
Kur funksionon në modalitetin e imazhit ose të videos, detyra e Klasifikimit të Imazhit bllokon fillin aktual derisa të përfundojë përpunimin e imazhit ose kornizës hyrëse. Për të shmangur bllokimin e fillit aktual, ekzekutoni përpunimin në një fill në sfond duke përdorur kornizat iOS Dispatch ose NSOoperation .
Kur ekzekutohet në modalitetin e transmetimit të drejtpërdrejtë, detyra e Klasifikimit të Imazhit kthehet menjëherë dhe nuk e bllokon lidhjen aktuale. Ai thërret metodën
imageClassifier(_:didFinishClassification:timestampInMilliseconds:error:)
me rezultatin e klasifikimit pas përpunimit të çdo kornize hyrëse. Klasifikuesi i imazhit e thërret këtë metodë në mënyrë asinkrone në një radhë të dedikuar dërgimi serik. Për shfaqjen e rezultateve në ndërfaqen e përdoruesit, dërgoni rezultatet në radhën kryesore pas përpunimit të rezultateve. Nëse funksioniclassifyAsync
thirret kur detyra e Klasifikuesit të Imazhit është e zënë me përpunimin e një kornize tjetër, Klasifikuesi i imazhit injoron kornizën e re hyrëse.
Trajtoni dhe shfaqni rezultatet
Pas ekzekutimit të përfundimit, detyra e Klasifikimit të Imazhit kthen një objekt ImageClassifierResult
i cili përmban listën e kategorive të mundshme për objektet brenda imazhit ose kornizës hyrëse.
Më poshtë tregon një shembull të të dhënave dalëse nga kjo detyrë:
ImageClassifierResult:
Classifications #0 (single classification head):
head index: 0
category #0:
category name: "/m/01bwb9"
display name: "Passer domesticus"
score: 0.91406
index: 671
category #1:
category name: "/m/01bwbt"
display name: "Passer montanus"
score: 0.00391
index: 670
Ky rezultat është marrë duke ekzekutuar klasifikuesin e shpendëve në:
Shembulli i kodit të klasifikuesit të imazhit demonstron se si të shfaqen rezultatet e klasifikimit të kthyera nga detyra, shikoni shembullin e kodit për detaje.