Detyra Object Detector ju lejon të zbuloni praninë dhe vendndodhjen e klasave të shumta të objekteve. Për shembull, një detektor objektesh mund të lokalizojë qentë brenda në një imazh. Këto udhëzime ju tregojnë se si të përdorni detyrën e Detektorit të Objekteve në Android. 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 i thjeshtë i një aplikacioni Object Detector për Android. Shembulli përdor kamerën në një pajisje fizike Android për të zbuluar vazhdimisht objektet, dhe gjithashtu mund të përdorë imazhe dhe video nga galeria e pajisjes për të zbuluar në mënyrë statike objektet.
Mund ta përdorni aplikacionin si pikënisje për aplikacionin tuaj Android ose t'i referoheni kur modifikoni një aplikacion ekzistues. Shembulli i kodit të Detektorit të Objekteve gjendet 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 arka të rrallë, në mënyrë që të keni vetëm skedarët për shembullin e aplikacionit Object Detector:
cd mediapipe git sparse-checkout init --cone git sparse-checkout set examples/object_detection/android
Pas krijimit të një versioni lokal të kodit shembull, mund ta importoni projektin në Android Studio dhe të ekzekutoni aplikacionin. Për udhëzime, shihni Udhëzuesin e konfigurimit për Android .
Komponentët kryesorë
Skedarët e mëposhtëm përmbajnë kodin vendimtar për shembullin e aplikacionit Object Detector:
- ObjectDetectorHelper.kt - Inicializon detektorin e objektit dhe trajton zgjedhjen e modelit dhe delegatit
- MainActivity.kt - Zbaton aplikacionin dhe mbledh komponentët e ndërfaqes së përdoruesit
- OverlayView.kt - Trajton dhe shfaq 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 Detektorin e Objekteve. 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 Android .
varësitë
Detektori i objekteve përdor bibliotekën com.google.mediapipe:tasks-vision
. Shtoni këtë varësi në skedarin build.gradle
të projektit tuaj të zhvillimit të aplikacionit Android. Importoni varësitë e kërkuara me kodin e mëposhtëm:
dependencies {
implementation 'com.google.mediapipe:tasks-vision:latest.release'
}
Model
Detyra MediaPipe Object Detector kërkon një model të trajnuar që është në përputhje me këtë detyrë. Për më shumë informacion mbi modelet e trajnuara të disponueshme për Detektorin e Objekteve, shihni seksionin Modelet e përmbledhjes së detyrave.
Zgjidhni dhe shkarkoni modelin dhe më pas ruajeni në direktorinë e projektit tuaj:
<dev-project-root>/src/main/assets
Përdorni metodën BaseOptions.Builder.setModelAssetPath()
për të specifikuar shtegun e përdorur nga modeli. Për një shembull kodi, shihni seksionin tjetër.
Krijo detyrën
Ju mund të përdorni funksionin createFromOptions
për të krijuar detyrën. Funksioni createFromOptions
pranon 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 një opsion konfigurimi nuk është specifikuar, do të përdoret vlera e paracaktuar. Për më shumë informacion mbi opsionet e konfigurimit, shihni Përmbledhjen e konfigurimit .
Detyra Object Detector mbështet 3 lloje të dhënash hyrëse: imazhe statike, skedarë video dhe transmetime video të drejtpërdrejta. Ju duhet të specifikoni mënyrën e ekzekutimit që korrespondon me llojin tuaj të të dhënave hyrëse kur krijoni detyrën. Zgjidhni skedën që korrespondon me llojin tuaj të të dhënave hyrëse për të parë se si të krijoni detyrën dhe të ekzekutoni konkluzionet.
Imazhi
ObjectDetectorOptions options = ObjectDetectorOptions.builder() .setBaseOptions(BaseOptions.builder().setModelAssetPath(‘model.tflite’).build()) .setRunningMode(RunningMode.IMAGE) .setMaxResults(5) .build(); objectDetector = ObjectDetector.createFromOptions(context, options);
Video
ObjectDetectorOptions options = ObjectDetectorOptions.builder() .setBaseOptions(BaseOptions.builder().setModelAssetPath(‘model.tflite’).build()) .setRunningMode(RunningMode.VIDEO) .setMaxResults(5) .build(); objectDetector = ObjectDetector.createFromOptions(context, options);
Transmetim i drejtpërdrejtë
ObjectDetectorOptions options = ObjectDetectorOptions.builder() .setBaseOptions(BaseOptions.builder().setModelAssetPath(‘model.tflite’).build()) .setRunningMode(RunningMode.LIVE_STREAM) .setMaxResults(5) .setResultListener((result, inputImage) -> { // Process the detection result here. }) .setErrorListener((result, inputImage) -> { // Process the classification errors here. }) .build(); objectDetector = ObjectDetector.createFromOptions(context, options);
Zbatimi i kodit të shembullit të Detektorit të Objekteve i lejon përdoruesit të kalojë midis mënyrave të përpunimit. Qasja e bën kodin e krijimit të detyrës më të komplikuar dhe mund të mos jetë i përshtatshëm për rastin tuaj të përdorimit. Ju mund ta shihni këtë kod në funksionin e klasës ObjectDetectorHelper
setupObjectDetector()
.
Opsionet e konfigurimit
Kjo detyrë ka opsionet e mëposhtme të konfigurimit për aplikacionet Android:
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. | { IMAGE, VIDEO, LIVE_STREAM } | IMAGE |
displayNamesLocales | 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ë zbulimit me pikët më të larta për t'u kthyer. | Çdo numër pozitiv | -1 (të gjitha rezultatet kthehen) |
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 zbulimit, 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 zbulimit, 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 zbulimit në mënyrë asinkrone kur detektori i objektit është në modalitetin e transmetimit të drejtpërdrejtë. Këtë opsion mund ta përdorni vetëm kur vendosni runningMode në LIVE_STREAM. | E pazbatueshme | Nuk është vendosur |
Përgatitni të dhënat
Ju duhet të konvertoni imazhin ose kornizën hyrëse në një objekt com.google.mediapipe.framework.image.MPImage
përpara se ta kaloni atë te Detektori i Objekteve.
Shembujt e mëposhtëm shpjegojnë dhe tregojnë se si të përgatiten të dhënat për përpunim për secilin nga llojet e të dhënave të disponueshme:
Imazhi
import com.google.mediapipe.framework.image.BitmapImageBuilder; import com.google.mediapipe.framework.image.MPImage; // Load an image on the user’s device as a Bitmap object using BitmapFactory. // Convert an Android’s Bitmap object to a MediaPipe’s Image object. Image mpImage = new BitmapImageBuilder(bitmap).build();
Video
import com.google.mediapipe.framework.image.BitmapImageBuilder; import com.google.mediapipe.framework.image.MPImage; // Load a video file on the user's device using MediaMetadataRetriever // From the video’s metadata, load the METADATA_KEY_DURATION and // METADATA_KEY_VIDEO_FRAME_COUNT values. Use these values // to calculate the timestamp of each frame later. // Loop through the video and load each frame as a Bitmap object. // Convert the Android’s Bitmap object to a MediaPipe’s Image object. Image mpImage = new BitmapImageBuilder(frame).build();
Transmetim i drejtpërdrejtë
import com.google.mediapipe.framework.image.MediaImageBuilder; import com.google.mediapipe.framework.image.MPImage; // Create a CameraX’s ImageAnalysis to continuously receive frames // from the device’s camera. Configure it to output frames in RGBA_8888 // format to match with what is required by the model. // For each Android’s ImageProxy object received from the ImageAnalysis, // extract the encapsulated Android’s Image object and convert it to // a MediaPipe’s Image object. android.media.Image mediaImage = imageProxy.getImage() MPImage mpImage = new MediaImageBuilder(mediaImage).build();
Në kodin e shembullit të Detektorit të Objekteve, përgatitja e të dhënave trajtohet në klasën ObjectDetectorHelper
brenda funksioneve detectImage()
, detectVideoFile()
, detectLivestreamFrame()
.
Drejtoni detyrën
Në varësi të llojit të të dhënave me të cilat po punoni, përdorni metodën ObjectDetector.detect...()
që është specifike për atë lloj të dhënash. Përdorni detect()
për imazhe individuale, detectForVideo()
për kornizat në skedarët video dhe detectAsync()
për transmetimet video. Kur jeni duke kryer zbulime në një transmetim video, sigurohuni që zbulimet t'i ekzekutoni në një bashkëbisedim të veçantë për të shmangur bllokimin e lidhjes së ndërfaqes së përdoruesit.
Shembujt e mëposhtëm të kodit tregojnë shembuj të thjeshtë se si të ekzekutohet Object Detector në këto mënyra të ndryshme të të dhënave:
Imazhi
ObjectDetectorResult detectionResult = objectDetector.detect(image);
Video
// Calculate the timestamp in milliseconds of the current frame. long frame_timestamp_ms = 1000 * video_duration * frame_index / frame_count; // Run inference on the frame. ObjectDetectorResult detectionResult = objectDetector.detectForVideo(image, frameTimestampMs);
Transmetim i drejtpërdrejtë
// Run inference on the frame. The detection results will be available // via the `resultListener` provided in the `ObjectDetectorOptions` when // the object detector was created. objectDetector.detectAsync(image, frameTimestampMs);
Shembulli i kodit të Detektorit të Objekteve tregon implementimet e secilit prej këtyre mënyrave në më shumë detaje detect()
, detectVideoFile()
dhe detectAsync()
. 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 "Detektori i objekteve".
- Kur ekzekutohet në modalitetin e imazhit ose të videos, detyra e Detektorit të Objekteve do të bllokojë 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.
- Kur ekzekutohet në modalitetin e transmetimit të drejtpërdrejtë, detyra e Detektorit të Objekteve nuk e bllokon lidhjen aktuale, por kthehet menjëherë. Ai do të thërrasë dëgjuesin e tij të rezultateve me rezultatin e zbulimit sa herë që ka përfunduar përpunimin e një kornize hyrëse. Nëse funksioni i zbulimit thirret kur detyra e Detektorit të Objekteve është e zënë duke përpunuar një kornizë tjetër, korniza e re hyrëse do të shpërfillet.
Trajtoni dhe shfaqni rezultatet
Pas ekzekutimit të konkluzionit, detyra Object Detector kthen një objekt ObjectDetectorResult
i cili përshkruan objektet që ka gjetur në imazhin hyrës.
Më poshtë tregon një shembull të të dhënave dalëse nga kjo detyrë:
ObjectDetectorResult:
Detection #0:
Box: (x: 355, y: 133, w: 190, h: 206)
Categories:
index : 17
score : 0.73828
class name : dog
Detection #1:
Box: (x: 103, y: 15, w: 138, h: 369)
Categories:
index : 17
score : 0.73047
class name : dog
Imazhi i mëposhtëm tregon një vizualizim të daljes së detyrës:
Shembulli i kodit të Detektorit të Objekteve tregon se si të shfaqen rezultatet e zbulimit të kthyera nga detyra, shikoni klasën OverlayView
për më shumë detaje.