mediapipe-nightly 0.10.21.post20241223__cp311-cp311-manylinux_2_28_x86_64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- mediapipe/__init__.py +26 -0
- mediapipe/calculators/__init__.py +0 -0
- mediapipe/calculators/audio/__init__.py +0 -0
- mediapipe/calculators/audio/mfcc_mel_calculators_pb2.py +33 -0
- mediapipe/calculators/audio/rational_factor_resample_calculator_pb2.py +33 -0
- mediapipe/calculators/audio/spectrogram_calculator_pb2.py +37 -0
- mediapipe/calculators/audio/stabilized_log_calculator_pb2.py +31 -0
- mediapipe/calculators/audio/time_series_framer_calculator_pb2.py +33 -0
- mediapipe/calculators/core/__init__.py +0 -0
- mediapipe/calculators/core/bypass_calculator_pb2.py +31 -0
- mediapipe/calculators/core/clip_vector_size_calculator_pb2.py +31 -0
- mediapipe/calculators/core/concatenate_vector_calculator_pb2.py +31 -0
- mediapipe/calculators/core/constant_side_packet_calculator_pb2.py +39 -0
- mediapipe/calculators/core/dequantize_byte_array_calculator_pb2.py +31 -0
- mediapipe/calculators/core/flow_limiter_calculator_pb2.py +32 -0
- mediapipe/calculators/core/gate_calculator_pb2.py +33 -0
- mediapipe/calculators/core/get_vector_item_calculator_pb2.py +31 -0
- mediapipe/calculators/core/graph_profile_calculator_pb2.py +31 -0
- mediapipe/calculators/core/packet_cloner_calculator_pb2.py +31 -0
- mediapipe/calculators/core/packet_resampler_calculator_pb2.py +33 -0
- mediapipe/calculators/core/packet_thinner_calculator_pb2.py +33 -0
- mediapipe/calculators/core/quantize_float_vector_calculator_pb2.py +31 -0
- mediapipe/calculators/core/sequence_shift_calculator_pb2.py +31 -0
- mediapipe/calculators/core/split_vector_calculator_pb2.py +33 -0
- mediapipe/calculators/image/__init__.py +0 -0
- mediapipe/calculators/image/bilateral_filter_calculator_pb2.py +31 -0
- mediapipe/calculators/image/feature_detector_calculator_pb2.py +31 -0
- mediapipe/calculators/image/image_clone_calculator_pb2.py +31 -0
- mediapipe/calculators/image/image_cropping_calculator_pb2.py +33 -0
- mediapipe/calculators/image/image_transformation_calculator_pb2.py +38 -0
- mediapipe/calculators/image/mask_overlay_calculator_pb2.py +33 -0
- mediapipe/calculators/image/opencv_encoded_image_to_image_frame_calculator_pb2.py +31 -0
- mediapipe/calculators/image/opencv_image_encoder_calculator_pb2.py +35 -0
- mediapipe/calculators/image/recolor_calculator_pb2.py +34 -0
- mediapipe/calculators/image/rotation_mode_pb2.py +29 -0
- mediapipe/calculators/image/scale_image_calculator_pb2.py +34 -0
- mediapipe/calculators/image/segmentation_smoothing_calculator_pb2.py +31 -0
- mediapipe/calculators/image/set_alpha_calculator_pb2.py +31 -0
- mediapipe/calculators/image/warp_affine_calculator_pb2.py +36 -0
- mediapipe/calculators/internal/__init__.py +0 -0
- mediapipe/calculators/internal/callback_packet_calculator_pb2.py +33 -0
- mediapipe/calculators/tensor/__init__.py +0 -0
- mediapipe/calculators/tensor/audio_to_tensor_calculator_pb2.py +35 -0
- mediapipe/calculators/tensor/bert_preprocessor_calculator_pb2.py +31 -0
- mediapipe/calculators/tensor/feedback_tensors_calculator_pb2.py +37 -0
- mediapipe/calculators/tensor/image_to_tensor_calculator_pb2.py +40 -0
- mediapipe/calculators/tensor/inference_calculator_pb2.py +63 -0
- mediapipe/calculators/tensor/landmarks_to_tensor_calculator_pb2.py +33 -0
- mediapipe/calculators/tensor/regex_preprocessor_calculator_pb2.py +31 -0
- mediapipe/calculators/tensor/tensor_converter_calculator_pb2.py +34 -0
- mediapipe/calculators/tensor/tensor_to_joints_calculator_pb2.py +31 -0
- mediapipe/calculators/tensor/tensors_readback_calculator_pb2.py +35 -0
- mediapipe/calculators/tensor/tensors_to_audio_calculator_pb2.py +33 -0
- mediapipe/calculators/tensor/tensors_to_classification_calculator_pb2.py +44 -0
- mediapipe/calculators/tensor/tensors_to_detections_calculator_pb2.py +39 -0
- mediapipe/calculators/tensor/tensors_to_floats_calculator_pb2.py +33 -0
- mediapipe/calculators/tensor/tensors_to_landmarks_calculator_pb2.py +33 -0
- mediapipe/calculators/tensor/tensors_to_segmentation_calculator_pb2.py +34 -0
- mediapipe/calculators/tensor/vector_to_tensor_calculator_pb2.py +27 -0
- mediapipe/calculators/tflite/__init__.py +0 -0
- mediapipe/calculators/tflite/ssd_anchors_calculator_pb2.py +32 -0
- mediapipe/calculators/tflite/tflite_converter_calculator_pb2.py +33 -0
- mediapipe/calculators/tflite/tflite_custom_op_resolver_calculator_pb2.py +31 -0
- mediapipe/calculators/tflite/tflite_inference_calculator_pb2.py +49 -0
- mediapipe/calculators/tflite/tflite_tensors_to_classification_calculator_pb2.py +31 -0
- mediapipe/calculators/tflite/tflite_tensors_to_detections_calculator_pb2.py +31 -0
- mediapipe/calculators/tflite/tflite_tensors_to_landmarks_calculator_pb2.py +33 -0
- mediapipe/calculators/tflite/tflite_tensors_to_segmentation_calculator_pb2.py +31 -0
- mediapipe/calculators/util/__init__.py +0 -0
- mediapipe/calculators/util/align_hand_to_pose_in_world_calculator_pb2.py +31 -0
- mediapipe/calculators/util/annotation_overlay_calculator_pb2.py +32 -0
- mediapipe/calculators/util/association_calculator_pb2.py +31 -0
- mediapipe/calculators/util/collection_has_min_size_calculator_pb2.py +31 -0
- mediapipe/calculators/util/combine_joints_calculator_pb2.py +36 -0
- mediapipe/calculators/util/detection_label_id_to_text_calculator_pb2.py +36 -0
- mediapipe/calculators/util/detections_to_rects_calculator_pb2.py +33 -0
- mediapipe/calculators/util/detections_to_render_data_calculator_pb2.py +33 -0
- mediapipe/calculators/util/face_to_rect_calculator_pb2.py +26 -0
- mediapipe/calculators/util/filter_detections_calculator_pb2.py +31 -0
- mediapipe/calculators/util/flat_color_image_calculator_pb2.py +32 -0
- mediapipe/calculators/util/labels_to_render_data_calculator_pb2.py +34 -0
- mediapipe/calculators/util/landmark_projection_calculator_pb2.py +31 -0
- mediapipe/calculators/util/landmarks_refinement_calculator_pb2.py +41 -0
- mediapipe/calculators/util/landmarks_smoothing_calculator_pb2.py +33 -0
- mediapipe/calculators/util/landmarks_to_detection_calculator_pb2.py +31 -0
- mediapipe/calculators/util/landmarks_to_floats_calculator_pb2.py +31 -0
- mediapipe/calculators/util/landmarks_to_render_data_calculator_pb2.py +32 -0
- mediapipe/calculators/util/landmarks_transformation_calculator_pb2.py +37 -0
- mediapipe/calculators/util/latency_pb2.py +26 -0
- mediapipe/calculators/util/local_file_contents_calculator_pb2.py +31 -0
- mediapipe/calculators/util/logic_calculator_pb2.py +34 -0
- mediapipe/calculators/util/non_max_suppression_calculator_pb2.py +35 -0
- mediapipe/calculators/util/packet_frequency_calculator_pb2.py +31 -0
- mediapipe/calculators/util/packet_frequency_pb2.py +26 -0
- mediapipe/calculators/util/packet_latency_calculator_pb2.py +31 -0
- mediapipe/calculators/util/rect_to_render_data_calculator_pb2.py +32 -0
- mediapipe/calculators/util/rect_to_render_scale_calculator_pb2.py +31 -0
- mediapipe/calculators/util/rect_transformation_calculator_pb2.py +31 -0
- mediapipe/calculators/util/refine_landmarks_from_heatmap_calculator_pb2.py +31 -0
- mediapipe/calculators/util/resource_provider_calculator_pb2.py +28 -0
- mediapipe/calculators/util/set_joints_visibility_calculator_pb2.py +41 -0
- mediapipe/calculators/util/thresholding_calculator_pb2.py +31 -0
- mediapipe/calculators/util/timed_box_list_id_to_label_calculator_pb2.py +31 -0
- mediapipe/calculators/util/timed_box_list_to_render_data_calculator_pb2.py +32 -0
- mediapipe/calculators/util/top_k_scores_calculator_pb2.py +31 -0
- mediapipe/calculators/util/visibility_copy_calculator_pb2.py +27 -0
- mediapipe/calculators/util/visibility_smoothing_calculator_pb2.py +31 -0
- mediapipe/calculators/video/__init__.py +0 -0
- mediapipe/calculators/video/box_detector_calculator_pb2.py +32 -0
- mediapipe/calculators/video/box_tracker_calculator_pb2.py +32 -0
- mediapipe/calculators/video/flow_packager_calculator_pb2.py +32 -0
- mediapipe/calculators/video/flow_to_image_calculator_pb2.py +31 -0
- mediapipe/calculators/video/motion_analysis_calculator_pb2.py +42 -0
- mediapipe/calculators/video/opencv_video_encoder_calculator_pb2.py +31 -0
- mediapipe/calculators/video/tool/__init__.py +0 -0
- mediapipe/calculators/video/tool/flow_quantizer_model_pb2.py +26 -0
- mediapipe/calculators/video/tracked_detection_manager_calculator_pb2.py +32 -0
- mediapipe/calculators/video/video_pre_stream_calculator_pb2.py +35 -0
- mediapipe/examples/__init__.py +14 -0
- mediapipe/examples/desktop/__init__.py +14 -0
- mediapipe/framework/__init__.py +0 -0
- mediapipe/framework/calculator_options_pb2.py +29 -0
- mediapipe/framework/calculator_pb2.py +59 -0
- mediapipe/framework/calculator_profile_pb2.py +48 -0
- mediapipe/framework/deps/__init__.py +0 -0
- mediapipe/framework/deps/proto_descriptor_pb2.py +29 -0
- mediapipe/framework/formats/__init__.py +0 -0
- mediapipe/framework/formats/affine_transform_data_pb2.py +28 -0
- mediapipe/framework/formats/annotation/__init__.py +0 -0
- mediapipe/framework/formats/annotation/locus_pb2.py +32 -0
- mediapipe/framework/formats/annotation/rasterization_pb2.py +29 -0
- mediapipe/framework/formats/body_rig_pb2.py +28 -0
- mediapipe/framework/formats/classification_pb2.py +31 -0
- mediapipe/framework/formats/detection_pb2.py +36 -0
- mediapipe/framework/formats/image_file_properties_pb2.py +26 -0
- mediapipe/framework/formats/image_format_pb2.py +29 -0
- mediapipe/framework/formats/landmark_pb2.py +37 -0
- mediapipe/framework/formats/location_data_pb2.py +38 -0
- mediapipe/framework/formats/matrix_data_pb2.py +31 -0
- mediapipe/framework/formats/motion/__init__.py +0 -0
- mediapipe/framework/formats/motion/optical_flow_field_data_pb2.py +30 -0
- mediapipe/framework/formats/object_detection/__init__.py +0 -0
- mediapipe/framework/formats/object_detection/anchor_pb2.py +26 -0
- mediapipe/framework/formats/rect_pb2.py +29 -0
- mediapipe/framework/formats/time_series_header_pb2.py +28 -0
- mediapipe/framework/graph_runtime_info_pb2.py +31 -0
- mediapipe/framework/mediapipe_options_pb2.py +27 -0
- mediapipe/framework/packet_factory_pb2.py +31 -0
- mediapipe/framework/packet_generator_pb2.py +33 -0
- mediapipe/framework/status_handler_pb2.py +28 -0
- mediapipe/framework/stream_handler/__init__.py +0 -0
- mediapipe/framework/stream_handler/default_input_stream_handler_pb2.py +27 -0
- mediapipe/framework/stream_handler/fixed_size_input_stream_handler_pb2.py +27 -0
- mediapipe/framework/stream_handler/sync_set_input_stream_handler_pb2.py +29 -0
- mediapipe/framework/stream_handler/timestamp_align_input_stream_handler_pb2.py +27 -0
- mediapipe/framework/stream_handler_pb2.py +30 -0
- mediapipe/framework/test_calculators_pb2.py +31 -0
- mediapipe/framework/thread_pool_executor_pb2.py +29 -0
- mediapipe/framework/tool/__init__.py +0 -0
- mediapipe/framework/tool/calculator_graph_template_pb2.py +44 -0
- mediapipe/framework/tool/field_data_pb2.py +28 -0
- mediapipe/framework/tool/node_chain_subgraph_pb2.py +31 -0
- mediapipe/framework/tool/packet_generator_wrapper_calculator_pb2.py +28 -0
- mediapipe/framework/tool/source_pb2.py +33 -0
- mediapipe/framework/tool/switch_container_pb2.py +32 -0
- mediapipe/gpu/__init__.py +0 -0
- mediapipe/gpu/copy_calculator_pb2.py +33 -0
- mediapipe/gpu/gl_animation_overlay_calculator_pb2.py +31 -0
- mediapipe/gpu/gl_context_options_pb2.py +31 -0
- mediapipe/gpu/gl_scaler_calculator_pb2.py +32 -0
- mediapipe/gpu/gl_surface_sink_calculator_pb2.py +32 -0
- mediapipe/gpu/gpu_origin_pb2.py +29 -0
- mediapipe/gpu/scale_mode_pb2.py +28 -0
- mediapipe/model_maker/__init__.py +27 -0
- mediapipe/model_maker/setup.py +107 -0
- mediapipe/modules/__init__.py +0 -0
- mediapipe/modules/face_detection/__init__.py +0 -0
- mediapipe/modules/face_detection/face_detection_full_range_cpu.binarypb +0 -0
- mediapipe/modules/face_detection/face_detection_full_range_sparse.tflite +0 -0
- mediapipe/modules/face_detection/face_detection_pb2.py +30 -0
- mediapipe/modules/face_detection/face_detection_short_range.tflite +0 -0
- mediapipe/modules/face_detection/face_detection_short_range_cpu.binarypb +0 -0
- mediapipe/modules/face_geometry/__init__.py +0 -0
- mediapipe/modules/face_geometry/data/__init__.py +0 -0
- mediapipe/modules/face_geometry/effect_renderer_calculator_pb2.py +27 -0
- mediapipe/modules/face_geometry/env_generator_calculator_pb2.py +28 -0
- mediapipe/modules/face_geometry/geometry_pipeline_calculator_pb2.py +27 -0
- mediapipe/modules/face_geometry/libs/__init__.py +0 -0
- mediapipe/modules/face_geometry/protos/__init__.py +0 -0
- mediapipe/modules/face_geometry/protos/environment_pb2.py +31 -0
- mediapipe/modules/face_geometry/protos/face_geometry_pb2.py +29 -0
- mediapipe/modules/face_geometry/protos/geometry_pipeline_metadata_pb2.py +32 -0
- mediapipe/modules/face_geometry/protos/mesh_3d_pb2.py +31 -0
- mediapipe/modules/face_landmark/__init__.py +0 -0
- mediapipe/modules/face_landmark/face_landmark.tflite +0 -0
- mediapipe/modules/face_landmark/face_landmark_front_cpu.binarypb +0 -0
- mediapipe/modules/face_landmark/face_landmark_with_attention.tflite +0 -0
- mediapipe/modules/hand_landmark/__init__.py +0 -0
- mediapipe/modules/hand_landmark/calculators/__init__.py +0 -0
- mediapipe/modules/hand_landmark/hand_landmark_full.tflite +0 -0
- mediapipe/modules/hand_landmark/hand_landmark_lite.tflite +0 -0
- mediapipe/modules/hand_landmark/hand_landmark_tracking_cpu.binarypb +0 -0
- mediapipe/modules/hand_landmark/handedness.txt +2 -0
- mediapipe/modules/holistic_landmark/__init__.py +0 -0
- mediapipe/modules/holistic_landmark/calculators/__init__.py +0 -0
- mediapipe/modules/holistic_landmark/calculators/roi_tracking_calculator_pb2.py +37 -0
- mediapipe/modules/holistic_landmark/hand_recrop.tflite +0 -0
- mediapipe/modules/holistic_landmark/holistic_landmark_cpu.binarypb +0 -0
- mediapipe/modules/iris_landmark/__init__.py +0 -0
- mediapipe/modules/iris_landmark/iris_landmark.tflite +0 -0
- mediapipe/modules/objectron/__init__.py +0 -0
- mediapipe/modules/objectron/calculators/__init__.py +0 -0
- mediapipe/modules/objectron/calculators/a_r_capture_metadata_pb2.py +102 -0
- mediapipe/modules/objectron/calculators/annotation_data_pb2.py +38 -0
- mediapipe/modules/objectron/calculators/belief_decoder_config_pb2.py +28 -0
- mediapipe/modules/objectron/calculators/camera_parameters_pb2.py +30 -0
- mediapipe/modules/objectron/calculators/filter_detection_calculator_pb2.py +35 -0
- mediapipe/modules/objectron/calculators/frame_annotation_to_rect_calculator_pb2.py +31 -0
- mediapipe/modules/objectron/calculators/frame_annotation_tracker_calculator_pb2.py +31 -0
- mediapipe/modules/objectron/calculators/lift_2d_frame_annotation_to_3d_calculator_pb2.py +32 -0
- mediapipe/modules/objectron/calculators/object_pb2.py +38 -0
- mediapipe/modules/objectron/calculators/tensors_to_objects_calculator_pb2.py +32 -0
- mediapipe/modules/objectron/calculators/tflite_tensors_to_objects_calculator_pb2.py +32 -0
- mediapipe/modules/objectron/object_detection_oidv4_labelmap.txt +24 -0
- mediapipe/modules/objectron/objectron_cpu.binarypb +0 -0
- mediapipe/modules/palm_detection/__init__.py +0 -0
- mediapipe/modules/palm_detection/palm_detection_full.tflite +0 -0
- mediapipe/modules/palm_detection/palm_detection_lite.tflite +0 -0
- mediapipe/modules/pose_detection/__init__.py +0 -0
- mediapipe/modules/pose_detection/pose_detection.tflite +0 -0
- mediapipe/modules/pose_landmark/__init__.py +0 -0
- mediapipe/modules/pose_landmark/pose_landmark_cpu.binarypb +0 -0
- mediapipe/modules/pose_landmark/pose_landmark_full.tflite +0 -0
- mediapipe/modules/selfie_segmentation/__init__.py +0 -0
- mediapipe/modules/selfie_segmentation/selfie_segmentation.tflite +0 -0
- mediapipe/modules/selfie_segmentation/selfie_segmentation_cpu.binarypb +0 -0
- mediapipe/modules/selfie_segmentation/selfie_segmentation_landscape.tflite +0 -0
- mediapipe/python/__init__.py +29 -0
- mediapipe/python/_framework_bindings.cpython-311-x86_64-linux-gnu.so +0 -0
- mediapipe/python/calculator_graph_test.py +251 -0
- mediapipe/python/image_frame_test.py +194 -0
- mediapipe/python/image_test.py +218 -0
- mediapipe/python/packet_creator.py +275 -0
- mediapipe/python/packet_getter.py +120 -0
- mediapipe/python/packet_test.py +533 -0
- mediapipe/python/solution_base.py +604 -0
- mediapipe/python/solution_base_test.py +396 -0
- mediapipe/python/solutions/__init__.py +27 -0
- mediapipe/python/solutions/download_utils.py +37 -0
- mediapipe/python/solutions/drawing_styles.py +249 -0
- mediapipe/python/solutions/drawing_utils.py +320 -0
- mediapipe/python/solutions/drawing_utils_test.py +258 -0
- mediapipe/python/solutions/face_detection.py +105 -0
- mediapipe/python/solutions/face_detection_test.py +92 -0
- mediapipe/python/solutions/face_mesh.py +125 -0
- mediapipe/python/solutions/face_mesh_connections.py +500 -0
- mediapipe/python/solutions/face_mesh_test.py +170 -0
- mediapipe/python/solutions/hands.py +153 -0
- mediapipe/python/solutions/hands_connections.py +32 -0
- mediapipe/python/solutions/hands_test.py +219 -0
- mediapipe/python/solutions/holistic.py +167 -0
- mediapipe/python/solutions/holistic_test.py +142 -0
- mediapipe/python/solutions/objectron.py +288 -0
- mediapipe/python/solutions/objectron_test.py +81 -0
- mediapipe/python/solutions/pose.py +192 -0
- mediapipe/python/solutions/pose_connections.py +22 -0
- mediapipe/python/solutions/pose_test.py +262 -0
- mediapipe/python/solutions/selfie_segmentation.py +76 -0
- mediapipe/python/solutions/selfie_segmentation_test.py +68 -0
- mediapipe/python/timestamp_test.py +78 -0
- mediapipe/tasks/__init__.py +14 -0
- mediapipe/tasks/cc/__init__.py +0 -0
- mediapipe/tasks/cc/audio/__init__.py +0 -0
- mediapipe/tasks/cc/audio/audio_classifier/__init__.py +0 -0
- mediapipe/tasks/cc/audio/audio_classifier/proto/__init__.py +0 -0
- mediapipe/tasks/cc/audio/audio_classifier/proto/audio_classifier_graph_options_pb2.py +35 -0
- mediapipe/tasks/cc/audio/audio_embedder/__init__.py +0 -0
- mediapipe/tasks/cc/audio/audio_embedder/proto/__init__.py +0 -0
- mediapipe/tasks/cc/audio/audio_embedder/proto/audio_embedder_graph_options_pb2.py +35 -0
- mediapipe/tasks/cc/audio/core/__init__.py +0 -0
- mediapipe/tasks/cc/audio/utils/__init__.py +0 -0
- mediapipe/tasks/cc/components/__init__.py +0 -0
- mediapipe/tasks/cc/components/calculators/__init__.py +0 -0
- mediapipe/tasks/cc/components/calculators/classification_aggregation_calculator_pb2.py +31 -0
- mediapipe/tasks/cc/components/calculators/score_calibration_calculator_pb2.py +35 -0
- mediapipe/tasks/cc/components/calculators/tensors_to_embeddings_calculator_pb2.py +32 -0
- mediapipe/tasks/cc/components/containers/__init__.py +0 -0
- mediapipe/tasks/cc/components/containers/proto/__init__.py +0 -0
- mediapipe/tasks/cc/components/containers/proto/classifications_pb2.py +30 -0
- mediapipe/tasks/cc/components/containers/proto/embeddings_pb2.py +35 -0
- mediapipe/tasks/cc/components/containers/proto/landmarks_detection_result_pb2.py +32 -0
- mediapipe/tasks/cc/components/processors/__init__.py +0 -0
- mediapipe/tasks/cc/components/processors/proto/__init__.py +0 -0
- mediapipe/tasks/cc/components/processors/proto/classification_postprocessing_graph_options_pb2.py +38 -0
- mediapipe/tasks/cc/components/processors/proto/classifier_options_pb2.py +27 -0
- mediapipe/tasks/cc/components/processors/proto/detection_postprocessing_graph_options_pb2.py +36 -0
- mediapipe/tasks/cc/components/processors/proto/detector_options_pb2.py +27 -0
- mediapipe/tasks/cc/components/processors/proto/embedder_options_pb2.py +27 -0
- mediapipe/tasks/cc/components/processors/proto/embedding_postprocessing_graph_options_pb2.py +32 -0
- mediapipe/tasks/cc/components/processors/proto/image_preprocessing_graph_options_pb2.py +34 -0
- mediapipe/tasks/cc/components/processors/proto/text_model_type_pb2.py +28 -0
- mediapipe/tasks/cc/components/processors/proto/text_preprocessing_graph_options_pb2.py +32 -0
- mediapipe/tasks/cc/components/utils/__init__.py +0 -0
- mediapipe/tasks/cc/core/__init__.py +0 -0
- mediapipe/tasks/cc/core/proto/__init__.py +0 -0
- mediapipe/tasks/cc/core/proto/acceleration_pb2.py +28 -0
- mediapipe/tasks/cc/core/proto/base_options_pb2.py +30 -0
- mediapipe/tasks/cc/core/proto/external_file_pb2.py +31 -0
- mediapipe/tasks/cc/core/proto/inference_subgraph_pb2.py +32 -0
- mediapipe/tasks/cc/core/proto/model_resources_calculator_pb2.py +32 -0
- mediapipe/tasks/cc/genai/__init__.py +0 -0
- mediapipe/tasks/cc/genai/inference/__init__.py +0 -0
- mediapipe/tasks/cc/genai/inference/c/__init__.py +0 -0
- mediapipe/tasks/cc/genai/inference/calculators/__init__.py +0 -0
- mediapipe/tasks/cc/genai/inference/calculators/detokenizer_calculator_pb2.py +27 -0
- mediapipe/tasks/cc/genai/inference/calculators/llm_gpu_calculator_pb2.py +32 -0
- mediapipe/tasks/cc/genai/inference/calculators/model_data_calculator_pb2.py +27 -0
- mediapipe/tasks/cc/genai/inference/calculators/tokenizer_calculator_pb2.py +29 -0
- mediapipe/tasks/cc/genai/inference/common/__init__.py +0 -0
- mediapipe/tasks/cc/genai/inference/proto/__init__.py +0 -0
- mediapipe/tasks/cc/genai/inference/proto/llm_file_metadata_pb2.py +32 -0
- mediapipe/tasks/cc/genai/inference/proto/llm_params_pb2.py +33 -0
- mediapipe/tasks/cc/genai/inference/proto/prompt_template_pb2.py +27 -0
- mediapipe/tasks/cc/genai/inference/proto/sampler_params_pb2.py +29 -0
- mediapipe/tasks/cc/genai/inference/proto/transformer_params_pb2.py +45 -0
- mediapipe/tasks/cc/genai/inference/utils/__init__.py +0 -0
- mediapipe/tasks/cc/genai/inference/utils/llm_utils/__init__.py +0 -0
- mediapipe/tasks/cc/genai/inference/utils/xnn_utils/__init__.py +0 -0
- mediapipe/tasks/cc/metadata/__init__.py +0 -0
- mediapipe/tasks/cc/metadata/python/__init__.py +0 -0
- mediapipe/tasks/cc/metadata/python/_pywrap_metadata_version.cpython-311-x86_64-linux-gnu.so +0 -0
- mediapipe/tasks/cc/metadata/tests/__init__.py +0 -0
- mediapipe/tasks/cc/metadata/utils/__init__.py +0 -0
- mediapipe/tasks/cc/text/__init__.py +0 -0
- mediapipe/tasks/cc/text/custom_ops/__init__.py +0 -0
- mediapipe/tasks/cc/text/custom_ops/ragged/__init__.py +0 -0
- mediapipe/tasks/cc/text/custom_ops/sentencepiece/__init__.py +0 -0
- mediapipe/tasks/cc/text/custom_ops/sentencepiece/testdata/__init__.py +0 -0
- mediapipe/tasks/cc/text/language_detector/__init__.py +0 -0
- mediapipe/tasks/cc/text/language_detector/custom_ops/__init__.py +0 -0
- mediapipe/tasks/cc/text/language_detector/custom_ops/utils/__init__.py +0 -0
- mediapipe/tasks/cc/text/language_detector/custom_ops/utils/hash/__init__.py +0 -0
- mediapipe/tasks/cc/text/language_detector/custom_ops/utils/utf/__init__.py +0 -0
- mediapipe/tasks/cc/text/text_classifier/__init__.py +0 -0
- mediapipe/tasks/cc/text/text_classifier/proto/__init__.py +0 -0
- mediapipe/tasks/cc/text/text_classifier/proto/text_classifier_graph_options_pb2.py +35 -0
- mediapipe/tasks/cc/text/text_embedder/__init__.py +0 -0
- mediapipe/tasks/cc/text/text_embedder/proto/__init__.py +0 -0
- mediapipe/tasks/cc/text/text_embedder/proto/text_embedder_graph_options_pb2.py +35 -0
- mediapipe/tasks/cc/text/tokenizers/__init__.py +0 -0
- mediapipe/tasks/cc/text/utils/__init__.py +0 -0
- mediapipe/tasks/cc/vision/__init__.py +0 -0
- mediapipe/tasks/cc/vision/core/__init__.py +0 -0
- mediapipe/tasks/cc/vision/custom_ops/__init__.py +0 -0
- mediapipe/tasks/cc/vision/face_detector/__init__.py +0 -0
- mediapipe/tasks/cc/vision/face_detector/proto/__init__.py +0 -0
- mediapipe/tasks/cc/vision/face_detector/proto/face_detector_graph_options_pb2.py +34 -0
- mediapipe/tasks/cc/vision/face_geometry/__init__.py +0 -0
- mediapipe/tasks/cc/vision/face_geometry/calculators/__init__.py +0 -0
- mediapipe/tasks/cc/vision/face_geometry/calculators/env_generator_calculator_pb2.py +28 -0
- mediapipe/tasks/cc/vision/face_geometry/calculators/geometry_pipeline_calculator_pb2.py +29 -0
- mediapipe/tasks/cc/vision/face_geometry/data/__init__.py +0 -0
- mediapipe/tasks/cc/vision/face_geometry/libs/__init__.py +0 -0
- mediapipe/tasks/cc/vision/face_geometry/proto/__init__.py +0 -0
- mediapipe/tasks/cc/vision/face_geometry/proto/environment_pb2.py +31 -0
- mediapipe/tasks/cc/vision/face_geometry/proto/face_geometry_graph_options_pb2.py +29 -0
- mediapipe/tasks/cc/vision/face_geometry/proto/face_geometry_pb2.py +29 -0
- mediapipe/tasks/cc/vision/face_geometry/proto/geometry_pipeline_metadata_pb2.py +32 -0
- mediapipe/tasks/cc/vision/face_geometry/proto/mesh_3d_pb2.py +31 -0
- mediapipe/tasks/cc/vision/face_landmarker/__init__.py +0 -0
- mediapipe/tasks/cc/vision/face_landmarker/proto/__init__.py +0 -0
- mediapipe/tasks/cc/vision/face_landmarker/proto/face_blendshapes_graph_options_pb2.py +34 -0
- mediapipe/tasks/cc/vision/face_landmarker/proto/face_landmarker_graph_options_pb2.py +37 -0
- mediapipe/tasks/cc/vision/face_landmarker/proto/face_landmarks_detector_graph_options_pb2.py +35 -0
- mediapipe/tasks/cc/vision/face_landmarker/proto/tensors_to_face_landmarks_graph_options_pb2.py +32 -0
- mediapipe/tasks/cc/vision/face_stylizer/__init__.py +0 -0
- mediapipe/tasks/cc/vision/face_stylizer/calculators/__init__.py +0 -0
- mediapipe/tasks/cc/vision/face_stylizer/calculators/tensors_to_image_calculator_pb2.py +36 -0
- mediapipe/tasks/cc/vision/face_stylizer/proto/__init__.py +0 -0
- mediapipe/tasks/cc/vision/face_stylizer/proto/face_stylizer_graph_options_pb2.py +35 -0
- mediapipe/tasks/cc/vision/gesture_recognizer/__init__.py +0 -0
- mediapipe/tasks/cc/vision/gesture_recognizer/calculators/__init__.py +0 -0
- mediapipe/tasks/cc/vision/gesture_recognizer/calculators/combined_prediction_calculator_pb2.py +33 -0
- mediapipe/tasks/cc/vision/gesture_recognizer/calculators/landmarks_to_matrix_calculator_pb2.py +31 -0
- mediapipe/tasks/cc/vision/gesture_recognizer/proto/__init__.py +0 -0
- mediapipe/tasks/cc/vision/gesture_recognizer/proto/gesture_classifier_graph_options_pb2.py +35 -0
- mediapipe/tasks/cc/vision/gesture_recognizer/proto/gesture_embedder_graph_options_pb2.py +34 -0
- mediapipe/tasks/cc/vision/gesture_recognizer/proto/gesture_recognizer_graph_options_pb2.py +36 -0
- mediapipe/tasks/cc/vision/gesture_recognizer/proto/hand_gesture_recognizer_graph_options_pb2.py +36 -0
- mediapipe/tasks/cc/vision/hand_detector/__init__.py +0 -0
- mediapipe/tasks/cc/vision/hand_detector/proto/__init__.py +0 -0
- mediapipe/tasks/cc/vision/hand_detector/proto/hand_detector_graph_options_pb2.py +34 -0
- mediapipe/tasks/cc/vision/hand_detector/proto/hand_detector_result_pb2.py +30 -0
- mediapipe/tasks/cc/vision/hand_landmarker/__init__.py +0 -0
- mediapipe/tasks/cc/vision/hand_landmarker/calculators/__init__.py +0 -0
- mediapipe/tasks/cc/vision/hand_landmarker/calculators/hand_association_calculator_pb2.py +31 -0
- mediapipe/tasks/cc/vision/hand_landmarker/proto/__init__.py +0 -0
- mediapipe/tasks/cc/vision/hand_landmarker/proto/hand_landmarker_graph_options_pb2.py +36 -0
- mediapipe/tasks/cc/vision/hand_landmarker/proto/hand_landmarks_detector_graph_options_pb2.py +34 -0
- mediapipe/tasks/cc/vision/hand_landmarker/proto/hand_roi_refinement_graph_options_pb2.py +28 -0
- mediapipe/tasks/cc/vision/holistic_landmarker/__init__.py +0 -0
- mediapipe/tasks/cc/vision/holistic_landmarker/proto/__init__.py +0 -0
- mediapipe/tasks/cc/vision/holistic_landmarker/proto/holistic_landmarker_graph_options_pb2.py +34 -0
- mediapipe/tasks/cc/vision/holistic_landmarker/proto/holistic_result_pb2.py +29 -0
- mediapipe/tasks/cc/vision/image_classifier/__init__.py +0 -0
- mediapipe/tasks/cc/vision/image_classifier/proto/__init__.py +0 -0
- mediapipe/tasks/cc/vision/image_classifier/proto/image_classifier_graph_options_pb2.py +35 -0
- mediapipe/tasks/cc/vision/image_embedder/__init__.py +0 -0
- mediapipe/tasks/cc/vision/image_embedder/proto/__init__.py +0 -0
- mediapipe/tasks/cc/vision/image_embedder/proto/image_embedder_graph_options_pb2.py +35 -0
- mediapipe/tasks/cc/vision/image_generator/__init__.py +0 -0
- mediapipe/tasks/cc/vision/image_generator/diffuser/__init__.py +0 -0
- mediapipe/tasks/cc/vision/image_generator/diffuser/stable_diffusion_iterate_calculator_pb2.py +40 -0
- mediapipe/tasks/cc/vision/image_generator/proto/__init__.py +0 -0
- mediapipe/tasks/cc/vision/image_generator/proto/conditioned_image_graph_options_pb2.py +40 -0
- mediapipe/tasks/cc/vision/image_generator/proto/control_plugin_graph_options_pb2.py +34 -0
- mediapipe/tasks/cc/vision/image_generator/proto/image_generator_graph_options_pb2.py +30 -0
- mediapipe/tasks/cc/vision/image_segmenter/__init__.py +0 -0
- mediapipe/tasks/cc/vision/image_segmenter/calculators/__init__.py +0 -0
- mediapipe/tasks/cc/vision/image_segmenter/calculators/tensors_to_segmentation_calculator_pb2.py +34 -0
- mediapipe/tasks/cc/vision/image_segmenter/proto/__init__.py +0 -0
- mediapipe/tasks/cc/vision/image_segmenter/proto/image_segmenter_graph_options_pb2.py +35 -0
- mediapipe/tasks/cc/vision/image_segmenter/proto/segmenter_options_pb2.py +33 -0
- mediapipe/tasks/cc/vision/interactive_segmenter/__init__.py +0 -0
- mediapipe/tasks/cc/vision/object_detector/__init__.py +0 -0
- mediapipe/tasks/cc/vision/object_detector/proto/__init__.py +0 -0
- mediapipe/tasks/cc/vision/object_detector/proto/object_detector_options_pb2.py +34 -0
- mediapipe/tasks/cc/vision/pose_detector/__init__.py +0 -0
- mediapipe/tasks/cc/vision/pose_detector/proto/__init__.py +0 -0
- mediapipe/tasks/cc/vision/pose_detector/proto/pose_detector_graph_options_pb2.py +34 -0
- mediapipe/tasks/cc/vision/pose_landmarker/__init__.py +0 -0
- mediapipe/tasks/cc/vision/pose_landmarker/proto/__init__.py +0 -0
- mediapipe/tasks/cc/vision/pose_landmarker/proto/pose_landmarker_graph_options_pb2.py +36 -0
- mediapipe/tasks/cc/vision/pose_landmarker/proto/pose_landmarks_detector_graph_options_pb2.py +34 -0
- mediapipe/tasks/cc/vision/utils/__init__.py +0 -0
- mediapipe/tasks/cc/vision/utils/ghum/__init__.py +0 -0
- mediapipe/tasks/metadata/image_segmenter_metadata_schema.fbs +59 -0
- mediapipe/tasks/metadata/image_segmenter_metadata_schema_py_generated.py +108 -0
- mediapipe/tasks/metadata/metadata_schema.fbs +732 -0
- mediapipe/tasks/metadata/metadata_schema_py_generated.py +3251 -0
- mediapipe/tasks/metadata/object_detector_metadata_schema.fbs +98 -0
- mediapipe/tasks/metadata/object_detector_metadata_schema_py_generated.py +674 -0
- mediapipe/tasks/metadata/schema_py_generated.py +18438 -0
- mediapipe/tasks/python/__init__.py +27 -0
- mediapipe/tasks/python/audio/__init__.py +33 -0
- mediapipe/tasks/python/audio/audio_classifier.py +324 -0
- mediapipe/tasks/python/audio/audio_embedder.py +285 -0
- mediapipe/tasks/python/audio/core/__init__.py +16 -0
- mediapipe/tasks/python/audio/core/audio_record.py +125 -0
- mediapipe/tasks/python/audio/core/audio_task_running_mode.py +29 -0
- mediapipe/tasks/python/audio/core/base_audio_task_api.py +181 -0
- mediapipe/tasks/python/benchmark/__init__.py +13 -0
- mediapipe/tasks/python/benchmark/benchmark_utils.py +70 -0
- mediapipe/tasks/python/benchmark/vision/__init__.py +13 -0
- mediapipe/tasks/python/benchmark/vision/benchmark.py +99 -0
- mediapipe/tasks/python/benchmark/vision/core/__init__.py +14 -0
- mediapipe/tasks/python/benchmark/vision/core/base_vision_benchmark_api.py +40 -0
- mediapipe/tasks/python/components/__init__.py +13 -0
- mediapipe/tasks/python/components/containers/__init__.py +53 -0
- mediapipe/tasks/python/components/containers/audio_data.py +137 -0
- mediapipe/tasks/python/components/containers/bounding_box.py +73 -0
- mediapipe/tasks/python/components/containers/category.py +78 -0
- mediapipe/tasks/python/components/containers/classification_result.py +111 -0
- mediapipe/tasks/python/components/containers/detections.py +181 -0
- mediapipe/tasks/python/components/containers/embedding_result.py +89 -0
- mediapipe/tasks/python/components/containers/keypoint.py +77 -0
- mediapipe/tasks/python/components/containers/landmark.py +122 -0
- mediapipe/tasks/python/components/containers/landmark_detection_result.py +106 -0
- mediapipe/tasks/python/components/containers/rect.py +109 -0
- mediapipe/tasks/python/components/processors/__init__.py +23 -0
- mediapipe/tasks/python/components/processors/classifier_options.py +86 -0
- mediapipe/tasks/python/components/utils/__init__.py +13 -0
- mediapipe/tasks/python/components/utils/cosine_similarity.py +68 -0
- mediapipe/tasks/python/core/__init__.py +13 -0
- mediapipe/tasks/python/core/base_options.py +121 -0
- mediapipe/tasks/python/core/optional_dependencies.py +25 -0
- mediapipe/tasks/python/core/task_info.py +139 -0
- mediapipe/tasks/python/genai/__init__.py +14 -0
- mediapipe/tasks/python/genai/bundler/__init__.py +23 -0
- mediapipe/tasks/python/genai/bundler/llm_bundler.py +130 -0
- mediapipe/tasks/python/genai/bundler/llm_bundler_test.py +168 -0
- mediapipe/tasks/python/genai/converter/__init__.py +24 -0
- mediapipe/tasks/python/genai/converter/converter_base.py +179 -0
- mediapipe/tasks/python/genai/converter/converter_factory.py +79 -0
- mediapipe/tasks/python/genai/converter/llm_converter.py +374 -0
- mediapipe/tasks/python/genai/converter/llm_converter_test.py +63 -0
- mediapipe/tasks/python/genai/converter/pytorch_converter.py +318 -0
- mediapipe/tasks/python/genai/converter/pytorch_converter_test.py +86 -0
- mediapipe/tasks/python/genai/converter/quantization_util.py +516 -0
- mediapipe/tasks/python/genai/converter/quantization_util_test.py +259 -0
- mediapipe/tasks/python/genai/converter/safetensors_converter.py +580 -0
- mediapipe/tasks/python/genai/converter/safetensors_converter_test.py +83 -0
- mediapipe/tasks/python/genai/converter/weight_bins_writer.py +120 -0
- mediapipe/tasks/python/genai/converter/weight_bins_writer_test.py +95 -0
- mediapipe/tasks/python/metadata/__init__.py +13 -0
- mediapipe/tasks/python/metadata/flatbuffers_lib/_pywrap_flatbuffers.cpython-311-x86_64-linux-gnu.so +0 -0
- mediapipe/tasks/python/metadata/metadata.py +928 -0
- mediapipe/tasks/python/metadata/metadata_displayer_cli.py +34 -0
- mediapipe/tasks/python/metadata/metadata_writers/__init__.py +13 -0
- mediapipe/tasks/python/metadata/metadata_writers/face_stylizer.py +138 -0
- mediapipe/tasks/python/metadata/metadata_writers/image_classifier.py +71 -0
- mediapipe/tasks/python/metadata/metadata_writers/image_segmenter.py +170 -0
- mediapipe/tasks/python/metadata/metadata_writers/metadata_info.py +1166 -0
- mediapipe/tasks/python/metadata/metadata_writers/metadata_writer.py +845 -0
- mediapipe/tasks/python/metadata/metadata_writers/model_asset_bundle_utils.py +71 -0
- mediapipe/tasks/python/metadata/metadata_writers/object_detector.py +331 -0
- mediapipe/tasks/python/metadata/metadata_writers/text_classifier.py +119 -0
- mediapipe/tasks/python/metadata/metadata_writers/writer_utils.py +91 -0
- mediapipe/tasks/python/test/__init__.py +13 -0
- mediapipe/tasks/python/test/audio/__init__.py +13 -0
- mediapipe/tasks/python/test/audio/audio_classifier_test.py +387 -0
- mediapipe/tasks/python/test/audio/audio_embedder_test.py +297 -0
- mediapipe/tasks/python/test/test_utils.py +196 -0
- mediapipe/tasks/python/test/text/__init__.py +13 -0
- mediapipe/tasks/python/test/text/language_detector_test.py +228 -0
- mediapipe/tasks/python/test/text/text_classifier_test.py +235 -0
- mediapipe/tasks/python/test/text/text_embedder_test.py +326 -0
- mediapipe/tasks/python/test/vision/__init__.py +13 -0
- mediapipe/tasks/python/test/vision/face_aligner_test.py +190 -0
- mediapipe/tasks/python/test/vision/face_detector_test.py +523 -0
- mediapipe/tasks/python/test/vision/face_landmarker_test.py +565 -0
- mediapipe/tasks/python/test/vision/face_stylizer_test.py +191 -0
- mediapipe/tasks/python/test/vision/hand_landmarker_test.py +437 -0
- mediapipe/tasks/python/test/vision/holistic_landmarker_test.py +544 -0
- mediapipe/tasks/python/test/vision/image_classifier_test.py +657 -0
- mediapipe/tasks/python/test/vision/image_embedder_test.py +423 -0
- mediapipe/tasks/python/test/vision/image_segmenter_test.py +512 -0
- mediapipe/tasks/python/test/vision/interactive_segmenter_test.py +341 -0
- mediapipe/tasks/python/test/vision/object_detector_test.py +493 -0
- mediapipe/tasks/python/test/vision/pose_landmarker_test.py +518 -0
- mediapipe/tasks/python/text/__init__.py +35 -0
- mediapipe/tasks/python/text/core/__init__.py +16 -0
- mediapipe/tasks/python/text/core/base_text_task_api.py +54 -0
- mediapipe/tasks/python/text/language_detector.py +220 -0
- mediapipe/tasks/python/text/text_classifier.py +187 -0
- mediapipe/tasks/python/text/text_embedder.py +188 -0
- mediapipe/tasks/python/vision/__init__.py +90 -0
- mediapipe/tasks/python/vision/core/__init__.py +14 -0
- mediapipe/tasks/python/vision/core/base_vision_task_api.py +226 -0
- mediapipe/tasks/python/vision/core/image_processing_options.py +39 -0
- mediapipe/tasks/python/vision/core/vision_task_running_mode.py +31 -0
- mediapipe/tasks/python/vision/face_aligner.py +158 -0
- mediapipe/tasks/python/vision/face_detector.py +332 -0
- mediapipe/tasks/python/vision/face_landmarker.py +3244 -0
- mediapipe/tasks/python/vision/face_stylizer.py +158 -0
- mediapipe/tasks/python/vision/gesture_recognizer.py +480 -0
- mediapipe/tasks/python/vision/hand_landmarker.py +504 -0
- mediapipe/tasks/python/vision/holistic_landmarker.py +576 -0
- mediapipe/tasks/python/vision/image_classifier.py +358 -0
- mediapipe/tasks/python/vision/image_embedder.py +362 -0
- mediapipe/tasks/python/vision/image_segmenter.py +433 -0
- mediapipe/tasks/python/vision/interactive_segmenter.py +285 -0
- mediapipe/tasks/python/vision/object_detector.py +389 -0
- mediapipe/tasks/python/vision/pose_landmarker.py +455 -0
- mediapipe/util/__init__.py +0 -0
- mediapipe/util/analytics/__init__.py +0 -0
- mediapipe/util/analytics/mediapipe_log_extension_pb2.py +44 -0
- mediapipe/util/analytics/mediapipe_logging_enums_pb2.py +37 -0
- mediapipe/util/audio_decoder_pb2.py +33 -0
- mediapipe/util/color_pb2.py +33 -0
- mediapipe/util/label_map_pb2.py +27 -0
- mediapipe/util/render_data_pb2.py +58 -0
- mediapipe/util/sequence/__init__.py +14 -0
- mediapipe/util/sequence/media_sequence.py +716 -0
- mediapipe/util/sequence/media_sequence_test.py +290 -0
- mediapipe/util/sequence/media_sequence_util.py +800 -0
- mediapipe/util/sequence/media_sequence_util_test.py +389 -0
- mediapipe/util/tracking/__init__.py +0 -0
- mediapipe/util/tracking/box_detector_pb2.py +39 -0
- mediapipe/util/tracking/box_tracker_pb2.py +32 -0
- mediapipe/util/tracking/camera_motion_pb2.py +31 -0
- mediapipe/util/tracking/flow_packager_pb2.py +60 -0
- mediapipe/util/tracking/frame_selection_pb2.py +35 -0
- mediapipe/util/tracking/frame_selection_solution_evaluator_pb2.py +28 -0
- mediapipe/util/tracking/motion_analysis_pb2.py +35 -0
- mediapipe/util/tracking/motion_estimation_pb2.py +66 -0
- mediapipe/util/tracking/motion_models_pb2.py +42 -0
- mediapipe/util/tracking/motion_saliency_pb2.py +26 -0
- mediapipe/util/tracking/push_pull_filtering_pb2.py +26 -0
- mediapipe/util/tracking/region_flow_computation_pb2.py +59 -0
- mediapipe/util/tracking/region_flow_pb2.py +49 -0
- mediapipe/util/tracking/tone_estimation_pb2.py +45 -0
- mediapipe/util/tracking/tone_models_pb2.py +32 -0
- mediapipe/util/tracking/tracked_detection_manager_config_pb2.py +26 -0
- mediapipe/util/tracking/tracking_pb2.py +73 -0
- mediapipe_nightly-0.10.21.post20241223.dist-info/LICENSE +218 -0
- mediapipe_nightly-0.10.21.post20241223.dist-info/METADATA +199 -0
- mediapipe_nightly-0.10.21.post20241223.dist-info/RECORD +593 -0
- mediapipe_nightly-0.10.21.post20241223.dist-info/WHEEL +5 -0
- mediapipe_nightly-0.10.21.post20241223.dist-info/top_level.txt +4 -0
- mediapipe_nightly.libs/libEGL-48f73270.so.1.1.0 +0 -0
- mediapipe_nightly.libs/libGLESv2-ed5eda4f.so.2.1.0 +0 -0
- mediapipe_nightly.libs/libGLdispatch-64b28464.so.0.0.0 +0 -0
@@ -0,0 +1,194 @@
|
|
1
|
+
# Copyright 2020 The MediaPipe Authors.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
"""Tests for mediapipe.python._framework_bindings.image_frame."""
|
16
|
+
|
17
|
+
import gc
|
18
|
+
import random
|
19
|
+
import sys
|
20
|
+
|
21
|
+
from absl.testing import absltest
|
22
|
+
import cv2
|
23
|
+
import numpy as np
|
24
|
+
import PIL.Image
|
25
|
+
|
26
|
+
from mediapipe.python._framework_bindings import image_frame
|
27
|
+
|
28
|
+
ImageFormat = image_frame.ImageFormat
|
29
|
+
ImageFrame = image_frame.ImageFrame
|
30
|
+
|
31
|
+
|
32
|
+
# TODO: Add unit tests specifically for memory management.
|
33
|
+
class ImageFrameTest(absltest.TestCase):
|
34
|
+
|
35
|
+
def test_create_image_frame_from_gray_cv_mat(self):
|
36
|
+
w, h = random.randrange(3, 100), random.randrange(3, 100)
|
37
|
+
mat = cv2.cvtColor(
|
38
|
+
np.random.randint(2**8 - 1, size=(h, w, 3), dtype=np.uint8),
|
39
|
+
cv2.COLOR_RGB2GRAY)
|
40
|
+
mat[2, 2] = 42
|
41
|
+
gray8_image_frame = ImageFrame(image_format=ImageFormat.GRAY8, data=mat)
|
42
|
+
self.assertTrue(np.array_equal(mat, gray8_image_frame.numpy_view()))
|
43
|
+
with self.assertRaisesRegex(IndexError, 'index dimension mismatch'):
|
44
|
+
print(gray8_image_frame[w, h, 1])
|
45
|
+
with self.assertRaisesRegex(IndexError, 'out of bounds'):
|
46
|
+
print(gray8_image_frame[w, h])
|
47
|
+
self.assertEqual(42, gray8_image_frame[2, 2])
|
48
|
+
|
49
|
+
def test_create_image_frame_from_rgb_cv_mat(self):
|
50
|
+
w, h, channels = random.randrange(3, 100), random.randrange(3, 100), 3
|
51
|
+
mat = cv2.cvtColor(
|
52
|
+
np.random.randint(2**8 - 1, size=(h, w, channels), dtype=np.uint8),
|
53
|
+
cv2.COLOR_RGB2BGR)
|
54
|
+
mat[2, 2, 1] = 42
|
55
|
+
rgb_image_frame = ImageFrame(image_format=ImageFormat.SRGB, data=mat)
|
56
|
+
self.assertTrue(np.array_equal(mat, rgb_image_frame.numpy_view()))
|
57
|
+
with self.assertRaisesRegex(IndexError, 'out of bounds'):
|
58
|
+
print(rgb_image_frame[w, h, channels])
|
59
|
+
self.assertEqual(42, rgb_image_frame[2, 2, 1])
|
60
|
+
|
61
|
+
def test_create_image_frame_from_rgb48_cv_mat(self):
|
62
|
+
w, h, channels = random.randrange(3, 100), random.randrange(3, 100), 3
|
63
|
+
mat = cv2.cvtColor(
|
64
|
+
np.random.randint(2**16 - 1, size=(h, w, channels), dtype=np.uint16),
|
65
|
+
cv2.COLOR_RGB2BGR)
|
66
|
+
mat[2, 2, 1] = 42
|
67
|
+
rgb48_image_frame = ImageFrame(image_format=ImageFormat.SRGB48, data=mat)
|
68
|
+
self.assertTrue(np.array_equal(mat, rgb48_image_frame.numpy_view()))
|
69
|
+
with self.assertRaisesRegex(IndexError, 'out of bounds'):
|
70
|
+
print(rgb48_image_frame[w, h, channels])
|
71
|
+
self.assertEqual(42, rgb48_image_frame[2, 2, 1])
|
72
|
+
|
73
|
+
def test_create_image_frame_from_gray_pil_image(self):
|
74
|
+
w, h = random.randrange(3, 100), random.randrange(3, 100)
|
75
|
+
img = PIL.Image.fromarray(
|
76
|
+
np.random.randint(2**8 - 1, size=(h, w), dtype=np.uint8), 'L')
|
77
|
+
gray8_image_frame = ImageFrame(
|
78
|
+
image_format=ImageFormat.GRAY8, data=np.asarray(img))
|
79
|
+
self.assertTrue(
|
80
|
+
np.array_equal(np.asarray(img), gray8_image_frame.numpy_view()))
|
81
|
+
with self.assertRaisesRegex(IndexError, 'index dimension mismatch'):
|
82
|
+
print(gray8_image_frame[w, h, 1])
|
83
|
+
with self.assertRaisesRegex(IndexError, 'out of bounds'):
|
84
|
+
print(gray8_image_frame[w, h])
|
85
|
+
|
86
|
+
def test_create_image_frame_from_rgb_pil_image(self):
|
87
|
+
w, h, channels = random.randrange(3, 100), random.randrange(3, 100), 3
|
88
|
+
img = PIL.Image.fromarray(
|
89
|
+
np.random.randint(2**8 - 1, size=(h, w, channels), dtype=np.uint8),
|
90
|
+
'RGB')
|
91
|
+
rgb_image_frame = ImageFrame(
|
92
|
+
image_format=ImageFormat.SRGB, data=np.asarray(img))
|
93
|
+
self.assertTrue(
|
94
|
+
np.array_equal(np.asarray(img), rgb_image_frame.numpy_view()))
|
95
|
+
with self.assertRaisesRegex(IndexError, 'out of bounds'):
|
96
|
+
print(rgb_image_frame[w, h, channels])
|
97
|
+
|
98
|
+
def test_create_image_frame_from_rgba64_pil_image(self):
|
99
|
+
w, h, channels = random.randrange(3, 100), random.randrange(3, 100), 4
|
100
|
+
img = PIL.Image.fromarray(
|
101
|
+
np.random.randint(2**16 - 1, size=(h, w, channels), dtype=np.uint16),
|
102
|
+
'RGBA')
|
103
|
+
rgba_image_frame = ImageFrame(
|
104
|
+
image_format=ImageFormat.SRGBA64,
|
105
|
+
data=np.asarray(img).astype(np.uint16))
|
106
|
+
self.assertTrue(
|
107
|
+
np.array_equal(np.asarray(img), rgba_image_frame.numpy_view()))
|
108
|
+
with self.assertRaisesRegex(IndexError, 'out of bounds'):
|
109
|
+
print(rgba_image_frame[1000, 1000, 1000])
|
110
|
+
|
111
|
+
def test_image_frame_numby_view(self):
|
112
|
+
w, h, channels = random.randrange(3, 100), random.randrange(3, 100), 3
|
113
|
+
mat = cv2.cvtColor(
|
114
|
+
np.random.randint(2**8 - 1, size=(h, w, channels), dtype=np.uint8),
|
115
|
+
cv2.COLOR_RGB2BGR)
|
116
|
+
rgb_image_frame = ImageFrame(image_format=ImageFormat.SRGB, data=mat)
|
117
|
+
output_ndarray = rgb_image_frame.numpy_view()
|
118
|
+
self.assertTrue(np.array_equal(mat, rgb_image_frame.numpy_view()))
|
119
|
+
# The output of numpy_view() is a reference to the internal data and it's
|
120
|
+
# unwritable after creation.
|
121
|
+
with self.assertRaisesRegex(ValueError,
|
122
|
+
'assignment destination is read-only'):
|
123
|
+
output_ndarray[0, 0, 0] = 0
|
124
|
+
copied_ndarray = np.copy(output_ndarray)
|
125
|
+
copied_ndarray[0, 0, 0] = 0
|
126
|
+
|
127
|
+
def test_cropped_gray8_image(self):
|
128
|
+
w, h = random.randrange(20, 100), random.randrange(20, 100)
|
129
|
+
channels, offset = 3, 10
|
130
|
+
mat = cv2.cvtColor(
|
131
|
+
np.random.randint(2**8 - 1, size=(h, w, channels), dtype=np.uint8),
|
132
|
+
cv2.COLOR_RGB2GRAY)
|
133
|
+
gray8_image_frame = ImageFrame(
|
134
|
+
image_format=ImageFormat.GRAY8,
|
135
|
+
data=np.ascontiguousarray(mat[offset:-offset, offset:-offset]))
|
136
|
+
self.assertTrue(
|
137
|
+
np.array_equal(mat[offset:-offset, offset:-offset],
|
138
|
+
gray8_image_frame.numpy_view()))
|
139
|
+
|
140
|
+
def test_cropped_rgb_image(self):
|
141
|
+
w, h = random.randrange(20, 100), random.randrange(20, 100)
|
142
|
+
channels, offset = 3, 10
|
143
|
+
mat = cv2.cvtColor(
|
144
|
+
np.random.randint(2**8 - 1, size=(h, w, channels), dtype=np.uint8),
|
145
|
+
cv2.COLOR_RGB2BGR)
|
146
|
+
rgb_image_frame = ImageFrame(
|
147
|
+
image_format=ImageFormat.SRGB,
|
148
|
+
data=np.ascontiguousarray(mat[offset:-offset, offset:-offset, :]))
|
149
|
+
self.assertTrue(
|
150
|
+
np.array_equal(mat[offset:-offset, offset:-offset, :],
|
151
|
+
rgb_image_frame.numpy_view()))
|
152
|
+
|
153
|
+
# For image frames that store contiguous data, the output of numpy_view()
|
154
|
+
# points to the pixel data of the original image frame object. The life cycle
|
155
|
+
# of the data array should tie to the image frame object.
|
156
|
+
def test_image_frame_numpy_view_with_contiguous_data(self):
|
157
|
+
w, h = 640, 480
|
158
|
+
mat = np.random.randint(2**8 - 1, size=(h, w, 3), dtype=np.uint8)
|
159
|
+
rgb_image_frame = ImageFrame(image_format=ImageFormat.SRGB, data=mat)
|
160
|
+
self.assertTrue(rgb_image_frame.is_contiguous())
|
161
|
+
initial_ref_count = sys.getrefcount(rgb_image_frame)
|
162
|
+
self.assertTrue(np.array_equal(mat, rgb_image_frame.numpy_view()))
|
163
|
+
# Get 2 data array objects and verify that the image frame's ref count is
|
164
|
+
# increased by 2.
|
165
|
+
np_view = rgb_image_frame.numpy_view()
|
166
|
+
self.assertEqual(sys.getrefcount(rgb_image_frame), initial_ref_count + 1)
|
167
|
+
np_view2 = rgb_image_frame.numpy_view()
|
168
|
+
self.assertEqual(sys.getrefcount(rgb_image_frame), initial_ref_count + 2)
|
169
|
+
del np_view
|
170
|
+
del np_view2
|
171
|
+
gc.collect()
|
172
|
+
# After the two data array objects getting destroyed, the current ref count
|
173
|
+
# should euqal to the initial ref count.
|
174
|
+
self.assertEqual(sys.getrefcount(rgb_image_frame), initial_ref_count)
|
175
|
+
|
176
|
+
# For image frames that store non contiguous data, the output of numpy_view()
|
177
|
+
# stores a copy of the pixel data of the image frame object. The life cycle of
|
178
|
+
# the data array doesn't tie to the image frame object.
|
179
|
+
def test_image_frame_numpy_view_with_non_contiguous_data(self):
|
180
|
+
w, h = 641, 481
|
181
|
+
mat = np.random.randint(2**8 - 1, size=(h, w, 3), dtype=np.uint8)
|
182
|
+
rgb_image_frame = ImageFrame(image_format=ImageFormat.SRGB, data=mat)
|
183
|
+
self.assertFalse(rgb_image_frame.is_contiguous())
|
184
|
+
initial_ref_count = sys.getrefcount(rgb_image_frame)
|
185
|
+
self.assertTrue(np.array_equal(mat, rgb_image_frame.numpy_view()))
|
186
|
+
np_view = rgb_image_frame.numpy_view()
|
187
|
+
self.assertEqual(sys.getrefcount(rgb_image_frame), initial_ref_count)
|
188
|
+
del np_view
|
189
|
+
gc.collect()
|
190
|
+
self.assertEqual(sys.getrefcount(rgb_image_frame), initial_ref_count)
|
191
|
+
|
192
|
+
|
193
|
+
if __name__ == '__main__':
|
194
|
+
absltest.main()
|
@@ -0,0 +1,218 @@
|
|
1
|
+
# Copyright 2021 The MediaPipe Authors.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
"""Tests for mediapipe.python._framework_bindings.image."""
|
16
|
+
|
17
|
+
import gc
|
18
|
+
import os
|
19
|
+
import random
|
20
|
+
import sys
|
21
|
+
|
22
|
+
from absl.testing import absltest
|
23
|
+
import cv2
|
24
|
+
import numpy as np
|
25
|
+
import PIL.Image
|
26
|
+
|
27
|
+
# resources dependency
|
28
|
+
from mediapipe.python._framework_bindings import image
|
29
|
+
from mediapipe.python._framework_bindings import image_frame
|
30
|
+
|
31
|
+
TEST_IMAGE_PATH = 'mediapipe/python/solutions/testdata'
|
32
|
+
|
33
|
+
Image = image.Image
|
34
|
+
ImageFormat = image_frame.ImageFormat
|
35
|
+
|
36
|
+
|
37
|
+
# TODO: Add unit tests specifically for memory management.
|
38
|
+
class ImageTest(absltest.TestCase):
|
39
|
+
|
40
|
+
def test_create_image_from_gray_cv_mat(self):
|
41
|
+
w, h = random.randrange(3, 100), random.randrange(3, 100)
|
42
|
+
mat = cv2.cvtColor(
|
43
|
+
np.random.randint(2**8 - 1, size=(h, w, 3), dtype=np.uint8),
|
44
|
+
cv2.COLOR_RGB2GRAY)
|
45
|
+
mat[2, 2] = 42
|
46
|
+
gray8_image = Image(image_format=ImageFormat.GRAY8, data=mat)
|
47
|
+
self.assertTrue(np.array_equal(mat, gray8_image.numpy_view()))
|
48
|
+
with self.assertRaisesRegex(IndexError, 'index dimension mismatch'):
|
49
|
+
print(gray8_image[w, h, 1])
|
50
|
+
with self.assertRaisesRegex(IndexError, 'out of bounds'):
|
51
|
+
print(gray8_image[w, h])
|
52
|
+
self.assertEqual(42, gray8_image[2, 2])
|
53
|
+
|
54
|
+
def test_create_image_from_rgb_cv_mat(self):
|
55
|
+
w, h, channels = random.randrange(3, 100), random.randrange(3, 100), 3
|
56
|
+
mat = cv2.cvtColor(
|
57
|
+
np.random.randint(2**8 - 1, size=(h, w, channels), dtype=np.uint8),
|
58
|
+
cv2.COLOR_RGB2BGR)
|
59
|
+
mat[2, 2, 1] = 42
|
60
|
+
rgb_image = Image(image_format=ImageFormat.SRGB, data=mat)
|
61
|
+
self.assertTrue(np.array_equal(mat, rgb_image.numpy_view()))
|
62
|
+
with self.assertRaisesRegex(IndexError, 'out of bounds'):
|
63
|
+
print(rgb_image[w, h, channels])
|
64
|
+
self.assertEqual(42, rgb_image[2, 2, 1])
|
65
|
+
|
66
|
+
def test_create_image_from_rgb48_cv_mat(self):
|
67
|
+
w, h, channels = random.randrange(3, 100), random.randrange(3, 100), 3
|
68
|
+
mat = cv2.cvtColor(
|
69
|
+
np.random.randint(2**16 - 1, size=(h, w, channels), dtype=np.uint16),
|
70
|
+
cv2.COLOR_RGB2BGR)
|
71
|
+
mat[2, 2, 1] = 42
|
72
|
+
rgb48_image = Image(image_format=ImageFormat.SRGB48, data=mat)
|
73
|
+
self.assertTrue(np.array_equal(mat, rgb48_image.numpy_view()))
|
74
|
+
with self.assertRaisesRegex(IndexError, 'out of bounds'):
|
75
|
+
print(rgb48_image[w, h, channels])
|
76
|
+
self.assertEqual(42, rgb48_image[2, 2, 1])
|
77
|
+
|
78
|
+
def test_create_image_from_gray_pil_image(self):
|
79
|
+
w, h = random.randrange(3, 100), random.randrange(3, 100)
|
80
|
+
img = PIL.Image.fromarray(
|
81
|
+
np.random.randint(2**8 - 1, size=(h, w), dtype=np.uint8), 'L')
|
82
|
+
gray8_image = Image(image_format=ImageFormat.GRAY8, data=np.asarray(img))
|
83
|
+
self.assertTrue(np.array_equal(np.asarray(img), gray8_image.numpy_view()))
|
84
|
+
with self.assertRaisesRegex(IndexError, 'index dimension mismatch'):
|
85
|
+
print(gray8_image[w, h, 1])
|
86
|
+
with self.assertRaisesRegex(IndexError, 'out of bounds'):
|
87
|
+
print(gray8_image[w, h])
|
88
|
+
|
89
|
+
def test_create_image_from_rgb_pil_image(self):
|
90
|
+
w, h, channels = random.randrange(3, 100), random.randrange(3, 100), 3
|
91
|
+
img = PIL.Image.fromarray(
|
92
|
+
np.random.randint(2**8 - 1, size=(h, w, channels), dtype=np.uint8),
|
93
|
+
'RGB')
|
94
|
+
rgb_image = Image(image_format=ImageFormat.SRGB, data=np.asarray(img))
|
95
|
+
self.assertTrue(np.array_equal(np.asarray(img), rgb_image.numpy_view()))
|
96
|
+
with self.assertRaisesRegex(IndexError, 'out of bounds'):
|
97
|
+
print(rgb_image[w, h, channels])
|
98
|
+
|
99
|
+
def test_create_image_from_rgba64_pil_image(self):
|
100
|
+
w, h, channels = random.randrange(3, 100), random.randrange(3, 100), 4
|
101
|
+
img = PIL.Image.fromarray(
|
102
|
+
np.random.randint(2**16 - 1, size=(h, w, channels), dtype=np.uint16),
|
103
|
+
'RGBA')
|
104
|
+
rgba_image = Image(
|
105
|
+
image_format=ImageFormat.SRGBA64,
|
106
|
+
data=np.asarray(img).astype(np.uint16))
|
107
|
+
self.assertTrue(np.array_equal(np.asarray(img), rgba_image.numpy_view()))
|
108
|
+
with self.assertRaisesRegex(IndexError, 'out of bounds'):
|
109
|
+
print(rgba_image[1000, 1000, 1000])
|
110
|
+
|
111
|
+
def test_image_numby_view(self):
|
112
|
+
w, h, channels = random.randrange(3, 100), random.randrange(3, 100), 3
|
113
|
+
mat = cv2.cvtColor(
|
114
|
+
np.random.randint(2**8 - 1, size=(h, w, channels), dtype=np.uint8),
|
115
|
+
cv2.COLOR_RGB2BGR)
|
116
|
+
rgb_image = Image(image_format=ImageFormat.SRGB, data=mat)
|
117
|
+
output_ndarray = rgb_image.numpy_view()
|
118
|
+
self.assertTrue(np.array_equal(mat, rgb_image.numpy_view()))
|
119
|
+
# The output of numpy_view() is a reference to the internal data and it's
|
120
|
+
# unwritable after creation.
|
121
|
+
with self.assertRaisesRegex(ValueError,
|
122
|
+
'assignment destination is read-only'):
|
123
|
+
output_ndarray[0, 0, 0] = 0
|
124
|
+
copied_ndarray = np.copy(output_ndarray)
|
125
|
+
copied_ndarray[0, 0, 0] = 0
|
126
|
+
|
127
|
+
def test_cropped_gray8_image(self):
|
128
|
+
w, h = random.randrange(20, 100), random.randrange(20, 100)
|
129
|
+
channels, offset = 3, 10
|
130
|
+
mat = cv2.cvtColor(
|
131
|
+
np.random.randint(2**8 - 1, size=(h, w, channels), dtype=np.uint8),
|
132
|
+
cv2.COLOR_RGB2GRAY)
|
133
|
+
gray8_image = Image(
|
134
|
+
image_format=ImageFormat.GRAY8,
|
135
|
+
data=np.ascontiguousarray(mat[offset:-offset, offset:-offset]))
|
136
|
+
self.assertTrue(
|
137
|
+
np.array_equal(mat[offset:-offset, offset:-offset],
|
138
|
+
gray8_image.numpy_view()))
|
139
|
+
|
140
|
+
def test_cropped_rgb_image(self):
|
141
|
+
w, h = random.randrange(20, 100), random.randrange(20, 100)
|
142
|
+
channels, offset = 3, 10
|
143
|
+
mat = cv2.cvtColor(
|
144
|
+
np.random.randint(2**8 - 1, size=(h, w, channels), dtype=np.uint8),
|
145
|
+
cv2.COLOR_RGB2BGR)
|
146
|
+
rgb_image = Image(
|
147
|
+
image_format=ImageFormat.SRGB,
|
148
|
+
data=np.ascontiguousarray(mat[offset:-offset, offset:-offset, :]))
|
149
|
+
self.assertTrue(
|
150
|
+
np.array_equal(mat[offset:-offset, offset:-offset, :],
|
151
|
+
rgb_image.numpy_view()))
|
152
|
+
|
153
|
+
# For image frames that store contiguous data, the output of numpy_view()
|
154
|
+
# points to the pixel data of the original image frame object. The life cycle
|
155
|
+
# of the data array should tie to the image frame object.
|
156
|
+
def test_image_numpy_view_with_contiguous_data(self):
|
157
|
+
w, h = 640, 480
|
158
|
+
mat = np.random.randint(2**8 - 1, size=(h, w, 3), dtype=np.uint8)
|
159
|
+
rgb_image = Image(image_format=ImageFormat.SRGB, data=mat)
|
160
|
+
self.assertTrue(rgb_image.is_contiguous())
|
161
|
+
initial_ref_count = sys.getrefcount(rgb_image)
|
162
|
+
self.assertTrue(np.array_equal(mat, rgb_image.numpy_view()))
|
163
|
+
# Get 2 data array objects and verify that the image frame's ref count is
|
164
|
+
# increased by 2.
|
165
|
+
np_view = rgb_image.numpy_view()
|
166
|
+
self.assertEqual(sys.getrefcount(rgb_image), initial_ref_count + 1)
|
167
|
+
np_view2 = rgb_image.numpy_view()
|
168
|
+
self.assertEqual(sys.getrefcount(rgb_image), initial_ref_count + 2)
|
169
|
+
del np_view
|
170
|
+
del np_view2
|
171
|
+
gc.collect()
|
172
|
+
# After the two data array objects getting destroyed, the current ref count
|
173
|
+
# should euqal to the initial ref count.
|
174
|
+
self.assertEqual(sys.getrefcount(rgb_image), initial_ref_count)
|
175
|
+
|
176
|
+
# For image frames that store non contiguous data, the output of numpy_view()
|
177
|
+
# stores a copy of the pixel data of the image frame object. The life cycle of
|
178
|
+
# the data array doesn't tie to the image frame object.
|
179
|
+
def test_image_numpy_view_with_non_contiguous_data(self):
|
180
|
+
w, h = 641, 481
|
181
|
+
mat = np.random.randint(2**8 - 1, size=(h, w, 3), dtype=np.uint8)
|
182
|
+
rgb_image = Image(image_format=ImageFormat.SRGB, data=mat)
|
183
|
+
self.assertFalse(rgb_image.is_contiguous())
|
184
|
+
initial_ref_count = sys.getrefcount(rgb_image)
|
185
|
+
self.assertTrue(np.array_equal(mat, rgb_image.numpy_view()))
|
186
|
+
np_view = rgb_image.numpy_view()
|
187
|
+
self.assertEqual(sys.getrefcount(rgb_image), initial_ref_count)
|
188
|
+
del np_view
|
189
|
+
gc.collect()
|
190
|
+
self.assertEqual(sys.getrefcount(rgb_image), initial_ref_count)
|
191
|
+
|
192
|
+
def test_image_create_from_cvmat(self):
|
193
|
+
image_path = os.path.join(os.path.dirname(__file__),
|
194
|
+
'solutions/testdata/hands.jpg')
|
195
|
+
mat = cv2.imread(image_path).astype(np.uint8)
|
196
|
+
mat = cv2.cvtColor(mat, cv2.COLOR_BGR2RGB)
|
197
|
+
rgb_image = Image(image_format=ImageFormat.SRGB, data=mat)
|
198
|
+
self.assertEqual(rgb_image.width, 720)
|
199
|
+
self.assertEqual(rgb_image.height, 382)
|
200
|
+
self.assertEqual(rgb_image.channels, 3)
|
201
|
+
self.assertEqual(rgb_image.image_format, ImageFormat.SRGB)
|
202
|
+
self.assertTrue(np.array_equal(mat, rgb_image.numpy_view()))
|
203
|
+
|
204
|
+
def test_image_create_from_file(self):
|
205
|
+
image_path = os.path.join(os.path.dirname(__file__),
|
206
|
+
'solutions/testdata/hands.jpg')
|
207
|
+
loaded_image = Image.create_from_file(image_path)
|
208
|
+
self.assertEqual(loaded_image.width, 720)
|
209
|
+
self.assertEqual(loaded_image.height, 382)
|
210
|
+
# On Mac w/ GPU support, images use 4 channels (SRGBA). Otherwise, all
|
211
|
+
# images use 3 channels (SRGB).
|
212
|
+
self.assertIn(loaded_image.channels, [3, 4])
|
213
|
+
self.assertIn(
|
214
|
+
loaded_image.image_format, [ImageFormat.SRGB, ImageFormat.SRGBA]
|
215
|
+
)
|
216
|
+
|
217
|
+
if __name__ == '__main__':
|
218
|
+
absltest.main()
|
@@ -0,0 +1,275 @@
|
|
1
|
+
# Copyright 2020 The MediaPipe Authors.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
"""The public facing packet creator APIs."""
|
16
|
+
|
17
|
+
from typing import List, Union
|
18
|
+
import warnings
|
19
|
+
|
20
|
+
import numpy as np
|
21
|
+
|
22
|
+
from google.protobuf import message
|
23
|
+
from mediapipe.python._framework_bindings import _packet_creator
|
24
|
+
from mediapipe.python._framework_bindings import image
|
25
|
+
from mediapipe.python._framework_bindings import image_frame
|
26
|
+
from mediapipe.python._framework_bindings import packet
|
27
|
+
|
28
|
+
|
29
|
+
create_string = _packet_creator.create_string
|
30
|
+
create_bool = _packet_creator.create_bool
|
31
|
+
create_int = _packet_creator.create_int
|
32
|
+
create_int8 = _packet_creator.create_int8
|
33
|
+
create_int16 = _packet_creator.create_int16
|
34
|
+
create_int32 = _packet_creator.create_int32
|
35
|
+
create_int64 = _packet_creator.create_int64
|
36
|
+
create_uint8 = _packet_creator.create_uint8
|
37
|
+
create_uint16 = _packet_creator.create_uint16
|
38
|
+
create_uint32 = _packet_creator.create_uint32
|
39
|
+
create_uint64 = _packet_creator.create_uint64
|
40
|
+
create_float = _packet_creator.create_float
|
41
|
+
create_double = _packet_creator.create_double
|
42
|
+
create_int_array = _packet_creator.create_int_array
|
43
|
+
create_float_array = _packet_creator.create_float_array
|
44
|
+
create_int_vector = _packet_creator.create_int_vector
|
45
|
+
create_bool_vector = _packet_creator.create_bool_vector
|
46
|
+
create_float_vector = _packet_creator.create_float_vector
|
47
|
+
create_string_vector = _packet_creator.create_string_vector
|
48
|
+
create_image_vector = _packet_creator.create_image_vector
|
49
|
+
create_packet_vector = _packet_creator.create_packet_vector
|
50
|
+
create_string_to_packet_map = _packet_creator.create_string_to_packet_map
|
51
|
+
create_matrix = _packet_creator.create_matrix
|
52
|
+
|
53
|
+
|
54
|
+
def create_image_frame(data: Union[image_frame.ImageFrame, np.ndarray], # pytype: disable=annotation-type-mismatch
|
55
|
+
*,
|
56
|
+
image_format: image_frame.ImageFormat = None,
|
57
|
+
copy: bool = None) -> packet.Packet:
|
58
|
+
"""Create a MediaPipe ImageFrame packet.
|
59
|
+
|
60
|
+
A MediaPipe ImageFrame packet can be created from an existing MediaPipe
|
61
|
+
ImageFrame object and the data will be realigned and copied into a new
|
62
|
+
ImageFrame object inside of the packet.
|
63
|
+
|
64
|
+
A MediaPipe ImageFrame packet can also be created from the raw pixel data
|
65
|
+
represented as a numpy array with one of the uint8, uint16, and float data
|
66
|
+
types. There are three data ownership modes depending on how the 'copy' arg
|
67
|
+
is set.
|
68
|
+
|
69
|
+
i) Default mode
|
70
|
+
If copy is not set, mutable data is always copied while the immutable data
|
71
|
+
is by reference.
|
72
|
+
|
73
|
+
ii) Copy mode (safe)
|
74
|
+
If copy is set to True, the data will be realigned and copied into an
|
75
|
+
ImageFrame object inside of the packet regardless the immutablity of the
|
76
|
+
original data.
|
77
|
+
|
78
|
+
iii) Reference mode (dangerous)
|
79
|
+
If copy is set to False, the data will be forced to be shared. If the data is
|
80
|
+
mutable (data.flags.writeable is True), a warning will be raised.
|
81
|
+
|
82
|
+
Args:
|
83
|
+
data: A MediaPipe ImageFrame object or the raw pixel data that is
|
84
|
+
represnted as a numpy ndarray.
|
85
|
+
image_format: One of the image_frame.ImageFormat enum types.
|
86
|
+
copy: Indicate if the packet should copy the data from the numpy nparray.
|
87
|
+
|
88
|
+
Returns:
|
89
|
+
A MediaPipe ImageFrame Packet.
|
90
|
+
|
91
|
+
Raises:
|
92
|
+
ValueError:
|
93
|
+
i) When "data" is a numpy ndarray, "image_format" is not provided or
|
94
|
+
the "data" array is not c_contiguous in the reference mode.
|
95
|
+
ii) When "data" is an ImageFrame object, the "image_format" arg doesn't
|
96
|
+
match the image format of the "data" ImageFrame object or "copy" is
|
97
|
+
explicitly set to False.
|
98
|
+
TypeError: If "image format" doesn't match "data" array's data type.
|
99
|
+
|
100
|
+
Examples:
|
101
|
+
np_array = np.random.randint(255, size=(321, 123, 3), dtype=np.uint8)
|
102
|
+
# Copy mode by default if the data array is writable.
|
103
|
+
image_frame_packet = mp.packet_creator.create_image_frame(
|
104
|
+
image_format=mp.ImageFormat.SRGB, data=np_array)
|
105
|
+
|
106
|
+
# Make the array unwriteable to trigger the reference mode.
|
107
|
+
np_array.flags.writeable = False
|
108
|
+
image_frame_packet = mp.packet_creator.create_image_frame(
|
109
|
+
image_format=mp.ImageFormat.SRGB, data=np_array)
|
110
|
+
|
111
|
+
image_frame = mp.ImageFrame(image_format=mp.ImageFormat.SRGB, data=np_array)
|
112
|
+
image_frame_packet = mp.packet_creator.create_image_frame(image_frame)
|
113
|
+
|
114
|
+
"""
|
115
|
+
if isinstance(data, image_frame.ImageFrame):
|
116
|
+
if image_format is not None and data.image_format != image_format:
|
117
|
+
raise ValueError(
|
118
|
+
'The provided image_format doesn\'t match the one from the data arg.')
|
119
|
+
if copy is not None and not copy:
|
120
|
+
# Taking a reference will make the created packet be mutable since the
|
121
|
+
# ImageFrame object can still be manipulated in Python, which voids packet
|
122
|
+
# immutability.
|
123
|
+
raise ValueError(
|
124
|
+
'Creating ImageFrame packet by taking a reference of another ImageFrame object is not supported yet.'
|
125
|
+
)
|
126
|
+
# pylint:disable=protected-access
|
127
|
+
return _packet_creator._create_image_frame_from_image_frame(data)
|
128
|
+
# pylint:enable=protected-access
|
129
|
+
else:
|
130
|
+
if image_format is None:
|
131
|
+
raise ValueError('Please provide \'image_format\' with \'data\'.')
|
132
|
+
# If copy arg is not set, copying the data if it's immutable. Otherwise,
|
133
|
+
# take a reference of the immutable data to avoid data copy.
|
134
|
+
if copy is None:
|
135
|
+
copy = True if data.flags.writeable else False
|
136
|
+
if not copy:
|
137
|
+
# TODO: Investigate why the first 2 bytes of the data has data
|
138
|
+
# corruption when "data" is not c_contiguous.
|
139
|
+
if not data.flags.c_contiguous:
|
140
|
+
raise ValueError(
|
141
|
+
'Reference mode is unavailable if \'data\' is not c_contiguous.')
|
142
|
+
if data.flags.writeable:
|
143
|
+
warnings.warn(
|
144
|
+
'\'data\' is still writeable. Taking a reference of the data to create ImageFrame packet is dangerous.',
|
145
|
+
RuntimeWarning, 2)
|
146
|
+
# pylint:disable=protected-access
|
147
|
+
return _packet_creator._create_image_frame_from_pixel_data(
|
148
|
+
image_format, data, copy)
|
149
|
+
# pylint:enable=protected-access
|
150
|
+
|
151
|
+
|
152
|
+
def create_image(data: Union[image.Image, np.ndarray], # pytype: disable=annotation-type-mismatch
|
153
|
+
*,
|
154
|
+
image_format: image_frame.ImageFormat = None,
|
155
|
+
copy: bool = None) -> packet.Packet:
|
156
|
+
"""Create a MediaPipe Image packet.
|
157
|
+
|
158
|
+
A MediaPipe Image packet can be created from an existing MediaPipe
|
159
|
+
Image object and the data will be realigned and copied into a new
|
160
|
+
Image object inside of the packet.
|
161
|
+
|
162
|
+
A MediaPipe Image packet can also be created from the raw pixel data
|
163
|
+
represented as a numpy array with one of the uint8, uint16, and float data
|
164
|
+
types. There are three data ownership modes depending on how the 'copy' arg
|
165
|
+
is set.
|
166
|
+
|
167
|
+
i) Default mode
|
168
|
+
If copy is not set, mutable data is always copied while the immutable data
|
169
|
+
is by reference.
|
170
|
+
|
171
|
+
ii) Copy mode (safe)
|
172
|
+
If copy is set to True, the data will be realigned and copied into an
|
173
|
+
Image object inside of the packet regardless the immutablity of the
|
174
|
+
original data.
|
175
|
+
|
176
|
+
iii) Reference mode (dangerous)
|
177
|
+
If copy is set to False, the data will be forced to be shared. If the data is
|
178
|
+
mutable (data.flags.writeable is True), a warning will be raised.
|
179
|
+
|
180
|
+
Args:
|
181
|
+
data: A MediaPipe Image object or the raw pixel data that is represnted as a
|
182
|
+
numpy ndarray.
|
183
|
+
image_format: One of the mp.ImageFormat enum types.
|
184
|
+
copy: Indicate if the packet should copy the data from the numpy nparray.
|
185
|
+
|
186
|
+
Returns:
|
187
|
+
A MediaPipe Image Packet.
|
188
|
+
|
189
|
+
Raises:
|
190
|
+
ValueError:
|
191
|
+
i) When "data" is a numpy ndarray, "image_format" is not provided or
|
192
|
+
the "data" array is not c_contiguous in the reference mode.
|
193
|
+
ii) When "data" is an Image object, the "image_format" arg doesn't
|
194
|
+
match the image format of the "data" Image object or "copy" is
|
195
|
+
explicitly set to False.
|
196
|
+
TypeError: If "image format" doesn't match "data" array's data type.
|
197
|
+
|
198
|
+
Examples:
|
199
|
+
np_array = np.random.randint(255, size=(321, 123, 3), dtype=np.uint8)
|
200
|
+
# Copy mode by default if the data array is writable.
|
201
|
+
image_packet = mp.packet_creator.create_image(
|
202
|
+
image_format=mp.ImageFormat.SRGB, data=np_array)
|
203
|
+
|
204
|
+
# Make the array unwriteable to trigger the reference mode.
|
205
|
+
np_array.flags.writeable = False
|
206
|
+
image_packet = mp.packet_creator.create_image(
|
207
|
+
image_format=mp.ImageFormat.SRGB, data=np_array)
|
208
|
+
|
209
|
+
image = mp.Image(image_format=mp.ImageFormat.SRGB, data=np_array)
|
210
|
+
image_packet = mp.packet_creator.create_image(image)
|
211
|
+
|
212
|
+
"""
|
213
|
+
if isinstance(data, image.Image):
|
214
|
+
if image_format is not None and data.image_format != image_format:
|
215
|
+
raise ValueError(
|
216
|
+
'The provided image_format doesn\'t match the one from the data arg.')
|
217
|
+
if copy is not None and not copy:
|
218
|
+
# Taking a reference will make the created packet be mutable since the
|
219
|
+
# Image object can still be manipulated in Python, which voids packet
|
220
|
+
# immutability.
|
221
|
+
raise ValueError(
|
222
|
+
'Creating Image packet by taking a reference of another Image object is not supported yet.'
|
223
|
+
)
|
224
|
+
# pylint:disable=protected-access
|
225
|
+
return _packet_creator._create_image_from_image(data)
|
226
|
+
# pylint:enable=protected-access
|
227
|
+
else:
|
228
|
+
if image_format is None:
|
229
|
+
raise ValueError('Please provide \'image_format\' with \'data\'.')
|
230
|
+
# If copy arg is not set, copying the data if it's immutable. Otherwise,
|
231
|
+
# take a reference of the immutable data to avoid data copy.
|
232
|
+
if copy is None:
|
233
|
+
copy = True if data.flags.writeable else False
|
234
|
+
if not copy:
|
235
|
+
# TODO: Investigate why the first 2 bytes of the data has data
|
236
|
+
# corruption when "data" is not c_contiguous.
|
237
|
+
if not data.flags.c_contiguous:
|
238
|
+
raise ValueError(
|
239
|
+
'Reference mode is unavailable if \'data\' is not c_contiguous.')
|
240
|
+
if data.flags.writeable:
|
241
|
+
warnings.warn(
|
242
|
+
'\'data\' is still writeable. Taking a reference of the data to create Image packet is dangerous.',
|
243
|
+
RuntimeWarning, 2)
|
244
|
+
# pylint:disable=protected-access
|
245
|
+
return _packet_creator._create_image_from_pixel_data(
|
246
|
+
image_format, data, copy)
|
247
|
+
# pylint:enable=protected-access
|
248
|
+
|
249
|
+
|
250
|
+
def create_proto(proto_message: message.Message) -> packet.Packet:
|
251
|
+
"""Create a MediaPipe protobuf message packet.
|
252
|
+
|
253
|
+
Args:
|
254
|
+
proto_message: A Python protobuf message.
|
255
|
+
|
256
|
+
Returns:
|
257
|
+
A MediaPipe protobuf message Packet.
|
258
|
+
|
259
|
+
Raises:
|
260
|
+
RuntimeError: If the protobuf message type is not registered in MediaPipe.
|
261
|
+
|
262
|
+
Examples:
|
263
|
+
detection = detection_pb2.Detection()
|
264
|
+
text_format.Parse('score: 0.5', detection)
|
265
|
+
packet = mp.packet_creator.create_proto(detection)
|
266
|
+
output_detection = mp.packet_getter.get_proto(packet)
|
267
|
+
"""
|
268
|
+
# pylint:disable=protected-access
|
269
|
+
return _packet_creator._create_proto(proto_message.DESCRIPTOR.full_name,
|
270
|
+
proto_message.SerializeToString())
|
271
|
+
# pylint:enable=protected-access
|
272
|
+
|
273
|
+
|
274
|
+
def create_proto_vector(message_list: List[message.Message]) -> packet.Packet:
|
275
|
+
raise NotImplementedError('create_proto_vector is not implemented.')
|