From 06b913606bae304026a9e542278906d8f6bf4dd7 Mon Sep 17 00:00:00 2001 From: Dmitry Kurtaev Date: Mon, 17 Jul 2023 16:23:32 +0300 Subject: [PATCH 1/3] Add test for Pack from TFLite --- testdata/dnn/tflite/generate.py | 31 ++++++++++++++++++ testdata/dnn/tflite/replicate_by_pack.tflite | Bin 0 -> 1788 bytes testdata/dnn/tflite/replicate_by_pack_inp.npy | Bin 0 -> 164 bytes ...eplicate_by_pack_out_PartitionedCall:0.npy | Bin 0 -> 164 bytes 4 files changed, 31 insertions(+) create mode 100644 testdata/dnn/tflite/replicate_by_pack.tflite create mode 100644 testdata/dnn/tflite/replicate_by_pack_inp.npy create mode 100644 testdata/dnn/tflite/replicate_by_pack_out_PartitionedCall:0.npy diff --git a/testdata/dnn/tflite/generate.py b/testdata/dnn/tflite/generate.py index b1d5d9d67..0ca5fd53d 100644 --- a/testdata/dnn/tflite/generate.py +++ b/testdata/dnn/tflite/generate.py @@ -45,3 +45,34 @@ def run_mediapipe_solution(solution, inp_size): run_tflite_model("face_detection_short_range", (128, 128)) run_mediapipe_solution(mp.solutions.selfie_segmentation.SelfieSegmentation(model_selection=0), (256, 256)) + +# Save TensorFlow model as TFLite +def save_tflite_model(model, inp, name): + func = model.__call__.get_concrete_function() + converter = tf.lite.TFLiteConverter.from_concrete_functions([func], model) + tflite_model = converter.convert() + + with open(f'{name}.tflite', 'wb') as f: + f.write(tflite_model) + + out = model(inp) + + np.save(f'{name}_inp.npy', inp.transpose(0, 3, 1, 2)) + np.save(f'{name}_out_PartitionedCall:0.npy', np.array(out).transpose(0, 3, 1, 2)) + + +class ReplicateByPack(tf.Module): + @tf.function(input_signature=[tf.TensorSpec(shape=[1, 3, 3, 1], dtype=tf.float32)]) + def __call__(self, x): + pack_1 = tf.stack([x, x], axis=3) + reshape_1 = tf.reshape(pack_1, [1, 3, 6, 1]) + pack_2 = tf.stack([reshape_1, reshape_1], axis=2) + reshape_2 = tf.reshape(pack_2, [1, 6, 6, 1]) + scaled = tf.image.resize(reshape_2, size=(3, 3), method=tf.image.ResizeMethod.NEAREST_NEIGHBOR) + return scaled + x + +model = ReplicateByPack() +inp = np.random.standard_normal((1, 3, 3, 1)).astype(np.float32) + +save_tflite_model(model, inp, 'replicate_by_pack') + diff --git a/testdata/dnn/tflite/replicate_by_pack.tflite b/testdata/dnn/tflite/replicate_by_pack.tflite new file mode 100644 index 0000000000000000000000000000000000000000..c56f2e89274831994c18678ce6b25b9df7269d75 GIT binary patch literal 1788 zcmZvdzfTlF6vrQkasr+h2%(_3f|48vHi`{F3>bbGxL6r4tE}9{;~>XEh_SGspdiLr z7(*M;+U2Vo!5V&h;!`k3UX;90IESO!0Whzt5iAB~GSC+bVNkIL`3!CSK@%;7tRn4zb z``8-KPvplmyYb^^6x9X$r5J>a&?9_o;*buu@y+_QD5@8p~N#4mfm89Kzw zd?+2xH71E|P&kl`GXTfwa;Lyr?!DCqI&jIKT&XFxd4(<~{Af(NoH9D2-sAws`Njro zH;9LtF*E49vJ{4e6A9l6_l2DBO=m~KynvlgdPC$2;N^r}$*yR=>s7-b)GP8=r@eCd z#+YPqWG0S>m{@1^j-3tS7!hi+K^|3qD|qUUF2~cN?`a<{`oUW1;YL-*|F!p^$sV~= zmmbNmEkh-5(=YOdTrAuLAeO@>F84}}XC-636?%`Jh{;{J9H^t?er@6+gS(eqoAIaUsO_*m=~X4l#&V(cT3DEP6dh= zXCxM+0{I$-ItoB!3`Ckb3bhJk0Iq%aX6^r&m1w(Y=TmztubK82PA=GQ-gIq$6JzWC N$kL_uHrw{@2LQv#FP#7Y literal 0 HcmV?d00001 diff --git a/testdata/dnn/tflite/replicate_by_pack_out_PartitionedCall:0.npy b/testdata/dnn/tflite/replicate_by_pack_out_PartitionedCall:0.npy new file mode 100644 index 0000000000000000000000000000000000000000..9b89b69742d1b514198b38203c27ebc6115f6030 GIT binary patch literal 164 zcmbR27wQ`j$;eQ~P_3SlTAW;@Zl$1ZlV+l>qoAIaUsO_*m=~X4l#&V(cT3DEP6dh= zXCxM+0{I$-ItoB!3`Ckb3bhJk0Iq%aqz-({dT6_7XR3phm!!jmlL`mSo5Bt>F|r(^b literal 0 HcmV?d00001 From 89d03b0500d9e1b34b4e5f57418baf7da681ed21 Mon Sep 17 00:00:00 2001 From: Dmitry Kurtaev Date: Tue, 18 Jul 2023 09:32:44 +0300 Subject: [PATCH 2/3] Update test data --- testdata/dnn/tflite/generate.py | 29 +++++++++--------- testdata/dnn/tflite/replicate_by_pack.tflite | Bin 1788 -> 1664 bytes testdata/dnn/tflite/replicate_by_pack_inp.npy | Bin 164 -> 164 bytes ...npy => replicate_by_pack_out_Identity.npy} | Bin 164 -> 164 bytes 4 files changed, 14 insertions(+), 15 deletions(-) rename testdata/dnn/tflite/{replicate_by_pack_out_PartitionedCall:0.npy => replicate_by_pack_out_Identity.npy} (78%) diff --git a/testdata/dnn/tflite/generate.py b/testdata/dnn/tflite/generate.py index 0ca5fd53d..9e7f5992f 100644 --- a/testdata/dnn/tflite/generate.py +++ b/testdata/dnn/tflite/generate.py @@ -48,31 +48,30 @@ def run_mediapipe_solution(solution, inp_size): # Save TensorFlow model as TFLite def save_tflite_model(model, inp, name): - func = model.__call__.get_concrete_function() - converter = tf.lite.TFLiteConverter.from_concrete_functions([func], model) + func = model.get_concrete_function() + converter = tf.lite.TFLiteConverter.from_concrete_functions([func]) tflite_model = converter.convert() + interpreter = tf.lite.Interpreter(model_content=tflite_model) + with open(f'{name}.tflite', 'wb') as f: f.write(tflite_model) out = model(inp) np.save(f'{name}_inp.npy', inp.transpose(0, 3, 1, 2)) - np.save(f'{name}_out_PartitionedCall:0.npy', np.array(out).transpose(0, 3, 1, 2)) + np.save(f'{name}_out_Identity.npy', np.array(out).transpose(0, 3, 1, 2)) -class ReplicateByPack(tf.Module): - @tf.function(input_signature=[tf.TensorSpec(shape=[1, 3, 3, 1], dtype=tf.float32)]) - def __call__(self, x): - pack_1 = tf.stack([x, x], axis=3) - reshape_1 = tf.reshape(pack_1, [1, 3, 6, 1]) - pack_2 = tf.stack([reshape_1, reshape_1], axis=2) - reshape_2 = tf.reshape(pack_2, [1, 6, 6, 1]) - scaled = tf.image.resize(reshape_2, size=(3, 3), method=tf.image.ResizeMethod.NEAREST_NEIGHBOR) - return scaled + x +@tf.function(input_signature=[tf.TensorSpec(shape=[1, 3, 3, 1], dtype=tf.float32)]) +def replicate_by_pack(x): + pack_1 = tf.stack([x, x], axis=3) + reshape_1 = tf.reshape(pack_1, [1, 3, 6, 1]) + pack_2 = tf.stack([reshape_1, reshape_1], axis=2) + reshape_2 = tf.reshape(pack_2, [1, 6, 6, 1]) + scaled = tf.image.resize(reshape_2, size=(3, 3), method=tf.image.ResizeMethod.NEAREST_NEIGHBOR) + return scaled + x -model = ReplicateByPack() inp = np.random.standard_normal((1, 3, 3, 1)).astype(np.float32) - -save_tflite_model(model, inp, 'replicate_by_pack') +save_tflite_model(replicate_by_pack, inp, 'replicate_by_pack') diff --git a/testdata/dnn/tflite/replicate_by_pack.tflite b/testdata/dnn/tflite/replicate_by_pack.tflite index c56f2e89274831994c18678ce6b25b9df7269d75..ae30d89fe4c6187155ec582611c7f126fd34463f 100644 GIT binary patch delta 231 zcmWm7Jqtl$6bJBg9`}*F#6VqjmBD7RkPH?QC5z$%FeoWypbRzx!>w}%Ba0oMz;2Mq zSFqX9<9~=`U}0il$YEn(UUMHu%?W@Yhb0}Wj_s!JwM14 B6e<7! delta 43 zcmV+`0M!4a0i*$tfF!=&8o=>t;XR_cWk5Pg89>m Date: Tue, 25 Jul 2023 20:25:03 +0300 Subject: [PATCH 3/3] Test data for PReLU from TensorFlow 2 with non-zero scales --- .../dnn/tensorflow/generate_tf2_models.py | 4 ++-- testdata/dnn/tensorflow/tf2_prelu_in.npy | Bin 152 -> 224 bytes testdata/dnn/tensorflow/tf2_prelu_net.pb | Bin 3513 -> 3282 bytes testdata/dnn/tensorflow/tf2_prelu_out.npy | Bin 152 -> 224 bytes 4 files changed, 2 insertions(+), 2 deletions(-) diff --git a/testdata/dnn/tensorflow/generate_tf2_models.py b/testdata/dnn/tensorflow/generate_tf2_models.py index 0834ec85d..61928554b 100644 --- a/testdata/dnn/tensorflow/generate_tf2_models.py +++ b/testdata/dnn/tensorflow/generate_tf2_models.py @@ -76,9 +76,9 @@ def saveBroken(graph, name): save(model, 'tf2_dense', flatten_input=tf.TensorSpec(shape=[None, 1, 2, 3], dtype=tf.float32)) ################################################################################ model = tf.keras.models.Sequential([ - tf.keras.layers.PReLU(input_shape=(1, 2, 3)), + tf.keras.layers.PReLU(input_shape=(1, 4, 6), alpha_initializer='random_normal'), ]) -save(model, 'tf2_prelu', p_re_lu_input=tf.TensorSpec(shape=[None, 1, 2, 3], dtype=tf.float32)) +save(model, 'tf2_prelu', p_re_lu_input=tf.TensorSpec(shape=[None, 1, 4, 6], dtype=tf.float32)) ################################################################################ model = tf.keras.models.Sequential([ tf.keras.layers.AveragePooling2D(input_shape=(4, 6, 3), pool_size=(2, 2)), diff --git a/testdata/dnn/tensorflow/tf2_prelu_in.npy b/testdata/dnn/tensorflow/tf2_prelu_in.npy index 3f341818db5901df0f1aa9ecb4a82b30f6e46186..2896b22ac2dcc696f9ded43d984f386a43f3ad81 100644 GIT binary patch delta 122 zcmV-=0EPdU0pJ0UKnpf3ATcZ;G$||~eUVWvkzfX43f@uAzF%S=y|p)~zuFKcJ`&9l zK--SPzG+#NzRwjaKX!OyKlqp%zkF1dy?kW7KlGqbKMkL$z83ZxJvb`EJZZidKk8%e czrF(sz=J*$zbMSezHg6XKNASeKB}4jKE)$6uK)l5 delta 50 zcmaFBID>J51Glk`f}xIrk*1D9?ZiO6i3x0yTo0?(*^0=?*`BYgvA2GI#J-U$+dko) Gf;|9#V-SS^ diff --git a/testdata/dnn/tensorflow/tf2_prelu_net.pb b/testdata/dnn/tensorflow/tf2_prelu_net.pb index 80dc11783799b66c1d7c5ba0ff08c7204c6b05ba..ac7c21f3a04f5ad38001cb9656f9157c60ae2cd7 100644 GIT binary patch literal 3282 zcmd<`=i)7hFG`KiDUHv}D<~}y;tt43Ois_Wpj4$4stdH(xfnx07IMvG-Rt$qz~0QzZWrmoB8d@p}QUh3KJz2yI|m^2DVTmw0h% zVJRqyCg#K&>O*sheo$&osSpc@l%gzT5N@M1kj+R9WJ4MS@^VJ5U|fNTOB_caC#HlY z7G)+T<)r!-AbF3XAU8t<`C3LU4_q$7C63jleyQm~%s@hl79K~q7npp#aJdVYI4<|b z8$w)6QCONH+_r*|%Nv&)aEW7e8z@r&9S6x=RP-*wsqd*3?YX5nLd?FUIZ{+hMN-rZ zLmK!vF(pNa)iEU{%t(rQ1u2z+4;UK=A5UlGvcQ$>aEZg3B1k0-bs`oRY6zG0GIH6G zRhj0OmH?Y(`tjyS?jzfe2=^=iW?Tx~gI3vEK${@ctiQPqGjb`A5NQ+!uapmYZ4XHN zpoa${pkukz@P;!ievOdgm!P*1#&I#^zOB>t)_A$SFsp2aj~FB85)qqrCM z0-t&7lyiqh2YvS@w$=l`AKS}dy`?;1_{M!(EOtg+a`F5r&6D1&v61*)N4Mk9lG_dZ zI10Gy2Oe|WCA_d5v_o>aqnkC-NzQeq$iREJHh(im7_4o2%oom&$TVBh?95*vt=2vb z==qTB2Lz91&e!?LqOd%sP(%{^MsTON631Op5anY^wq~RIFY6NN7X%M@&(&Z4CwGoP$@g{K|&DswmABdgFvb|AyeHE?nJsX6V%0 zqfw9UbJh+ObEQgPRhGaH1RFX%y73I1+w1^W#fO+TEwze+^iZcsH=eCk+@C|Wr6{gQ zWnU3&>J;e4Gn5Suw~#hEEM56YclB2K}J>}s1HotVtCpx%7a>n8+v3$+D75{uT;an}^bg{etB z-w|w;(39%KZjC#p6F>;R5M0p(kWmdKDU-*=nyFDtX)KcW3%EWL_ax?~67yW!a`}%4 mnmN`_>1&N+GwK=M!EuwXn8|6Mv}W_qJ51Glk`f}xIrk*1D9?ZiO6i3x0yTo0?(*^0=?*`BYgvA2GI#J-U$+dko) Gf;|9#V-SS^