diff --git a/testdata/dnn/download_models.py b/testdata/dnn/download_models.py index 0a1441517..f755a0fb3 100755 --- a/testdata/dnn/download_models.py +++ b/testdata/dnn/download_models.py @@ -257,6 +257,11 @@ def is_archive(self): url='http://dl.caffe.berkeleyvision.org/fcn8s-heavy-pascal.caffemodel', sha='c449ea74dd7d83751d1357d6a8c323fcf4038962', filename='fcn8s-heavy-pascal.caffemodel'), + Model( + name='Fcn', + url='https://github.com/onnx/models/raw/491ce05590abb7551d7fae43c067c060eeb575a6/validated/vision/object_detection_segmentation/fcn/model/fcn-resnet50-12.onnx', + sha='1bb0c7e0034038969aecc6251166f1612a139230', + filename='onnx/models/fcn-resnet50-12.onnx'), Model( name='Ssd_vgg16', url='https://www.dropbox.com/s/8apyk3uzk2vl522/VGG_ILSVRC2016_SSD_300x300_iter_440000.caffemodel?dl=1', diff --git a/testdata/dnn/segmentation_exp.png b/testdata/dnn/segmentation_exp.png index d69d5ca60..0a99edec1 100644 Binary files a/testdata/dnn/segmentation_exp.png and b/testdata/dnn/segmentation_exp.png differ diff --git a/testdata/dnn/tflite/generate.py b/testdata/dnn/tflite/generate.py index 54d6acddf..31f0e0a09 100644 --- a/testdata/dnn/tflite/generate.py +++ b/testdata/dnn/tflite/generate.py @@ -58,9 +58,14 @@ def save_tflite_model(model, inp, name): out = model(inp) out = np.array(out) - if len(inp.shape) == 4: + # convert NHWC to NCHW format + if inp.ndim == 4: inp = inp.transpose(0, 3, 1, 2) + inp = np.copy(inp, order='C').astype(inp.dtype) + + if out.ndim == 4: out = out.transpose(0, 3, 1, 2) + out = np.copy(out, order='C').astype(out.dtype) np.save(f'{name}_inp.npy', inp) np.save(f'{name}_out_Identity.npy', out) @@ -88,6 +93,14 @@ def split(x): inp = np.random.standard_normal((1, 3)).astype(np.float32) save_tflite_model(split, inp, 'split') +def keras_to_tf(model, input_shape): + tf_func = tf.function( + model.call, + input_signature=[tf.TensorSpec(input_shape, tf.float32)], + ) + inp = np.random.standard_normal((input_shape)).astype(np.float32) + + return tf_func, inp fully_connected = tf.keras.models.Sequential([ tf.keras.layers.Dense(3), @@ -95,10 +108,42 @@ def split(x): tf.keras.layers.Softmax(), ]) -fully_connected = tf.function( - fully_connected.call, - input_signature=[tf.TensorSpec((1,2), tf.float32)], -) - -inp = np.random.standard_normal((1, 2)).astype(np.float32) +fully_connected, inp = keras_to_tf(fully_connected, (1, 2)) save_tflite_model(fully_connected, inp, 'fully_connected') + +permutation_3d = tf.keras.models.Sequential([ + tf.keras.layers.Permute((2, 1)) +]) + +permutation_3d, inp = keras_to_tf(permutation_3d, (1, 2, 3)) +save_tflite_model(permutation_3d, inp, 'permutation_3d') + +# (1, 2, 3) is temporarily disabled as TFLiteConverter produces a incorrect graph in this case +permutation_4d_list = [(1, 3, 2), (2, 1, 3), (2, 3, 1)] +for perm_axis in permutation_4d_list: + permutation_4d_model = tf.keras.models.Sequential([ + tf.keras.layers.Permute(perm_axis), + tf.keras.layers.Conv2D(3, 1) + ]) + + permutation_4d_model, inp = keras_to_tf(permutation_4d_model, (1, 2, 3, 4)) + model_name = f"permutation_4d_0{''.join(map(str, perm_axis))}" + save_tflite_model(permutation_4d_model, inp, model_name) + +global_average_pooling_2d = tf.keras.models.Sequential([ + tf.keras.layers.GlobalAveragePooling2D(keepdims=True), + tf.keras.layers.ZeroPadding2D(1), + tf.keras.layers.GlobalAveragePooling2D(keepdims=False) +]) + +global_average_pooling_2d, inp = keras_to_tf(global_average_pooling_2d, (1, 7, 7, 5)) +save_tflite_model(global_average_pooling_2d, inp, 'global_average_pooling_2d') + +global_max_pool = tf.keras.models.Sequential([ + tf.keras.layers.GlobalMaxPool2D(keepdims=True), + tf.keras.layers.ZeroPadding2D(1), + tf.keras.layers.GlobalMaxPool2D(keepdims=True) +]) + +global_max_pool, inp = keras_to_tf(global_max_pool, (1, 7, 7, 5)) +save_tflite_model(global_max_pool, inp, 'global_max_pooling_2d') diff --git a/testdata/dnn/tflite/global_average_pooling_2d.tflite b/testdata/dnn/tflite/global_average_pooling_2d.tflite new file mode 100644 index 000000000..0ac15d77a Binary files /dev/null and b/testdata/dnn/tflite/global_average_pooling_2d.tflite differ diff --git a/testdata/dnn/tflite/global_average_pooling_2d_inp.npy b/testdata/dnn/tflite/global_average_pooling_2d_inp.npy new file mode 100644 index 000000000..4f3964639 Binary files /dev/null and b/testdata/dnn/tflite/global_average_pooling_2d_inp.npy differ diff --git a/testdata/dnn/tflite/global_average_pooling_2d_out_Identity.npy b/testdata/dnn/tflite/global_average_pooling_2d_out_Identity.npy new file mode 100644 index 000000000..79ecb22ad Binary files /dev/null and b/testdata/dnn/tflite/global_average_pooling_2d_out_Identity.npy differ diff --git a/testdata/dnn/tflite/global_max_pooling_2d.tflite b/testdata/dnn/tflite/global_max_pooling_2d.tflite new file mode 100644 index 000000000..10e8b7b57 Binary files /dev/null and b/testdata/dnn/tflite/global_max_pooling_2d.tflite differ diff --git a/testdata/dnn/tflite/global_max_pooling_2d_inp.npy b/testdata/dnn/tflite/global_max_pooling_2d_inp.npy new file mode 100644 index 000000000..8e88bf946 Binary files /dev/null and b/testdata/dnn/tflite/global_max_pooling_2d_inp.npy differ diff --git a/testdata/dnn/tflite/global_max_pooling_2d_out_Identity.npy b/testdata/dnn/tflite/global_max_pooling_2d_out_Identity.npy new file mode 100644 index 000000000..679d0e3a8 Binary files /dev/null and b/testdata/dnn/tflite/global_max_pooling_2d_out_Identity.npy differ diff --git a/testdata/dnn/tflite/permutation_3d.tflite b/testdata/dnn/tflite/permutation_3d.tflite new file mode 100644 index 000000000..597c40bab Binary files /dev/null and b/testdata/dnn/tflite/permutation_3d.tflite differ diff --git a/testdata/dnn/tflite/permutation_3d_inp.npy b/testdata/dnn/tflite/permutation_3d_inp.npy new file mode 100644 index 000000000..a10573b7b Binary files /dev/null and b/testdata/dnn/tflite/permutation_3d_inp.npy differ diff --git a/testdata/dnn/tflite/permutation_3d_out_Identity.npy b/testdata/dnn/tflite/permutation_3d_out_Identity.npy new file mode 100644 index 000000000..ae4e45c6e Binary files /dev/null and b/testdata/dnn/tflite/permutation_3d_out_Identity.npy differ diff --git a/testdata/dnn/tflite/permutation_4d_0132.tflite b/testdata/dnn/tflite/permutation_4d_0132.tflite new file mode 100644 index 000000000..d6fed63ac Binary files /dev/null and b/testdata/dnn/tflite/permutation_4d_0132.tflite differ diff --git a/testdata/dnn/tflite/permutation_4d_0132_inp.npy b/testdata/dnn/tflite/permutation_4d_0132_inp.npy new file mode 100644 index 000000000..8ccfe49b4 Binary files /dev/null and b/testdata/dnn/tflite/permutation_4d_0132_inp.npy differ diff --git a/testdata/dnn/tflite/permutation_4d_0132_out_Identity.npy b/testdata/dnn/tflite/permutation_4d_0132_out_Identity.npy new file mode 100644 index 000000000..af8364f43 Binary files /dev/null and b/testdata/dnn/tflite/permutation_4d_0132_out_Identity.npy differ diff --git a/testdata/dnn/tflite/permutation_4d_0213.tflite b/testdata/dnn/tflite/permutation_4d_0213.tflite new file mode 100644 index 000000000..4f97acf14 Binary files /dev/null and b/testdata/dnn/tflite/permutation_4d_0213.tflite differ diff --git a/testdata/dnn/tflite/permutation_4d_0213_inp.npy b/testdata/dnn/tflite/permutation_4d_0213_inp.npy new file mode 100644 index 000000000..12f84948a Binary files /dev/null and b/testdata/dnn/tflite/permutation_4d_0213_inp.npy differ diff --git a/testdata/dnn/tflite/permutation_4d_0213_out_Identity.npy b/testdata/dnn/tflite/permutation_4d_0213_out_Identity.npy new file mode 100644 index 000000000..e1c6621d6 Binary files /dev/null and b/testdata/dnn/tflite/permutation_4d_0213_out_Identity.npy differ diff --git a/testdata/dnn/tflite/permutation_4d_0231.tflite b/testdata/dnn/tflite/permutation_4d_0231.tflite new file mode 100644 index 000000000..51775409b Binary files /dev/null and b/testdata/dnn/tflite/permutation_4d_0231.tflite differ diff --git a/testdata/dnn/tflite/permutation_4d_0231_inp.npy b/testdata/dnn/tflite/permutation_4d_0231_inp.npy new file mode 100644 index 000000000..5d5e0a2bc Binary files /dev/null and b/testdata/dnn/tflite/permutation_4d_0231_inp.npy differ diff --git a/testdata/dnn/tflite/permutation_4d_0231_out_Identity.npy b/testdata/dnn/tflite/permutation_4d_0231_out_Identity.npy new file mode 100644 index 000000000..c107fb7ab Binary files /dev/null and b/testdata/dnn/tflite/permutation_4d_0231_out_Identity.npy differ