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(
|
||||
name = "detection",
|
||||
srcs = ["Detection.java"],
|
||||
javacopts = [
|
||||
"-Xep:AndroidJdkLibsChecker:OFF",
|
||||
],
|
||||
deps = [
|
||||
":category",
|
||||
":normalizedkeypoint",
|
||||
"//third_party:autovalue",
|
||||
"@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.
|
||||
filegroup(
|
||||
name = "java_src",
|
||||
|
|
|
@ -18,6 +18,7 @@ import android.graphics.RectF;
|
|||
import com.google.auto.value.AutoValue;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
|
||||
/**
|
||||
* 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
|
||||
// libraries. Therefore, instead of using ImmutableList here, we convert the List into
|
||||
// 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. */
|
||||
|
@ -47,4 +63,12 @@ public abstract class Detection {
|
|||
|
||||
/** A {@link RectF} object to represent the bounding box of the detected object. */
|
||||
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