Project import generated by Copybara.

GitOrigin-RevId: ff83882955f1a1e2a043ff4e71278be9d7217bbe
This commit is contained in:
MediaPipe Team
2021-05-05 14:56:16 -04:00
committed by chuoling
parent ecb5b5f44a
commit a9b643e0f5
210 changed files with 5312 additions and 3838 deletions
Binary file not shown.
@@ -19,19 +19,19 @@
# - "pose_detection.tflite" is available at
# "mediapipe/modules/pose_detection/pose_detection.tflite"
#
# - "pose_landmark_full_body.tflite" or "pose_landmark_upper_body.tflite" is
# available at
# "mediapipe/modules/pose_landmark/pose_landmark_full_body.tflite"
# or
# "mediapipe/modules/pose_landmark/pose_landmark_upper_body.tflite"
# - "pose_landmark_lite.tflite" or "pose_landmark_full.tflite" or
# "pose_landmark_heavy.tflite" is available at
# "mediapipe/modules/pose_landmark/pose_landmark_lite.tflite" or
# "mediapipe/modules/pose_landmark/pose_landmark_full.tflite" or
# "mediapipe/modules/pose_landmark/pose_landmark_heavy.tflite"
# path respectively during execution, depending on the specification in the
# UPPER_BODY_ONLY input side packet.
# MODEL_COMPLEXITY input side packet.
#
# EXAMPLE:
# node {
# calculator: "HolisticLandmarkCpu"
# input_stream: "IMAGE:input_video"
# input_side_packet: UPPER_BODY_ONLY:upper_body_only
# input_side_packet: "MODEL_COMPLEXITY:model_complexity"
# input_side_packet: SMOOTH_LANDMARKS:smooth_landmarks
# output_stream: "POSE_LANDMARKS:pose_landmarks"
# output_stream: "FACE_LANDMARKS:face_landmarks"
@@ -50,17 +50,17 @@ type: "HolisticLandmarkCpu"
# CPU image. (ImageFrame)
input_stream: "IMAGE:image"
# Whether to detect/predict the full set of pose landmarks (see below), or only
# those on the upper body. If unspecified, functions as set to false. (bool)
# Note that upper-body-only prediction may be more accurate for use cases where
# the lower-body parts are mostly out of view.
input_side_packet: "UPPER_BODY_ONLY:upper_body_only"
# Complexity of the pose landmark model: 0, 1 or 2. Landmark accuracy as well as
# inference latency generally go up with the model complexity. If unspecified,
# functions as set to 0. (int)
input_side_packet: "MODEL_COMPLEXITY:model_complexity"
# Whether to filter landmarks across different input images to reduce jitter.
# If unspecified, functions as set to true. (bool)
input_side_packet: "SMOOTH_LANDMARKS:smooth_landmarks"
# Pose landmarks. (NormalizedLandmarkList)
# We have 33 landmarks or 25 landmarks if UPPER_BODY_ONLY is set to true.
# 33 pose landmarks.
output_stream: "POSE_LANDMARKS:pose_landmarks"
# 21 left hand landmarks. (NormalizedLandmarkList)
output_stream: "LEFT_HAND_LANDMARKS:left_hand_landmarks"
@@ -77,7 +77,7 @@ output_stream: "POSE_DETECTION:pose_detection"
node {
calculator: "PoseLandmarkCpu"
input_stream: "IMAGE:image"
input_side_packet: "UPPER_BODY_ONLY:upper_body_only"
input_side_packet: "MODEL_COMPLEXITY:model_complexity"
input_side_packet: "SMOOTH_LANDMARKS:smooth_landmarks"
output_stream: "LANDMARKS:pose_landmarks"
output_stream: "ROI_FROM_LANDMARKS:pose_landmarks_roi"
@@ -19,19 +19,19 @@
# - "pose_detection.tflite" is available at
# "mediapipe/modules/pose_detection/pose_detection.tflite"
#
# - "pose_landmark_full_body.tflite" or "pose_landmark_upper_body.tflite" is
# available at
# "mediapipe/modules/pose_landmark/pose_landmark_full_body.tflite"
# or
# "mediapipe/modules/pose_landmark/pose_landmark_upper_body.tflite"
# - "pose_landmark_lite.tflite" or "pose_landmark_full.tflite" or
# "pose_landmark_heavy.tflite" is available at
# "mediapipe/modules/pose_landmark/pose_landmark_lite.tflite" or
# "mediapipe/modules/pose_landmark/pose_landmark_full.tflite" or
# "mediapipe/modules/pose_landmark/pose_landmark_heavy.tflite"
# path respectively during execution, depending on the specification in the
# UPPER_BODY_ONLY input side packet.
# MODEL_COMPLEXITY input side packet.
#
# EXAMPLE:
# node {
# calculator: "HolisticLandmarkGpu"
# input_stream: "IMAGE:input_video"
# input_side_packet: UPPER_BODY_ONLY:upper_body_only
# input_side_packet: "MODEL_COMPLEXITY:model_complexity"
# input_side_packet: SMOOTH_LANDMARKS:smooth_landmarks
# output_stream: "POSE_LANDMARKS:pose_landmarks"
# output_stream: "FACE_LANDMARKS:face_landmarks"
@@ -50,17 +50,17 @@ type: "HolisticLandmarkGpu"
# GPU image. (GpuBuffer)
input_stream: "IMAGE:image"
# Whether to detect/predict the full set of pose landmarks (see below), or only
# those on the upper body. If unspecified, functions as set to false. (bool)
# Note that upper-body-only prediction may be more accurate for use cases where
# the lower-body parts are mostly out of view.
input_side_packet: "UPPER_BODY_ONLY:upper_body_only"
# Complexity of the pose landmark model: 0, 1 or 2. Landmark accuracy as well as
# inference latency generally go up with the model complexity. If unspecified,
# functions as set to 0. (int)
input_side_packet: "MODEL_COMPLEXITY:model_complexity"
# Whether to filter landmarks across different input images to reduce jitter.
# If unspecified, functions as set to true. (bool)
input_side_packet: "SMOOTH_LANDMARKS:smooth_landmarks"
# Pose landmarks. (NormalizedLandmarkList)
# We have 33 landmarks or 25 landmarks if UPPER_BODY_ONLY is set to true.
# 33 pose landmarks.
output_stream: "POSE_LANDMARKS:pose_landmarks"
# 21 left hand landmarks. (NormalizedLandmarkList)
output_stream: "LEFT_HAND_LANDMARKS:left_hand_landmarks"
@@ -77,7 +77,7 @@ output_stream: "POSE_DETECTION:pose_detection"
node {
calculator: "PoseLandmarkGpu"
input_stream: "IMAGE:image"
input_side_packet: "UPPER_BODY_ONLY:upper_body_only"
input_side_packet: "MODEL_COMPLEXITY:model_complexity"
input_side_packet: "SMOOTH_LANDMARKS:smooth_landmarks"
output_stream: "LANDMARKS:pose_landmarks"
output_stream: "ROI_FROM_LANDMARKS:pose_landmarks_roi"
@@ -36,7 +36,7 @@ input_stream: "IMAGE:image"
# this packet so that they don't wait for it unnecessarily.
output_stream: "DETECTIONS:detections"
# Transforms the input image into a 128x128 while keeping the aspect ratio
# Transforms the input image into a 224x224 one while keeping the aspect ratio
# (what is expected by the corresponding model), resulting in potential
# letterboxing in the transformed image.
node: {
@@ -46,8 +46,8 @@ node: {
output_stream: "LETTERBOX_PADDING:letterbox_padding"
options: {
[mediapipe.ImageToTensorCalculatorOptions.ext] {
output_tensor_width: 128
output_tensor_height: 128
output_tensor_width: 224
output_tensor_height: 224
keep_aspect_ratio: true
output_tensor_float_range {
min: -1.0
@@ -74,6 +74,7 @@ node {
model_path: "mediapipe/modules/pose_detection/pose_detection.tflite"
delegate { xnnpack {} }
}
#
}
}
@@ -84,17 +85,18 @@ node {
output_side_packet: "anchors"
options: {
[mediapipe.SsdAnchorsCalculatorOptions.ext] {
num_layers: 4
num_layers: 5
min_scale: 0.1484375
max_scale: 0.75
input_size_height: 128
input_size_width: 128
input_size_height: 224
input_size_width: 224
anchor_offset_x: 0.5
anchor_offset_y: 0.5
strides: 8
strides: 16
strides: 16
strides: 16
strides: 32
strides: 32
strides: 32
aspect_ratios: 1.0
fixed_anchor_size: true
}
@@ -112,7 +114,7 @@ node {
options: {
[mediapipe.TensorsToDetectionsCalculatorOptions.ext] {
num_classes: 1
num_boxes: 896
num_boxes: 2254
num_coords: 12
box_coord_offset: 0
keypoint_coord_offset: 4
@@ -121,10 +123,10 @@ node {
sigmoid_score: true
score_clipping_thresh: 100.0
reverse_output_order: true
x_scale: 128.0
y_scale: 128.0
h_scale: 128.0
w_scale: 128.0
x_scale: 224.0
y_scale: 224.0
h_scale: 224.0
w_scale: 224.0
min_score_thresh: 0.5
}
}
@@ -36,7 +36,7 @@ input_stream: "IMAGE:image"
# this packet so that they don't wait for it unnecessarily.
output_stream: "DETECTIONS:detections"
# Transforms the input image into a 128x128 while keeping the aspect ratio
# Transforms the input image into a 224x224 one while keeping the aspect ratio
# (what is expected by the corresponding model), resulting in potential
# letterboxing in the transformed image.
node: {
@@ -46,8 +46,8 @@ node: {
output_stream: "LETTERBOX_PADDING:letterbox_padding"
options: {
[mediapipe.ImageToTensorCalculatorOptions.ext] {
output_tensor_width: 128
output_tensor_height: 128
output_tensor_width: 224
output_tensor_height: 224
keep_aspect_ratio: true
output_tensor_float_range {
min: -1.0
@@ -80,17 +80,18 @@ node {
output_side_packet: "anchors"
options: {
[mediapipe.SsdAnchorsCalculatorOptions.ext] {
num_layers: 4
num_layers: 5
min_scale: 0.1484375
max_scale: 0.75
input_size_height: 128
input_size_width: 128
input_size_height: 224
input_size_width: 224
anchor_offset_x: 0.5
anchor_offset_y: 0.5
strides: 8
strides: 16
strides: 16
strides: 16
strides: 32
strides: 32
strides: 32
aspect_ratios: 1.0
fixed_anchor_size: true
}
@@ -108,7 +109,7 @@ node {
options: {
[mediapipe.TensorsToDetectionsCalculatorOptions.ext] {
num_classes: 1
num_boxes: 896
num_boxes: 2254
num_coords: 12
box_coord_offset: 0
keypoint_coord_offset: 4
@@ -117,10 +118,10 @@ node {
sigmoid_score: true
score_clipping_thresh: 100.0
reverse_output_order: true
x_scale: 128.0
y_scale: 128.0
h_scale: 128.0
w_scale: 128.0
x_scale: 224.0
y_scale: 224.0
h_scale: 224.0
w_scale: 224.0
min_score_thresh: 0.5
}
}
+5 -25
View File
@@ -48,8 +48,8 @@ mediapipe_simple_subgraph(
"//mediapipe/calculators/tensor:tensors_to_landmarks_calculator",
"//mediapipe/calculators/util:landmark_letterbox_removal_calculator",
"//mediapipe/calculators/util:landmark_projection_calculator",
"//mediapipe/calculators/util:refine_landmarks_from_heatmap_calculator",
"//mediapipe/calculators/util:thresholding_calculator",
"//mediapipe/framework/tool:switch_container",
],
)
@@ -68,8 +68,8 @@ mediapipe_simple_subgraph(
"//mediapipe/calculators/tensor:tensors_to_landmarks_calculator",
"//mediapipe/calculators/util:landmark_letterbox_removal_calculator",
"//mediapipe/calculators/util:landmark_projection_calculator",
"//mediapipe/calculators/util:refine_landmarks_from_heatmap_calculator",
"//mediapipe/calculators/util:thresholding_calculator",
"//mediapipe/framework/tool:switch_container",
],
)
@@ -124,30 +124,11 @@ mediapipe_simple_subgraph(
],
)
mediapipe_simple_subgraph(
name = "pose_landmark_upper_body_gpu",
graph = "pose_landmark_upper_body_gpu.pbtxt",
register_as = "PoseLandmarkUpperBodyGpu",
deps = [
":pose_landmark_gpu",
"//mediapipe/calculators/core:constant_side_packet_calculator",
],
)
mediapipe_simple_subgraph(
name = "pose_landmark_upper_body_cpu",
graph = "pose_landmark_upper_body_cpu.pbtxt",
register_as = "PoseLandmarkUpperBodyCpu",
deps = [
":pose_landmark_cpu",
"//mediapipe/calculators/core:constant_side_packet_calculator",
],
)
exports_files(
srcs = [
"pose_landmark_full_body.tflite",
"pose_landmark_upper_body.tflite",
"pose_landmark_full.tflite",
"pose_landmark_heavy.tflite",
"pose_landmark_lite.tflite",
],
)
@@ -158,7 +139,6 @@ mediapipe_simple_subgraph(
deps = [
"//mediapipe/calculators/util:alignment_points_to_rects_calculator",
"//mediapipe/calculators/util:rect_transformation_calculator",
"//mediapipe/framework/tool:switch_container",
],
)
+4 -6
View File
@@ -2,9 +2,7 @@
Subgraphs|Details
:--- | :---
[`PoseLandmarkByRoiCpu`](https://github.com/google/mediapipe/tree/master/mediapipe/modules/pose_landmark/pose_landmark_by_roi_cpu.pbtxt)| Detects landmarks of a single body pose, full-body by default but can be configured (via an input side packet) to cover upper-body only. See landmarks (aka keypoints) [scheme](https://github.com/google/mediapipe/tree/master/mediapipe/modules/pose_landmark/pose_landmark_full_body_topology.svg). (CPU input, and inference is executed on CPU.)
[`PoseLandmarkByRoiGpu`](https://github.com/google/mediapipe/tree/master/mediapipe/modules/pose_landmark/pose_landmark_by_roi_gpu.pbtxt)| Detects landmarks of a single body pose, full-body by default but can be configured (via an input side packet) to cover upper-body only. See landmarks (aka keypoints) [scheme](https://github.com/google/mediapipe/tree/master/mediapipe/modules/pose_landmark/pose_landmark_full_body_topology.svg). (GPU input, and inference is executed on GPU)
[`PoseLandmarkCpu`](https://github.com/google/mediapipe/tree/master/mediapipe/modules/pose_landmark/pose_landmark_cpu.pbtxt)| Detects landmarks of a single body pose, full-body by default but can be configured (via an input side packet) to cover upper-body only. See landmarks (aka keypoints) [scheme](https://github.com/google/mediapipe/tree/master/mediapipe/modules/pose_landmark/pose_landmark_full_body_topology.svg). (CPU input, and inference is executed on CPU)
[`PoseLandmarkGpu`](https://github.com/google/mediapipe/tree/master/mediapipe/modules/pose_landmark/pose_landmark_gpu.pbtxt)| Detects landmarks of a single body pose, full-body by default but can be configured (via an input side packet) to cover upper-body only. See landmarks (aka keypoints) [scheme](https://github.com/google/mediapipe/tree/master/mediapipe/modules/pose_landmark/pose_landmark_full_body_topology.svg). (GPU input, and inference is executed on GPU.)
[`PoseLandmarkUpperBodyCpu`](https://github.com/google/mediapipe/tree/master/mediapipe/modules/pose_landmark/pose_landmark_upper_body_cpu.pbtxt)| Detects and tracks landmarks of a single upper-body pose. See landmarks (aka keypoints) [scheme](https://github.com/google/mediapipe/tree/master/mediapipe/modules/pose_landmark/pose_landmark_upper_body_topology.svg). (CPU input, and inference is executed on CPU)
[`PoseLandmarkUpperBodyGpu`](https://github.com/google/mediapipe/tree/master/mediapipe/modules/pose_landmark/pose_landmark_upper_body_gpu.pbtxt)| Detects and tracks landmarks of a single upper-body pose. See landmarks (aka keypoints) [scheme](https://github.com/google/mediapipe/tree/master/mediapipe/modules/pose_landmark/pose_landmark_upper_body_topology.svg). (GPU input, and inference is executed on GPU.)
[`PoseLandmarkByRoiCpu`](https://github.com/google/mediapipe/tree/master/mediapipe/modules/pose_landmark/pose_landmark_by_roi_cpu.pbtxt)| Detects landmarks of a single body pose. See landmarks (aka keypoints) [scheme](https://github.com/google/mediapipe/tree/master/mediapipe/modules/pose_landmark/pose_landmark_topology.svg). (CPU input, and inference is executed on CPU.)
[`PoseLandmarkByRoiGpu`](https://github.com/google/mediapipe/tree/master/mediapipe/modules/pose_landmark/pose_landmark_by_roi_gpu.pbtxt)| Detects landmarks of a single body pose. See landmarks (aka keypoints) [scheme](https://github.com/google/mediapipe/tree/master/mediapipe/modules/pose_landmark/pose_landmark_topology.svg). (GPU input, and inference is executed on GPU)
[`PoseLandmarkCpu`](https://github.com/google/mediapipe/tree/master/mediapipe/modules/pose_landmark/pose_landmark_cpu.pbtxt)| Detects landmarks of a single body pose. See landmarks (aka keypoints) [scheme](https://github.com/google/mediapipe/tree/master/mediapipe/modules/pose_landmark/pose_landmark_topology.svg). (CPU input, and inference is executed on CPU)
[`PoseLandmarkGpu`](https://github.com/google/mediapipe/tree/master/mediapipe/modules/pose_landmark/pose_landmark_gpu.pbtxt)| Detects landmarks of a single body pose. See landmarks (aka keypoints) [scheme](https://github.com/google/mediapipe/tree/master/mediapipe/modules/pose_landmark/pose_landmark_topology.svg). (GPU input, and inference is executed on GPU.)
@@ -9,44 +9,22 @@ type: "PoseDetectionToRoi"
input_stream: "DETECTION:detection"
# Frame size (width and height). (std::pair<int, int>)
input_stream: "IMAGE_SIZE:image_size"
# Whether to detect/predict the full set of pose landmarks, or only those on the
# upper body. If unspecified, functions as set to false. (bool)
input_side_packet: "UPPER_BODY_ONLY:upper_body_only"
# ROI according to the first detection of input detections. (NormalizedRect)
output_stream: "ROI:roi"
# Converts pose detection into a rectangle based on center and scale alignment
# points. Pose detection contains four key points: first two for full-body pose
# and two more for upper-body pose.
# points.
node {
calculator: "SwitchContainer"
input_side_packet: "ENABLE:upper_body_only"
calculator: "AlignmentPointsRectsCalculator"
input_stream: "DETECTION:detection"
input_stream: "IMAGE_SIZE:image_size"
output_stream: "NORM_RECT:raw_roi"
options {
[mediapipe.SwitchContainerOptions.ext] {
contained_node: {
calculator: "AlignmentPointsRectsCalculator"
options: {
[mediapipe.DetectionsToRectsCalculatorOptions.ext] {
rotation_vector_start_keypoint_index: 0
rotation_vector_end_keypoint_index: 1
rotation_vector_target_angle_degrees: 90
}
}
}
contained_node: {
calculator: "AlignmentPointsRectsCalculator"
options: {
[mediapipe.DetectionsToRectsCalculatorOptions.ext] {
rotation_vector_start_keypoint_index: 2
rotation_vector_end_keypoint_index: 3
rotation_vector_target_angle_degrees: 90
}
}
}
options: {
[mediapipe.DetectionsToRectsCalculatorOptions.ext] {
rotation_vector_start_keypoint_index: 0
rotation_vector_end_keypoint_index: 1
rotation_vector_target_angle_degrees: 90
}
}
}
@@ -59,8 +37,8 @@ node {
output_stream: "roi"
options: {
[mediapipe.RectTransformationCalculatorOptions.ext] {
scale_x: 1.5
scale_y: 1.5
scale_x: 1.25
scale_y: 1.25
square_long: true
}
}
@@ -1,18 +1,18 @@
# MediaPipe graph to detect/predict upper-body pose landmarks. (CPU input, and
# inference is executed on CPU.)
# MediaPipe graph to detect/predict pose landmarks. (CPU input, and inference is
# executed on CPU.)
#
# It is required that "pose_landmark_full_body.tflite" or
# "pose_landmark_upper_body.tflite" is available at
# "mediapipe/modules/pose_landmark/pose_landmark_full_body.tflite"
# or
# "mediapipe/modules/pose_landmark/pose_landmark_upper_body.tflite"
# It is required that "pose_landmark_lite.tflite" or
# "pose_landmark_full.tflite" or "pose_landmark_heavy.tflite" is available at
# "mediapipe/modules/pose_landmark/pose_landmark_lite.tflite" or
# "mediapipe/modules/pose_landmark/pose_landmark_full.tflite" or
# "mediapipe/modules/pose_landmark/pose_landmark_heavy.tflite"
# path respectively during execution, depending on the specification in the
# UPPER_BODY_ONLY input side packet.
# MODEL_COMPLEXITY input side packet.
#
# EXAMPLE:
# node {
# calculator: "PoseLandmarkByRoiCpu"
# input_side_packet: "UPPER_BODY_ONLY:upper_body_only"
# input_side_packet: "MODEL_COMPLEXITY:model_complexity"
# input_stream: "IMAGE:image"
# input_stream: "ROI:roi"
# output_stream: "LANDMARKS:landmarks"
@@ -26,16 +26,14 @@ input_stream: "IMAGE:image"
# (NormalizedRect)
input_stream: "ROI:roi"
# Whether to detect/predict the full set of pose landmarks (see below), or only
# those on the upper body. If unspecified, functions as set to false. (bool)
# Note that upper-body-only prediction may be more accurate for use cases where
# the lower-body parts are mostly out of view.
input_side_packet: "UPPER_BODY_ONLY:upper_body_only"
# Complexity of the pose landmark model: 0, 1 or 2. Landmark accuracy as well as
# inference latency generally go up with the model complexity. If unspecified,
# functions as set to 0. (int)
input_side_packet: "MODEL_COMPLEXITY:model_complexity"
# Pose landmarks within the given ROI. (NormalizedLandmarkList)
# We have 33 landmarks (see pose_landmark_full_body_topology.svg) with the
# first 25 fall on the upper body (see pose_landmark_upper_body_topology.svg),
# and there are other auxiliary key points.
# We have 33 landmarks (see pose_landmark_topology.svg) and there are other
# auxiliary key points.
# 0 - nose
# 1 - left eye (inner)
# 2 - left eye
@@ -104,7 +102,7 @@ node: {
# Loads the pose landmark TF Lite model.
node {
calculator: "PoseLandmarkModelLoader"
input_side_packet: "UPPER_BODY_ONLY:upper_body_only"
input_side_packet: "MODEL_COMPLEXITY:model_complexity"
output_side_packet: "MODEL:model"
}
@@ -128,10 +126,12 @@ node {
input_stream: "output_tensors"
output_stream: "landmark_tensors"
output_stream: "pose_flag_tensor"
output_stream: "heatmap_tensor"
options: {
[mediapipe.SplitVectorCalculatorOptions.ext] {
ranges: { begin: 0 end: 1 }
ranges: { begin: 1 end: 2 }
ranges: { begin: 3 end: 4 }
}
}
}
@@ -168,36 +168,29 @@ node {
# Decodes the landmark tensors into a vector of landmarks, where the landmark
# coordinates are normalized by the size of the input image to the model.
node {
calculator: "SwitchContainer"
input_side_packet: "ENABLE:upper_body_only"
calculator: "TensorsToLandmarksCalculator"
input_stream: "TENSORS:ensured_landmark_tensors"
output_stream: "NORM_LANDMARKS:raw_landmarks"
options: {
[mediapipe.SwitchContainerOptions.ext] {
contained_node: {
calculator: "TensorsToLandmarksCalculator"
options: {
[mediapipe.TensorsToLandmarksCalculatorOptions.ext] {
num_landmarks: 35
input_image_width: 256
input_image_height: 256
visibility_activation: SIGMOID
presence_activation: SIGMOID
}
}
}
contained_node: {
calculator: "TensorsToLandmarksCalculator"
options: {
[mediapipe.TensorsToLandmarksCalculatorOptions.ext] {
num_landmarks: 27
input_image_width: 256
input_image_height: 256
visibility_activation: SIGMOID
presence_activation: SIGMOID
}
}
}
[mediapipe.TensorsToLandmarksCalculatorOptions.ext] {
num_landmarks: 39
input_image_width: 256
input_image_height: 256
visibility_activation: SIGMOID
presence_activation: SIGMOID
}
}
}
# Refines landmarks with the heatmap tensor.
node {
calculator: "RefineLandmarksFromHeatmapCalculator"
input_stream: "NORM_LANDMARKS:raw_landmarks"
input_stream: "TENSORS:heatmap_tensor"
output_stream: "NORM_LANDMARKS:refined_landmarks"
options: {
[mediapipe.RefineLandmarksFromHeatmapCalculatorOptions.ext] {
kernel_size: 7
}
}
}
@@ -208,7 +201,7 @@ node {
# image before image transformation).
node {
calculator: "LandmarkLetterboxRemovalCalculator"
input_stream: "LANDMARKS:raw_landmarks"
input_stream: "LANDMARKS:refined_landmarks"
input_stream: "LETTERBOX_PADDING:letterbox_padding"
output_stream: "LANDMARKS:adjusted_landmarks"
}
@@ -225,31 +218,14 @@ node {
# Splits the landmarks into two sets: the actual pose landmarks and the
# auxiliary landmarks.
node {
calculator: "SwitchContainer"
input_side_packet: "ENABLE:upper_body_only"
calculator: "SplitNormalizedLandmarkListCalculator"
input_stream: "all_landmarks"
output_stream: "landmarks"
output_stream: "auxiliary_landmarks"
options: {
[mediapipe.SwitchContainerOptions.ext] {
contained_node: {
calculator: "SplitNormalizedLandmarkListCalculator"
options: {
[mediapipe.SplitVectorCalculatorOptions.ext] {
ranges: { begin: 0 end: 33 }
ranges: { begin: 33 end: 35 }
}
}
}
contained_node: {
calculator: "SplitNormalizedLandmarkListCalculator"
options: {
[mediapipe.SplitVectorCalculatorOptions.ext] {
ranges: { begin: 0 end: 25 }
ranges: { begin: 25 end: 27 }
}
}
}
[mediapipe.SplitVectorCalculatorOptions.ext] {
ranges: { begin: 0 end: 33 }
ranges: { begin: 33 end: 35 }
}
}
}
@@ -1,18 +1,18 @@
# MediaPipe graph to detect/predict upper-body pose landmarks. (GPU input, and
# inference is executed on GPU.)
# MediaPipe graph to detect/predict pose landmarks. (GPU input, and inference is
# executed on GPU.)
#
# It is required that "pose_landmark_full_body.tflite" or
# "pose_landmark_upper_body.tflite" is available at
# "mediapipe/modules/pose_landmark/pose_landmark_full_body.tflite"
# or
# "mediapipe/modules/pose_landmark/pose_landmark_upper_body.tflite"
# It is required that "pose_landmark_lite.tflite" or
# "pose_landmark_full.tflite" or "pose_landmark_heavy.tflite" is available at
# "mediapipe/modules/pose_landmark/pose_landmark_lite.tflite" or
# "mediapipe/modules/pose_landmark/pose_landmark_full.tflite" or
# "mediapipe/modules/pose_landmark/pose_landmark_heavy.tflite"
# path respectively during execution, depending on the specification in the
# UPPER_BODY_ONLY input side packet.
# MODEL_COMPLEXITY input side packet.
#
# EXAMPLE:
# node {
# calculator: "PoseLandmarkByRoiGpu"
# input_side_packet: "UPPER_BODY_ONLY:upper_body_only"
# input_side_packet: "MODEL_COMPLEXITY:model_complexity"
# input_stream: "IMAGE:image"
# input_stream: "ROI:roi"
# output_stream: "LANDMARKS:landmarks"
@@ -26,16 +26,14 @@ input_stream: "IMAGE:image"
# (NormalizedRect)
input_stream: "ROI:roi"
# Whether to detect/predict the full set of pose landmarks (see below), or only
# those on the upper body. If unspecified, functions as set to false. (bool)
# Note that upper-body-only prediction may be more accurate for use cases where
# the lower-body parts are mostly out of view.
input_side_packet: "UPPER_BODY_ONLY:upper_body_only"
# Complexity of the pose landmark model: 0, 1 or 2. Landmark accuracy as well as
# inference latency generally go up with the model complexity. If unspecified,
# functions as set to 0. (int)
input_side_packet: "MODEL_COMPLEXITY:model_complexity"
# Pose landmarks within the given ROI. (NormalizedLandmarkList)
# We have 33 landmarks (see pose_landmark_full_body_topology.svg) with the
# first 25 fall on the upper body (see pose_landmark_upper_body_topology.svg),
# and there are other auxiliary key points.
# We have 33 landmarks (see pose_landmark_topology.svg), and there are other
# auxiliary key points.
# 0 - nose
# 1 - left eye (inner)
# 2 - left eye
@@ -105,7 +103,7 @@ node: {
# Loads the pose landmark TF Lite model.
node {
calculator: "PoseLandmarkModelLoader"
input_side_packet: "UPPER_BODY_ONLY:upper_body_only"
input_side_packet: "MODEL_COMPLEXITY:model_complexity"
output_side_packet: "MODEL:model"
}
@@ -115,6 +113,15 @@ node {
input_side_packet: "MODEL:model"
input_stream: "TENSORS:input_tensors"
output_stream: "TENSORS:output_tensors"
options: {
[mediapipe.InferenceCalculatorOptions.ext] {
delegate {
gpu {
allow_precision_loss: false
}
}
}
}
}
# Splits a vector of TFLite tensors to multiple vectors according to the ranges
@@ -124,10 +131,12 @@ node {
input_stream: "output_tensors"
output_stream: "landmark_tensors"
output_stream: "pose_flag_tensor"
output_stream: "heatmap_tensor"
options: {
[mediapipe.SplitVectorCalculatorOptions.ext] {
ranges: { begin: 0 end: 1 }
ranges: { begin: 1 end: 2 }
ranges: { begin: 3 end: 4 }
}
}
}
@@ -164,36 +173,29 @@ node {
# Decodes the landmark tensors into a vector of landmarks, where the landmark
# coordinates are normalized by the size of the input image to the model.
node {
calculator: "SwitchContainer"
input_side_packet: "ENABLE:upper_body_only"
calculator: "TensorsToLandmarksCalculator"
input_stream: "TENSORS:ensured_landmark_tensors"
output_stream: "NORM_LANDMARKS:raw_landmarks"
options: {
[mediapipe.SwitchContainerOptions.ext] {
contained_node: {
calculator: "TensorsToLandmarksCalculator"
options: {
[mediapipe.TensorsToLandmarksCalculatorOptions.ext] {
num_landmarks: 35
input_image_width: 256
input_image_height: 256
visibility_activation: SIGMOID
presence_activation: SIGMOID
}
}
}
contained_node: {
calculator: "TensorsToLandmarksCalculator"
options: {
[mediapipe.TensorsToLandmarksCalculatorOptions.ext] {
num_landmarks: 27
input_image_width: 256
input_image_height: 256
visibility_activation: SIGMOID
presence_activation: SIGMOID
}
}
}
[mediapipe.TensorsToLandmarksCalculatorOptions.ext] {
num_landmarks: 39
input_image_width: 256
input_image_height: 256
visibility_activation: SIGMOID
presence_activation: SIGMOID
}
}
}
# Refines landmarks with the heatmap tensor.
node {
calculator: "RefineLandmarksFromHeatmapCalculator"
input_stream: "NORM_LANDMARKS:raw_landmarks"
input_stream: "TENSORS:heatmap_tensor"
output_stream: "NORM_LANDMARKS:refined_landmarks"
options: {
[mediapipe.RefineLandmarksFromHeatmapCalculatorOptions.ext] {
kernel_size: 7
}
}
}
@@ -204,7 +206,7 @@ node {
# image before image transformation).
node {
calculator: "LandmarkLetterboxRemovalCalculator"
input_stream: "LANDMARKS:raw_landmarks"
input_stream: "LANDMARKS:refined_landmarks"
input_stream: "LETTERBOX_PADDING:letterbox_padding"
output_stream: "LANDMARKS:adjusted_landmarks"
}
@@ -221,31 +223,14 @@ node {
# Splits the landmarks into two sets: the actual pose landmarks and the
# auxiliary landmarks.
node {
calculator: "SwitchContainer"
input_side_packet: "ENABLE:upper_body_only"
calculator: "SplitNormalizedLandmarkListCalculator"
input_stream: "all_landmarks"
output_stream: "landmarks"
output_stream: "auxiliary_landmarks"
options: {
[mediapipe.SwitchContainerOptions.ext] {
contained_node: {
calculator: "SplitNormalizedLandmarkListCalculator"
options: {
[mediapipe.SplitVectorCalculatorOptions.ext] {
ranges: { begin: 0 end: 33 }
ranges: { begin: 33 end: 35 }
}
}
}
contained_node: {
calculator: "SplitNormalizedLandmarkListCalculator"
options: {
[mediapipe.SplitVectorCalculatorOptions.ext] {
ranges: { begin: 0 end: 25 }
ranges: { begin: 25 end: 27 }
}
}
}
[mediapipe.SplitVectorCalculatorOptions.ext] {
ranges: { begin: 0 end: 33 }
ranges: { begin: 33 end: 35 }
}
}
}
@@ -6,18 +6,18 @@
# "mediapipe/modules/pose_detection/pose_detection.tflite"
# path during execution.
#
# It is required that "pose_landmark_full_body.tflite" or
# "pose_landmark_upper_body.tflite" is available at
# "mediapipe/modules/pose_landmark/pose_landmark_full_body.tflite"
# or
# "mediapipe/modules/pose_landmark/pose_landmark_upper_body.tflite"
# It is required that "pose_landmark_lite.tflite" or
# "pose_landmark_full.tflite" or "pose_landmark_heavy.tflite" is available at
# "mediapipe/modules/pose_landmark/pose_landmark_lite.tflite" or
# "mediapipe/modules/pose_landmark/pose_landmark_full.tflite" or
# "mediapipe/modules/pose_landmark/pose_landmark_heavy.tflite"
# path respectively during execution, depending on the specification in the
# UPPER_BODY_ONLY input side packet.
# MODEL_COMPLEXITY input side packet.
#
# EXAMPLE:
# node {
# calculator: "PoseLandmarkCpu"
# input_side_packet: "UPPER_BODY_ONLY:upper_body_only"
# input_side_packet: "MODEL_COMPLEXITY:model_complexity"
# input_side_packet: "SMOOTH_LANDMARKS:smooth_landmarks"
# input_stream: "IMAGE:image"
# output_stream: "LANDMARKS:pose_landmarks"
@@ -28,20 +28,18 @@ type: "PoseLandmarkCpu"
# CPU image. (ImageFrame)
input_stream: "IMAGE:image"
# Whether to detect/predict the full set of pose landmarks (see below), or only
# those on the upper body. If unspecified, functions as set to false. (bool)
# Note that upper-body-only prediction may be more accurate for use cases where
# the lower-body parts are mostly out of view.
input_side_packet: "UPPER_BODY_ONLY:upper_body_only"
# Whether to filter landmarks across different input images to reduce jitter.
# If unspecified, functions as set to false. (bool)
input_side_packet: "SMOOTH_LANDMARKS:smooth_landmarks"
# Complexity of the pose landmark model: 0, 1 or 2. Landmark accuracy as well as
# inference latency generally go up with the model complexity. If unspecified,
# functions as set to 0. (int)
input_side_packet: "MODEL_COMPLEXITY:model_complexity"
# Pose landmarks within the given ROI. (NormalizedLandmarkList)
# We have 33 landmarks (see pose_landmark_full_body_topology.svg) with the
# first 25 fall on the upper body (see pose_landmark_upper_body_topology.svg),
# and there are other auxiliary key points.
# We have 33 landmarks (see pose_landmark_topology.svg), and there are other
# auxiliary key points.
# 0 - nose
# 1 - left eye (inner)
# 2 - left eye
@@ -164,7 +162,6 @@ node {
# to detect landmarks.
node {
calculator: "PoseDetectionToRoi"
input_side_packet: "UPPER_BODY_ONLY:upper_body_only"
input_stream: "DETECTION:pose_detection"
input_stream: "IMAGE_SIZE:image_size_for_pose_detection"
output_stream: "ROI:pose_rect_from_detection"
@@ -183,7 +180,7 @@ node {
# Detects pose landmarks within specified region of interest of the image.
node {
calculator: "PoseLandmarkByRoiCpu"
input_side_packet: "UPPER_BODY_ONLY:upper_body_only"
input_side_packet: "MODEL_COMPLEXITY:model_complexity"
input_stream: "IMAGE:image"
input_stream: "ROI:pose_rect"
output_stream: "LANDMARKS:unfiltered_pose_landmarks"
Binary file not shown.
@@ -6,18 +6,18 @@
# "mediapipe/modules/pose_detection/pose_detection.tflite"
# path during execution.
#
# It is required that "pose_landmark_full_body.tflite" or
# "pose_landmark_upper_body.tflite" is available at
# "mediapipe/modules/pose_landmark/pose_landmark_full_body.tflite"
# or
# "mediapipe/modules/pose_landmark/pose_landmark_upper_body.tflite"
# It is required that "pose_landmark_lite.tflite" or
# "pose_landmark_full.tflite" or "pose_landmark_heavy.tflite" is available at
# "mediapipe/modules/pose_landmark/pose_landmark_lite.tflite" or
# "mediapipe/modules/pose_landmark/pose_landmark_full.tflite" or
# "mediapipe/modules/pose_landmark/pose_landmark_heavy.tflite"
# path respectively during execution, depending on the specification in the
# UPPER_BODY_ONLY input side packet.
# MODEL_COMPLEXITY input side packet.
#
# EXAMPLE:
# node {
# calculator: "PoseLandmarkGpu"
# input_side_packet: "UPPER_BODY_ONLY:upper_body_only"
# input_side_packet: "MODEL_COMPLEXITY:model_complexity"
# input_side_packet: "SMOOTH_LANDMARKS:smooth_landmarks"
# input_stream: "IMAGE:image"
# output_stream: "LANDMARKS:pose_landmarks"
@@ -28,20 +28,18 @@ type: "PoseLandmarkGpu"
# GPU image. (GpuBuffer)
input_stream: "IMAGE:image"
# Whether to detect/predict the full set of pose landmarks (see below), or only
# those on the upper body. If unspecified, functions as set to false. (bool)
# Note that upper-body-only prediction may be more accurate for use cases where
# the lower-body parts are mostly out of view.
input_side_packet: "UPPER_BODY_ONLY:upper_body_only"
# Whether to filter landmarks across different input images to reduce jitter.
# If unspecified, functions as set to false. (bool)
input_side_packet: "SMOOTH_LANDMARKS:smooth_landmarks"
# Complexity of the pose landmark model: 0, 1 or 2. Landmark accuracy as well as
# inference latency generally go up with the model complexity. If unspecified,
# functions as set to 0. (int)
input_side_packet: "MODEL_COMPLEXITY:model_complexity"
# Pose landmarks within the given ROI. (NormalizedLandmarkList)
# We have 33 landmarks (see pose_landmark_full_body_topology.svg) with the
# first 25 fall on the upper body (see pose_landmark_upper_body_topology.svg),
# and there are other auxiliary key points.
# We have 33 landmarks (see pose_landmark_topology.svg), and there are other
# auxiliary key points.
# 0 - nose
# 1 - left eye (inner)
# 2 - left eye
@@ -164,7 +162,6 @@ node {
# to detect landmarks.
node {
calculator: "PoseDetectionToRoi"
input_side_packet: "UPPER_BODY_ONLY:upper_body_only"
input_stream: "DETECTION:pose_detection"
input_stream: "IMAGE_SIZE:image_size_for_pose_detection"
output_stream: "ROI:pose_rect_from_detection"
@@ -183,7 +180,7 @@ node {
# Detects pose landmarks within specified region of interest of the image.
node {
calculator: "PoseLandmarkByRoiGpu"
input_side_packet: "UPPER_BODY_ONLY:upper_body_only"
input_side_packet: "MODEL_COMPLEXITY:model_complexity"
input_stream: "IMAGE:image"
input_stream: "ROI:pose_rect"
output_stream: "LANDMARKS:unfiltered_pose_landmarks"
Binary file not shown.
Binary file not shown.
@@ -2,18 +2,19 @@
type: "PoseLandmarkModelLoader"
# Whether to load the full-body landmark model or the upper-body on. (bool)
input_side_packet: "UPPER_BODY_ONLY:upper_body_only"
# Complexity of the pose landmark model: 0, 1 or 2. Landmark accuracy as well as
# inference latency generally go up with the model complexity. If unspecified,
# functions as set to 0. (int)
input_side_packet: "MODEL_COMPLEXITY:model_complexity"
# TF Lite model represented as a FlatBuffer.
# (std::unique_ptr<tflite::FlatBufferModel, std::function<void(tflite::FlatBufferModel*)>>)
output_side_packet: "MODEL:model"
# Determines path to the desired pose landmark model file based on specification
# in the input side packet.
# Determines path to the desired pose landmark model file.
node {
calculator: "SwitchContainer"
input_side_packet: "ENABLE:upper_body_only"
input_side_packet: "SELECT:model_complexity"
output_side_packet: "PACKET:model_path"
options: {
[mediapipe.SwitchContainerOptions.ext] {
@@ -22,7 +23,7 @@ node {
options: {
[mediapipe.ConstantSidePacketCalculatorOptions.ext]: {
packet {
string_value: "mediapipe/modules/pose_landmark/pose_landmark_full_body.tflite"
string_value: "mediapipe/modules/pose_landmark/pose_landmark_lite.tflite"
}
}
}
@@ -32,7 +33,17 @@ node {
options: {
[mediapipe.ConstantSidePacketCalculatorOptions.ext]: {
packet {
string_value: "mediapipe/modules/pose_landmark/pose_landmark_upper_body.tflite"
string_value: "mediapipe/modules/pose_landmark/pose_landmark_full.tflite"
}
}
}
}
contained_node: {
calculator: "ConstantSidePacketCalculator"
options: {
[mediapipe.ConstantSidePacketCalculatorOptions.ext]: {
packet {
string_value: "mediapipe/modules/pose_landmark/pose_landmark_heavy.tflite"
}
}
}
@@ -11,7 +11,7 @@
width="1000"
height="1400"
viewBox="0 0 1000 1400"
sodipodi:docname="pose_landmark_full_body_topology.svg">
sodipodi:docname="pose_landmark_topology.svg">
<defs
id="defs905">
<marker

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 26 KiB

@@ -1,91 +0,0 @@
# MediaPipe graph to detect/predict pose landmarks. (CPU input, and inference is
# executed on CPU.) This graph tries to skip pose detection as much as possible
# by using previously detected/predicted landmarks for new images.
#
# It is required that "pose_detection.tflite" is available at
# "mediapipe/modules/pose_detection/pose_detection.tflite"
# path during execution.
#
# It is required that "pose_landmark_upper_body.tflite" is available at
# "mediapipe/modules/pose_landmark/pose_landmark_upper_body.tflite"
# path during execution.
#
# EXAMPLE:
# node {
# calculator: "PoseLandmarkUpperBodyCpu"
# input_side_packet: "SMOOTH_LANDMARKS:smooth_landmarks"
# input_stream: "IMAGE:image"
# output_stream: "LANDMARKS:pose_landmarks"
# }
type: "PoseLandmarkUpperBodyCpu"
# CPU image. (ImageFrame)
input_stream: "IMAGE:image"
# Whether to filter landmarks across different input images to reduce jitter.
# If unspecified, functions as set to false. (bool)
input_side_packet: "SMOOTH_LANDMARKS:smooth_landmarks"
# Pose landmarks within the given ROI. (NormalizedLandmarkList)
# We have 25 (upper-body) landmarks (see pose_landmark_upper_body_topology.svg).
# 0 - nose
# 1 - left eye (inner)
# 2 - left eye
# 3 - left eye (outer)
# 4 - right eye (inner)
# 5 - right eye
# 6 - right eye (outer)
# 7 - left ear
# 8 - right ear
# 9 - mouth (left)
# 10 - mouth (right)
# 11 - left shoulder
# 12 - right shoulder
# 13 - left elbow
# 14 - right elbow
# 15 - left wrist
# 16 - right wrist
# 17 - left pinky
# 18 - right pinky
# 19 - left index
# 20 - right index
# 21 - left thumb
# 22 - right thumb
# 23 - left hip
# 24 - right hip
#
# NOTE: if a pose is not present within the given ROI, for this particular
# timestamp there will not be an output packet in the LANDMARKS stream. However,
# the MediaPipe framework will internally inform the downstream calculators of
# the absence of this packet so that they don't wait for it unnecessarily.
output_stream: "LANDMARKS:pose_landmarks"
# Extra outputs (for debugging, for instance).
# Detected poses. (Detection)
output_stream: "DETECTION:pose_detection"
# Regions of interest calculated based on landmarks. (NormalizedRect)
output_stream: "ROI_FROM_LANDMARKS:pose_rect_from_landmarks"
# Regions of interest calculated based on pose detections. (NormalizedRect)
output_stream: "ROI_FROM_DETECTION:pose_rect_from_detection"
node {
calculator: "ConstantSidePacketCalculator"
output_side_packet: "PACKET:upper_body_only"
options: {
[mediapipe.ConstantSidePacketCalculatorOptions.ext]: {
packet { bool_value: true }
}
}
}
node {
calculator: "PoseLandmarkCpu"
input_side_packet: "UPPER_BODY_ONLY:upper_body_only"
input_side_packet: "SMOOTH_LANDMARKS:smooth_landmarks"
input_stream: "IMAGE:image"
output_stream: "LANDMARKS:pose_landmarks"
output_stream: "DETECTION:pose_detection"
output_stream: "ROI_FROM_LANDMARKS:pose_rect_from_landmarks"
output_stream: "ROI_FROM_DETECTION:pose_rect_from_detection"
}
@@ -1,91 +0,0 @@
# MediaPipe graph to detect/predict pose landmarks. (GPU input, and inference is
# executed on GPU.) This graph tries to skip pose detection as much as possible
# by using previously detected/predicted landmarks for new images.
#
# It is required that "pose_detection.tflite" is available at
# "mediapipe/modules/pose_detection/pose_detection.tflite"
# path during execution.
#
# It is required that "pose_landmark_upper_body.tflite" is available at
# "mediapipe/modules/pose_landmark/pose_landmark_upper_body.tflite"
# path during execution.
#
# EXAMPLE:
# node {
# calculator: "PoseLandmarkUpperBodyGpu"
# input_side_packet: "SMOOTH_LANDMARKS:smooth_landmarks"
# input_stream: "IMAGE:image"
# output_stream: "LANDMARKS:pose_landmarks"
# }
type: "PoseLandmarkUpperBodyGpu"
# GPU image. (GpuBuffer)
input_stream: "IMAGE:image"
# Whether to filter landmarks across different input images to reduce jitter.
# If unspecified, functions as set to false. (bool)
input_side_packet: "SMOOTH_LANDMARKS:smooth_landmarks"
# Pose landmarks within the given ROI. (NormalizedLandmarkList)
# We have 25 (upper-body) landmarks (see pose_landmark_upper_body_topology.svg).
# 0 - nose
# 1 - left eye (inner)
# 2 - left eye
# 3 - left eye (outer)
# 4 - right eye (inner)
# 5 - right eye
# 6 - right eye (outer)
# 7 - left ear
# 8 - right ear
# 9 - mouth (left)
# 10 - mouth (right)
# 11 - left shoulder
# 12 - right shoulder
# 13 - left elbow
# 14 - right elbow
# 15 - left wrist
# 16 - right wrist
# 17 - left pinky
# 18 - right pinky
# 19 - left index
# 20 - right index
# 21 - left thumb
# 22 - right thumb
# 23 - left hip
# 24 - right hip
#
# NOTE: if a pose is not present within the given ROI, for this particular
# timestamp there will not be an output packet in the LANDMARKS stream. However,
# the MediaPipe framework will internally inform the downstream calculators of
# the absence of this packet so that they don't wait for it unnecessarily.
output_stream: "LANDMARKS:pose_landmarks"
# Extra outputs (for debugging, for instance).
# Detected poses. (Detection)
output_stream: "DETECTION:pose_detection"
# Regions of interest calculated based on landmarks. (NormalizedRect)
output_stream: "ROI_FROM_LANDMARKS:pose_rect_from_landmarks"
# Regions of interest calculated based on pose detections. (NormalizedRect)
output_stream: "ROI_FROM_DETECTION:pose_rect_from_detection"
node {
calculator: "ConstantSidePacketCalculator"
output_side_packet: "PACKET:upper_body_only"
options: {
[mediapipe.ConstantSidePacketCalculatorOptions.ext]: {
packet { bool_value: true }
}
}
}
node {
calculator: "PoseLandmarkGpu"
input_side_packet: "UPPER_BODY_ONLY:upper_body_only"
input_side_packet: "SMOOTH_LANDMARKS:smooth_landmarks"
input_stream: "IMAGE:image"
output_stream: "LANDMARKS:pose_landmarks"
output_stream: "DETECTION:pose_detection"
output_stream: "ROI_FROM_LANDMARKS:pose_rect_from_landmarks"
output_stream: "ROI_FROM_DETECTION:pose_rect_from_detection"
}
@@ -1,514 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
version="1.1"
id="svg901"
width="1000"
height="1000"
viewBox="0 0 1000 1000"
sodipodi:docname="pose_landmark_upper_body_topology.svg">
<defs
id="defs905">
<marker
orient="auto"
refY="0"
refX="0"
id="DotL"
style="overflow:visible">
<path
id="path1015"
d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
transform="matrix(0.8,0,0,0.8,5.92,0.8)" />
</marker>
</defs>
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
id="namedview903"
showgrid="false" />
<g
id="layer4"
transform="translate(-4)">
<ellipse
ry="126.60618"
rx="111.30894"
cy="305.81415"
cx="505.18814"
id="path1424"
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1.96674;stroke-miterlimit:4;stroke-dasharray:3.9335, 3.9335;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal" />
</g>
<g
id="layer1"
style="display:inline"
transform="translate(-4)">
<path
id="path915"
d="m 89.266999,515.88093 31.432341,-69.15117 50.29176,67.05568 z"
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:9.07087;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
id="path919"
d="m 175.95642,465.32495 -4.96532,48.46049 92.20155,41.9098 96.39253,-92.20155 46.10078,259.84073 H 600.5665 L 648.76282,463.49369 H 359.58518"
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:9.07087;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
sodipodi:nodetypes="cccccccc" />
<path
id="path921"
d="m 648.76282,463.49369 94.29696,96.39252 94.29708,-44.00528 -2.09544,-52.38724"
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:9.07087;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
id="path923"
d="m 887.64862,446.72976 -50.29176,69.15117 77.53308,-4.19098 z"
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:9.07087;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
style="fill:none;stroke:#000000;stroke-width:9.07087;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
d="m 399.14743,295.40655 53.09262,-24.12475 51.926,49.7624 51.92599,-49.7624 54.59156,24.12475"
id="path950"
sodipodi:nodetypes="ccccc" />
<path
style="fill:none;stroke:#000000;stroke-width:9.07087;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 473.87588,362.15229 h 58.41674"
id="path952" />
</g>
<g
id="layer2"
style="display:inline"
transform="translate(-4)">
<circle
r="8.8288517"
style="fill:#de2b00;fill-opacity:1;stroke:#000000;stroke-width:1.5423;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
id="path1237"
cx="404.98865"
cy="294.37057" />
<circle
r="8.8288517"
cy="269.62979"
cx="431.4061"
id="ellipse1275"
style="fill:#de2b00;fill-opacity:1;stroke:#000000;stroke-width:1.5423;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" />
<circle
r="8.8288517"
style="fill:#de2b00;fill-opacity:1;stroke:#000000;stroke-width:1.5423;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
id="ellipse1277"
cx="452.83154"
cy="269.62979" />
<circle
r="8.8288517"
cy="270.17917"
cx="473.70761"
id="ellipse1279"
style="fill:#de2b00;fill-opacity:1;stroke:#000000;stroke-width:1.5423;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" />
<circle
r="8.8288517"
style="fill:#de2b00;fill-opacity:1;stroke:#000000;stroke-width:1.5423;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
id="ellipse1281"
cx="535.23712"
cy="271.27792" />
<circle
r="8.8288517"
cy="271.27792"
cx="556.6626"
id="ellipse1283"
style="fill:#de2b00;fill-opacity:1;stroke:#000000;stroke-width:1.5423;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" />
<circle
r="8.8288517"
style="fill:#de2b00;fill-opacity:1;stroke:#000000;stroke-width:1.5423;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
id="ellipse1285"
cx="577.53864"
cy="271.82727" />
<circle
r="8.8288517"
cy="320.92383"
cx="503.92303"
id="ellipse1287"
style="fill:#de2b00;fill-opacity:1;stroke:#000000;stroke-width:1.5423;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" />
<circle
r="8.8288517"
style="fill:#de2b00;fill-opacity:1;stroke:#000000;stroke-width:1.5423;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
id="ellipse1289"
cx="610.31799"
cy="297.1174" />
<circle
r="8.8288517"
cy="362.67599"
cx="534.13843"
id="ellipse1291"
style="fill:#de2b00;fill-opacity:1;stroke:#000000;stroke-width:1.5423;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" />
<circle
r="8.8288517"
style="fill:#de2b00;fill-opacity:1;stroke:#000000;stroke-width:1.5423;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
id="ellipse1293"
cx="475.90512"
cy="362.67599" />
<circle
r="8.8288517"
cy="462.78937"
cx="359.83167"
id="ellipse1295"
style="fill:#de2b00;fill-opacity:1;stroke:#000000;stroke-width:1.5423;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" />
<circle
r="8.8288517"
style="fill:#de2b00;fill-opacity:1;stroke:#000000;stroke-width:1.5423;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
id="ellipse1297"
cx="648.56439"
cy="462.78937" />
<circle
r="8.8288517"
cy="560.00092"
cx="742.87408"
id="ellipse1299"
style="fill:#de2b00;fill-opacity:1;stroke:#000000;stroke-width:1.5423;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" />
<circle
r="8.8288517"
style="fill:#de2b00;fill-opacity:1;stroke:#000000;stroke-width:1.5423;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
id="ellipse1301"
cx="837.18384"
cy="516.47339" />
<circle
r="8.8288517"
cy="470.04398"
cx="835.73291"
id="ellipse1303"
style="fill:#de2b00;fill-opacity:1;stroke:#000000;stroke-width:1.5423;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" />
<circle
r="8.8288517"
style="fill:#de2b00;fill-opacity:1;stroke:#000000;stroke-width:1.5423;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
id="ellipse1305"
cx="887.96594"
cy="446.82925" />
<circle
r="8.8288517"
cy="510.66968"
cx="914.08246"
id="ellipse1307"
style="fill:#de2b00;fill-opacity:1;stroke:#000000;stroke-width:1.5423;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" />
<circle
r="8.8288517"
style="fill:#de2b00;fill-opacity:1;stroke:#000000;stroke-width:1.5423;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
id="ellipse1309"
cx="91.41188"
cy="516.47339" />
<circle
r="8.8288517"
cy="448.28018"
cx="118.97932"
id="ellipse1311"
style="fill:#de2b00;fill-opacity:1;stroke:#000000;stroke-width:1.5423;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" />
<circle
r="8.8288517"
style="fill:#de2b00;fill-opacity:1;stroke:#000000;stroke-width:1.5423;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
id="ellipse1313"
cx="175.51056"
cy="468.59305" />
<circle
r="8.8288517"
cy="510.66965"
cx="168.31055"
id="ellipse1315"
style="fill:#de2b00;fill-opacity:1;stroke:#000000;stroke-width:1.5423;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" />
<circle
r="8.8288517"
style="fill:#de2b00;fill-opacity:1;stroke:#000000;stroke-width:1.5423;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
id="ellipse1317"
cx="261.16931"
cy="554.1972" />
<circle
r="8.8288517"
cy="722.50366"
cx="403.35931"
id="ellipse1319"
style="fill:#de2b00;fill-opacity:1;stroke:#000000;stroke-width:1.5423;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" />
<circle
r="8.8288517"
style="fill:#de2b00;fill-opacity:1;stroke:#000000;stroke-width:1.5423;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
id="ellipse1321"
cx="600.68414"
cy="722.50366" />
</g>
<g
id="layer3"
transform="translate(-4)">
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:48px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.2"
x="419.60342"
y="255.16025"
id="text1326"><tspan
sodipodi:role="line"
id="tspan1324"
x="419.60342"
y="255.16025"
style="font-size:32px;stroke-width:1.2">6</tspan></text>
<text
id="text1330"
y="255.16025"
x="442.68222"
style="font-style:normal;font-weight:normal;font-size:48px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.2"
xml:space="preserve"><tspan
style="font-size:32px;stroke-width:1.2"
y="255.16025"
x="442.68222"
id="tspan1328"
sodipodi:role="line">5</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:48px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.2"
x="464.07236"
y="255.16025"
id="text1334"><tspan
sodipodi:role="line"
id="tspan1332"
x="464.07236"
y="255.16025"
style="font-size:32px;stroke-width:1.2">4</tspan></text>
<text
id="text1338"
y="255.16025"
x="524.30243"
style="font-style:normal;font-weight:normal;font-size:48px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.2"
xml:space="preserve"><tspan
style="font-size:32px;stroke-width:1.2"
y="255.16025"
x="524.30243"
id="tspan1336"
sodipodi:role="line">1</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:48px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.2"
x="546.92578"
y="255.16025"
id="text1342"><tspan
sodipodi:role="line"
id="tspan1340"
x="546.92578"
y="255.16025"
style="font-size:32px;stroke-width:1.2">2</tspan></text>
<text
id="text1346"
y="255.16025"
x="568.77136"
style="font-style:normal;font-weight:normal;font-size:48px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.2"
xml:space="preserve"><tspan
style="font-size:32px;stroke-width:1.2"
y="255.16025"
x="568.77136"
id="tspan1344"
sodipodi:role="line">3</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:48px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.2"
x="493.90598"
y="303.00659"
id="text1350"><tspan
sodipodi:role="line"
id="tspan1348"
x="493.90598"
y="303.00659"
style="font-size:32px;stroke-width:1.2">0</tspan></text>
<text
id="text1354"
y="309.91464"
x="368.57889"
style="font-style:normal;font-weight:normal;font-size:48px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.2"
xml:space="preserve"><tspan
style="font-size:32px;stroke-width:1.2"
y="309.91464"
x="368.57889"
id="tspan1352"
sodipodi:role="line">8</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:48px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.2"
x="623.38293"
y="310.21472"
id="text1358"><tspan
sodipodi:role="line"
id="tspan1356"
x="623.38293"
y="310.21472"
style="font-size:32px;stroke-width:1.2">7</tspan></text>
<text
id="text1362"
y="374.48364"
x="428.60062"
style="font-style:normal;font-weight:normal;font-size:48px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.2"
xml:space="preserve"><tspan
style="font-size:32px;stroke-width:1.2"
y="374.48364"
x="428.60062"
id="tspan1360"
sodipodi:role="line">10</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:48px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.2"
x="544.67633"
y="376.58969"
id="text1366"><tspan
sodipodi:role="line"
id="tspan1364"
x="544.67633"
y="376.58969"
style="font-size:32px;stroke-width:1.2">9</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:48px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.2"
x="338.9014"
y="445.61142"
id="text1370"><tspan
sodipodi:role="line"
id="tspan1368"
x="338.9014"
y="445.61142"
style="font-size:32px;stroke-width:1.2">12</tspan></text>
<text
id="text1374"
y="445.61142"
x="630.0719"
style="font-style:normal;font-weight:normal;font-size:48px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.2"
xml:space="preserve"><tspan
style="font-size:32px;stroke-width:1.2"
y="445.61142"
x="630.0719"
id="tspan1372"
sodipodi:role="line">11</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:48px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.2"
x="817.3042"
y="445.61142"
id="text1378"><tspan
sodipodi:role="line"
id="tspan1376"
x="817.3042"
y="445.61142"
style="font-size:32px;stroke-width:1.2">21</tspan></text>
<text
id="text1382"
y="447.44272"
x="161.83781"
style="font-style:normal;font-weight:normal;font-size:48px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.2"
xml:space="preserve"><tspan
style="font-size:32px;stroke-width:1.2"
y="447.44272"
x="161.83781"
id="tspan1380"
sodipodi:role="line">22</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:48px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.2"
x="97.174942"
y="427.29883"
id="text1386"><tspan
sodipodi:role="line"
id="tspan1384"
x="97.174942"
y="427.29883"
style="font-size:32px;stroke-width:1.2">20</tspan></text>
<text
id="text1390"
y="557.31836"
x="62.824665"
style="font-style:normal;font-weight:normal;font-size:48px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.2"
xml:space="preserve"><tspan
style="font-size:32px;stroke-width:1.2"
y="557.31836"
x="62.824665"
id="tspan1388"
sodipodi:role="line">18</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:48px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.2"
x="145.23141"
y="559.1496"
id="text1394"><tspan
sodipodi:role="line"
id="tspan1392"
x="145.23141"
y="559.1496"
style="font-size:32px;stroke-width:1.2">16</tspan></text>
<text
id="text1398"
y="531.68073"
x="238.75079"
style="font-style:normal;font-weight:normal;font-size:48px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.2"
xml:space="preserve"><tspan
style="font-size:32px;stroke-width:1.2"
y="531.68073"
x="238.75079"
id="tspan1396"
sodipodi:role="line">14</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:48px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.2"
x="724.7287"
y="535.3432"
id="text1402"><tspan
sodipodi:role="line"
id="tspan1400"
x="724.7287"
y="535.3432"
style="font-size:32px;stroke-width:1.2">13</tspan></text>
<text
id="text1406"
y="560.9809"
x="826.46051"
style="font-style:normal;font-weight:normal;font-size:48px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.2"
xml:space="preserve"><tspan
style="font-size:32px;stroke-width:1.2"
y="560.9809"
x="826.46051"
id="tspan1404"
sodipodi:role="line">15</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:48px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.2"
x="913.7923"
y="551.94958"
id="text1410"><tspan
sodipodi:role="line"
id="tspan1408"
x="913.7923"
y="551.94958"
style="font-size:32px;stroke-width:1.2">17</tspan></text>
<text
id="text1414"
y="432.79257"
x="896.0484"
style="font-style:normal;font-weight:normal;font-size:48px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.2"
xml:space="preserve"><tspan
style="font-size:32px;stroke-width:1.2"
y="432.79257"
x="896.0484"
id="tspan1412"
sodipodi:role="line">19</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:48px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.2"
x="615.86548"
y="735.64441"
id="text1418"><tspan
sodipodi:role="line"
id="tspan1416"
x="615.86548"
y="735.64441"
style="font-size:32px;stroke-width:1.2">23</tspan></text>
<text
id="text1422"
y="736.78186"
x="346.6701"
style="font-style:normal;font-weight:normal;font-size:48px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.2"
xml:space="preserve"><tspan
style="font-size:32px;stroke-width:1.2"
y="736.78186"
x="346.6701"
id="tspan1420"
sodipodi:role="line">24</tspan></text>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 21 KiB

@@ -43,8 +43,8 @@ node {
output_stream: "roi"
options: {
[mediapipe.RectTransformationCalculatorOptions.ext] {
scale_x: 1.5
scale_y: 1.5
scale_x: 1.25
scale_y: 1.25
square_long: true
}
}