diff --git a/onnxruntime/core/providers/nnapi/nnapi_builtin/builders/op_builder.cc b/onnxruntime/core/providers/nnapi/nnapi_builtin/builders/op_builder.cc index 319ebe26c5..a351a5c483 100644 --- a/onnxruntime/core/providers/nnapi/nnapi_builtin/builders/op_builder.cc +++ b/onnxruntime/core/providers/nnapi/nnapi_builtin/builders/op_builder.cc @@ -1284,8 +1284,10 @@ Status PoolOpBuilder::AddToModelBuilderImpl(ModelBuilder& model_builder, const N int32_t fuse_code = model_builder.FindActivation(node, *node.OutputDefs()[0]); // Get output scale and zero point if this is QLinearAveragePool - float y_scale = 0.0f; - int32_t y_zero_point = 0; + // Otherwise we will use the scale and zero point of the input + const OperandType& input_operand_type = operand_types.at(input); + float y_scale = input_operand_type.operandType.scale; + int32_t y_zero_point = input_operand_type.operandType.zeroPoint; if (is_qlinear_average_pool) { const auto& initializers = model_builder.GetInitializerTensors(); float x_scale = 0.0f; diff --git a/onnxruntime/test/providers/nnapi/nnapi_basic_test.cc b/onnxruntime/test/providers/nnapi/nnapi_basic_test.cc index b80aa7cb85..b8c4acd127 100644 --- a/onnxruntime/test/providers/nnapi/nnapi_basic_test.cc +++ b/onnxruntime/test/providers/nnapi/nnapi_basic_test.cc @@ -82,7 +82,7 @@ TEST(NnapiExecutionProviderTest, InternalUint8SupportTest) { const ORTCHAR_T* model_file_name = ORT_TSTR("testdata/nnapi_internal_uint8_support.onnx"); #if defined(__ANDROID__) - std::vector dims_x = {1, 3}; + std::vector dims_x = {1, 1, 1, 3}; std::vector values_x = {0.0f, 256.0f, 512.0f}; OrtValue ml_value_x; CreateMLValue(TestNnapiExecutionProvider()->GetAllocator(0, OrtMemTypeDefault), dims_x, values_x, diff --git a/onnxruntime/test/testdata/nnapi_internal_uint8_support.onnx b/onnxruntime/test/testdata/nnapi_internal_uint8_support.onnx index daee608f7c..03fca2f533 100644 Binary files a/onnxruntime/test/testdata/nnapi_internal_uint8_support.onnx and b/onnxruntime/test/testdata/nnapi_internal_uint8_support.onnx differ diff --git a/onnxruntime/test/testdata/nnapi_internal_uint8_support.py b/onnxruntime/test/testdata/nnapi_internal_uint8_support.py index f419df2dc7..d7d2c18cf5 100644 --- a/onnxruntime/test/testdata/nnapi_internal_uint8_support.py +++ b/onnxruntime/test/testdata/nnapi_internal_uint8_support.py @@ -8,10 +8,11 @@ from onnx import TensorProto # def GenerateModel(model_name): def GenerateModel(model_name): nodes = [ - helper.make_node("QuantizeLinear", ["X", "Scale", "Zero_point"], ["X_quantized"], "quantize"), - helper.make_node("Concat", ["X_quantized", "X_quantized"], ["X_concat"], axis=0, name="concat"), - helper.make_node("Transpose", ["X_concat"], ["X_transposed"], "transpose"), - helper.make_node("DequantizeLinear", ["X_transposed", "Scale", "Zero_point"], ["Y"], "dequantize"), + helper.make_node("QuantizeLinear", ["X", "Scale", "Zero_point"], ["X_quantized"], "quantize_0"), + helper.make_node("Concat", ["X_quantized", "X_quantized"], ["X_concat"], axis=-2, name="concat_0"), + helper.make_node("MaxPool", ["X_concat"], ["X_maxpool"], kernel_shape=[2, 2], name="maxpool_0"), + helper.make_node("Transpose", ["X_maxpool"], ["X_transposed"], perm=[0, 1, 3, 2], name="transpose_0"), + helper.make_node("DequantizeLinear", ["X_transposed", "Scale", "Zero_point"], ["Y"], "dequantize_0"), ] initializers = [ @@ -20,14 +21,14 @@ def GenerateModel(model_name): ] inputs = [ - helper.make_tensor_value_info('X', TensorProto.FLOAT, [1, 3]), + helper.make_tensor_value_info('X', TensorProto.FLOAT, [1, 1, 1, 3]), ] graph = helper.make_graph( nodes, "NNAPI_Internal_uint8_Test", inputs, - [helper.make_tensor_value_info('Y', TensorProto.FLOAT, [3, 2])], + [helper.make_tensor_value_info('Y', TensorProto.FLOAT, [1, 1, 2, 1])], initializers )