fixed landmarks values from graph
This commit is contained in:
parent
e72fb8a6be
commit
9150dd57cc
|
@ -22,6 +22,7 @@ android_library(
|
||||||
resource_files = glob(["res/**"]),
|
resource_files = glob(["res/**"]),
|
||||||
visibility = ["//visibility:public"],
|
visibility = ["//visibility:public"],
|
||||||
deps = [
|
deps = [
|
||||||
|
"//mediapipe/framework/formats:landmark_java_proto_lite",
|
||||||
"//mediapipe/framework/formats:detection_java_proto_lite",
|
"//mediapipe/framework/formats:detection_java_proto_lite",
|
||||||
"//mediapipe/framework/formats:location_data_java_proto_lite",
|
"//mediapipe/framework/formats:location_data_java_proto_lite",
|
||||||
"//mediapipe/java/com/google/mediapipe/components:android_camerax_helper",
|
"//mediapipe/java/com/google/mediapipe/components:android_camerax_helper",
|
||||||
|
|
|
@ -30,6 +30,7 @@ import androidx.activity.result.ActivityResultLauncher;
|
||||||
import androidx.activity.result.contract.ActivityResultContracts;
|
import androidx.activity.result.contract.ActivityResultContracts;
|
||||||
import androidx.exifinterface.media.ExifInterface;
|
import androidx.exifinterface.media.ExifInterface;
|
||||||
// ContentResolver dependency
|
// ContentResolver dependency
|
||||||
|
import com.google.mediapipe.formats.proto.LandmarkProto;
|
||||||
import com.google.mediapipe.solutioncore.CameraInput;
|
import com.google.mediapipe.solutioncore.CameraInput;
|
||||||
import com.google.mediapipe.solutioncore.SolutionGlSurfaceView;
|
import com.google.mediapipe.solutioncore.SolutionGlSurfaceView;
|
||||||
import com.google.mediapipe.solutioncore.VideoInput;
|
import com.google.mediapipe.solutioncore.VideoInput;
|
||||||
|
@ -201,7 +202,7 @@ public class MainActivity extends AppCompatActivity {
|
||||||
// Connects MediaPipe Face Detection solution to the user-defined PoseTrackingResultImageView.
|
// Connects MediaPipe Face Detection solution to the user-defined PoseTrackingResultImageView.
|
||||||
poseTracking.setResultListener(
|
poseTracking.setResultListener(
|
||||||
poseTrackingResult -> {
|
poseTrackingResult -> {
|
||||||
logNoseTipKeypoint(poseTrackingResult, /*faceIndex=*/ 0, /*showPixelValues=*/ true);
|
logExampleKeypoint(poseTrackingResult, /*faceIndex=*/ 0, /*showPixelValues=*/ true);
|
||||||
// imageView.setPoseTrackingResult(poseTrackingResult);
|
// imageView.setPoseTrackingResult(poseTrackingResult);
|
||||||
// runOnUiThread(() -> imageView.update());
|
// runOnUiThread(() -> imageView.update());
|
||||||
});
|
});
|
||||||
|
@ -271,7 +272,7 @@ public class MainActivity extends AppCompatActivity {
|
||||||
this,
|
this,
|
||||||
PoseTrackingOptions.builder()
|
PoseTrackingOptions.builder()
|
||||||
.setStaticImageMode(false)
|
.setStaticImageMode(false)
|
||||||
.setLandmarkVisibility(false)
|
.setLandmarkVisibility(true)
|
||||||
.setModelSelection(0)
|
.setModelSelection(0)
|
||||||
.build());
|
.build());
|
||||||
poseTracking.setErrorListener(
|
poseTracking.setErrorListener(
|
||||||
|
@ -293,7 +294,7 @@ public class MainActivity extends AppCompatActivity {
|
||||||
glSurfaceView.setRenderInputImage(true);
|
glSurfaceView.setRenderInputImage(true);
|
||||||
poseTracking.setResultListener(
|
poseTracking.setResultListener(
|
||||||
poseTrackingResult -> {
|
poseTrackingResult -> {
|
||||||
logNoseTipKeypoint(poseTrackingResult, /*faceIndex=*/ 0, /*showPixelValues=*/ false);
|
logExampleKeypoint(poseTrackingResult, /*faceIndex=*/ 0, /*showPixelValues=*/ false);
|
||||||
glSurfaceView.setRenderData(poseTrackingResult);
|
glSurfaceView.setRenderData(poseTrackingResult);
|
||||||
glSurfaceView.requestRender();
|
glSurfaceView.requestRender();
|
||||||
});
|
});
|
||||||
|
@ -339,33 +340,18 @@ public class MainActivity extends AppCompatActivity {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void logNoseTipKeypoint(
|
private void logExampleKeypoint(
|
||||||
PoseTrackingResult result, int faceIndex, boolean showPixelValues) {
|
PoseTrackingResult result, int faceIndex, boolean showPixelValues) {
|
||||||
if (result.multiPoseTrackings().isEmpty()) {
|
if (result.multiPoseTrackings().isEmpty()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// RelativeKeypoint noseTip =
|
LandmarkProto.Landmark exampleLandmark = result.multiPoseLandmarks().get(0);
|
||||||
// result
|
Log.d(
|
||||||
// .multiPoseTrackings()
|
TAG,
|
||||||
// .get(faceIndex)
|
String.format(
|
||||||
// .getLocationData()
|
"Pose Landmark Landmark at index 0: x=%f, y=%f, z=%f",
|
||||||
// .getRelativeKeypoints(FaceKeypoint.NOSE_TIP);
|
exampleLandmark.getX() , exampleLandmark.getY(),exampleLandmark.getZ() ));
|
||||||
// For Bitmaps, show the pixel values. For texture inputs, show the normalized coordinates.
|
|
||||||
if (showPixelValues) {
|
|
||||||
int width = result.inputBitmap().getWidth();
|
|
||||||
int height = result.inputBitmap().getHeight();
|
|
||||||
// Log.i(
|
|
||||||
// TAG,
|
|
||||||
// String.format(
|
|
||||||
// "MediaPipe Face Detection nose tip coordinates (pixel values): x=%f, y=%f",
|
|
||||||
// noseTip.getX() * width, noseTip.getY() * height));
|
|
||||||
} else {
|
|
||||||
// Log.i(
|
|
||||||
// TAG,
|
|
||||||
// String.format(
|
|
||||||
// "MediaPipe Face Detection nose tip normalized coordinates (value range: [0, 1]):"
|
|
||||||
// + " x=%f, y=%f",
|
|
||||||
// noseTip.getX(), noseTip.getY()));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,12 +5,13 @@ input_stream: "IMAGE:input_video"
|
||||||
|
|
||||||
# Output image with rendered results. (GpuBuffer)
|
# Output image with rendered results. (GpuBuffer)
|
||||||
output_stream: "output_video"
|
output_stream: "output_video"
|
||||||
# Pose landmarks. (NormalizedLandmarkList)
|
|
||||||
#output_stream: "pose_landmarks"
|
|
||||||
|
|
||||||
output_stream: "IMAGE:throttled_input_video"
|
output_stream: "IMAGE:throttled_input_video"
|
||||||
output_stream: "DETECTION:pose_detection"
|
output_stream: "DETECTION:pose_detection"
|
||||||
output_stream: "output_video"
|
output_stream: "output_video"
|
||||||
|
# Pose landmarks. (NormalizedLandmarkList)
|
||||||
|
output_stream: "pose_landmarks"
|
||||||
|
|
||||||
|
|
||||||
# Generates side packet to enable segmentation.
|
# Generates side packet to enable segmentation.
|
||||||
node {
|
node {
|
||||||
|
|
|
@ -39,6 +39,7 @@ android_library(
|
||||||
visibility = ["//visibility:public"],
|
visibility = ["//visibility:public"],
|
||||||
deps = [
|
deps = [
|
||||||
"//mediapipe/framework/formats:detection_java_proto_lite",
|
"//mediapipe/framework/formats:detection_java_proto_lite",
|
||||||
|
"//mediapipe/framework/formats:landmark_java_proto_lite",
|
||||||
"//mediapipe/java/com/google/mediapipe/framework:android_framework",
|
"//mediapipe/java/com/google/mediapipe/framework:android_framework",
|
||||||
"//mediapipe/java/com/google/mediapipe/solutioncore:camera_input",
|
"//mediapipe/java/com/google/mediapipe/solutioncore:camera_input",
|
||||||
"//mediapipe/java/com/google/mediapipe/solutioncore:solution_base",
|
"//mediapipe/java/com/google/mediapipe/solutioncore:solution_base",
|
||||||
|
|
|
@ -19,6 +19,7 @@ import android.util.Log;
|
||||||
|
|
||||||
import com.google.common.collect.ImmutableList;
|
import com.google.common.collect.ImmutableList;
|
||||||
import com.google.mediapipe.formats.proto.DetectionProto;
|
import com.google.mediapipe.formats.proto.DetectionProto;
|
||||||
|
import com.google.mediapipe.formats.proto.LandmarkProto;
|
||||||
import com.google.mediapipe.framework.MediaPipeException;
|
import com.google.mediapipe.framework.MediaPipeException;
|
||||||
import com.google.mediapipe.framework.Packet;
|
import com.google.mediapipe.framework.Packet;
|
||||||
import com.google.mediapipe.framework.PacketGetter;
|
import com.google.mediapipe.framework.PacketGetter;
|
||||||
|
@ -31,6 +32,7 @@ import com.google.mediapipe.formats.proto.DetectionProto.Detection;
|
||||||
import com.google.protobuf.InvalidProtocolBufferException;
|
import com.google.protobuf.InvalidProtocolBufferException;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
|
@ -48,10 +50,11 @@ public class PoseTracking extends ImageSolutionBase {
|
||||||
private static final String FULL_RANGE_GRAPH_NAME = "face_detection_full_range_image.binarypb";
|
private static final String FULL_RANGE_GRAPH_NAME = "face_detection_full_range_image.binarypb";
|
||||||
private static final String IMAGE_INPUT_STREAM = "input_video";
|
private static final String IMAGE_INPUT_STREAM = "input_video";
|
||||||
private static final ImmutableList<String> OUTPUT_STREAMS =
|
private static final ImmutableList<String> OUTPUT_STREAMS =
|
||||||
ImmutableList.of("pose_detection", "throttled_input_video","output_video");
|
ImmutableList.of("pose_detection", "throttled_input_video","output_video","pose_landmarks");
|
||||||
private static final int DETECTIONS_INDEX = 0;
|
private static final int DETECTIONS_INDEX = 0;
|
||||||
private static final int INPUT_IMAGE_INDEX = 1;
|
private static final int INPUT_IMAGE_INDEX = 1;
|
||||||
private static final int OUTPUT_IMAGE_INDEX = 2;
|
private static final int OUTPUT_IMAGE_INDEX = 2;
|
||||||
|
private static final int LANDMARKS_INDEX = 3;
|
||||||
private final OutputHandler<PoseTrackingResult> outputHandler;
|
private final OutputHandler<PoseTrackingResult> outputHandler;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -71,24 +74,40 @@ public class PoseTracking extends ImageSolutionBase {
|
||||||
try {
|
try {
|
||||||
byte[] bytes = PacketGetter.getProtoBytes(packet);
|
byte[] bytes = PacketGetter.getProtoBytes(packet);
|
||||||
Detection det = Detection.parseFrom(bytes);
|
Detection det = Detection.parseFrom(bytes);
|
||||||
poseTrackingResultBuilder.setMultiPoseTrackings(
|
poseTrackingResultBuilder.setMultiPoseDetections(
|
||||||
ImmutableList.<Detection>of(det));
|
ImmutableList.<Detection>of(det));
|
||||||
|
|
||||||
// Detection det = PacketGetter.getProto(packet, Detection.getDefaultInstance());
|
// Detection det = PacketGetter.getProto(packet, Detection.getDefaultInstance());
|
||||||
Log.v(TAG,"Packet not empty");
|
Log.v(TAG,"Packet not empty");
|
||||||
|
|
||||||
}catch (InvalidProtocolBufferException e){
|
}catch (InvalidProtocolBufferException e){
|
||||||
Log.e(TAG,e.getMessage());
|
Log.e(TAG,e.getMessage());
|
||||||
poseTrackingResultBuilder.setMultiPoseTrackings(
|
poseTrackingResultBuilder.setMultiPoseDetections(
|
||||||
ImmutableList.<Detection>of());
|
ImmutableList.<Detection>of());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}else {
|
}else {
|
||||||
poseTrackingResultBuilder.setMultiPoseTrackings(
|
poseTrackingResultBuilder.setMultiPoseDetections(
|
||||||
getProtoVector(packets.get(DETECTIONS_INDEX), Detection.parser()));
|
getProtoVector(packets.get(DETECTIONS_INDEX), Detection.parser()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Packet landmarksPacket = packets.get(LANDMARKS_INDEX);
|
||||||
|
if (landmarksPacket.isEmpty()){
|
||||||
|
poseTrackingResultBuilder.setMultiPoseLandmarks(ImmutableList.of());
|
||||||
|
}else {
|
||||||
|
byte[] landmarkBytes = PacketGetter.getProtoBytes(landmarksPacket);
|
||||||
|
LandmarkProto.LandmarkList landmarks = LandmarkProto.LandmarkList.parseFrom(landmarkBytes);
|
||||||
|
// List<LandmarkProto.Landmark> landmarks = getProtoVector(landmarksPacket, LandmarkProto.Landmark.parser());
|
||||||
|
poseTrackingResultBuilder.setMultiPoseLandmarks(landmarks.getLandmarkList());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
} catch (MediaPipeException e) {
|
} catch (MediaPipeException e) {
|
||||||
reportError("Error occurs while getting MediaPipe pose tracking results.", e);
|
reportError("Error occurs while getting MediaPipe pose tracking results.", e);
|
||||||
|
} catch (InvalidProtocolBufferException e) {
|
||||||
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
|
||||||
int imageIndex = options.landmarkVisibility() ? OUTPUT_IMAGE_INDEX : INPUT_IMAGE_INDEX;
|
int imageIndex = options.landmarkVisibility() ? OUTPUT_IMAGE_INDEX : INPUT_IMAGE_INDEX;
|
||||||
|
|
|
@ -17,6 +17,7 @@ package com.google.mediapipe.solutions.posetracking;
|
||||||
import android.graphics.Bitmap;
|
import android.graphics.Bitmap;
|
||||||
import com.google.auto.value.AutoBuilder;
|
import com.google.auto.value.AutoBuilder;
|
||||||
import com.google.common.collect.ImmutableList;
|
import com.google.common.collect.ImmutableList;
|
||||||
|
import com.google.mediapipe.formats.proto.LandmarkProto;
|
||||||
import com.google.mediapipe.framework.Packet;
|
import com.google.mediapipe.framework.Packet;
|
||||||
import com.google.mediapipe.framework.TextureFrame;
|
import com.google.mediapipe.framework.TextureFrame;
|
||||||
import com.google.mediapipe.solutioncore.ImageSolutionResult;
|
import com.google.mediapipe.solutioncore.ImageSolutionResult;
|
||||||
|
@ -29,11 +30,13 @@ import java.util.List;
|
||||||
* the corresponding input image.
|
* the corresponding input image.
|
||||||
*/
|
*/
|
||||||
public class PoseTrackingResult extends ImageSolutionResult {
|
public class PoseTrackingResult extends ImageSolutionResult {
|
||||||
private final ImmutableList<Detection> multiPoseTrackings;
|
private final ImmutableList<Detection> multiPoseDetections;
|
||||||
|
private final ImmutableList<LandmarkProto.Landmark> multiPoseLandmarks;
|
||||||
|
|
||||||
PoseTrackingResult(
|
PoseTrackingResult(
|
||||||
ImmutableList<Detection> multiPoseTrackings, Packet imagePacket, long timestamp) {
|
ImmutableList<Detection> multiPoseDetections,ImmutableList<LandmarkProto.Landmark> multiPoseLandmarks, Packet imagePacket, long timestamp) {
|
||||||
this.multiPoseTrackings = multiPoseTrackings;
|
this.multiPoseDetections = multiPoseDetections;
|
||||||
|
this.multiPoseLandmarks = multiPoseLandmarks;
|
||||||
this.timestamp = timestamp;
|
this.timestamp = timestamp;
|
||||||
this.imagePacket = imagePacket;
|
this.imagePacket = imagePacket;
|
||||||
}
|
}
|
||||||
|
@ -44,7 +47,12 @@ public class PoseTrackingResult extends ImageSolutionResult {
|
||||||
// to [0.0, 1.0] by the image height). Each keypoint is composed of x and y, which are normalized
|
// to [0.0, 1.0] by the image height). Each keypoint is composed of x and y, which are normalized
|
||||||
// to [0.0, 1.0] by the image width and height respectively.
|
// to [0.0, 1.0] by the image width and height respectively.
|
||||||
public ImmutableList<Detection> multiPoseTrackings() {
|
public ImmutableList<Detection> multiPoseTrackings() {
|
||||||
return multiPoseTrackings;
|
return multiPoseDetections;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public ImmutableList<LandmarkProto.Landmark> multiPoseLandmarks() {
|
||||||
|
return multiPoseLandmarks;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Builder builder() {
|
public static Builder builder() {
|
||||||
|
@ -54,7 +62,8 @@ public class PoseTrackingResult extends ImageSolutionResult {
|
||||||
/** Builder for {@link PoseTrackingResult}. */
|
/** Builder for {@link PoseTrackingResult}. */
|
||||||
@AutoBuilder
|
@AutoBuilder
|
||||||
public abstract static class Builder {
|
public abstract static class Builder {
|
||||||
abstract Builder setMultiPoseTrackings(List<Detection> value);
|
abstract Builder setMultiPoseDetections(List<Detection> value);
|
||||||
|
abstract Builder setMultiPoseLandmarks(List<LandmarkProto.Landmark> value);
|
||||||
|
|
||||||
abstract Builder setTimestamp(long value);
|
abstract Builder setTimestamp(long value);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user