Project import generated by Copybara.
GitOrigin-RevId: ff83882955f1a1e2a043ff4e71278be9d7217bbe
This commit is contained in:
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"
|
||||
|
||||
Binary file not shown.
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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",
|
||||
],
|
||||
)
|
||||
|
||||
|
||||
@@ -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.
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"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -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 |
Binary file not shown.
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user