normalized keypoint container. Detection adds optional keypoint list.
PiperOrigin-RevId: 514624925
This commit is contained in:
parent
e4ac1a10c2
commit
c1b460920c
|
@ -38,8 +38,12 @@ android_library(
|
||||||
android_library(
|
android_library(
|
||||||
name = "detection",
|
name = "detection",
|
||||||
srcs = ["Detection.java"],
|
srcs = ["Detection.java"],
|
||||||
|
javacopts = [
|
||||||
|
"-Xep:AndroidJdkLibsChecker:OFF",
|
||||||
|
],
|
||||||
deps = [
|
deps = [
|
||||||
":category",
|
":category",
|
||||||
|
":normalizedkeypoint",
|
||||||
"//third_party:autovalue",
|
"//third_party:autovalue",
|
||||||
"@maven//:com_google_guava_guava",
|
"@maven//:com_google_guava_guava",
|
||||||
],
|
],
|
||||||
|
@ -92,6 +96,18 @@ android_library(
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
|
||||||
|
android_library(
|
||||||
|
name = "normalizedkeypoint",
|
||||||
|
srcs = ["NormalizedKeypoint.java"],
|
||||||
|
javacopts = [
|
||||||
|
"-Xep:AndroidJdkLibsChecker:OFF",
|
||||||
|
],
|
||||||
|
deps = [
|
||||||
|
"//third_party:autovalue",
|
||||||
|
"@maven//:com_google_guava_guava",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
# Expose the java source files for building mediapipe tasks core AAR.
|
# Expose the java source files for building mediapipe tasks core AAR.
|
||||||
filegroup(
|
filegroup(
|
||||||
name = "java_src",
|
name = "java_src",
|
||||||
|
|
|
@ -18,6 +18,7 @@ import android.graphics.RectF;
|
||||||
import com.google.auto.value.AutoValue;
|
import com.google.auto.value.AutoValue;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Represents one detected object in the results of {@link
|
* Represents one detected object in the results of {@link
|
||||||
|
@ -39,7 +40,22 @@ public abstract class Detection {
|
||||||
// such as Guava, because it may introduce conflicts with clients who also happen to use those
|
// such as Guava, because it may introduce conflicts with clients who also happen to use those
|
||||||
// libraries. Therefore, instead of using ImmutableList here, we convert the List into
|
// libraries. Therefore, instead of using ImmutableList here, we convert the List into
|
||||||
// unmodifiableList
|
// unmodifiableList
|
||||||
return new AutoValue_Detection(Collections.unmodifiableList(categories), boundingBox);
|
return new AutoValue_Detection(
|
||||||
|
Collections.unmodifiableList(categories), boundingBox, Optional.empty());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a {@link Detection} instance from a list of {@link Category} and a bounding box.
|
||||||
|
*
|
||||||
|
* @param categories a list of {@link Category} objects that contain category name, display name,
|
||||||
|
* score, and the label index.
|
||||||
|
* @param boundingBox a {@link RectF} object to represent the bounding box.
|
||||||
|
* @param keypoints an optional list of {@link NormalizedKeypoints} associated with the detection.
|
||||||
|
*/
|
||||||
|
public static Detection create(
|
||||||
|
List<Category> categories, RectF boundingBox, Optional<List<NormalizedKeypoint>> keypoints) {
|
||||||
|
return new AutoValue_Detection(
|
||||||
|
Collections.unmodifiableList(categories), boundingBox, keypoints);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** A list of {@link Category} objects. */
|
/** A list of {@link Category} objects. */
|
||||||
|
@ -47,4 +63,12 @@ public abstract class Detection {
|
||||||
|
|
||||||
/** A {@link RectF} object to represent the bounding box of the detected object. */
|
/** A {@link RectF} object to represent the bounding box of the detected object. */
|
||||||
public abstract RectF boundingBox();
|
public abstract RectF boundingBox();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An optional list of {@link NormalizedKeypoint} associated with the detection. Keypoints
|
||||||
|
* represent interesting points related to the detection. For example, the keypoints represent the
|
||||||
|
* eyes, ear and mouth from face detection model. Or in the template matching detection, e.g.
|
||||||
|
* KNIFT, they can represent the feature points for template matching.
|
||||||
|
*/
|
||||||
|
public abstract Optional<List<NormalizedKeypoint>> keypoints();
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,91 @@
|
||||||
|
// Copyright 2023 The MediaPipe Authors. All Rights Reserved.
|
||||||
|
//
|
||||||
|
// 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.components.containers;
|
||||||
|
|
||||||
|
import com.google.auto.value.AutoValue;
|
||||||
|
import java.util.Objects;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Normalized keypoint represents a point in 2D space with x, y coordinates. x and y are normalized
|
||||||
|
* to [0.0, 1.0] by the image width and height respectively.
|
||||||
|
*/
|
||||||
|
@AutoValue
|
||||||
|
public abstract class NormalizedKeypoint {
|
||||||
|
private static final float TOLERANCE = 1e-6f;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a {@link NormalizedKeypoint} instance from normalized x and y coordinates.
|
||||||
|
*
|
||||||
|
* @param x the x coordinates of the normalized keypoint.
|
||||||
|
* @param y the y coordinates of the normalized keypoint.
|
||||||
|
*/
|
||||||
|
public static NormalizedKeypoint create(float x, float y) {
|
||||||
|
return new AutoValue_NormalizedKeypoint(x, y, Optional.empty(), Optional.empty());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a {@link NormalizedKeypoint} instance from normalized x and y coordinates, and the
|
||||||
|
* optional label and keypoint score.
|
||||||
|
*
|
||||||
|
* @param x the x coordinates of the normalized keypoint.
|
||||||
|
* @param y the y coordinates of the normalized keypoint.
|
||||||
|
* @param label optional label of the keypoint.
|
||||||
|
* @param score optional score of the keypoint.
|
||||||
|
*/
|
||||||
|
public static NormalizedKeypoint create(
|
||||||
|
float x, float y, Optional<String> label, Optional<Float> score) {
|
||||||
|
return new AutoValue_NormalizedKeypoint(x, y, label, score);
|
||||||
|
}
|
||||||
|
|
||||||
|
// The x coordinates of the normalized keypoint.
|
||||||
|
public abstract float x();
|
||||||
|
|
||||||
|
// The y coordinates of the normalized keypoint.
|
||||||
|
public abstract float y();
|
||||||
|
|
||||||
|
// optional label of the keypoint.
|
||||||
|
public abstract Optional<String> label();
|
||||||
|
|
||||||
|
// optional score of the keypoint.
|
||||||
|
public abstract Optional<Float> score();
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public final boolean equals(Object o) {
|
||||||
|
if (!(o instanceof NormalizedKeypoint)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
NormalizedKeypoint other = (NormalizedKeypoint) o;
|
||||||
|
return Math.abs(other.x() - this.x()) < TOLERANCE && Math.abs(other.x() - this.y()) < TOLERANCE;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public final int hashCode() {
|
||||||
|
return Objects.hash(x(), y(), label(), score());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public final String toString() {
|
||||||
|
return "<Normalized Keypoint (x="
|
||||||
|
+ x()
|
||||||
|
+ " y="
|
||||||
|
+ y()
|
||||||
|
+ " label= "
|
||||||
|
+ label().orElse("null")
|
||||||
|
+ " score="
|
||||||
|
+ (score().isPresent() ? score().get() : "null")
|
||||||
|
+ ")>";
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user