From 952021f497cf1bbea88487ada1d2839906cf8ee7 Mon Sep 17 00:00:00 2001 From: Khanh LeViet Date: Thu, 25 May 2023 08:02:25 -0700 Subject: [PATCH 1/7] Remove unused MediaPipe Tasks Android sample PiperOrigin-RevId: 535259478 --- mediapipe/tasks/examples/android/BUILD | 21 -- .../src/main/AndroidManifest.xml | 37 --- .../android/objectdetector/src/main/BUILD | 49 ---- .../examples/objectdetector/MainActivity.java | 239 ------------------ .../ObjectDetectionResultImageView.java | 77 ------ .../drawable-v24/ic_launcher_foreground.xml | 34 --- .../res/drawable/ic_launcher_background.xml | 74 ------ .../android/res/layout/activity_main.xml | 40 --- .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 - .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 - .../android/res/mipmap-hdpi/ic_launcher.png | Bin 1354 -> 0 bytes .../mipmap-hdpi/ic_launcher_foreground.png | Bin 2257 -> 0 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 3246 -> 0 bytes .../android/res/mipmap-mdpi/ic_launcher.png | Bin 959 -> 0 bytes .../mipmap-mdpi/ic_launcher_foreground.png | Bin 900 -> 0 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 1955 -> 0 bytes .../android/res/mipmap-xhdpi/ic_launcher.png | Bin 1971 -> 0 bytes .../mipmap-xhdpi/ic_launcher_foreground.png | Bin 1845 -> 0 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 4658 -> 0 bytes .../android/res/mipmap-xxhdpi/ic_launcher.png | Bin 3562 -> 0 bytes .../mipmap-xxhdpi/ic_launcher_foreground.png | Bin 5655 -> 0 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 7745 -> 0 bytes .../res/mipmap-xxxhdpi/ic_launcher.png | Bin 5004 -> 0 bytes .../mipmap-xxxhdpi/ic_launcher_foreground.png | Bin 8278 -> 0 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 11062 -> 0 bytes .../examples/android/res/values/colors.xml | 6 - .../examples/android/res/values/strings.xml | 6 - .../examples/android/res/values/styles.xml | 11 - 28 files changed, 604 deletions(-) delete mode 100644 mediapipe/tasks/examples/android/BUILD delete mode 100644 mediapipe/tasks/examples/android/objectdetector/src/main/AndroidManifest.xml delete mode 100644 mediapipe/tasks/examples/android/objectdetector/src/main/BUILD delete mode 100644 mediapipe/tasks/examples/android/objectdetector/src/main/java/com/google/mediapipe/tasks/examples/objectdetector/MainActivity.java delete mode 100644 mediapipe/tasks/examples/android/objectdetector/src/main/java/com/google/mediapipe/tasks/examples/objectdetector/ObjectDetectionResultImageView.java delete mode 100644 mediapipe/tasks/examples/android/res/drawable-v24/ic_launcher_foreground.xml delete mode 100644 mediapipe/tasks/examples/android/res/drawable/ic_launcher_background.xml delete mode 100644 mediapipe/tasks/examples/android/res/layout/activity_main.xml delete mode 100644 mediapipe/tasks/examples/android/res/mipmap-anydpi-v26/ic_launcher.xml delete mode 100644 mediapipe/tasks/examples/android/res/mipmap-anydpi-v26/ic_launcher_round.xml delete mode 100644 mediapipe/tasks/examples/android/res/mipmap-hdpi/ic_launcher.png delete mode 100644 mediapipe/tasks/examples/android/res/mipmap-hdpi/ic_launcher_foreground.png delete mode 100644 mediapipe/tasks/examples/android/res/mipmap-hdpi/ic_launcher_round.png delete mode 100644 mediapipe/tasks/examples/android/res/mipmap-mdpi/ic_launcher.png delete mode 100644 mediapipe/tasks/examples/android/res/mipmap-mdpi/ic_launcher_foreground.png delete mode 100644 mediapipe/tasks/examples/android/res/mipmap-mdpi/ic_launcher_round.png delete mode 100644 mediapipe/tasks/examples/android/res/mipmap-xhdpi/ic_launcher.png delete mode 100644 mediapipe/tasks/examples/android/res/mipmap-xhdpi/ic_launcher_foreground.png delete mode 100644 mediapipe/tasks/examples/android/res/mipmap-xhdpi/ic_launcher_round.png delete mode 100644 mediapipe/tasks/examples/android/res/mipmap-xxhdpi/ic_launcher.png delete mode 100644 mediapipe/tasks/examples/android/res/mipmap-xxhdpi/ic_launcher_foreground.png delete mode 100644 mediapipe/tasks/examples/android/res/mipmap-xxhdpi/ic_launcher_round.png delete mode 100644 mediapipe/tasks/examples/android/res/mipmap-xxxhdpi/ic_launcher.png delete mode 100644 mediapipe/tasks/examples/android/res/mipmap-xxxhdpi/ic_launcher_foreground.png delete mode 100644 mediapipe/tasks/examples/android/res/mipmap-xxxhdpi/ic_launcher_round.png delete mode 100644 mediapipe/tasks/examples/android/res/values/colors.xml delete mode 100644 mediapipe/tasks/examples/android/res/values/strings.xml delete mode 100644 mediapipe/tasks/examples/android/res/values/styles.xml diff --git a/mediapipe/tasks/examples/android/BUILD b/mediapipe/tasks/examples/android/BUILD deleted file mode 100644 index f2c90236b..000000000 --- a/mediapipe/tasks/examples/android/BUILD +++ /dev/null @@ -1,21 +0,0 @@ -# Copyright 2022 The MediaPipe Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -licenses(["notice"]) - -filegroup( - name = "resource_files", - srcs = glob(["res/**"]), - visibility = ["//mediapipe/tasks/examples/android:__subpackages__"], -) diff --git a/mediapipe/tasks/examples/android/objectdetector/src/main/AndroidManifest.xml b/mediapipe/tasks/examples/android/objectdetector/src/main/AndroidManifest.xml deleted file mode 100644 index 5c53dc269..000000000 --- a/mediapipe/tasks/examples/android/objectdetector/src/main/AndroidManifest.xml +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/mediapipe/tasks/examples/android/objectdetector/src/main/BUILD b/mediapipe/tasks/examples/android/objectdetector/src/main/BUILD deleted file mode 100644 index 28bd38f9f..000000000 --- a/mediapipe/tasks/examples/android/objectdetector/src/main/BUILD +++ /dev/null @@ -1,49 +0,0 @@ -# Copyright 2022 The MediaPipe Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -licenses(["notice"]) - -package(default_visibility = ["//visibility:private"]) - -android_binary( - name = "objectdetector", - srcs = glob(["**/*.java"]), - assets = [ - "//mediapipe/tasks/testdata/vision:test_models", - ], - assets_dir = "", - custom_package = "com.google.mediapipe.tasks.examples.objectdetector", - manifest = "AndroidManifest.xml", - manifest_values = { - "applicationId": "com.google.mediapipe.tasks.examples.objectdetector", - }, - multidex = "native", - resource_files = ["//mediapipe/tasks/examples/android:resource_files"], - deps = [ - "//mediapipe/java/com/google/mediapipe/framework:android_framework", - "//mediapipe/java/com/google/mediapipe/framework/image", - "//mediapipe/tasks/java/com/google/mediapipe/tasks/components/containers:detection", - "//mediapipe/tasks/java/com/google/mediapipe/tasks/core", - "//mediapipe/tasks/java/com/google/mediapipe/tasks/vision:core", - "//mediapipe/tasks/java/com/google/mediapipe/tasks/vision:objectdetector", - "//third_party:androidx_appcompat", - "//third_party:androidx_constraint_layout", - "//third_party:opencv", - "@maven//:androidx_activity_activity", - "@maven//:androidx_concurrent_concurrent_futures", - "@maven//:androidx_exifinterface_exifinterface", - "@maven//:androidx_fragment_fragment", - "@maven//:com_google_guava_guava", - ], -) diff --git a/mediapipe/tasks/examples/android/objectdetector/src/main/java/com/google/mediapipe/tasks/examples/objectdetector/MainActivity.java b/mediapipe/tasks/examples/android/objectdetector/src/main/java/com/google/mediapipe/tasks/examples/objectdetector/MainActivity.java deleted file mode 100644 index abfd7c7d1..000000000 --- a/mediapipe/tasks/examples/android/objectdetector/src/main/java/com/google/mediapipe/tasks/examples/objectdetector/MainActivity.java +++ /dev/null @@ -1,239 +0,0 @@ -// Copyright 2022 The MediaPipe Authors. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package com.google.mediapipe.tasks.examples.objectdetector; - -import android.content.Intent; -import android.graphics.Bitmap; -import android.media.MediaMetadataRetriever; -import android.os.Bundle; -import android.provider.MediaStore; -import androidx.appcompat.app.AppCompatActivity; -import android.util.Log; -import android.view.View; -import android.widget.Button; -import android.widget.FrameLayout; -import androidx.activity.result.ActivityResultLauncher; -import androidx.activity.result.contract.ActivityResultContracts; -import androidx.exifinterface.media.ExifInterface; -// ContentResolver dependency -import com.google.mediapipe.framework.MediaPipeException; -import com.google.mediapipe.framework.image.BitmapImageBuilder; -import com.google.mediapipe.framework.image.MPImage; -import com.google.mediapipe.tasks.core.BaseOptions; -import com.google.mediapipe.tasks.vision.core.ImageProcessingOptions; -import com.google.mediapipe.tasks.vision.core.RunningMode; -import com.google.mediapipe.tasks.vision.objectdetector.ObjectDetectionResult; -import com.google.mediapipe.tasks.vision.objectdetector.ObjectDetector; -import com.google.mediapipe.tasks.vision.objectdetector.ObjectDetector.ObjectDetectorOptions; -import java.io.IOException; -import java.io.InputStream; - -/** Main activity of MediaPipe Task Object Detector reference app. */ -public class MainActivity extends AppCompatActivity { - private static final String TAG = "MainActivity"; - private static final String MODEL_FILE = "coco_ssd_mobilenet_v1_1.0_quant_2018_06_29.tflite"; - - private ObjectDetector objectDetector; - - private enum InputSource { - UNKNOWN, - IMAGE, - VIDEO, - CAMERA, - } - - private InputSource inputSource = InputSource.UNKNOWN; - - // Image mode demo component. - private ActivityResultLauncher imageGetter; - // Video mode demo component. - private ActivityResultLauncher videoGetter; - private ObjectDetectionResultImageView imageView; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_main); - setupImageModeDemo(); - setupVideoModeDemo(); - // TODO: Adds live camera demo. - } - - /** Sets up the image mode demo. */ - private void setupImageModeDemo() { - imageView = new ObjectDetectionResultImageView(this); - // The Intent to access gallery and read images as bitmap. - imageGetter = - registerForActivityResult( - new ActivityResultContracts.StartActivityForResult(), - result -> { - Intent resultIntent = result.getData(); - if (resultIntent != null) { - if (result.getResultCode() == RESULT_OK) { - Bitmap bitmap = null; - int rotation = 0; - try { - bitmap = - downscaleBitmap( - MediaStore.Images.Media.getBitmap( - this.getContentResolver(), resultIntent.getData())); - } catch (IOException e) { - Log.e(TAG, "Bitmap reading error:" + e); - } - try { - InputStream imageData = - this.getContentResolver().openInputStream(resultIntent.getData()); - rotation = getImageRotation(imageData); - } catch (IOException | MediaPipeException e) { - Log.e(TAG, "Bitmap rotation error:" + e); - } - if (bitmap != null) { - MPImage image = new BitmapImageBuilder(bitmap).build(); - ObjectDetectionResult detectionResult = - objectDetector.detect( - image, - ImageProcessingOptions.builder().setRotationDegrees(rotation).build()); - imageView.setData(image, detectionResult); - runOnUiThread(() -> imageView.update()); - } - } - } - }); - Button loadImageButton = findViewById(R.id.button_load_picture); - loadImageButton.setOnClickListener( - v -> { - if (inputSource != InputSource.IMAGE) { - createObjectDetector(RunningMode.IMAGE); - this.inputSource = InputSource.IMAGE; - updateLayout(); - } - // Reads images from gallery. - Intent pickImageIntent = new Intent(Intent.ACTION_PICK); - pickImageIntent.setDataAndType(MediaStore.Images.Media.INTERNAL_CONTENT_URI, "image/*"); - imageGetter.launch(pickImageIntent); - }); - } - - /** Sets up the video mode demo. */ - private void setupVideoModeDemo() { - imageView = new ObjectDetectionResultImageView(this); - // The Intent to access gallery and read a video file. - videoGetter = - registerForActivityResult( - new ActivityResultContracts.StartActivityForResult(), - result -> { - Intent resultIntent = result.getData(); - if (resultIntent != null) { - if (result.getResultCode() == RESULT_OK) { - MediaMetadataRetriever metaRetriever = new MediaMetadataRetriever(); - metaRetriever.setDataSource(this, resultIntent.getData()); - long duration = - Long.parseLong( - metaRetriever.extractMetadata( - MediaMetadataRetriever.METADATA_KEY_DURATION)); - int numFrames = - Integer.parseInt( - metaRetriever.extractMetadata( - MediaMetadataRetriever.METADATA_KEY_VIDEO_FRAME_COUNT)); - long frameIntervalMs = duration / numFrames; - for (int i = 0; i < numFrames; ++i) { - MPImage image = - new BitmapImageBuilder(metaRetriever.getFrameAtIndex(i)).build(); - ObjectDetectionResult detectionResult = - objectDetector.detectForVideo(image, frameIntervalMs * i); - // Currently only annotates the detection result on the first video frame and - // display it to verify the correctness. - // TODO: Annotates the detection result on every frame, save the - // annotated frames as a video file, and play back the video afterwards. - if (i == 0) { - imageView.setData(image, detectionResult); - runOnUiThread(() -> imageView.update()); - } - } - } - } - }); - Button loadVideoButton = findViewById(R.id.button_load_video); - loadVideoButton.setOnClickListener( - v -> { - createObjectDetector(RunningMode.VIDEO); - updateLayout(); - this.inputSource = InputSource.VIDEO; - - // Reads a video from gallery. - Intent pickVideoIntent = new Intent(Intent.ACTION_PICK); - pickVideoIntent.setDataAndType(MediaStore.Video.Media.INTERNAL_CONTENT_URI, "video/*"); - videoGetter.launch(pickVideoIntent); - }); - } - - private void createObjectDetector(RunningMode mode) { - if (objectDetector != null) { - objectDetector.close(); - } - // Initializes a new MediaPipe ObjectDetector instance - ObjectDetectorOptions options = - ObjectDetectorOptions.builder() - .setBaseOptions(BaseOptions.builder().setModelAssetPath(MODEL_FILE).build()) - .setScoreThreshold(0.5f) - .setMaxResults(5) - .setRunningMode(mode) - .build(); - objectDetector = ObjectDetector.createFromOptions(this, options); - } - - private void updateLayout() { - // Updates the preview layout. - FrameLayout frameLayout = findViewById(R.id.preview_display_layout); - frameLayout.removeAllViewsInLayout(); - imageView.setImageDrawable(null); - frameLayout.addView(imageView); - imageView.setVisibility(View.VISIBLE); - } - - private Bitmap downscaleBitmap(Bitmap originalBitmap) { - double aspectRatio = (double) originalBitmap.getWidth() / originalBitmap.getHeight(); - int width = imageView.getWidth(); - int height = imageView.getHeight(); - if (((double) imageView.getWidth() / imageView.getHeight()) > aspectRatio) { - width = (int) (height * aspectRatio); - } else { - height = (int) (width / aspectRatio); - } - return Bitmap.createScaledBitmap(originalBitmap, width, height, false); - } - - private int getImageRotation(InputStream imageData) throws IOException, MediaPipeException { - int orientation = - new ExifInterface(imageData) - .getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); - switch (orientation) { - case ExifInterface.ORIENTATION_NORMAL: - return 0; - case ExifInterface.ORIENTATION_ROTATE_90: - return 90; - case ExifInterface.ORIENTATION_ROTATE_180: - return 180; - case ExifInterface.ORIENTATION_ROTATE_270: - return 270; - default: - // TODO: use getRotationDegrees() and isFlipped() instead of switch once flip - // is supported. - throw new MediaPipeException( - MediaPipeException.StatusCode.UNIMPLEMENTED.ordinal(), - "Flipped images are not supported yet."); - } - } -} diff --git a/mediapipe/tasks/examples/android/objectdetector/src/main/java/com/google/mediapipe/tasks/examples/objectdetector/ObjectDetectionResultImageView.java b/mediapipe/tasks/examples/android/objectdetector/src/main/java/com/google/mediapipe/tasks/examples/objectdetector/ObjectDetectionResultImageView.java deleted file mode 100644 index e37c64156..000000000 --- a/mediapipe/tasks/examples/android/objectdetector/src/main/java/com/google/mediapipe/tasks/examples/objectdetector/ObjectDetectionResultImageView.java +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright 2022 The MediaPipe Authors. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package com.google.mediapipe.tasks.examples.objectdetector; - -import android.content.Context; -import android.graphics.Bitmap; -import android.graphics.Canvas; -import android.graphics.Color; -import android.graphics.Matrix; -import android.graphics.Paint; -import androidx.appcompat.widget.AppCompatImageView; -import com.google.mediapipe.framework.image.BitmapExtractor; -import com.google.mediapipe.framework.image.MPImage; -import com.google.mediapipe.tasks.components.containers.Detection; -import com.google.mediapipe.tasks.vision.objectdetector.ObjectDetectionResult; - -/** An ImageView implementation for displaying {@link ObjectDetectionResult}. */ -public class ObjectDetectionResultImageView extends AppCompatImageView { - private static final String TAG = "ObjectDetectionResultImageView"; - - private static final int BBOX_COLOR = Color.GREEN; - private static final int BBOX_THICKNESS = 5; // Pixels - private Bitmap latest; - - public ObjectDetectionResultImageView(Context context) { - super(context); - setScaleType(AppCompatImageView.ScaleType.FIT_CENTER); - } - - /** - * Sets a {@link MPImage} and an {@link ObjectDetectionResult} to render. - * - * @param image a {@link MPImage} object for annotation. - * @param result an {@link ObjectDetectionResult} object that contains the detection result. - */ - public void setData(MPImage image, ObjectDetectionResult result) { - if (image == null || result == null) { - return; - } - latest = BitmapExtractor.extract(image); - Canvas canvas = new Canvas(latest); - canvas.drawBitmap(latest, new Matrix(), null); - for (int i = 0; i < result.detections().size(); ++i) { - drawDetectionOnCanvas(result.detections().get(i), canvas); - } - } - - /** Updates the image view with the latest {@link ObjectDetectionResult}. */ - public void update() { - postInvalidate(); - if (latest != null) { - setImageBitmap(latest); - } - } - - private void drawDetectionOnCanvas(Detection detection, Canvas canvas) { - // TODO: Draws the category and the score per bounding box. - // Draws bounding box. - Paint bboxPaint = new Paint(); - bboxPaint.setColor(BBOX_COLOR); - bboxPaint.setStyle(Paint.Style.STROKE); - bboxPaint.setStrokeWidth(BBOX_THICKNESS); - canvas.drawRect(detection.boundingBox(), bboxPaint); - } -} diff --git a/mediapipe/tasks/examples/android/res/drawable-v24/ic_launcher_foreground.xml b/mediapipe/tasks/examples/android/res/drawable-v24/ic_launcher_foreground.xml deleted file mode 100644 index c7bd21dbd..000000000 --- a/mediapipe/tasks/examples/android/res/drawable-v24/ic_launcher_foreground.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - - diff --git a/mediapipe/tasks/examples/android/res/drawable/ic_launcher_background.xml b/mediapipe/tasks/examples/android/res/drawable/ic_launcher_background.xml deleted file mode 100644 index 01f0af0ad..000000000 --- a/mediapipe/tasks/examples/android/res/drawable/ic_launcher_background.xml +++ /dev/null @@ -1,74 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/mediapipe/tasks/examples/android/res/layout/activity_main.xml b/mediapipe/tasks/examples/android/res/layout/activity_main.xml deleted file mode 100644 index 834e9a3e6..000000000 --- a/mediapipe/tasks/examples/android/res/layout/activity_main.xml +++ /dev/null @@ -1,40 +0,0 @@ - - - -