fixed landmarks values from graph

This commit is contained in:
Mautisim Munir 2022-09-26 18:18:45 +05:00
parent e72fb8a6be
commit 9150dd57cc
6 changed files with 55 additions and 38 deletions

View File

@ -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",

View File

@ -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()));
}
} }
} }

View File

@ -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 {

View File

@ -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",

View File

@ -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;

View File

@ -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);