From 7385d83ff6668ce4cd13255167eb61c8a6e3d0e8 Mon Sep 17 00:00:00 2001 From: Prianka Liz Kariat Date: Fri, 24 Jun 2022 00:43:46 +0530 Subject: [PATCH 01/11] Updated audio tests --- .../lite/delegates/gpu/metal/kernels/BUILD | 910 ++++++++++++++++++ .../ios/task/audio/core/BUILD | 6 +- .../ios/task/audio/core/audio_record/BUILD | 4 +- .../test/task/audio/audio_classifier/BUILD | 26 + .../TFLAudioClassifierTests.m | 171 +++- .../TFLAudioClassifierTests.swift | 47 + .../test/task/audio/core/audio_record/BUILD | 2 - .../task/audio/core/audio_record/utils/BUILD | 3 +- .../utils/sources/AVAudioPCMBuffer+Utils.h | 4 +- 9 files changed, 1141 insertions(+), 32 deletions(-) create mode 100644 bazel-tflite-support/external/org_tensorflow/tensorflow/lite/delegates/gpu/metal/kernels/BUILD create mode 100644 tensorflow_lite_support/ios/test/task/audio/audio_classifier/TFLAudioClassifierTests.swift diff --git a/bazel-tflite-support/external/org_tensorflow/tensorflow/lite/delegates/gpu/metal/kernels/BUILD b/bazel-tflite-support/external/org_tensorflow/tensorflow/lite/delegates/gpu/metal/kernels/BUILD new file mode 100644 index 000000000..a2f8dbb6c --- /dev/null +++ b/bazel-tflite-support/external/org_tensorflow/tensorflow/lite/delegates/gpu/metal/kernels/BUILD @@ -0,0 +1,910 @@ +load("@build_bazel_rules_apple//apple:ios.bzl", "ios_unit_test") +load( + "//tensorflow/lite:special_rules.bzl", + "tflite_ios_lab_runner", + "tflite_ios_per_kernel_test", + "tflite_portable_test_suite", +) +load( + "//tensorflow/core/platform:build_config_root.bzl", + "tf_gpu_tests_tags", +) + +package( + default_visibility = ["//visibility:public"], + licenses = ["notice"], +) + +objc_library( + name = "add_test_lib", + testonly = 1, + srcs = ["add_test.mm"], + sdk_frameworks = ["XCTest"], + deps = [ + ":test_util", + "//tensorflow/lite/delegates/gpu/common/tasks:add_test_util", + ], +) + +ios_unit_test( + name = "add_test", + testonly = 1, + minimum_os_version = "11.4", + runner = tflite_ios_lab_runner("IOS_LATEST"), + tags = tf_gpu_tests_tags() + [ + "notap", + "tflite_not_portable_android", + ], + deps = [":add_test_lib"], +) + +objc_library( + name = "cast_test_lib", + testonly = 1, + srcs = ["cast_test.mm"], + sdk_frameworks = ["XCTest"], + deps = [ + ":test_util", + "//tensorflow/lite/delegates/gpu/common/tasks:cast_test_util", + ], +) + +ios_unit_test( + name = "cast_test", + testonly = 1, + minimum_os_version = "11.4", + runner = tflite_ios_lab_runner("IOS_LATEST"), + tags = tf_gpu_tests_tags() + [ + "notap", + "tflite_not_portable_android", + ], + deps = [":cast_test_lib"], +) + +objc_library( + name = "concat_test_lib", + testonly = 1, + srcs = ["concat_test.mm"], + sdk_frameworks = ["XCTest"], + deps = [ + ":test_util", + "//tensorflow/lite/delegates/gpu/common/tasks:concat_test_util", + ], +) + +ios_unit_test( + name = "concat_test", + testonly = 1, + minimum_os_version = "11.4", + runner = tflite_ios_lab_runner("IOS_LATEST"), + tags = tf_gpu_tests_tags() + [ + "notap", + "tflite_not_portable_android", + ], + deps = [":concat_test_lib"], +) + +objc_library( + name = "conv_test_lib", + testonly = 1, + srcs = ["conv_test.mm"], + sdk_frameworks = ["XCTest"], + deps = [ + ":test_util", + "//tensorflow/lite/delegates/gpu/common/tasks:conv_buffer_1x1_test_util", + "//tensorflow/lite/delegates/gpu/common/tasks:conv_constants_test_util", + "//tensorflow/lite/delegates/gpu/common/tasks:conv_metal", + "//tensorflow/lite/delegates/gpu/common/tasks:conv_metal_simd", + "//tensorflow/lite/delegates/gpu/common/tasks:conv_powervr_test_util", + "//tensorflow/lite/delegates/gpu/common/tasks:winograd", + "//tensorflow/lite/delegates/gpu/metal:compute_task", + "//tensorflow/lite/delegates/gpu/metal:metal_spatial_tensor", + ], +) + +ios_unit_test( + name = "conv_test", + testonly = 1, + minimum_os_version = "11.4", + runner = tflite_ios_lab_runner("IOS_LATEST"), + tags = tf_gpu_tests_tags() + [ + "notap", + "tflite_not_portable_android", + ], + deps = [":conv_test_lib"], +) + +objc_library( + name = "conv_weights_converter_test_lib", + testonly = 1, + srcs = ["conv_weights_converter_test.mm"], + sdk_frameworks = ["XCTest"], + deps = [ + ":test_util", + "//tensorflow/lite/delegates/gpu/common/tasks:conv_weights_converter_test_util", + ], +) + +ios_unit_test( + name = "conv_weights_converter_test", + testonly = 1, + minimum_os_version = "11.4", + runner = tflite_ios_lab_runner("IOS_LATEST"), + tags = tf_gpu_tests_tags() + [ + "notap", + "tflite_not_portable_android", + ], + deps = [":conv_weights_converter_test_lib"], +) + +objc_library( + name = "cumsum_test_lib", + testonly = 1, + srcs = ["cumsum_test.mm"], + sdk_frameworks = ["XCTest"], + deps = [ + ":test_util", + "//tensorflow/lite/delegates/gpu/common:status", + "//tensorflow/lite/delegates/gpu/common/tasks:cumsum_test_util", + ], +) + +ios_unit_test( + name = "cumsum_test", + testonly = 1, + minimum_os_version = "11.4", + runner = tflite_ios_lab_runner("IOS_LATEST"), + tags = tf_gpu_tests_tags() + [ + "notap", + "tflite_not_portable_android", + ], + deps = [":cumsum_test_lib"], +) + +objc_library( + name = "depthwise_conv_test_lib", + testonly = 1, + srcs = ["depthwise_conv_test.mm"], + sdk_frameworks = ["XCTest"], + deps = [ + ":test_util", + "//tensorflow/lite/delegates/gpu/common/tasks:depthwise_conv_3x3_stride_h2_test_util", + "//tensorflow/lite/delegates/gpu/common/tasks:depthwise_conv_3x3_test_util", + "//tensorflow/lite/delegates/gpu/common/tasks:depthwise_conv_test_util", + ], +) + +ios_unit_test( + name = "depthwise_conv_test", + testonly = 1, + minimum_os_version = "11.4", + runner = tflite_ios_lab_runner("IOS_LATEST"), + tags = tf_gpu_tests_tags() + [ + "notap", + "tflite_not_portable_android", + ], + deps = [":depthwise_conv_test_lib"], +) + +objc_library( + name = "elementwise_test_lib", + testonly = 1, + srcs = ["elementwise_test.mm"], + sdk_frameworks = ["XCTest"], + deps = [ + ":test_util", + "//tensorflow/lite/delegates/gpu/common/tasks:elementwise_test_util", + ], +) + +ios_unit_test( + name = "elementwise_test", + testonly = 1, + minimum_os_version = "11.4", + runner = tflite_ios_lab_runner("IOS_LATEST"), + tags = tf_gpu_tests_tags() + [ + "notap", + "tflite_not_portable_android", + ], + deps = [":elementwise_test_lib"], +) + +objc_library( + name = "fully_connected_test_lib", + testonly = 1, + srcs = ["fully_connected_test.mm"], + sdk_frameworks = ["XCTest"], + deps = [ + ":test_util", + "//tensorflow/lite/delegates/gpu/common/tasks:fully_connected_test_util", + ], +) + +ios_unit_test( + name = "fully_connected_test", + testonly = 1, + minimum_os_version = "11.4", + runner = tflite_ios_lab_runner("IOS_LATEST"), + tags = tf_gpu_tests_tags() + [ + "notap", + "tflite_not_portable_android", + ], + deps = [":fully_connected_test_lib"], +) + +objc_library( + name = "gather_test_lib", + testonly = 1, + srcs = ["gather_test.mm"], + sdk_frameworks = ["XCTest"], + deps = [ + ":test_util", + "//tensorflow/lite/delegates/gpu/common/tasks:gather_test_util", + ], +) + +ios_unit_test( + name = "gather_test", + testonly = 1, + minimum_os_version = "11.4", + runner = tflite_ios_lab_runner("IOS_LATEST"), + tags = tf_gpu_tests_tags() + [ + "notap", + "tflite_not_portable_android", + ], + deps = [":gather_test_lib"], +) + +objc_library( + name = "lstm_test_lib", + testonly = 1, + srcs = ["lstm_test.mm"], + sdk_frameworks = ["XCTest"], + deps = [ + ":test_util", + "//tensorflow/lite/delegates/gpu/common/tasks:lstm_test_util", + ], +) + +ios_unit_test( + name = "lstm_test", + testonly = 1, + minimum_os_version = "11.4", + runner = tflite_ios_lab_runner("IOS_LATEST"), + tags = tf_gpu_tests_tags() + [ + "notap", + "tflite_not_portable_android", + ], + deps = [":lstm_test_lib"], +) + +objc_library( + name = "max_unpooling_test_lib", + testonly = 1, + srcs = ["max_unpooling_test.mm"], + sdk_frameworks = ["XCTest"], + deps = [ + ":test_util", + "//tensorflow/lite/delegates/gpu/common/tasks:max_unpooling_test_util", + ], +) + +ios_unit_test( + name = "max_unpooling_test", + testonly = 1, + minimum_os_version = "11.4", + runner = tflite_ios_lab_runner("IOS_LATEST"), + tags = tf_gpu_tests_tags() + [ + "notap", + "tflite_not_portable_android", + ], + deps = [":max_unpooling_test_lib"], +) + +objc_library( + name = "mean_stddev_normalization_test_lib", + testonly = 1, + srcs = ["mean_stddev_normalization_test.mm"], + sdk_frameworks = ["XCTest"], + deps = [ + ":test_util", + "//tensorflow/lite/delegates/gpu/common/tasks:mean_stddev_normalization_test_util", + ], +) + +ios_unit_test( + name = "mean_stddev_normalization_test", + testonly = 1, + minimum_os_version = "11.4", + runner = tflite_ios_lab_runner("IOS_LATEST"), + tags = tf_gpu_tests_tags() + [ + "notap", + "tflite_not_portable_android", + ], + deps = [":mean_stddev_normalization_test_lib"], +) + +objc_library( + name = "one_hot_test_lib", + testonly = 1, + srcs = ["one_hot_test.mm"], + sdk_frameworks = ["XCTest"], + deps = [ + ":test_util", + "//tensorflow/lite/delegates/gpu/common:status", + "//tensorflow/lite/delegates/gpu/common/tasks:one_hot_test_util", + # "//third_party/apple_frameworks:XCTest", + ], +) + +ios_unit_test( + name = "one_hot_test", + testonly = 1, + minimum_os_version = "11.4", + runner = tflite_ios_lab_runner("IOS_LATEST"), + tags = tf_gpu_tests_tags() + [ + "notap", + "tflite_not_portable_android", + ], + deps = [":one_hot_test_lib"], +) + +objc_library( + name = "padding_test_lib", + testonly = 1, + srcs = ["padding_test.mm"], + sdk_frameworks = ["XCTest"], + deps = [ + ":test_util", + "//tensorflow/lite/delegates/gpu/common/tasks:padding_test_util", + ], +) + +ios_unit_test( + name = "padding_test", + testonly = 1, + minimum_os_version = "11.4", + runner = tflite_ios_lab_runner("IOS_LATEST"), + tags = tf_gpu_tests_tags() + [ + "notap", + "tflite_not_portable_android", + ], + deps = [":padding_test_lib"], +) + +objc_library( + name = "pooling_test_lib", + testonly = 1, + srcs = ["pooling_test.mm"], + sdk_frameworks = ["XCTest"], + deps = [ + ":test_util", + "//tensorflow/lite/delegates/gpu/common/tasks:pooling_test_util", + ], +) + +ios_unit_test( + name = "pooling_test", + testonly = 1, + minimum_os_version = "11.4", + runner = tflite_ios_lab_runner("IOS_LATEST"), + tags = tf_gpu_tests_tags() + [ + "notap", + "tflite_not_portable_android", + ], + deps = [":pooling_test_lib"], +) + +objc_library( + name = "prelu_test_lib", + testonly = 1, + srcs = ["prelu_test.mm"], + sdk_frameworks = ["XCTest"], + deps = [ + ":test_util", + "//tensorflow/lite/delegates/gpu/common/tasks:prelu_test_util", + ], +) + +ios_unit_test( + name = "prelu_test", + testonly = 1, + minimum_os_version = "11.4", + runner = tflite_ios_lab_runner("IOS_LATEST"), + tags = tf_gpu_tests_tags() + [ + "notap", + "tflite_not_portable_android", + ], + deps = [":prelu_test_lib"], +) + +objc_library( + name = "quantize_and_dequantize_test_lib", + testonly = 1, + srcs = ["quantize_and_dequantize_test.mm"], + sdk_frameworks = ["XCTest"], + deps = [ + ":test_util", + "//tensorflow/lite/delegates/gpu/common:operations", + "//tensorflow/lite/delegates/gpu/common:shape", + "//tensorflow/lite/delegates/gpu/common:status", + "//tensorflow/lite/delegates/gpu/common:tensor", + "//tensorflow/lite/delegates/gpu/common:util", + "//tensorflow/lite/delegates/gpu/common/tasks:quantize_and_dequantize_test_util", + ], +) + +ios_unit_test( + name = "quantize_and_dequantize_test", + testonly = 1, + minimum_os_version = "11.4", + runner = tflite_ios_lab_runner("IOS_LATEST"), + tags = tf_gpu_tests_tags() + [ + "notap", + "tflite_not_portable_android", + ], + deps = [":quantize_and_dequantize_test_lib"], +) + +objc_library( + name = "reduce_test_lib", + testonly = 1, + srcs = ["reduce_test.mm"], + sdk_frameworks = ["XCTest"], + deps = [ + ":test_util", + "//tensorflow/lite/delegates/gpu/common/tasks:reduce_test_util", + ], +) + +ios_unit_test( + name = "reduce_test", + testonly = 1, + minimum_os_version = "11.4", + runner = tflite_ios_lab_runner("IOS_LATEST"), + tags = tf_gpu_tests_tags() + [ + "notap", + "tflite_not_portable_android", + ], + deps = [":reduce_test_lib"], +) + +objc_library( + name = "relu_test_lib", + testonly = 1, + srcs = ["relu_test.mm"], + sdk_frameworks = ["XCTest"], + deps = [ + ":test_util", + "//tensorflow/lite/delegates/gpu/common/tasks:relu_test_util", + ], +) + +ios_unit_test( + name = "relu_test", + testonly = 1, + minimum_os_version = "11.4", + runner = tflite_ios_lab_runner("IOS_LATEST"), + tags = tf_gpu_tests_tags() + [ + "notap", + "tflite_not_portable_android", + ], + deps = [":relu_test_lib"], +) + +objc_library( + name = "resampler_test_lib", + testonly = 1, + srcs = ["resampler_test.mm"], + sdk_frameworks = ["XCTest"], + deps = [ + "//tensorflow/lite/delegates/gpu/common:shape", + "//tensorflow/lite/delegates/gpu/common:status", + "//tensorflow/lite/delegates/gpu/common/tasks:resampler_test_util", + "//tensorflow/lite/delegates/gpu/metal/kernels:test_util", + ], +) + +ios_unit_test( + name = "resampler_test", + testonly = 1, + minimum_os_version = "11.4", + runner = tflite_ios_lab_runner("IOS_LATEST"), + tags = [ + "no_mac", # TODO(b/183905399) + "notap", + "tflite_mobile_test_jet", + "tflite_not_portable_android", + ], + deps = [":resampler_test_lib"], +) + +objc_library( + name = "resize_test_lib", + testonly = 1, + srcs = ["resize_test.mm"], + sdk_frameworks = ["XCTest"], + deps = [ + ":test_util", + "//tensorflow/lite/delegates/gpu/common/tasks:resize_test_util", + ], +) + +ios_unit_test( + name = "resize_test", + testonly = 1, + minimum_os_version = "11.4", + runner = tflite_ios_lab_runner("IOS_LATEST"), + tags = tf_gpu_tests_tags() + [ + "notap", + "tflite_not_portable_android", + ], + deps = [":resize_test_lib"], +) + +objc_library( + name = "reshape_test_lib", + testonly = 1, + srcs = ["reshape_test.mm"], + sdk_frameworks = ["XCTest"], + deps = [ + ":test_util", + "//tensorflow/lite/delegates/gpu/common/tasks:reshape_test_util", + ], +) + +ios_unit_test( + name = "reshape_test", + testonly = 1, + minimum_os_version = "11.4", + runner = tflite_ios_lab_runner("IOS_LATEST"), + tags = tf_gpu_tests_tags() + [ + "notap", + "tflite_not_portable_android", + ], + deps = [":reshape_test_lib"], +) + +objc_library( + name = "select_v2_test_lib", + testonly = 1, + srcs = ["select_v2_test.mm"], + sdk_frameworks = ["XCTest"], + deps = [ + ":test_util", + "//tensorflow/lite/delegates/gpu/common/tasks:select_v2_test_util", + ], +) + +ios_unit_test( + name = "select_v2_test", + testonly = 1, + minimum_os_version = "11.4", + runner = tflite_ios_lab_runner("IOS_LATEST"), + tags = tf_gpu_tests_tags() + [ + "notap", + "tflite_not_portable_android", + ], + deps = [":select_v2_test_lib"], +) + +objc_library( + name = "slice_test_lib", + testonly = 1, + srcs = ["slice_test.mm"], + sdk_frameworks = ["XCTest"], + deps = [ + ":test_util", + "//tensorflow/lite/delegates/gpu/common/tasks:strided_slice_test_util", + ], +) + +ios_unit_test( + name = "slice_test", + testonly = 1, + minimum_os_version = "11.4", + runner = tflite_ios_lab_runner("IOS_LATEST"), + tags = tf_gpu_tests_tags() + [ + "notap", + "tflite_not_portable_android", + ], + deps = [":slice_test_lib"], +) + +objc_library( + name = "softmax_test_lib", + testonly = 1, + srcs = ["softmax_test.mm"], + sdk_frameworks = ["XCTest"], + deps = [ + ":test_util", + "//tensorflow/lite/delegates/gpu/common/tasks:softmax_test_util", + ], +) + +ios_unit_test( + name = "softmax_test", + testonly = 1, + minimum_os_version = "11.4", + runner = tflite_ios_lab_runner("IOS_LATEST"), + tags = tf_gpu_tests_tags() + [ + "notap", + "tflite_not_portable_android", + ], + deps = [":softmax_test_lib"], +) + +objc_library( + name = "space_to_depth_test_lib", + testonly = 1, + srcs = ["space_to_depth_test.mm"], + sdk_frameworks = ["XCTest"], + deps = [ + ":test_util", + "//tensorflow/lite/delegates/gpu/common/tasks:space_to_depth_test_util", + ], +) + +ios_unit_test( + name = "space_to_depth_test", + testonly = 1, + minimum_os_version = "11.4", + runner = tflite_ios_lab_runner("IOS_LATEST"), + tags = tf_gpu_tests_tags() + [ + "notap", + "tflite_not_portable_android", + ], + deps = [":space_to_depth_test_lib"], +) + +objc_library( + name = "split_test_lib", + testonly = 1, + srcs = ["split_test.mm"], + sdk_frameworks = ["XCTest"], + deps = [ + ":test_util", + "//tensorflow/lite/delegates/gpu/common/tasks:split_test_util", + ], +) + +ios_unit_test( + name = "split_test", + testonly = 1, + minimum_os_version = "11.4", + runner = tflite_ios_lab_runner("IOS_LATEST"), + tags = tf_gpu_tests_tags() + [ + "notap", + "tflite_not_portable_android", + ], + deps = [":split_test_lib"], +) + +objc_library( + name = "tile_test_lib", + testonly = 1, + srcs = ["tile_test.mm"], + sdk_frameworks = ["XCTest"], + deps = [ + ":test_util", + "//tensorflow/lite/delegates/gpu/common/tasks:tile_test_util", + ], +) + +ios_unit_test( + name = "tile_test", + testonly = 1, + minimum_os_version = "11.4", + runner = tflite_ios_lab_runner("IOS_LATEST"), + tags = tf_gpu_tests_tags() + [ + "notap", + "tflite_not_portable_android", + ], + deps = [":tile_test_lib"], +) + +objc_library( + name = "transpose_conv_test_lib", + testonly = 1, + srcs = ["transpose_conv_test.mm"], + sdk_frameworks = ["XCTest"], + deps = [ + ":test_util", + "//tensorflow/lite/delegates/gpu/common/tasks:convolution_transposed_3x3_test_util", + "//tensorflow/lite/delegates/gpu/common/tasks:convolution_transposed_3x3_thin_test_util", + "//tensorflow/lite/delegates/gpu/common/tasks:convolution_transposed_4x4_test_util", + "//tensorflow/lite/delegates/gpu/common/tasks:convolution_transposed_test_util", + "//tensorflow/lite/delegates/gpu/common/tasks:convolution_transposed_thin_test_util", + ], +) + +ios_unit_test( + name = "transpose_conv_test", + testonly = 1, + minimum_os_version = "11.4", + runner = tflite_ios_lab_runner("IOS_LATEST"), + tags = tf_gpu_tests_tags() + [ + "notap", + "tflite_not_portable_android", + ], + deps = [":transpose_conv_test_lib"], +) + +objc_library( + name = "transpose_test_lib", + testonly = 1, + srcs = ["transpose_test.mm"], + sdk_frameworks = ["XCTest"], + deps = [ + ":test_util", + "//tensorflow/lite/delegates/gpu/common/tasks:transpose_test_util", + ], +) + +ios_unit_test( + name = "transpose_test", + testonly = 1, + minimum_os_version = "11.4", + runner = tflite_ios_lab_runner("IOS_LATEST"), + tags = tf_gpu_tests_tags() + [ + "notap", + "tflite_not_portable_android", + ], + deps = [":transpose_test_lib"], +) + +objc_library( + name = "test_util", + testonly = 1, + srcs = [ + "test_util.cc", + ], + hdrs = ["test_util.h"], + copts = [ + "-ObjC++", + ], + sdk_frameworks = [ + "Metal", + ], + deps = [ + "//tensorflow/lite/delegates/gpu/common:convert", + "//tensorflow/lite/delegates/gpu/common:gpu_info", + "//tensorflow/lite/delegates/gpu/common:operations", + "//tensorflow/lite/delegates/gpu/common:precision", + "//tensorflow/lite/delegates/gpu/common:shape", + "//tensorflow/lite/delegates/gpu/common:status", + "//tensorflow/lite/delegates/gpu/common:tensor", + "//tensorflow/lite/delegates/gpu/common:types", + "//tensorflow/lite/delegates/gpu/common:util", + "//tensorflow/lite/delegates/gpu/common/task:gpu_operation", + "//tensorflow/lite/delegates/gpu/common/task:testing_util", + "//tensorflow/lite/delegates/gpu/metal:common", + "//tensorflow/lite/delegates/gpu/metal:compute_task", + "//tensorflow/lite/delegates/gpu/metal:metal_device", + "//tensorflow/lite/delegates/gpu/metal:metal_spatial_tensor", + "@FP16", + "@com_google_absl//absl/memory", + "@com_google_absl//absl/strings", + ], +) + +objc_library( + name = "winograd_test_lib", + testonly = 1, + srcs = ["winograd_test.mm"], + sdk_frameworks = ["XCTest"], + deps = [ + ":test_util", + "//tensorflow/lite/delegates/gpu/common:winograd_util", + "//tensorflow/lite/delegates/gpu/common/tasks:winograd_test_util", + ], +) + +ios_unit_test( + name = "winograd_test", + testonly = 1, + minimum_os_version = "11.4", + runner = tflite_ios_lab_runner("IOS_LATEST"), + tags = tf_gpu_tests_tags() + [ + "notap", + "tflite_not_portable_android", + ], + deps = [":winograd_test_lib"], +) + +objc_library( + name = "kernel_tests_lib", + testonly = 1, + srcs = [ + "add_test.mm", + "cast_test.mm", + "concat_test.mm", + "conv_test.mm", + "conv_weights_converter_test.mm", + "cumsum_test.mm", + "depthwise_conv_test.mm", + "elementwise_test.mm", + "fully_connected_test.mm", + "gather_test.mm", + "lstm_test.mm", + "max_unpooling_test.mm", + "mean_stddev_normalization_test.mm", + "one_hot_test.mm", + "padding_test.mm", + "pooling_test.mm", + "prelu_test.mm", + "quantize_and_dequantize_test.mm", + "reduce_test.mm", + "relu_test.mm", + "resampler_test.mm", + "reshape_test.mm", + "resize_test.mm", + "select_v2_test.mm", + "slice_test.mm", + "softmax_test.mm", + "space_to_depth_test.mm", + "split_test.mm", + "tile_test.mm", + "transpose_conv_test.mm", + "transpose_test.mm", + "winograd_test.mm", + ], + hdrs = [ + ], + sdk_frameworks = ["XCTest"], + deps = [ + ":test_util", + "//tensorflow/lite/delegates/gpu/common:gpu_info", + "//tensorflow/lite/delegates/gpu/common:precision", + "//tensorflow/lite/delegates/gpu/common:shape", + "//tensorflow/lite/delegates/gpu/common:types", + "//tensorflow/lite/delegates/gpu/common:util", + "//tensorflow/lite/delegates/gpu/common/tasks:add_test_util", + "//tensorflow/lite/delegates/gpu/common/tasks:cast_test_util", + "//tensorflow/lite/delegates/gpu/common/tasks:concat_test_util", + "//tensorflow/lite/delegates/gpu/common/tasks:conv_buffer_1x1_test_util", + "//tensorflow/lite/delegates/gpu/common/tasks:conv_constants_test_util", + "//tensorflow/lite/delegates/gpu/common/tasks:conv_metal", + "//tensorflow/lite/delegates/gpu/common/tasks:conv_metal_simd", + "//tensorflow/lite/delegates/gpu/common/tasks:conv_powervr_test_util", + "//tensorflow/lite/delegates/gpu/common/tasks:conv_weights_converter_test_util", + "//tensorflow/lite/delegates/gpu/common/tasks:convolution_transposed_3x3_test_util", + "//tensorflow/lite/delegates/gpu/common/tasks:convolution_transposed_3x3_thin_test_util", + "//tensorflow/lite/delegates/gpu/common/tasks:convolution_transposed_4x4_test_util", + "//tensorflow/lite/delegates/gpu/common/tasks:convolution_transposed_test_util", + "//tensorflow/lite/delegates/gpu/common/tasks:convolution_transposed_thin_test_util", + "//tensorflow/lite/delegates/gpu/common/tasks:depthwise_conv_3x3_stride_h2_test_util", + "//tensorflow/lite/delegates/gpu/common/tasks:depthwise_conv_3x3_test_util", + "//tensorflow/lite/delegates/gpu/common/tasks:depthwise_conv_test_util", + "//tensorflow/lite/delegates/gpu/common/tasks:elementwise_test_util", + "//tensorflow/lite/delegates/gpu/common/tasks:fully_connected_test_util", + "//tensorflow/lite/delegates/gpu/common/tasks:gather_test_util", + "//tensorflow/lite/delegates/gpu/common/tasks:lstm_test_util", + "//tensorflow/lite/delegates/gpu/common/tasks:max_unpooling_test_util", + "//tensorflow/lite/delegates/gpu/common/tasks:mean_stddev_normalization_test_util", + "//tensorflow/lite/delegates/gpu/common/tasks:padding_test_util", + "//tensorflow/lite/delegates/gpu/common/tasks:pooling_test_util", + "//tensorflow/lite/delegates/gpu/common/tasks:prelu_test_util", + "//tensorflow/lite/delegates/gpu/common/tasks:quantize_and_dequantize_test_util", + "//tensorflow/lite/delegates/gpu/common/tasks:reduce_test_util", + "//tensorflow/lite/delegates/gpu/common/tasks:relu_test_util", + "//tensorflow/lite/delegates/gpu/common/tasks:resampler_test_util", + "//tensorflow/lite/delegates/gpu/common/tasks:reshape_test_util", + "//tensorflow/lite/delegates/gpu/common/tasks:resize_test_util", + "//tensorflow/lite/delegates/gpu/common/tasks:softmax_test_util", + "//tensorflow/lite/delegates/gpu/common/tasks:space_to_depth_test_util", + "//tensorflow/lite/delegates/gpu/common/tasks:split_test_util", + "//tensorflow/lite/delegates/gpu/common/tasks:strided_slice_test_util", + "//tensorflow/lite/delegates/gpu/common/tasks:tile_test_util", + "//tensorflow/lite/delegates/gpu/common/tasks:transpose_test_util", + "//tensorflow/lite/delegates/gpu/common/tasks:winograd", + "//tensorflow/lite/delegates/gpu/common/tasks:winograd_test_util", + "//tensorflow/lite/delegates/gpu/metal:common", + "//tensorflow/lite/delegates/gpu/metal:compute_task", + "//tensorflow/lite/delegates/gpu/metal:metal_spatial_tensor", + ], +) + +tflite_portable_test_suite() + +tflite_ios_per_kernel_test() diff --git a/tensorflow_lite_support/ios/task/audio/core/BUILD b/tensorflow_lite_support/ios/task/audio/core/BUILD index ee9060492..7c04c2cd6 100644 --- a/tensorflow_lite_support/ios/task/audio/core/BUILD +++ b/tensorflow_lite_support/ios/task/audio/core/BUILD @@ -12,7 +12,7 @@ objc_library( "sources/TFLFloatBuffer.h", ], module_name = "TFLFloatBuffer", - deps = ["//third_party/apple_frameworks:Foundation"], + # deps = ["//third_party/apple_frameworks:Foundation"], ) objc_library( @@ -28,7 +28,7 @@ objc_library( ":TFLFloatBuffer", "//tensorflow_lite_support/ios:TFLCommon", "//tensorflow_lite_support/ios:TFLCommonUtils", - "//third_party/apple_frameworks:Foundation", + # "//third_party/apple_frameworks:Foundation", ], ) @@ -41,5 +41,5 @@ objc_library( "sources/TFLAudioFormat.h", ], module_name = "TFLAudioFormat", - deps = ["//third_party/apple_frameworks:Foundation"], + # deps = ["//:Foundation"], ) diff --git a/tensorflow_lite_support/ios/task/audio/core/audio_record/BUILD b/tensorflow_lite_support/ios/task/audio/core/audio_record/BUILD index 27b3fe8d2..1a7ab4d42 100644 --- a/tensorflow_lite_support/ios/task/audio/core/audio_record/BUILD +++ b/tensorflow_lite_support/ios/task/audio/core/audio_record/BUILD @@ -18,7 +18,7 @@ objc_library( "//tensorflow_lite_support/ios/task/audio/core:TFLAudioFormat", "//tensorflow_lite_support/ios/task/audio/core:TFLFloatBuffer", "//tensorflow_lite_support/ios/task/audio/core:TFLRingBuffer", - "//third_party/apple_frameworks:AVFoundation", - "//third_party/apple_frameworks:Foundation", + # "//third_party/apple_frameworks:AVFoundation", + # "//third_party/apple_frameworks:Foundation", ], ) diff --git a/tensorflow_lite_support/ios/test/task/audio/audio_classifier/BUILD b/tensorflow_lite_support/ios/test/task/audio/audio_classifier/BUILD index 2f8c5ca0e..e64c69070 100644 --- a/tensorflow_lite_support/ios/test/task/audio/audio_classifier/BUILD +++ b/tensorflow_lite_support/ios/test/task/audio/audio_classifier/BUILD @@ -1,6 +1,7 @@ load("@org_tensorflow//tensorflow/lite/ios:ios.bzl", "TFL_DEFAULT_TAGS", "TFL_DISABLED_SANITIZER_TAGS", "TFL_MINIMUM_OS_VERSION") load("@build_bazel_rules_apple//apple:ios.bzl", "ios_unit_test") load("@org_tensorflow//tensorflow/lite:special_rules.bzl", "tflite_ios_lab_runner") +load("@build_bazel_rules_swift//swift:swift.bzl", "swift_library") package( default_visibility = ["//visibility:private"], @@ -31,3 +32,28 @@ ios_unit_test( ":TFLAudioClassifierObjcTestLibrary", ], ) + +swift_library( + name = "TFLAudioClassifierSwiftTestLibrary", + testonly = 1, + srcs = ["TFLAudioClassifierTests.swift"], + data = [ + "//tensorflow_lite_support/cc/test/testdata/task/audio:test_audio_clips", + "//tensorflow_lite_support/cc/test/testdata/task/audio:test_models", + ], + tags = TFL_DEFAULT_TAGS, + deps = [ + "//tensorflow_lite_support/ios/task/audio:TFLAudioClassifier", + "//tensorflow_lite_support/ios/test/task/audio/core/audio_record/utils:AVAudioPCMBufferUtils", + ], +) + +ios_unit_test( + name = "TFLAudioClassifierSwiftTest", + minimum_os_version = TFL_MINIMUM_OS_VERSION, + runner = tflite_ios_lab_runner("IOS_LATEST"), + tags = TFL_DEFAULT_TAGS + TFL_DISABLED_SANITIZER_TAGS, + deps = [ + ":TFLAudioClassifierSwiftTestLibrary", + ], +) diff --git a/tensorflow_lite_support/ios/test/task/audio/audio_classifier/TFLAudioClassifierTests.m b/tensorflow_lite_support/ios/test/task/audio/audio_classifier/TFLAudioClassifierTests.m index 9fbd07771..fb21957b9 100644 --- a/tensorflow_lite_support/ios/test/task/audio/audio_classifier/TFLAudioClassifierTests.m +++ b/tensorflow_lite_support/ios/test/task/audio/audio_classifier/TFLAudioClassifierTests.m @@ -15,6 +15,7 @@ #import #import "tensorflow_lite_support/ios/task/audio/sources/TFLAudioClassifier.h" +#import "tensorflow_lite_support/ios/sources/TFLCommon.h" #import "tensorflow_lite_support/ios/test/task/audio/core/audio_record/utils/sources/AVAudioPCMBuffer+Utils.h" #define VerifyError(error, expectedDomain, expectedCode, expectedLocalizedDescription) \ @@ -27,7 +28,7 @@ #define VerifyCategory(category, expectedIndex, expectedScore, expectedLabel, expectedDisplayName) \ XCTAssertEqual(category.index, expectedIndex); \ - XCTAssertEqualWithAccuracy(category.score, expectedScore, 1e-6); \ + XCTAssertEqualWithAccuracy(category.score, expectedScore, 1e-2); \ XCTAssertEqualObjects(category.label, expectedLabel); \ XCTAssertEqualObjects(category.displayName, expectedDisplayName); @@ -48,7 +49,7 @@ @interface TFLAudioClassifierTests : XCTestCase @property(nonatomic) AVAudioFormat *audioEngineFormat; @end -// This category of TFLAudioRecord is private to the current test file. This is needed in order to +// This category of TFLAudioRecord is private to the test files. This is needed in order to // expose the method to load the audio record buffer without calling: -[TFLAudioRecord // startRecordingWithError:]. This is needed to avoid exposing this method which isn't useful to the // consumers of the framework. @@ -57,6 +58,7 @@ - (void)convertAndLoadBuffer:(AVAudioPCMBuffer *)buffer usingAudioConverter:(AVAudioConverter *)audioConverter; @end + @implementation TFLAudioClassifierTests - (void)setUp { @@ -123,6 +125,14 @@ - (TFLAudioClassifier *)createAudioClassifierWithModelPath:(NSString *)modelPath return audioClassifier; } +- (TFLAudioClassifier *)createAudioClassifierWithOptions:(TFLAudioClassifierOptions *)options { + TFLAudioClassifier *audioClassifier = [TFLAudioClassifier audioClassifierWithOptions:options + error:nil]; + XCTAssertNotNil(audioClassifier); + + return audioClassifier; +} + - (TFLAudioTensor *)createAudioTensorWithAudioClassifier:(TFLAudioClassifier *)audioClassifier { // Create the audio tensor using audio classifier. TFLAudioTensor *audioTensor = [audioClassifier createInputAudioTensor]; @@ -146,7 +156,7 @@ - (void)loadAudioTensor:(TFLAudioTensor *)audioTensor fromWavFileWithName:(NSStr } - (TFLClassificationResult *)classifyWithAudioClassifier:(TFLAudioClassifier *)audioClassifier - audioTensor:(TFLAudioTensor *)audioTensor { + audioTensor:(TFLAudioTensor *)audioTensor expectedCategoryCount:(const NSInteger)expectedCategoryCount { TFLClassificationResult *classificationResult = [audioClassifier classifyWithAudioTensor:audioTensor error:nil]; @@ -154,7 +164,6 @@ - (TFLClassificationResult *)classifyWithAudioClassifier:(TFLAudioClassifier *)a VerifyClassificationResult(classificationResult, expectedClassificationsCount); const NSInteger expectedHeadIndex = 0; - const NSInteger expectedCategoryCount = 521; VerifyClassifications(classificationResult.classifications[0], expectedHeadIndex, expectedCategoryCount); @@ -171,16 +180,10 @@ - (void)validateClassificationResultForInferenceWithFloatBuffer: ); VerifyCategory(categories[1], 500, // expectedIndex - 0.019531, // expectedScore + 0.015625, // expectedScore @"Inside, small room", // expectedLabel nil // expectedDisplaName ); - VerifyCategory(categories[2], - 3, // expectedIndex - 0.003906, // expectedScore - @"Narration, monologue", // expectedLabel - nil // expectedDisplaName - ); } - (void)validateCategoriesForInferenceWithAudioRecord:(NSArray *)categories { @@ -203,14 +206,21 @@ - (void)validateCategoriesForInferenceWithAudioRecord:(NSArray *) @"Inside, small room", // expectedLabel nil // expectedDisplaName ); - // The 3rd result is different from python tests because of the audio file format conversions are - // done using iOS native classes to mimic audio record behaviour. The iOS native classes handle - // audio format conversion differently as opposed to the task library C++ convenience method. - VerifyCategory(categories[2], - 3, // expectedIndex - 0.003906, // expectedScore - @"Narration, monologue", // expectedLabel - nil // expectedDisplaName +} + +- (void)validateCategoriesForInferenceWithLabelDenyList:(NSArray *)categories { + // The third category is different from the third category specified in -[TFLAudioClassifierTests + // validateClassificationResultForInferenceWithFloatBuffer]. This is because in case of inference + // with audio record involves more native internal conversions to mock the conversions done by the + // audio record as opposed to inference with float buffer where the number of native conversions are + // fewer. Since each native conversion by `AVAudioConverter` employ strategies to pick samples based + // on the format specified, the samples passed in for inference in case of float buffer and audio + // record will be slightly different. + VerifyCategory(categories[0], + 500, // expectedIndex + 0.015625, // expectedScore + @"Inside, small room", // expectedLabel + nil // expectedDisplaName ); } @@ -224,12 +234,15 @@ - (TFLAudioRecord *)createAudioRecordWithAudioClassifier:(TFLAudioClassifier *)a - (void)testInferenceWithFloatBufferSucceeds { TFLAudioClassifier *audioClassifier = [self createAudioClassifierWithModelPath:self.modelPath]; - + TFLAudioTensor *audioTensor = [self createAudioTensorWithAudioClassifier:audioClassifier]; [self loadAudioTensor:audioTensor fromWavFileWithName:@"speech"]; + const NSInteger expectedCategoryCount = 521; TFLClassificationResult *classificationResult = [self classifyWithAudioClassifier:audioClassifier - audioTensor:audioTensor]; + audioTensor:audioTensor + expectedCategoryCount:expectedCategoryCount]; + [self validateClassificationResultForInferenceWithFloatBuffer:classificationResult .classifications[0] .categories]; @@ -246,13 +259,127 @@ - (void)testInferenceWithAudioRecordSucceeds { // Load the audioRecord buffer into the audio tensor. [audioTensor loadAudioRecord:audioRecord withError:nil]; + const NSInteger expectedCategoryCount = 521; TFLClassificationResult *classificationResult = [self classifyWithAudioClassifier:audioClassifier - audioTensor:audioTensor]; + audioTensor:audioTensor + expectedCategoryCount:expectedCategoryCount]; [self validateCategoriesForInferenceWithAudioRecord:classificationResult.classifications[0] .categories]; } +- (void)testInferenceWithMaxResultsSucceeds { + + const NSInteger maxResults = 3; + TFLAudioClassifierOptions *options = + [[TFLAudioClassifierOptions alloc] initWithModelPath:self.modelPath]; + options.classificationOptions.maxResults = maxResults; + + + TFLAudioClassifier *audioClassifier = [self createAudioClassifierWithOptions:options]; + TFLAudioTensor *audioTensor = [self createAudioTensorWithAudioClassifier:audioClassifier]; + [self loadAudioTensor:audioTensor fromWavFileWithName:@"speech"]; + + TFLClassificationResult *classificationResult = [self classifyWithAudioClassifier:audioClassifier + audioTensor:audioTensor + expectedCategoryCount:maxResults]; + + [self validateClassificationResultForInferenceWithFloatBuffer:classificationResult + .classifications[0] + .categories]; +} + + +- (void)testInferenceWithClassNameBlackListAndWhiteListFails { + + TFLAudioClassifierOptions *options = + [[TFLAudioClassifierOptions alloc] initWithModelPath:self.modelPath]; + options.classificationOptions.labelAllowList = @[@"Speech"]; + options.classificationOptions.labelDenyList = @[@"Inside, small room"]; + + NSError *error = nil; + TFLAudioClassifier *audioClassifier = [TFLAudioClassifier audioClassifierWithOptions:options + error:&error]; + XCTAssertNil(audioClassifier); + VerifyError(error, + expectedTaskErrorDomain, // expectedErrorDomain + TFLSupportErrorCodeInvalidArgumentError, // expectedErrorCode + @"INVALID_ARGUMENT: `class_name_allowlist` and `class_name_denylist` are mutually exclusive options." // expectedErrorMessage + ); +} + +- (void)testInferenceWithLabelAllowListSucceeds { + + TFLAudioClassifierOptions *options = + [[TFLAudioClassifierOptions alloc] initWithModelPath:self.modelPath]; + options.classificationOptions.labelAllowList = @[@"Speech", @"Inside, small room"]; + + NSError *error = nil; + TFLAudioClassifier *audioClassifier = [TFLAudioClassifier audioClassifierWithOptions:options + error:&error]; + TFLAudioTensor *audioTensor = [self createAudioTensorWithAudioClassifier:audioClassifier]; + [self loadAudioTensor:audioTensor fromWavFileWithName:@"speech"]; + + TFLClassificationResult *classificationResult = [self classifyWithAudioClassifier:audioClassifier + audioTensor:audioTensor + expectedCategoryCount:options.classificationOptions.labelAllowList.count]; + + [self validateClassificationResultForInferenceWithFloatBuffer:classificationResult + .classifications[0] + .categories]; +} + +- (void)testInferenceWithLabelDenyListSucceeds { + + TFLAudioClassifierOptions *options = + [[TFLAudioClassifierOptions alloc] initWithModelPath:self.modelPath]; + options.classificationOptions.labelDenyList = @[@"Speech"]; + + NSError *error = nil; + TFLAudioClassifier *audioClassifier = [TFLAudioClassifier audioClassifierWithOptions:options + error:&error]; + TFLAudioTensor *audioTensor = [self createAudioTensorWithAudioClassifier:audioClassifier]; + [self loadAudioTensor:audioTensor fromWavFileWithName:@"speech"]; + + const NSInteger expectedCategoryCount = 520; + TFLClassificationResult *classificationResult = [self classifyWithAudioClassifier:audioClassifier + audioTensor:audioTensor + expectedCategoryCount:expectedCategoryCount]; + + [self validateCategoriesForInferenceWithLabelDenyList:classificationResult + .classifications[0] + .categories]; +} + +- (void)testCreateAudioClassifierWithNilOptionsFails { + + NSError *error = nil; + TFLAudioClassifier *audioClassifier = [TFLAudioClassifier audioClassifierWithOptions:nil error:&error]; + + XCTAssertNil(audioClassifier); + VerifyError(error, + expectedTaskErrorDomain, // expectedErrorDomain + TFLSupportErrorCodeInvalidArgumentError, // expectedErrorCode + @"TFLAudioClassifierOptions argument cannot be nil." // expectedErrorMessage + ); +} + +- (void)testInferenceWithNilAudioTensorFails { + + TFLAudioClassifier *audioClassifier = [self createAudioClassifierWithModelPath:self.modelPath]; + + NSError *error = nil; + TFLClassificationResult *classificationResult = + [audioClassifier classifyWithAudioTensor:nil error:&error]; + + XCTAssertNil(classificationResult); + VerifyError(error, + expectedTaskErrorDomain, // expectedErrorDomain + TFLSupportErrorCodeInvalidArgumentError, // expectedErrorCode + @"audioTensor argument cannot be nil." // expectedErrorMessage + ); +} + @end NS_ASSUME_NONNULL_END diff --git a/tensorflow_lite_support/ios/test/task/audio/audio_classifier/TFLAudioClassifierTests.swift b/tensorflow_lite_support/ios/test/task/audio/audio_classifier/TFLAudioClassifierTests.swift new file mode 100644 index 000000000..e64a436ff --- /dev/null +++ b/tensorflow_lite_support/ios/test/task/audio/audio_classifier/TFLAudioClassifierTests.swift @@ -0,0 +1,47 @@ +/* Copyright 2022 The TensorFlow Authors. All Rights Reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + ==============================================================================*/ +import AVAudioPCMBufferUtils +import XCTest + +@testable import TFLAudioClassifier + +class AudioClassifierTests: XCTestCase { + + static let bundle = Bundle(for: AudioClassifierTests.self) + static let modelPath = bundle.path( + forResource: "yamnet_audio_classifier_with_metadata", + ofType: "tflite") + + func bufferFromFile(name: String, fileExtension:String, audioFormat:AudioFormat) -> AVAudioPCMBuffer? { + guard let filePath = AudioClassifierTests.bundle.path( + forResource: name, + ofType: fileExtension) else { + return nil; + } + + return AVAudioPCMBuffer.loadPCMBufferFromFile(withPath:filePath, audioFormat:audioFormat) + } + func testInferenceWithFloatBufferSucceeds() throws { + + let modelPath = try XCTUnwrap(AudioClassifierTests.modelPath) + + let options = AudioClassifierOptions(modelPath: modelPath) + + let audioClassifier = + try AudioClassifier.classifier(options: options) + + } + +} diff --git a/tensorflow_lite_support/ios/test/task/audio/core/audio_record/BUILD b/tensorflow_lite_support/ios/test/task/audio/core/audio_record/BUILD index 1d00c5b4d..635fc87f5 100644 --- a/tensorflow_lite_support/ios/test/task/audio/core/audio_record/BUILD +++ b/tensorflow_lite_support/ios/test/task/audio/core/audio_record/BUILD @@ -19,8 +19,6 @@ objc_library( "//tensorflow_lite_support/ios:TFLCommon", "//tensorflow_lite_support/ios/task/audio/core/audio_record:TFLAudioRecord", "//tensorflow_lite_support/ios/test/task/audio/core/audio_record/utils:AVAudioPCMBufferUtils", - "//third_party/apple_frameworks:AVFoundation", - "//third_party/apple_frameworks:XCTest", ], ) diff --git a/tensorflow_lite_support/ios/test/task/audio/core/audio_record/utils/BUILD b/tensorflow_lite_support/ios/test/task/audio/core/audio_record/utils/BUILD index 453ccf4b4..2bc7c6e0f 100644 --- a/tensorflow_lite_support/ios/test/task/audio/core/audio_record/utils/BUILD +++ b/tensorflow_lite_support/ios/test/task/audio/core/audio_record/utils/BUILD @@ -16,7 +16,6 @@ objc_library( deps = [ "//tensorflow_lite_support/ios/task/audio/core:TFLAudioFormat", "//tensorflow_lite_support/ios/task/audio/core:TFLFloatBuffer", - "//third_party/apple_frameworks:AVFoundation", - "//third_party/apple_frameworks:Foundation", ], ) + diff --git a/tensorflow_lite_support/ios/test/task/audio/core/audio_record/utils/sources/AVAudioPCMBuffer+Utils.h b/tensorflow_lite_support/ios/test/task/audio/core/audio_record/utils/sources/AVAudioPCMBuffer+Utils.h index 8802d8f60..69a3fc326 100644 --- a/tensorflow_lite_support/ios/test/task/audio/core/audio_record/utils/sources/AVAudioPCMBuffer+Utils.h +++ b/tensorflow_lite_support/ios/test/task/audio/core/audio_record/utils/sources/AVAudioPCMBuffer+Utils.h @@ -29,7 +29,9 @@ NS_ASSUME_NONNULL_BEGIN processingFormat:(AVAudioFormat *)processingFormat; + (nullable AVAudioPCMBuffer *)loadPCMBufferFromFileWithPath:(NSString *)path - audioFormat:(TFLAudioFormat *)audioFormat; + audioFormat:(TFLAudioFormat *)audioFormat + NS_SWIFT_NAME(loadPCMBufferFromFile(withPath:audioFormat:)); + @end From 712905c88d24f4dc64b290d8f0f0d5425e38b7dc Mon Sep 17 00:00:00 2001 From: Prianka Liz Kariat Date: Fri, 24 Jun 2022 01:51:24 +0530 Subject: [PATCH 02/11] Updated swift tests --- .../audio_tensor/sources/TFLAudioTensor.h | 4 +- .../audio_tensor/sources/TFLAudioTensor.m | 4 +- .../task/audio/sources/TFLAudioClassifier.h | 5 +- .../TFLAudioClassifierTests.swift | 149 +++++++++++++++++- 4 files changed, 149 insertions(+), 13 deletions(-) diff --git a/tensorflow_lite_support/ios/task/audio/core/audio_tensor/sources/TFLAudioTensor.h b/tensorflow_lite_support/ios/task/audio/core/audio_tensor/sources/TFLAudioTensor.h index 132a091aa..b58593d2a 100644 --- a/tensorflow_lite_support/ios/task/audio/core/audio_tensor/sources/TFLAudioTensor.h +++ b/tensorflow_lite_support/ios/task/audio/core/audio_tensor/sources/TFLAudioTensor.h @@ -90,8 +90,8 @@ NS_SWIFT_NAME(AudioTensor) * @return A boolean indicating if the load operation succeded. */ - (BOOL)loadBuffer:(TFLFloatBuffer *)buffer - offset:(NSInteger)offset - size:(NSInteger)size + offset:(NSUInteger)offset + size:(NSUInteger)size error:(NSError **)error; @end diff --git a/tensorflow_lite_support/ios/task/audio/core/audio_tensor/sources/TFLAudioTensor.m b/tensorflow_lite_support/ios/task/audio/core/audio_tensor/sources/TFLAudioTensor.m index b4b37bb11..ce58f1754 100644 --- a/tensorflow_lite_support/ios/task/audio/core/audio_tensor/sources/TFLAudioTensor.m +++ b/tensorflow_lite_support/ios/task/audio/core/audio_tensor/sources/TFLAudioTensor.m @@ -32,8 +32,8 @@ - (instancetype)initWithAudioFormat:(TFLAudioFormat *)format sampleCount:(NSUInt } - (BOOL)loadBuffer:(TFLFloatBuffer *)buffer - offset:(NSInteger)offset - size:(NSInteger)size + offset:(NSUInteger)offset + size:(NSUInteger)size error:(NSError **)error { return [_ringBuffer loadFloatData:buffer.data dataSize:buffer.size diff --git a/tensorflow_lite_support/ios/task/audio/sources/TFLAudioClassifier.h b/tensorflow_lite_support/ios/task/audio/sources/TFLAudioClassifier.h index 024d4caf4..f96133080 100644 --- a/tensorflow_lite_support/ios/task/audio/sources/TFLAudioClassifier.h +++ b/tensorflow_lite_support/ios/task/audio/sources/TFLAudioClassifier.h @@ -74,7 +74,8 @@ NS_SWIFT_NAME(AudioClassifier) * in initializing the audio classifier. */ + (nullable instancetype)audioClassifierWithOptions:(TFLAudioClassifierOptions *)options - error:(NSError **)error; + error:(NSError **)error + NS_SWIFT_NAME(classifier(options:)); + (instancetype)new NS_UNAVAILABLE; @@ -89,7 +90,7 @@ NS_SWIFT_NAME(AudioClassifier) * @return A `TFLAudioTensor` with the same buffer size as the model input tensor and audio format * required by the model, if creation is successful otherwise nil. */ -- (nullable TFLAudioTensor *)createInputAudioTensor; +- (TFLAudioTensor *)createInputAudioTensor; /** * Creates a `TFLAudioRecord` instance to start recording audio input from the microphone. The diff --git a/tensorflow_lite_support/ios/test/task/audio/audio_classifier/TFLAudioClassifierTests.swift b/tensorflow_lite_support/ios/test/task/audio/audio_classifier/TFLAudioClassifierTests.swift index e64a436ff..82ff25ca9 100644 --- a/tensorflow_lite_support/ios/test/task/audio/audio_classifier/TFLAudioClassifierTests.swift +++ b/tensorflow_lite_support/ios/test/task/audio/audio_classifier/TFLAudioClassifierTests.swift @@ -23,25 +23,160 @@ class AudioClassifierTests: XCTestCase { static let modelPath = bundle.path( forResource: "yamnet_audio_classifier_with_metadata", ofType: "tflite") + + func verifyError( + _ error: Error, + expectedLocalizedDescription: String + ) { + + XCTAssertEqual( + error.localizedDescription, + expectedLocalizedDescription) + } + + func verifyCategory( + _ category: ClassificationCategory, + expectedIndex: NSInteger, + expectedScore: Float, + expectedLabel: String, + expectedDisplayName: String? + ) { + XCTAssertEqual( + category.index, + expectedIndex) + XCTAssertEqual( + category.score, + expectedScore, + accuracy: 1e-2); + XCTAssertEqual( + category.label, + expectedLabel) + XCTAssertEqual( + category.displayName, + expectedDisplayName) + } + + func verifyClassifications( + _ classifications: Classifications, + expectedHeadIndex: NSInteger, + expectedCategoryCount: NSInteger + ) { + XCTAssertEqual( + classifications.headIndex, + expectedHeadIndex) + XCTAssertEqual( + classifications.categories.count, + expectedCategoryCount) + } + + func verifyClassificationResult( + _ classificationResult: ClassificationResult, + expectedClassificationsCount: NSInteger + ) { + XCTAssertEqual(classificationResult.classifications.count, expectedClassificationsCount) + } - func bufferFromFile(name: String, fileExtension:String, audioFormat:AudioFormat) -> AVAudioPCMBuffer? { + func bufferFromFile(withName name: String, fileExtension:String, audioFormat:AudioFormat) -> AVAudioPCMBuffer? { guard let filePath = AudioClassifierTests.bundle.path( forResource: name, ofType: fileExtension) else { return nil; } - return AVAudioPCMBuffer.loadPCMBufferFromFile(withPath:filePath, audioFormat:audioFormat) + return AVAudioPCMBuffer.loadPCMBufferFromFile( + withPath:filePath, + audioFormat:audioFormat) } - func testInferenceWithFloatBufferSucceeds() throws { - - let modelPath = try XCTUnwrap(AudioClassifierTests.modelPath) + func createAudioClassifier(withModelPath modelPath:String? + ) throws -> AudioClassifier? { + let modelPath = try XCTUnwrap(modelPath) let options = AudioClassifierOptions(modelPath: modelPath) - let audioClassifier = - try AudioClassifier.classifier(options: options) + let audioClassifier = try XCTUnwrap( + AudioClassifier.classifier( + options: options)) + return audioClassifier + } + + func createAudioTensor(withAudioClassifier audioClassifier:AudioClassifier) -> AudioTensor { + let audioTensor = audioClassifier.createInputAudioTensor() + return audioTensor + } + + func loadAudioTensor( + _ audioTensor:AudioTensor, + fromWavFileWithName fileName:String + ) throws { + // Load pcm buffer from file. + let buffer = try XCTUnwrap( + self.bufferFromFile( + withName:fileName, + fileExtension:"wav", + audioFormat:audioTensor.audioFormat)) + + // Get float buffer from pcm buffer. + let floatBuffer = try XCTUnwrap(buffer.floatBuffer); + + // Load float buffer into the audio tensor. + try audioTensor.loadBuffer( + floatBuffer, + offset:0, + size:floatBuffer.size); + } + + func classify( + audioTensor: AudioTensor, + usingAudioClassifier audioClassifier:AudioClassifier + ) throws -> ClassificationResult? { + let classificationResult = try XCTUnwrap( + audioClassifier.classify( + audioTensor:audioTensor)) + + let expectedClassificationsCount = 1 + self.verifyClassificationResult( + classificationResult, + expectedClassificationsCount: expectedClassificationsCount) + + let expectedCategoryCount = 521 + let expectedHeadIndex = 0 + self.verifyClassifications( + classificationResult.classifications[0], + expectedHeadIndex: expectedHeadIndex, + expectedCategoryCount: expectedCategoryCount) + + return classificationResult + } + + func validateForInferenceWithFloatBuffer(categories:[ClassificationCategory]) { + self.verifyCategory( + categories[0], + expectedIndex: 0, + expectedScore: 0.957031, + expectedLabel: "Speech", + expectedDisplayName: nil); + self.verifyCategory( + categories[1], + expectedIndex: 500, + expectedScore: 0.015625, + expectedLabel: "Inside, small room", + expectedDisplayName: nil); + } + + func testInferenceWithFloatBufferSucceeds() throws { + let audioClassifier = try XCTUnwrap( + self.createAudioClassifier( + withModelPath: AudioClassifierTests.modelPath)) + let audioTensor = self.createAudioTensor( + withAudioClassifier: audioClassifier) + try self.loadAudioTensor( + audioTensor, fromWavFileWithName:"speech") + let classificationResult = try XCTUnwrap( + self.classify(audioTensor: audioTensor, + usingAudioClassifier: audioClassifier)) + self.validateForInferenceWithFloatBuffer( + categories: classificationResult.classifications[0].categories) } } From 4e2bc763aaecf379ebe1d0e07edcbd54ac9d3164 Mon Sep 17 00:00:00 2001 From: Prianka Liz Kariat Date: Fri, 24 Jun 2022 01:57:30 +0530 Subject: [PATCH 03/11] Updated swift names --- .../task/audio/core/audio_tensor/sources/TFLAudioTensor.h | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/tensorflow_lite_support/ios/task/audio/core/audio_tensor/sources/TFLAudioTensor.h b/tensorflow_lite_support/ios/task/audio/core/audio_tensor/sources/TFLAudioTensor.h index b58593d2a..0cc2d4c84 100644 --- a/tensorflow_lite_support/ios/task/audio/core/audio_tensor/sources/TFLAudioTensor.h +++ b/tensorflow_lite_support/ios/task/audio/core/audio_tensor/sources/TFLAudioTensor.h @@ -70,7 +70,8 @@ NS_SWIFT_NAME(AudioTensor) * @return A boolean indicating if the load operation succeded. */ - (BOOL)loadAudioRecord:(TFLAudioRecord *)audioRecord - withError:(NSError **)error NS_SWIFT_NAME(loadAudioRecord(audioRecord:)); + withError:(NSError **)error + NS_SWIFT_NAME(load(audioRecord:)); /** * This function loads the internal buffer of `TFLAudioTensor` with the provided buffer. @@ -92,8 +93,9 @@ NS_SWIFT_NAME(AudioTensor) - (BOOL)loadBuffer:(TFLFloatBuffer *)buffer offset:(NSUInteger)offset size:(NSUInteger)size - error:(NSError **)error; - + error:(NSError **)error + NS_SWIFT_NAME(load(buffer:offset:size:)); + @end NS_ASSUME_NONNULL_END From 38c61f1a287bd8b686dae2a212318a7b62b2ed31 Mon Sep 17 00:00:00 2001 From: Prianka Liz Kariat Date: Fri, 24 Jun 2022 01:57:38 +0530 Subject: [PATCH 04/11] Updated swift tests --- .../TFLAudioClassifierTests.swift | 43 +++++++++++-------- 1 file changed, 25 insertions(+), 18 deletions(-) diff --git a/tensorflow_lite_support/ios/test/task/audio/audio_classifier/TFLAudioClassifierTests.swift b/tensorflow_lite_support/ios/test/task/audio/audio_classifier/TFLAudioClassifierTests.swift index 82ff25ca9..364c4ba18 100644 --- a/tensorflow_lite_support/ios/test/task/audio/audio_classifier/TFLAudioClassifierTests.swift +++ b/tensorflow_lite_support/ios/test/task/audio/audio_classifier/TFLAudioClassifierTests.swift @@ -73,10 +73,15 @@ class AudioClassifierTests: XCTestCase { _ classificationResult: ClassificationResult, expectedClassificationsCount: NSInteger ) { - XCTAssertEqual(classificationResult.classifications.count, expectedClassificationsCount) + XCTAssertEqual( + classificationResult.classifications.count, + expectedClassificationsCount) } - func bufferFromFile(withName name: String, fileExtension:String, audioFormat:AudioFormat) -> AVAudioPCMBuffer? { + func bufferFromFile( + withName name: String, + fileExtension: String, + audioFormat: AudioFormat) -> AVAudioPCMBuffer? { guard let filePath = AudioClassifierTests.bundle.path( forResource: name, ofType: fileExtension) else { @@ -84,11 +89,11 @@ class AudioClassifierTests: XCTestCase { } return AVAudioPCMBuffer.loadPCMBufferFromFile( - withPath:filePath, - audioFormat:audioFormat) + withPath: filePath, + audioFormat: audioFormat) } - func createAudioClassifier(withModelPath modelPath:String? + func createAudioClassifier(withModelPath modelPath: String? ) throws -> AudioClassifier? { let modelPath = try XCTUnwrap(modelPath) let options = AudioClassifierOptions(modelPath: modelPath) @@ -100,39 +105,40 @@ class AudioClassifierTests: XCTestCase { return audioClassifier } - func createAudioTensor(withAudioClassifier audioClassifier:AudioClassifier) -> AudioTensor { + func createAudioTensor( + withAudioClassifier audioClassifier: AudioClassifier) -> AudioTensor { let audioTensor = audioClassifier.createInputAudioTensor() return audioTensor } func loadAudioTensor( - _ audioTensor:AudioTensor, - fromWavFileWithName fileName:String + _ audioTensor: AudioTensor, + fromWavFileWithName fileName: String ) throws { // Load pcm buffer from file. let buffer = try XCTUnwrap( self.bufferFromFile( - withName:fileName, - fileExtension:"wav", - audioFormat:audioTensor.audioFormat)) + withName: fileName, + fileExtension: "wav", + audioFormat: audioTensor.audioFormat)) // Get float buffer from pcm buffer. let floatBuffer = try XCTUnwrap(buffer.floatBuffer); // Load float buffer into the audio tensor. - try audioTensor.loadBuffer( - floatBuffer, - offset:0, - size:floatBuffer.size); + try audioTensor.load( + buffer: floatBuffer, + offset: 0, + size: floatBuffer.size); } func classify( audioTensor: AudioTensor, - usingAudioClassifier audioClassifier:AudioClassifier + usingAudioClassifier audioClassifier: AudioClassifier ) throws -> ClassificationResult? { let classificationResult = try XCTUnwrap( audioClassifier.classify( - audioTensor:audioTensor)) + audioTensor: audioTensor)) let expectedClassificationsCount = 1 self.verifyClassificationResult( @@ -149,7 +155,8 @@ class AudioClassifierTests: XCTestCase { return classificationResult } - func validateForInferenceWithFloatBuffer(categories:[ClassificationCategory]) { + func validateForInferenceWithFloatBuffer( + categories: [ClassificationCategory]) { self.verifyCategory( categories[0], expectedIndex: 0, From 10b901564f231ecff23dd822aef695a64434d4a4 Mon Sep 17 00:00:00 2001 From: Prianka Liz Kariat Date: Fri, 24 Jun 2022 02:01:37 +0530 Subject: [PATCH 05/11] Removed unwanted file --- .../lite/delegates/gpu/metal/kernels/BUILD | 910 ------------------ 1 file changed, 910 deletions(-) delete mode 100644 bazel-tflite-support/external/org_tensorflow/tensorflow/lite/delegates/gpu/metal/kernels/BUILD diff --git a/bazel-tflite-support/external/org_tensorflow/tensorflow/lite/delegates/gpu/metal/kernels/BUILD b/bazel-tflite-support/external/org_tensorflow/tensorflow/lite/delegates/gpu/metal/kernels/BUILD deleted file mode 100644 index a2f8dbb6c..000000000 --- a/bazel-tflite-support/external/org_tensorflow/tensorflow/lite/delegates/gpu/metal/kernels/BUILD +++ /dev/null @@ -1,910 +0,0 @@ -load("@build_bazel_rules_apple//apple:ios.bzl", "ios_unit_test") -load( - "//tensorflow/lite:special_rules.bzl", - "tflite_ios_lab_runner", - "tflite_ios_per_kernel_test", - "tflite_portable_test_suite", -) -load( - "//tensorflow/core/platform:build_config_root.bzl", - "tf_gpu_tests_tags", -) - -package( - default_visibility = ["//visibility:public"], - licenses = ["notice"], -) - -objc_library( - name = "add_test_lib", - testonly = 1, - srcs = ["add_test.mm"], - sdk_frameworks = ["XCTest"], - deps = [ - ":test_util", - "//tensorflow/lite/delegates/gpu/common/tasks:add_test_util", - ], -) - -ios_unit_test( - name = "add_test", - testonly = 1, - minimum_os_version = "11.4", - runner = tflite_ios_lab_runner("IOS_LATEST"), - tags = tf_gpu_tests_tags() + [ - "notap", - "tflite_not_portable_android", - ], - deps = [":add_test_lib"], -) - -objc_library( - name = "cast_test_lib", - testonly = 1, - srcs = ["cast_test.mm"], - sdk_frameworks = ["XCTest"], - deps = [ - ":test_util", - "//tensorflow/lite/delegates/gpu/common/tasks:cast_test_util", - ], -) - -ios_unit_test( - name = "cast_test", - testonly = 1, - minimum_os_version = "11.4", - runner = tflite_ios_lab_runner("IOS_LATEST"), - tags = tf_gpu_tests_tags() + [ - "notap", - "tflite_not_portable_android", - ], - deps = [":cast_test_lib"], -) - -objc_library( - name = "concat_test_lib", - testonly = 1, - srcs = ["concat_test.mm"], - sdk_frameworks = ["XCTest"], - deps = [ - ":test_util", - "//tensorflow/lite/delegates/gpu/common/tasks:concat_test_util", - ], -) - -ios_unit_test( - name = "concat_test", - testonly = 1, - minimum_os_version = "11.4", - runner = tflite_ios_lab_runner("IOS_LATEST"), - tags = tf_gpu_tests_tags() + [ - "notap", - "tflite_not_portable_android", - ], - deps = [":concat_test_lib"], -) - -objc_library( - name = "conv_test_lib", - testonly = 1, - srcs = ["conv_test.mm"], - sdk_frameworks = ["XCTest"], - deps = [ - ":test_util", - "//tensorflow/lite/delegates/gpu/common/tasks:conv_buffer_1x1_test_util", - "//tensorflow/lite/delegates/gpu/common/tasks:conv_constants_test_util", - "//tensorflow/lite/delegates/gpu/common/tasks:conv_metal", - "//tensorflow/lite/delegates/gpu/common/tasks:conv_metal_simd", - "//tensorflow/lite/delegates/gpu/common/tasks:conv_powervr_test_util", - "//tensorflow/lite/delegates/gpu/common/tasks:winograd", - "//tensorflow/lite/delegates/gpu/metal:compute_task", - "//tensorflow/lite/delegates/gpu/metal:metal_spatial_tensor", - ], -) - -ios_unit_test( - name = "conv_test", - testonly = 1, - minimum_os_version = "11.4", - runner = tflite_ios_lab_runner("IOS_LATEST"), - tags = tf_gpu_tests_tags() + [ - "notap", - "tflite_not_portable_android", - ], - deps = [":conv_test_lib"], -) - -objc_library( - name = "conv_weights_converter_test_lib", - testonly = 1, - srcs = ["conv_weights_converter_test.mm"], - sdk_frameworks = ["XCTest"], - deps = [ - ":test_util", - "//tensorflow/lite/delegates/gpu/common/tasks:conv_weights_converter_test_util", - ], -) - -ios_unit_test( - name = "conv_weights_converter_test", - testonly = 1, - minimum_os_version = "11.4", - runner = tflite_ios_lab_runner("IOS_LATEST"), - tags = tf_gpu_tests_tags() + [ - "notap", - "tflite_not_portable_android", - ], - deps = [":conv_weights_converter_test_lib"], -) - -objc_library( - name = "cumsum_test_lib", - testonly = 1, - srcs = ["cumsum_test.mm"], - sdk_frameworks = ["XCTest"], - deps = [ - ":test_util", - "//tensorflow/lite/delegates/gpu/common:status", - "//tensorflow/lite/delegates/gpu/common/tasks:cumsum_test_util", - ], -) - -ios_unit_test( - name = "cumsum_test", - testonly = 1, - minimum_os_version = "11.4", - runner = tflite_ios_lab_runner("IOS_LATEST"), - tags = tf_gpu_tests_tags() + [ - "notap", - "tflite_not_portable_android", - ], - deps = [":cumsum_test_lib"], -) - -objc_library( - name = "depthwise_conv_test_lib", - testonly = 1, - srcs = ["depthwise_conv_test.mm"], - sdk_frameworks = ["XCTest"], - deps = [ - ":test_util", - "//tensorflow/lite/delegates/gpu/common/tasks:depthwise_conv_3x3_stride_h2_test_util", - "//tensorflow/lite/delegates/gpu/common/tasks:depthwise_conv_3x3_test_util", - "//tensorflow/lite/delegates/gpu/common/tasks:depthwise_conv_test_util", - ], -) - -ios_unit_test( - name = "depthwise_conv_test", - testonly = 1, - minimum_os_version = "11.4", - runner = tflite_ios_lab_runner("IOS_LATEST"), - tags = tf_gpu_tests_tags() + [ - "notap", - "tflite_not_portable_android", - ], - deps = [":depthwise_conv_test_lib"], -) - -objc_library( - name = "elementwise_test_lib", - testonly = 1, - srcs = ["elementwise_test.mm"], - sdk_frameworks = ["XCTest"], - deps = [ - ":test_util", - "//tensorflow/lite/delegates/gpu/common/tasks:elementwise_test_util", - ], -) - -ios_unit_test( - name = "elementwise_test", - testonly = 1, - minimum_os_version = "11.4", - runner = tflite_ios_lab_runner("IOS_LATEST"), - tags = tf_gpu_tests_tags() + [ - "notap", - "tflite_not_portable_android", - ], - deps = [":elementwise_test_lib"], -) - -objc_library( - name = "fully_connected_test_lib", - testonly = 1, - srcs = ["fully_connected_test.mm"], - sdk_frameworks = ["XCTest"], - deps = [ - ":test_util", - "//tensorflow/lite/delegates/gpu/common/tasks:fully_connected_test_util", - ], -) - -ios_unit_test( - name = "fully_connected_test", - testonly = 1, - minimum_os_version = "11.4", - runner = tflite_ios_lab_runner("IOS_LATEST"), - tags = tf_gpu_tests_tags() + [ - "notap", - "tflite_not_portable_android", - ], - deps = [":fully_connected_test_lib"], -) - -objc_library( - name = "gather_test_lib", - testonly = 1, - srcs = ["gather_test.mm"], - sdk_frameworks = ["XCTest"], - deps = [ - ":test_util", - "//tensorflow/lite/delegates/gpu/common/tasks:gather_test_util", - ], -) - -ios_unit_test( - name = "gather_test", - testonly = 1, - minimum_os_version = "11.4", - runner = tflite_ios_lab_runner("IOS_LATEST"), - tags = tf_gpu_tests_tags() + [ - "notap", - "tflite_not_portable_android", - ], - deps = [":gather_test_lib"], -) - -objc_library( - name = "lstm_test_lib", - testonly = 1, - srcs = ["lstm_test.mm"], - sdk_frameworks = ["XCTest"], - deps = [ - ":test_util", - "//tensorflow/lite/delegates/gpu/common/tasks:lstm_test_util", - ], -) - -ios_unit_test( - name = "lstm_test", - testonly = 1, - minimum_os_version = "11.4", - runner = tflite_ios_lab_runner("IOS_LATEST"), - tags = tf_gpu_tests_tags() + [ - "notap", - "tflite_not_portable_android", - ], - deps = [":lstm_test_lib"], -) - -objc_library( - name = "max_unpooling_test_lib", - testonly = 1, - srcs = ["max_unpooling_test.mm"], - sdk_frameworks = ["XCTest"], - deps = [ - ":test_util", - "//tensorflow/lite/delegates/gpu/common/tasks:max_unpooling_test_util", - ], -) - -ios_unit_test( - name = "max_unpooling_test", - testonly = 1, - minimum_os_version = "11.4", - runner = tflite_ios_lab_runner("IOS_LATEST"), - tags = tf_gpu_tests_tags() + [ - "notap", - "tflite_not_portable_android", - ], - deps = [":max_unpooling_test_lib"], -) - -objc_library( - name = "mean_stddev_normalization_test_lib", - testonly = 1, - srcs = ["mean_stddev_normalization_test.mm"], - sdk_frameworks = ["XCTest"], - deps = [ - ":test_util", - "//tensorflow/lite/delegates/gpu/common/tasks:mean_stddev_normalization_test_util", - ], -) - -ios_unit_test( - name = "mean_stddev_normalization_test", - testonly = 1, - minimum_os_version = "11.4", - runner = tflite_ios_lab_runner("IOS_LATEST"), - tags = tf_gpu_tests_tags() + [ - "notap", - "tflite_not_portable_android", - ], - deps = [":mean_stddev_normalization_test_lib"], -) - -objc_library( - name = "one_hot_test_lib", - testonly = 1, - srcs = ["one_hot_test.mm"], - sdk_frameworks = ["XCTest"], - deps = [ - ":test_util", - "//tensorflow/lite/delegates/gpu/common:status", - "//tensorflow/lite/delegates/gpu/common/tasks:one_hot_test_util", - # "//third_party/apple_frameworks:XCTest", - ], -) - -ios_unit_test( - name = "one_hot_test", - testonly = 1, - minimum_os_version = "11.4", - runner = tflite_ios_lab_runner("IOS_LATEST"), - tags = tf_gpu_tests_tags() + [ - "notap", - "tflite_not_portable_android", - ], - deps = [":one_hot_test_lib"], -) - -objc_library( - name = "padding_test_lib", - testonly = 1, - srcs = ["padding_test.mm"], - sdk_frameworks = ["XCTest"], - deps = [ - ":test_util", - "//tensorflow/lite/delegates/gpu/common/tasks:padding_test_util", - ], -) - -ios_unit_test( - name = "padding_test", - testonly = 1, - minimum_os_version = "11.4", - runner = tflite_ios_lab_runner("IOS_LATEST"), - tags = tf_gpu_tests_tags() + [ - "notap", - "tflite_not_portable_android", - ], - deps = [":padding_test_lib"], -) - -objc_library( - name = "pooling_test_lib", - testonly = 1, - srcs = ["pooling_test.mm"], - sdk_frameworks = ["XCTest"], - deps = [ - ":test_util", - "//tensorflow/lite/delegates/gpu/common/tasks:pooling_test_util", - ], -) - -ios_unit_test( - name = "pooling_test", - testonly = 1, - minimum_os_version = "11.4", - runner = tflite_ios_lab_runner("IOS_LATEST"), - tags = tf_gpu_tests_tags() + [ - "notap", - "tflite_not_portable_android", - ], - deps = [":pooling_test_lib"], -) - -objc_library( - name = "prelu_test_lib", - testonly = 1, - srcs = ["prelu_test.mm"], - sdk_frameworks = ["XCTest"], - deps = [ - ":test_util", - "//tensorflow/lite/delegates/gpu/common/tasks:prelu_test_util", - ], -) - -ios_unit_test( - name = "prelu_test", - testonly = 1, - minimum_os_version = "11.4", - runner = tflite_ios_lab_runner("IOS_LATEST"), - tags = tf_gpu_tests_tags() + [ - "notap", - "tflite_not_portable_android", - ], - deps = [":prelu_test_lib"], -) - -objc_library( - name = "quantize_and_dequantize_test_lib", - testonly = 1, - srcs = ["quantize_and_dequantize_test.mm"], - sdk_frameworks = ["XCTest"], - deps = [ - ":test_util", - "//tensorflow/lite/delegates/gpu/common:operations", - "//tensorflow/lite/delegates/gpu/common:shape", - "//tensorflow/lite/delegates/gpu/common:status", - "//tensorflow/lite/delegates/gpu/common:tensor", - "//tensorflow/lite/delegates/gpu/common:util", - "//tensorflow/lite/delegates/gpu/common/tasks:quantize_and_dequantize_test_util", - ], -) - -ios_unit_test( - name = "quantize_and_dequantize_test", - testonly = 1, - minimum_os_version = "11.4", - runner = tflite_ios_lab_runner("IOS_LATEST"), - tags = tf_gpu_tests_tags() + [ - "notap", - "tflite_not_portable_android", - ], - deps = [":quantize_and_dequantize_test_lib"], -) - -objc_library( - name = "reduce_test_lib", - testonly = 1, - srcs = ["reduce_test.mm"], - sdk_frameworks = ["XCTest"], - deps = [ - ":test_util", - "//tensorflow/lite/delegates/gpu/common/tasks:reduce_test_util", - ], -) - -ios_unit_test( - name = "reduce_test", - testonly = 1, - minimum_os_version = "11.4", - runner = tflite_ios_lab_runner("IOS_LATEST"), - tags = tf_gpu_tests_tags() + [ - "notap", - "tflite_not_portable_android", - ], - deps = [":reduce_test_lib"], -) - -objc_library( - name = "relu_test_lib", - testonly = 1, - srcs = ["relu_test.mm"], - sdk_frameworks = ["XCTest"], - deps = [ - ":test_util", - "//tensorflow/lite/delegates/gpu/common/tasks:relu_test_util", - ], -) - -ios_unit_test( - name = "relu_test", - testonly = 1, - minimum_os_version = "11.4", - runner = tflite_ios_lab_runner("IOS_LATEST"), - tags = tf_gpu_tests_tags() + [ - "notap", - "tflite_not_portable_android", - ], - deps = [":relu_test_lib"], -) - -objc_library( - name = "resampler_test_lib", - testonly = 1, - srcs = ["resampler_test.mm"], - sdk_frameworks = ["XCTest"], - deps = [ - "//tensorflow/lite/delegates/gpu/common:shape", - "//tensorflow/lite/delegates/gpu/common:status", - "//tensorflow/lite/delegates/gpu/common/tasks:resampler_test_util", - "//tensorflow/lite/delegates/gpu/metal/kernels:test_util", - ], -) - -ios_unit_test( - name = "resampler_test", - testonly = 1, - minimum_os_version = "11.4", - runner = tflite_ios_lab_runner("IOS_LATEST"), - tags = [ - "no_mac", # TODO(b/183905399) - "notap", - "tflite_mobile_test_jet", - "tflite_not_portable_android", - ], - deps = [":resampler_test_lib"], -) - -objc_library( - name = "resize_test_lib", - testonly = 1, - srcs = ["resize_test.mm"], - sdk_frameworks = ["XCTest"], - deps = [ - ":test_util", - "//tensorflow/lite/delegates/gpu/common/tasks:resize_test_util", - ], -) - -ios_unit_test( - name = "resize_test", - testonly = 1, - minimum_os_version = "11.4", - runner = tflite_ios_lab_runner("IOS_LATEST"), - tags = tf_gpu_tests_tags() + [ - "notap", - "tflite_not_portable_android", - ], - deps = [":resize_test_lib"], -) - -objc_library( - name = "reshape_test_lib", - testonly = 1, - srcs = ["reshape_test.mm"], - sdk_frameworks = ["XCTest"], - deps = [ - ":test_util", - "//tensorflow/lite/delegates/gpu/common/tasks:reshape_test_util", - ], -) - -ios_unit_test( - name = "reshape_test", - testonly = 1, - minimum_os_version = "11.4", - runner = tflite_ios_lab_runner("IOS_LATEST"), - tags = tf_gpu_tests_tags() + [ - "notap", - "tflite_not_portable_android", - ], - deps = [":reshape_test_lib"], -) - -objc_library( - name = "select_v2_test_lib", - testonly = 1, - srcs = ["select_v2_test.mm"], - sdk_frameworks = ["XCTest"], - deps = [ - ":test_util", - "//tensorflow/lite/delegates/gpu/common/tasks:select_v2_test_util", - ], -) - -ios_unit_test( - name = "select_v2_test", - testonly = 1, - minimum_os_version = "11.4", - runner = tflite_ios_lab_runner("IOS_LATEST"), - tags = tf_gpu_tests_tags() + [ - "notap", - "tflite_not_portable_android", - ], - deps = [":select_v2_test_lib"], -) - -objc_library( - name = "slice_test_lib", - testonly = 1, - srcs = ["slice_test.mm"], - sdk_frameworks = ["XCTest"], - deps = [ - ":test_util", - "//tensorflow/lite/delegates/gpu/common/tasks:strided_slice_test_util", - ], -) - -ios_unit_test( - name = "slice_test", - testonly = 1, - minimum_os_version = "11.4", - runner = tflite_ios_lab_runner("IOS_LATEST"), - tags = tf_gpu_tests_tags() + [ - "notap", - "tflite_not_portable_android", - ], - deps = [":slice_test_lib"], -) - -objc_library( - name = "softmax_test_lib", - testonly = 1, - srcs = ["softmax_test.mm"], - sdk_frameworks = ["XCTest"], - deps = [ - ":test_util", - "//tensorflow/lite/delegates/gpu/common/tasks:softmax_test_util", - ], -) - -ios_unit_test( - name = "softmax_test", - testonly = 1, - minimum_os_version = "11.4", - runner = tflite_ios_lab_runner("IOS_LATEST"), - tags = tf_gpu_tests_tags() + [ - "notap", - "tflite_not_portable_android", - ], - deps = [":softmax_test_lib"], -) - -objc_library( - name = "space_to_depth_test_lib", - testonly = 1, - srcs = ["space_to_depth_test.mm"], - sdk_frameworks = ["XCTest"], - deps = [ - ":test_util", - "//tensorflow/lite/delegates/gpu/common/tasks:space_to_depth_test_util", - ], -) - -ios_unit_test( - name = "space_to_depth_test", - testonly = 1, - minimum_os_version = "11.4", - runner = tflite_ios_lab_runner("IOS_LATEST"), - tags = tf_gpu_tests_tags() + [ - "notap", - "tflite_not_portable_android", - ], - deps = [":space_to_depth_test_lib"], -) - -objc_library( - name = "split_test_lib", - testonly = 1, - srcs = ["split_test.mm"], - sdk_frameworks = ["XCTest"], - deps = [ - ":test_util", - "//tensorflow/lite/delegates/gpu/common/tasks:split_test_util", - ], -) - -ios_unit_test( - name = "split_test", - testonly = 1, - minimum_os_version = "11.4", - runner = tflite_ios_lab_runner("IOS_LATEST"), - tags = tf_gpu_tests_tags() + [ - "notap", - "tflite_not_portable_android", - ], - deps = [":split_test_lib"], -) - -objc_library( - name = "tile_test_lib", - testonly = 1, - srcs = ["tile_test.mm"], - sdk_frameworks = ["XCTest"], - deps = [ - ":test_util", - "//tensorflow/lite/delegates/gpu/common/tasks:tile_test_util", - ], -) - -ios_unit_test( - name = "tile_test", - testonly = 1, - minimum_os_version = "11.4", - runner = tflite_ios_lab_runner("IOS_LATEST"), - tags = tf_gpu_tests_tags() + [ - "notap", - "tflite_not_portable_android", - ], - deps = [":tile_test_lib"], -) - -objc_library( - name = "transpose_conv_test_lib", - testonly = 1, - srcs = ["transpose_conv_test.mm"], - sdk_frameworks = ["XCTest"], - deps = [ - ":test_util", - "//tensorflow/lite/delegates/gpu/common/tasks:convolution_transposed_3x3_test_util", - "//tensorflow/lite/delegates/gpu/common/tasks:convolution_transposed_3x3_thin_test_util", - "//tensorflow/lite/delegates/gpu/common/tasks:convolution_transposed_4x4_test_util", - "//tensorflow/lite/delegates/gpu/common/tasks:convolution_transposed_test_util", - "//tensorflow/lite/delegates/gpu/common/tasks:convolution_transposed_thin_test_util", - ], -) - -ios_unit_test( - name = "transpose_conv_test", - testonly = 1, - minimum_os_version = "11.4", - runner = tflite_ios_lab_runner("IOS_LATEST"), - tags = tf_gpu_tests_tags() + [ - "notap", - "tflite_not_portable_android", - ], - deps = [":transpose_conv_test_lib"], -) - -objc_library( - name = "transpose_test_lib", - testonly = 1, - srcs = ["transpose_test.mm"], - sdk_frameworks = ["XCTest"], - deps = [ - ":test_util", - "//tensorflow/lite/delegates/gpu/common/tasks:transpose_test_util", - ], -) - -ios_unit_test( - name = "transpose_test", - testonly = 1, - minimum_os_version = "11.4", - runner = tflite_ios_lab_runner("IOS_LATEST"), - tags = tf_gpu_tests_tags() + [ - "notap", - "tflite_not_portable_android", - ], - deps = [":transpose_test_lib"], -) - -objc_library( - name = "test_util", - testonly = 1, - srcs = [ - "test_util.cc", - ], - hdrs = ["test_util.h"], - copts = [ - "-ObjC++", - ], - sdk_frameworks = [ - "Metal", - ], - deps = [ - "//tensorflow/lite/delegates/gpu/common:convert", - "//tensorflow/lite/delegates/gpu/common:gpu_info", - "//tensorflow/lite/delegates/gpu/common:operations", - "//tensorflow/lite/delegates/gpu/common:precision", - "//tensorflow/lite/delegates/gpu/common:shape", - "//tensorflow/lite/delegates/gpu/common:status", - "//tensorflow/lite/delegates/gpu/common:tensor", - "//tensorflow/lite/delegates/gpu/common:types", - "//tensorflow/lite/delegates/gpu/common:util", - "//tensorflow/lite/delegates/gpu/common/task:gpu_operation", - "//tensorflow/lite/delegates/gpu/common/task:testing_util", - "//tensorflow/lite/delegates/gpu/metal:common", - "//tensorflow/lite/delegates/gpu/metal:compute_task", - "//tensorflow/lite/delegates/gpu/metal:metal_device", - "//tensorflow/lite/delegates/gpu/metal:metal_spatial_tensor", - "@FP16", - "@com_google_absl//absl/memory", - "@com_google_absl//absl/strings", - ], -) - -objc_library( - name = "winograd_test_lib", - testonly = 1, - srcs = ["winograd_test.mm"], - sdk_frameworks = ["XCTest"], - deps = [ - ":test_util", - "//tensorflow/lite/delegates/gpu/common:winograd_util", - "//tensorflow/lite/delegates/gpu/common/tasks:winograd_test_util", - ], -) - -ios_unit_test( - name = "winograd_test", - testonly = 1, - minimum_os_version = "11.4", - runner = tflite_ios_lab_runner("IOS_LATEST"), - tags = tf_gpu_tests_tags() + [ - "notap", - "tflite_not_portable_android", - ], - deps = [":winograd_test_lib"], -) - -objc_library( - name = "kernel_tests_lib", - testonly = 1, - srcs = [ - "add_test.mm", - "cast_test.mm", - "concat_test.mm", - "conv_test.mm", - "conv_weights_converter_test.mm", - "cumsum_test.mm", - "depthwise_conv_test.mm", - "elementwise_test.mm", - "fully_connected_test.mm", - "gather_test.mm", - "lstm_test.mm", - "max_unpooling_test.mm", - "mean_stddev_normalization_test.mm", - "one_hot_test.mm", - "padding_test.mm", - "pooling_test.mm", - "prelu_test.mm", - "quantize_and_dequantize_test.mm", - "reduce_test.mm", - "relu_test.mm", - "resampler_test.mm", - "reshape_test.mm", - "resize_test.mm", - "select_v2_test.mm", - "slice_test.mm", - "softmax_test.mm", - "space_to_depth_test.mm", - "split_test.mm", - "tile_test.mm", - "transpose_conv_test.mm", - "transpose_test.mm", - "winograd_test.mm", - ], - hdrs = [ - ], - sdk_frameworks = ["XCTest"], - deps = [ - ":test_util", - "//tensorflow/lite/delegates/gpu/common:gpu_info", - "//tensorflow/lite/delegates/gpu/common:precision", - "//tensorflow/lite/delegates/gpu/common:shape", - "//tensorflow/lite/delegates/gpu/common:types", - "//tensorflow/lite/delegates/gpu/common:util", - "//tensorflow/lite/delegates/gpu/common/tasks:add_test_util", - "//tensorflow/lite/delegates/gpu/common/tasks:cast_test_util", - "//tensorflow/lite/delegates/gpu/common/tasks:concat_test_util", - "//tensorflow/lite/delegates/gpu/common/tasks:conv_buffer_1x1_test_util", - "//tensorflow/lite/delegates/gpu/common/tasks:conv_constants_test_util", - "//tensorflow/lite/delegates/gpu/common/tasks:conv_metal", - "//tensorflow/lite/delegates/gpu/common/tasks:conv_metal_simd", - "//tensorflow/lite/delegates/gpu/common/tasks:conv_powervr_test_util", - "//tensorflow/lite/delegates/gpu/common/tasks:conv_weights_converter_test_util", - "//tensorflow/lite/delegates/gpu/common/tasks:convolution_transposed_3x3_test_util", - "//tensorflow/lite/delegates/gpu/common/tasks:convolution_transposed_3x3_thin_test_util", - "//tensorflow/lite/delegates/gpu/common/tasks:convolution_transposed_4x4_test_util", - "//tensorflow/lite/delegates/gpu/common/tasks:convolution_transposed_test_util", - "//tensorflow/lite/delegates/gpu/common/tasks:convolution_transposed_thin_test_util", - "//tensorflow/lite/delegates/gpu/common/tasks:depthwise_conv_3x3_stride_h2_test_util", - "//tensorflow/lite/delegates/gpu/common/tasks:depthwise_conv_3x3_test_util", - "//tensorflow/lite/delegates/gpu/common/tasks:depthwise_conv_test_util", - "//tensorflow/lite/delegates/gpu/common/tasks:elementwise_test_util", - "//tensorflow/lite/delegates/gpu/common/tasks:fully_connected_test_util", - "//tensorflow/lite/delegates/gpu/common/tasks:gather_test_util", - "//tensorflow/lite/delegates/gpu/common/tasks:lstm_test_util", - "//tensorflow/lite/delegates/gpu/common/tasks:max_unpooling_test_util", - "//tensorflow/lite/delegates/gpu/common/tasks:mean_stddev_normalization_test_util", - "//tensorflow/lite/delegates/gpu/common/tasks:padding_test_util", - "//tensorflow/lite/delegates/gpu/common/tasks:pooling_test_util", - "//tensorflow/lite/delegates/gpu/common/tasks:prelu_test_util", - "//tensorflow/lite/delegates/gpu/common/tasks:quantize_and_dequantize_test_util", - "//tensorflow/lite/delegates/gpu/common/tasks:reduce_test_util", - "//tensorflow/lite/delegates/gpu/common/tasks:relu_test_util", - "//tensorflow/lite/delegates/gpu/common/tasks:resampler_test_util", - "//tensorflow/lite/delegates/gpu/common/tasks:reshape_test_util", - "//tensorflow/lite/delegates/gpu/common/tasks:resize_test_util", - "//tensorflow/lite/delegates/gpu/common/tasks:softmax_test_util", - "//tensorflow/lite/delegates/gpu/common/tasks:space_to_depth_test_util", - "//tensorflow/lite/delegates/gpu/common/tasks:split_test_util", - "//tensorflow/lite/delegates/gpu/common/tasks:strided_slice_test_util", - "//tensorflow/lite/delegates/gpu/common/tasks:tile_test_util", - "//tensorflow/lite/delegates/gpu/common/tasks:transpose_test_util", - "//tensorflow/lite/delegates/gpu/common/tasks:winograd", - "//tensorflow/lite/delegates/gpu/common/tasks:winograd_test_util", - "//tensorflow/lite/delegates/gpu/metal:common", - "//tensorflow/lite/delegates/gpu/metal:compute_task", - "//tensorflow/lite/delegates/gpu/metal:metal_spatial_tensor", - ], -) - -tflite_portable_test_suite() - -tflite_ios_per_kernel_test() From c5dac21f9d9d7798aaf767a6254f2a6c65507a55 Mon Sep 17 00:00:00 2001 From: Prianka Liz Kariat Date: Fri, 24 Jun 2022 02:05:39 +0530 Subject: [PATCH 06/11] Updated tests --- .../ios/task/audio/core/BUILD | 3 - .../ios/task/audio/core/audio_record/BUILD | 2 - .../TFLAudioClassifierTests.m | 121 +++++++++--------- 3 files changed, 59 insertions(+), 67 deletions(-) diff --git a/tensorflow_lite_support/ios/task/audio/core/BUILD b/tensorflow_lite_support/ios/task/audio/core/BUILD index 7c04c2cd6..6147d1f0a 100644 --- a/tensorflow_lite_support/ios/task/audio/core/BUILD +++ b/tensorflow_lite_support/ios/task/audio/core/BUILD @@ -12,7 +12,6 @@ objc_library( "sources/TFLFloatBuffer.h", ], module_name = "TFLFloatBuffer", - # deps = ["//third_party/apple_frameworks:Foundation"], ) objc_library( @@ -28,7 +27,6 @@ objc_library( ":TFLFloatBuffer", "//tensorflow_lite_support/ios:TFLCommon", "//tensorflow_lite_support/ios:TFLCommonUtils", - # "//third_party/apple_frameworks:Foundation", ], ) @@ -41,5 +39,4 @@ objc_library( "sources/TFLAudioFormat.h", ], module_name = "TFLAudioFormat", - # deps = ["//:Foundation"], ) diff --git a/tensorflow_lite_support/ios/task/audio/core/audio_record/BUILD b/tensorflow_lite_support/ios/task/audio/core/audio_record/BUILD index 1a7ab4d42..cd8103395 100644 --- a/tensorflow_lite_support/ios/task/audio/core/audio_record/BUILD +++ b/tensorflow_lite_support/ios/task/audio/core/audio_record/BUILD @@ -18,7 +18,5 @@ objc_library( "//tensorflow_lite_support/ios/task/audio/core:TFLAudioFormat", "//tensorflow_lite_support/ios/task/audio/core:TFLFloatBuffer", "//tensorflow_lite_support/ios/task/audio/core:TFLRingBuffer", - # "//third_party/apple_frameworks:AVFoundation", - # "//third_party/apple_frameworks:Foundation", ], ) diff --git a/tensorflow_lite_support/ios/test/task/audio/audio_classifier/TFLAudioClassifierTests.m b/tensorflow_lite_support/ios/test/task/audio/audio_classifier/TFLAudioClassifierTests.m index fb21957b9..27d637a36 100644 --- a/tensorflow_lite_support/ios/test/task/audio/audio_classifier/TFLAudioClassifierTests.m +++ b/tensorflow_lite_support/ios/test/task/audio/audio_classifier/TFLAudioClassifierTests.m @@ -14,8 +14,8 @@ ==============================================================================*/ #import -#import "tensorflow_lite_support/ios/task/audio/sources/TFLAudioClassifier.h" #import "tensorflow_lite_support/ios/sources/TFLCommon.h" +#import "tensorflow_lite_support/ios/task/audio/sources/TFLAudioClassifier.h" #import "tensorflow_lite_support/ios/test/task/audio/core/audio_record/utils/sources/AVAudioPCMBuffer+Utils.h" #define VerifyError(error, expectedDomain, expectedCode, expectedLocalizedDescription) \ @@ -58,7 +58,6 @@ - (void)convertAndLoadBuffer:(AVAudioPCMBuffer *)buffer usingAudioConverter:(AVAudioConverter *)audioConverter; @end - @implementation TFLAudioClassifierTests - (void)setUp { @@ -156,7 +155,8 @@ - (void)loadAudioTensor:(TFLAudioTensor *)audioTensor fromWavFileWithName:(NSStr } - (TFLClassificationResult *)classifyWithAudioClassifier:(TFLAudioClassifier *)audioClassifier - audioTensor:(TFLAudioTensor *)audioTensor expectedCategoryCount:(const NSInteger)expectedCategoryCount { + audioTensor:(TFLAudioTensor *)audioTensor + expectedCategoryCount:(const NSInteger)expectedCategoryCount { TFLClassificationResult *classificationResult = [audioClassifier classifyWithAudioTensor:audioTensor error:nil]; @@ -190,10 +190,10 @@ - (void)validateCategoriesForInferenceWithAudioRecord:(NSArray *) // The third category is different from the third category specified in -[TFLAudioClassifierTests // validateClassificationResultForInferenceWithFloatBuffer]. This is because in case of inference // with audio record involves more native internal conversions to mock the conversions done by the - // audio record as opposed to inference with float buffer where the number of native conversions are - // fewer. Since each native conversion by `AVAudioConverter` employ strategies to pick samples based - // on the format specified, the samples passed in for inference in case of float buffer and audio - // record will be slightly different. + // audio record as opposed to inference with float buffer where the number of native conversions + // are fewer. Since each native conversion by `AVAudioConverter` employ strategies to pick samples + // based on the format specified, the samples passed in for inference in case of float buffer and + // audio record will be slightly different. VerifyCategory(categories[0], 0, // expectedIndex 0.957031, // expectedScore @@ -212,10 +212,10 @@ - (void)validateCategoriesForInferenceWithLabelDenyList:(NSArray // The third category is different from the third category specified in -[TFLAudioClassifierTests // validateClassificationResultForInferenceWithFloatBuffer]. This is because in case of inference // with audio record involves more native internal conversions to mock the conversions done by the - // audio record as opposed to inference with float buffer where the number of native conversions are - // fewer. Since each native conversion by `AVAudioConverter` employ strategies to pick samples based - // on the format specified, the samples passed in for inference in case of float buffer and audio - // record will be slightly different. + // audio record as opposed to inference with float buffer where the number of native conversions + // are fewer. Since each native conversion by `AVAudioConverter` employ strategies to pick samples + // based on the format specified, the samples passed in for inference in case of float buffer and + // audio record will be slightly different. VerifyCategory(categories[0], 500, // expectedIndex 0.015625, // expectedScore @@ -234,14 +234,15 @@ - (TFLAudioRecord *)createAudioRecordWithAudioClassifier:(TFLAudioClassifier *)a - (void)testInferenceWithFloatBufferSucceeds { TFLAudioClassifier *audioClassifier = [self createAudioClassifierWithModelPath:self.modelPath]; - + TFLAudioTensor *audioTensor = [self createAudioTensorWithAudioClassifier:audioClassifier]; [self loadAudioTensor:audioTensor fromWavFileWithName:@"speech"]; const NSInteger expectedCategoryCount = 521; - TFLClassificationResult *classificationResult = [self classifyWithAudioClassifier:audioClassifier - audioTensor:audioTensor - expectedCategoryCount:expectedCategoryCount]; + TFLClassificationResult *classificationResult = + [self classifyWithAudioClassifier:audioClassifier + audioTensor:audioTensor + expectedCategoryCount:expectedCategoryCount]; [self validateClassificationResultForInferenceWithFloatBuffer:classificationResult .classifications[0] @@ -260,69 +261,67 @@ - (void)testInferenceWithAudioRecordSucceeds { [audioTensor loadAudioRecord:audioRecord withError:nil]; const NSInteger expectedCategoryCount = 521; - TFLClassificationResult *classificationResult = [self classifyWithAudioClassifier:audioClassifier - audioTensor:audioTensor - expectedCategoryCount:expectedCategoryCount]; + TFLClassificationResult *classificationResult = + [self classifyWithAudioClassifier:audioClassifier + audioTensor:audioTensor + expectedCategoryCount:expectedCategoryCount]; [self validateCategoriesForInferenceWithAudioRecord:classificationResult.classifications[0] .categories]; } - (void)testInferenceWithMaxResultsSucceeds { - const NSInteger maxResults = 3; TFLAudioClassifierOptions *options = - [[TFLAudioClassifierOptions alloc] initWithModelPath:self.modelPath]; + [[TFLAudioClassifierOptions alloc] initWithModelPath:self.modelPath]; options.classificationOptions.maxResults = maxResults; - - + TFLAudioClassifier *audioClassifier = [self createAudioClassifierWithOptions:options]; TFLAudioTensor *audioTensor = [self createAudioTensorWithAudioClassifier:audioClassifier]; [self loadAudioTensor:audioTensor fromWavFileWithName:@"speech"]; TFLClassificationResult *classificationResult = [self classifyWithAudioClassifier:audioClassifier audioTensor:audioTensor - expectedCategoryCount:maxResults]; + expectedCategoryCount:maxResults]; [self validateClassificationResultForInferenceWithFloatBuffer:classificationResult .classifications[0] .categories]; } - - (void)testInferenceWithClassNameBlackListAndWhiteListFails { - TFLAudioClassifierOptions *options = - [[TFLAudioClassifierOptions alloc] initWithModelPath:self.modelPath]; - options.classificationOptions.labelAllowList = @[@"Speech"]; - options.classificationOptions.labelDenyList = @[@"Inside, small room"]; - + [[TFLAudioClassifierOptions alloc] initWithModelPath:self.modelPath]; + options.classificationOptions.labelAllowList = @[ @"Speech" ]; + options.classificationOptions.labelDenyList = @[ @"Inside, small room" ]; + NSError *error = nil; TFLAudioClassifier *audioClassifier = [TFLAudioClassifier audioClassifierWithOptions:options error:&error]; XCTAssertNil(audioClassifier); VerifyError(error, - expectedTaskErrorDomain, // expectedErrorDomain - TFLSupportErrorCodeInvalidArgumentError, // expectedErrorCode - @"INVALID_ARGUMENT: `class_name_allowlist` and `class_name_denylist` are mutually exclusive options." // expectedErrorMessage + expectedTaskErrorDomain, // expectedErrorDomain + TFLSupportErrorCodeInvalidArgumentError, // expectedErrorCode + @"INVALID_ARGUMENT: `class_name_allowlist` and `class_name_denylist` are mutually " + @"exclusive options." // expectedErrorMessage ); } - (void)testInferenceWithLabelAllowListSucceeds { - TFLAudioClassifierOptions *options = - [[TFLAudioClassifierOptions alloc] initWithModelPath:self.modelPath]; - options.classificationOptions.labelAllowList = @[@"Speech", @"Inside, small room"]; - + [[TFLAudioClassifierOptions alloc] initWithModelPath:self.modelPath]; + options.classificationOptions.labelAllowList = @[ @"Speech", @"Inside, small room" ]; + NSError *error = nil; TFLAudioClassifier *audioClassifier = [TFLAudioClassifier audioClassifierWithOptions:options error:&error]; TFLAudioTensor *audioTensor = [self createAudioTensorWithAudioClassifier:audioClassifier]; [self loadAudioTensor:audioTensor fromWavFileWithName:@"speech"]; - TFLClassificationResult *classificationResult = [self classifyWithAudioClassifier:audioClassifier - audioTensor:audioTensor - expectedCategoryCount:options.classificationOptions.labelAllowList.count]; + TFLClassificationResult *classificationResult = + [self classifyWithAudioClassifier:audioClassifier + audioTensor:audioTensor + expectedCategoryCount:options.classificationOptions.labelAllowList.count]; [self validateClassificationResultForInferenceWithFloatBuffer:classificationResult .classifications[0] @@ -330,11 +329,10 @@ - (void)testInferenceWithLabelAllowListSucceeds { } - (void)testInferenceWithLabelDenyListSucceeds { - TFLAudioClassifierOptions *options = - [[TFLAudioClassifierOptions alloc] initWithModelPath:self.modelPath]; - options.classificationOptions.labelDenyList = @[@"Speech"]; - + [[TFLAudioClassifierOptions alloc] initWithModelPath:self.modelPath]; + options.classificationOptions.labelDenyList = @[ @"Speech" ]; + NSError *error = nil; TFLAudioClassifier *audioClassifier = [TFLAudioClassifier audioClassifierWithOptions:options error:&error]; @@ -342,41 +340,40 @@ - (void)testInferenceWithLabelDenyListSucceeds { [self loadAudioTensor:audioTensor fromWavFileWithName:@"speech"]; const NSInteger expectedCategoryCount = 520; - TFLClassificationResult *classificationResult = [self classifyWithAudioClassifier:audioClassifier - audioTensor:audioTensor - expectedCategoryCount:expectedCategoryCount]; + TFLClassificationResult *classificationResult = + [self classifyWithAudioClassifier:audioClassifier + audioTensor:audioTensor + expectedCategoryCount:expectedCategoryCount]; - [self validateCategoriesForInferenceWithLabelDenyList:classificationResult - .classifications[0] - .categories]; + [self validateCategoriesForInferenceWithLabelDenyList:classificationResult.classifications[0] + .categories]; } - (void)testCreateAudioClassifierWithNilOptionsFails { - NSError *error = nil; - TFLAudioClassifier *audioClassifier = [TFLAudioClassifier audioClassifierWithOptions:nil error:&error]; + TFLAudioClassifier *audioClassifier = [TFLAudioClassifier audioClassifierWithOptions:nil + error:&error]; XCTAssertNil(audioClassifier); - VerifyError(error, - expectedTaskErrorDomain, // expectedErrorDomain - TFLSupportErrorCodeInvalidArgumentError, // expectedErrorCode - @"TFLAudioClassifierOptions argument cannot be nil." // expectedErrorMessage + VerifyError(error, + expectedTaskErrorDomain, // expectedErrorDomain + TFLSupportErrorCodeInvalidArgumentError, // expectedErrorCode + @"TFLAudioClassifierOptions argument cannot be nil." // expectedErrorMessage ); } - (void)testInferenceWithNilAudioTensorFails { - TFLAudioClassifier *audioClassifier = [self createAudioClassifierWithModelPath:self.modelPath]; NSError *error = nil; - TFLClassificationResult *classificationResult = - [audioClassifier classifyWithAudioTensor:nil error:&error]; + TFLClassificationResult *classificationResult = [audioClassifier classifyWithAudioTensor:nil + error:&error]; XCTAssertNil(classificationResult); - VerifyError(error, - expectedTaskErrorDomain, // expectedErrorDomain - TFLSupportErrorCodeInvalidArgumentError, // expectedErrorCode - @"audioTensor argument cannot be nil." // expectedErrorMessage + VerifyError(error, + expectedTaskErrorDomain, // expectedErrorDomain + TFLSupportErrorCodeInvalidArgumentError, // expectedErrorCode + @"audioTensor argument cannot be nil." // expectedErrorMessage ); } From 9e59a49e0ddfd8b2e51b6a5bd5d140eb52d74224 Mon Sep 17 00:00:00 2001 From: Prianka Liz Kariat Date: Fri, 24 Jun 2022 02:13:07 +0530 Subject: [PATCH 07/11] Updated test --- .../task/audio/audio_classifier/TFLAudioClassifierTests.m | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tensorflow_lite_support/ios/test/task/audio/audio_classifier/TFLAudioClassifierTests.m b/tensorflow_lite_support/ios/test/task/audio/audio_classifier/TFLAudioClassifierTests.m index 27d637a36..8cc24bd39 100644 --- a/tensorflow_lite_support/ios/test/task/audio/audio_classifier/TFLAudioClassifierTests.m +++ b/tensorflow_lite_support/ios/test/task/audio/audio_classifier/TFLAudioClassifierTests.m @@ -28,7 +28,7 @@ #define VerifyCategory(category, expectedIndex, expectedScore, expectedLabel, expectedDisplayName) \ XCTAssertEqual(category.index, expectedIndex); \ - XCTAssertEqualWithAccuracy(category.score, expectedScore, 1e-2); \ + XCTAssertEqualWithAccuracy(category.score, expectedScore, 1e-6); \ XCTAssertEqualObjects(category.label, expectedLabel); \ XCTAssertEqualObjects(category.displayName, expectedDisplayName); @@ -180,7 +180,7 @@ - (void)validateClassificationResultForInferenceWithFloatBuffer: ); VerifyCategory(categories[1], 500, // expectedIndex - 0.015625, // expectedScore + 0.019531, // expectedScore @"Inside, small room", // expectedLabel nil // expectedDisplaName ); @@ -202,7 +202,7 @@ - (void)validateCategoriesForInferenceWithAudioRecord:(NSArray *) ); VerifyCategory(categories[1], 500, // expectedIndex - 0.015625, // expectedScore + 0.019531, // expectedScore @"Inside, small room", // expectedLabel nil // expectedDisplaName ); @@ -218,7 +218,7 @@ - (void)validateCategoriesForInferenceWithLabelDenyList:(NSArray // audio record will be slightly different. VerifyCategory(categories[0], 500, // expectedIndex - 0.015625, // expectedScore + 0.019531, // expectedScore @"Inside, small room", // expectedLabel nil // expectedDisplaName ); From 93d0333af2420d393267430034a009d5cb9044d6 Mon Sep 17 00:00:00 2001 From: Prianka Liz Kariat Date: Fri, 24 Jun 2022 02:38:00 +0530 Subject: [PATCH 08/11] Updated swift tests --- .../TFLAudioClassifierTests.swift | 31 ++++++++++++++++--- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/tensorflow_lite_support/ios/test/task/audio/audio_classifier/TFLAudioClassifierTests.swift b/tensorflow_lite_support/ios/test/task/audio/audio_classifier/TFLAudioClassifierTests.swift index 364c4ba18..901b11f19 100644 --- a/tensorflow_lite_support/ios/test/task/audio/audio_classifier/TFLAudioClassifierTests.swift +++ b/tensorflow_lite_support/ios/test/task/audio/audio_classifier/TFLAudioClassifierTests.swift @@ -47,7 +47,7 @@ class AudioClassifierTests: XCTestCase { XCTAssertEqual( category.score, expectedScore, - accuracy: 1e-2); + accuracy: 1e-6); XCTAssertEqual( category.label, expectedLabel) @@ -93,11 +93,19 @@ class AudioClassifierTests: XCTestCase { audioFormat: audioFormat) } - func createAudioClassifier(withModelPath modelPath: String? - ) throws -> AudioClassifier? { + func createAudioClassifierOptions(modelPath: String? + ) throws -> AudioClassifierOptions? { let modelPath = try XCTUnwrap(modelPath) let options = AudioClassifierOptions(modelPath: modelPath) + return options + } + + func createAudioClassifier(withModelPath modelPath: String? + ) throws -> AudioClassifier? { + let options = try XCTUnwrap( + self.createAudioClassifierOptions( + modelPath:AudioClassifierTests.modelPath)) let audioClassifier = try XCTUnwrap( AudioClassifier.classifier( options: options)) @@ -166,7 +174,7 @@ class AudioClassifierTests: XCTestCase { self.verifyCategory( categories[1], expectedIndex: 500, - expectedScore: 0.015625, + expectedScore: 0.019531, expectedLabel: "Inside, small room", expectedDisplayName: nil); } @@ -186,4 +194,17 @@ class AudioClassifierTests: XCTestCase { categories: classificationResult.classifications[0].categories) } -} + func testInferenceWithNoModelPathFails() throws { + let options = AudioClassifierOptions() + do { + let audioClassifier = try AudioClassifier.classifier( + options:options) + XCTAssertNil(audioClassifier) + } + catch { + self.verifyError( + error, + expectedLocalizedDescription: "INVALID_ARGUMENT: Missing mandatory `model_file` field in `base_options`") + } + } + \ No newline at end of file From c8298db680650ac6a9c4a737c867ade9e7f24f2d Mon Sep 17 00:00:00 2001 From: Prianka Liz Kariat Date: Fri, 24 Jun 2022 02:39:06 +0530 Subject: [PATCH 09/11] Updated Documentation --- .../task/audio/audio_classifier/TFLAudioClassifierTests.m | 7 ------- 1 file changed, 7 deletions(-) diff --git a/tensorflow_lite_support/ios/test/task/audio/audio_classifier/TFLAudioClassifierTests.m b/tensorflow_lite_support/ios/test/task/audio/audio_classifier/TFLAudioClassifierTests.m index 8cc24bd39..85e04a889 100644 --- a/tensorflow_lite_support/ios/test/task/audio/audio_classifier/TFLAudioClassifierTests.m +++ b/tensorflow_lite_support/ios/test/task/audio/audio_classifier/TFLAudioClassifierTests.m @@ -209,13 +209,6 @@ - (void)validateCategoriesForInferenceWithAudioRecord:(NSArray *) } - (void)validateCategoriesForInferenceWithLabelDenyList:(NSArray *)categories { - // The third category is different from the third category specified in -[TFLAudioClassifierTests - // validateClassificationResultForInferenceWithFloatBuffer]. This is because in case of inference - // with audio record involves more native internal conversions to mock the conversions done by the - // audio record as opposed to inference with float buffer where the number of native conversions - // are fewer. Since each native conversion by `AVAudioConverter` employ strategies to pick samples - // based on the format specified, the samples passed in for inference in case of float buffer and - // audio record will be slightly different. VerifyCategory(categories[0], 500, // expectedIndex 0.019531, // expectedScore From b6492415dca37ea6298e70345e29c5c65ed8a083 Mon Sep 17 00:00:00 2001 From: Prianka Liz Kariat Date: Fri, 24 Jun 2022 11:33:32 +0530 Subject: [PATCH 10/11] Updated includes --- .../ios/task/audio/core/audio_tensor/sources/TFLAudioTensor.h | 2 +- .../ios/task/audio/core/audio_tensor/sources/TFLAudioTensor.m | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/tensorflow_lite_support/ios/task/audio/core/audio_tensor/sources/TFLAudioTensor.h b/tensorflow_lite_support/ios/task/audio/core/audio_tensor/sources/TFLAudioTensor.h index 0cc2d4c84..3285e6117 100644 --- a/tensorflow_lite_support/ios/task/audio/core/audio_tensor/sources/TFLAudioTensor.h +++ b/tensorflow_lite_support/ios/task/audio/core/audio_tensor/sources/TFLAudioTensor.h @@ -14,7 +14,7 @@ #import #import "tensorflow_lite_support/ios/task/audio/core/audio_record/sources/TFLAudioRecord.h" -#import "tensorflow_lite_support/ios/task/audio/core/sources/TFLRingBuffer.h" +#import "tensorflow_lite_support/ios/task/audio/core/sources/TFLFloatBuffer.h" NS_ASSUME_NONNULL_BEGIN diff --git a/tensorflow_lite_support/ios/task/audio/core/audio_tensor/sources/TFLAudioTensor.m b/tensorflow_lite_support/ios/task/audio/core/audio_tensor/sources/TFLAudioTensor.m index ce58f1754..c2a69696a 100644 --- a/tensorflow_lite_support/ios/task/audio/core/audio_tensor/sources/TFLAudioTensor.m +++ b/tensorflow_lite_support/ios/task/audio/core/audio_tensor/sources/TFLAudioTensor.m @@ -13,6 +13,7 @@ // limitations under the License. #import "tensorflow_lite_support/ios/task/audio/core/audio_tensor/sources/TFLAudioTensor.h" +#import "tensorflow_lite_support/ios/task/audio/core/sources/TFLRingBuffer.h" #import "tensorflow_lite_support/ios/sources/TFLCommon.h" #import "tensorflow_lite_support/ios/sources/TFLCommonUtils.h" From 1e401664a9c1c4a4f3d77ddb9557deb51d047c44 Mon Sep 17 00:00:00 2001 From: Sebastian Schmidt Date: Thu, 30 Jun 2022 16:45:49 -0600 Subject: [PATCH 11/11] Rename test --- .../test/task/audio/audio_classifier/TFLAudioClassifierTests.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tensorflow_lite_support/ios/test/task/audio/audio_classifier/TFLAudioClassifierTests.m b/tensorflow_lite_support/ios/test/task/audio/audio_classifier/TFLAudioClassifierTests.m index 85e04a889..faafc9672 100644 --- a/tensorflow_lite_support/ios/test/task/audio/audio_classifier/TFLAudioClassifierTests.m +++ b/tensorflow_lite_support/ios/test/task/audio/audio_classifier/TFLAudioClassifierTests.m @@ -282,7 +282,7 @@ - (void)testInferenceWithMaxResultsSucceeds { .categories]; } -- (void)testInferenceWithClassNameBlackListAndWhiteListFails { +- (void)testInferenceWithClassNameAllowListAndDenyListFails { TFLAudioClassifierOptions *options = [[TFLAudioClassifierOptions alloc] initWithModelPath:self.modelPath]; options.classificationOptions.labelAllowList = @[ @"Speech" ];