From 76840c92e5b2ed7a6b92e084ed942b258a640a07 Mon Sep 17 00:00:00 2001 From: Alex Date: Thu, 2 Nov 2023 00:38:55 +0300 Subject: [PATCH 01/12] add test --- testdata/cv/aruco/failmask9.png | Bin 0 -> 18743 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 testdata/cv/aruco/failmask9.png diff --git a/testdata/cv/aruco/failmask9.png b/testdata/cv/aruco/failmask9.png new file mode 100644 index 0000000000000000000000000000000000000000..1cfbd573041c671399dbcdbfe28ef35848d3acef GIT binary patch literal 18743 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 Iol`;+0O^UPoB#j- literal 0 HcmV?d00001 From 453efd925a76a8f7a5dbd413258552192ada389e Mon Sep 17 00:00:00 2001 From: Rostislav Vasilikhin Date: Thu, 2 Nov 2023 04:10:22 +0100 Subject: [PATCH 02/12] patchNaNs perf data updated --- testdata/perf/core.xml | 310 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 310 insertions(+) diff --git a/testdata/perf/core.xml b/testdata/perf/core.xml index dff32100a..1fcf5c0df 100644 --- a/testdata/perf/core.xml +++ b/testdata/perf/core.xml @@ -73328,4 +73328,314 @@
d
2.7513703240000000e+09 + + + + + 65536 + 5 + 0. + 1.7700000762939453e+01 + + 639 + 479 + 1.7700000762939453e+01 + + 525 + 96 + 0. + + 150 + 203 + 0. + + + 65536 + 13 + 0. + 1.7700000762939453e+01 + + 639 + 479 + 1.7700000762939453e+01 + + 305 + 239 + 1 + 1.7700000762939453e+01 + + 579 + 192 + 1.7700000762939453e+01 + + + 65536 + 21 + 0. + 1.7700000762939453e+01 + + 639 + 479 + 1.7700000762939453e+01 + + 105 + 73 + 1 + 0. + + 203 + 448 + 2 + 0. + + + 65536 + 29 + 0. + 1.7700000762939453e+01 + + 639 + 479 + 1.7700000762939453e+01 + + 102 + 293 + 3 + 1.7700000762939453e+01 + + 594 + 324 + 2 + 1.7700000762939453e+01 + + + 65536 + 5 + 0. + 1.7700000762939453e+01 + + 1279 + 719 + 1.7700000762939453e+01 + + 1089 + 358 + 0. + + 668 + 235 + 0. + + + 65536 + 13 + 0. + 1.7700000762939453e+01 + + 1279 + 719 + 1.7700000762939453e+01 + + 379 + 625 + 1 + 1.7700000762939453e+01 + + 1232 + 64 + 1 + 0. + + + 65536 + 21 + 0. + 1.7700000762939453e+01 + + 1279 + 719 + 1.7700000762939453e+01 + + 1021 + 160 + 2 + 0. + + 189 + 679 + 2 + 1.7700000762939453e+01 + + + 65536 + 29 + 0. + 1.7700000762939453e+01 + + 1279 + 719 + 1.7700000762939453e+01 + + 1268 + 391 + 2 + 0. + + 345 + 611 + 2 + 0. + + + 65536 + 5 + 0. + 1.7700000762939453e+01 + + 1919 + 1079 + 1.7700000762939453e+01 + + 1477 + 838 + 0. + + 1265 + 874 + 0. + + + 65536 + 13 + 0. + 1.7700000762939453e+01 + + 1919 + 1079 + 1.7700000762939453e+01 + + 1111 + 911 + 0. + + 1573 + 638 + 1 + 0. + + + 65536 + 21 + 0. + 1.7700000762939453e+01 + + 1919 + 1079 + 1.7700000762939453e+01 + + 1076 + 443 + 2 + 0. + + 1718 + 938 + 1 + 0. + + + 65536 + 29 + 0. + 1.7700000762939453e+01 + + 1919 + 1079 + 1.7700000762939453e+01 + + 198 + 546 + 3 + 0. + + 482 + 558 + 2 + 1.7700000762939453e+01 + + + 65536 + 5 + 0. + 1.7700000762939453e+01 + + 3839 + 2159 + 1.7700000762939453e+01 + + 1512 + 242 + 1.7700000762939453e+01 + + 2941 + 237 + 1.7700000762939453e+01 + + + 65536 + 13 + 0. + 1.7700000762939453e+01 + + 3839 + 2159 + 1.7700000762939453e+01 + + 227 + 533 + 1 + 1.7700000762939453e+01 + + 133 + 453 + 0. + + + 65536 + 21 + 0. + 1.7700000762939453e+01 + + 3839 + 2159 + 1.7700000762939453e+01 + + 3452 + 400 + 1 + 0. + + 3087 + 1027 + 1.7700000762939453e+01 + + + 65536 + 29 + 0. + 1.7700000762939453e+01 + + 3839 + 2159 + 1.7700000762939453e+01 + + 578 + 542 + 3 + 0. + + 805 + 1977 + 3 + 1.7700000762939453e+01 From 7d91e2cd6ceee3d3ee3dbfed95189d68eed42318 Mon Sep 17 00:00:00 2001 From: Dmitry Kurtaev Date: Fri, 3 Nov 2023 12:33:05 +0300 Subject: [PATCH 03/12] Merge pull request #1115 from dkurt:dnn_shared_nodes_fusion * Test data for two resizes with shared subgraphs --- ...ut_two_resizes_with_shared_subgraphs_0.npy | Bin 0 -> 208 bytes ...ut_two_resizes_with_shared_subgraphs_1.npy | Bin 0 -> 152 bytes ...ut_two_resizes_with_shared_subgraphs_2.npy | Bin 0 -> 136 bytes ...tput_two_resizes_with_shared_subgraphs.npy | Bin 0 -> 208 bytes .../generate_onnx_models_with_onnxscript.py | 58 +++++++++++++++++- .../two_resizes_with_shared_subgraphs.onnx | Bin 0 -> 3048 bytes 6 files changed, 57 insertions(+), 1 deletion(-) create mode 100644 testdata/dnn/onnx/data/input_two_resizes_with_shared_subgraphs_0.npy create mode 100644 testdata/dnn/onnx/data/input_two_resizes_with_shared_subgraphs_1.npy create mode 100644 testdata/dnn/onnx/data/input_two_resizes_with_shared_subgraphs_2.npy create mode 100644 testdata/dnn/onnx/data/output_two_resizes_with_shared_subgraphs.npy create mode 100644 testdata/dnn/onnx/models/two_resizes_with_shared_subgraphs.onnx diff --git a/testdata/dnn/onnx/data/input_two_resizes_with_shared_subgraphs_0.npy b/testdata/dnn/onnx/data/input_two_resizes_with_shared_subgraphs_0.npy new file mode 100644 index 0000000000000000000000000000000000000000..b4059848a149a5259e3c57d28ff39c3f204497ed GIT binary patch literal 208 zcmbR27wQ`j$;eQ~P_3SlTAW;@Zl$1ZlV+l>qoAIaUsO_*m=~X4l#&V(cT3DEP6dh= zXCxM+0{I$-ItoB!qN8A{siRP5)Pwl@nl+43%2YBO0a)ZW9?-Ck~I GoIL=s5;^(+ literal 0 HcmV?d00001 diff --git a/testdata/dnn/onnx/data/input_two_resizes_with_shared_subgraphs_1.npy b/testdata/dnn/onnx/data/input_two_resizes_with_shared_subgraphs_1.npy new file mode 100644 index 0000000000000000000000000000000000000000..1435d978c97bb156909470d05be7e68b0d2bcd0b GIT binary patch literal 152 zcmbR27wQ`j$;eQ~P_3SlTAW;@Zl$1ZlV+l>qoAIaUsO_*m=~X4l#&V(cT3DEP6dh= zXCxM+0{I$-ItoB!tfOG0siRPqoAIaUsO_*m=~X4l#&V(cT3DEP6dh= jXCxM+0{I$-ItoB!1SBqoAIaUsO_*m=~X4l#&V(cT3DEP6dh= zXCxM+0{I$-ItoB!qN8A{siRPJwEKRw_38pUir~}dydHm z?PrIbu-BJ5Z!diMg8iR+C+*YTp0npue{8=c;k&&;{vZ2xz7zI$cAvA?FMMh5D9q&W ICX>|x07>9Mk^lez literal 0 HcmV?d00001 diff --git a/testdata/dnn/onnx/generate_onnx_models_with_onnxscript.py b/testdata/dnn/onnx/generate_onnx_models_with_onnxscript.py index ae160eba7..c8c9e6122 100644 --- a/testdata/dnn/onnx/generate_onnx_models_with_onnxscript.py +++ b/testdata/dnn/onnx/generate_onnx_models_with_onnxscript.py @@ -36,7 +36,7 @@ def make_model_and_data(model, *args, **kwargs): np.save(input_file, inputs[0]) else: for idx, input in enumerate(inputs, start=0): - input_files = os.path.join("data", "input_" + name + "_" + str(index)) + input_files = os.path.join("data", "input_" + name + "_" + str(idx)) np.save(input_files, input) if "force_saving_output_as_dtype_float32" in kwargs and kwargs["force_saving_output_as_dtype_float32"]: output = output.astype(np.float32) @@ -68,3 +68,59 @@ def greater_input_dtype_int64(x: ost.FLOAT[27, 9]) ->ost.BOOL[27, 9]: y = op.Greater(x, op.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.INT64, [], np.array([61], dtype=np.int64)))) return y make_model_and_data(greater_input_dtype_int64, np.random.randint(0, 100, size=[27, 9], dtype=np.int64), force_saving_input_as_dtype_float32=True, force_saving_output_as_dtype_float32=True) + +from onnxscript import opset11 + +@ost.script() +def two_resizes_with_shared_subgraphs(x: ost.FLOAT["batch", 1, "height", "width"], y: ost.FLOAT[1, 1, 3, 2], z: ost.FLOAT[1, 1, 2, 1]) ->ost.FLOAT["batch", 1, "height", "width"]: + shape_src_1 = opset11.Shape(x) + shape_src_2 = opset11.Shape(x) + gather_h = opset11.Gather(shape_src_1, opset11.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.INT64, [], np.array([2], dtype=np.int64))), axis=0) + gather_w = opset11.Gather(shape_src_2, opset11.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.INT64, [], np.array([3], dtype=np.int64))), axis=0) + unsqueeze_w_1 = opset11.Unsqueeze(gather_w, axes=[0]) + unsqueeze_w_2 = opset11.Unsqueeze(gather_w, axes=[0]) + unsqueeze_h_1 = opset11.Unsqueeze(gather_h, axes=[0]) + unsqueeze_h_2 = opset11.Unsqueeze(gather_h, axes=[0]) + concat_1 = opset11.Cast(opset11.Concat(unsqueeze_h_1, unsqueeze_w_1, axis=0), to=ost.INT64.dtype) + concat_2 = opset11.Cast(opset11.Concat(unsqueeze_h_2, unsqueeze_w_2, axis=0), to=ost.INT64.dtype) + + # This op is required to test double node removal + y = opset11.Add(y, opset11.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.FLOAT, [1], np.array([0.5], dtype=np.float32)))) + + # First branch + sliced = opset11.Slice(opset11.Shape(y), + starts=opset11.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.INT64, [1], np.array([0], dtype=np.int64))), + ends=opset11.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.INT64, [1], np.array([2], dtype=np.int64))), + axes=opset11.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.INT64, [1], np.array([0], dtype=np.int64))), + ) + concat_y = opset11.Concat(sliced, concat_1, axis=0) + resized_y = opset11.Resize(y, + roi=opset11.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.FLOAT, [0], np.empty([0]))), + scales=opset11.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.FLOAT, [0], np.empty([0]))), + sizes=concat_y, + coordinate_transformation_mode='pytorch_half_pixel', + cubic_coeff_a=-0.75, + mode='linear', + nearest_mode='floor' + ) + + # Second branch + sliced = opset11.Slice(opset11.Shape(z), + starts=opset11.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.INT64, [1], np.array([0], dtype=np.int64))), + ends=opset11.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.INT64, [1], np.array([2], dtype=np.int64))), + axes=opset11.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.INT64, [1], np.array([0], dtype=np.int64))), + ) + concat_z = opset11.Concat(sliced, concat_2, axis=0) + resized_z = opset11.Resize(z, + roi=opset11.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.FLOAT, [0], np.empty([0]))), + scales=opset11.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.FLOAT, [0], np.empty([0]))), + sizes=concat_z, + coordinate_transformation_mode='pytorch_half_pixel', + cubic_coeff_a=-0.75, + mode='linear', + nearest_mode='floor' + ) + + return opset11.Add(resized_y, resized_z) + +make_model_and_data(two_resizes_with_shared_subgraphs, np.random.rand(1, 1, 4, 5).astype(np.float32), np.random.rand(1, 1, 3, 2).astype(np.float32), np.random.rand(1, 1, 2, 1).astype(np.float32)) diff --git a/testdata/dnn/onnx/models/two_resizes_with_shared_subgraphs.onnx b/testdata/dnn/onnx/models/two_resizes_with_shared_subgraphs.onnx new file mode 100644 index 0000000000000000000000000000000000000000..14c89af15ba5e6e2e92a950ecd597f0501d6d98b GIT binary patch literal 3048 zcmd5;&2rl|5GE)}qTqO{ph@gFlTORYbQ(2HMN+@+q4_!V-cB#MU}%amsmi2EQkA8r z@l&+NK1tuD3xWV4SyD1R^`HT`f8XxnTR>*x@}D#O9HU!ul7-$Ppjqlu`$CVqR{a+y zxYX{c9Z=hqxrbOWxh}1EcfEP^Es~n;mwypr`c{^BK@6qhYScc#3~GCj>Nq7 z@-Rqg2q9dn@l)~DIl+c^8)fIET>ToCesiQ33AG)?O!z0d0z z@MXxC5ou)e$PXqE&0z!1KA^-AF6CIBrtI{Z+1iH=rX0&LGg8N&hz2xFt&K$W-;o9z zV!O-CU8S1+=6|80^*r}6E`4Q=Ytl-CEZPJUS|r)C8b24`ogx0hPm**J#ag9wjloNhX0s7VA7o{g8&waytn^_N$XPyHmAPO0};)871jhfwDs zHVVJSJcg$svM9qxVd8ovUPe#1z-jDMrFD|fcs zIdbR9kZOYsDOEd(q?EUk6S9)_l>E``Ot}RWg<3F-ufl6l8*lG!#k{{ls#LtWS8-2P Q*O$A2+zsCuSZkmB3*~Rhf&c&j literal 0 HcmV?d00001 From afe016d7feeb1ae967d82c22ad232fa137ad8bf8 Mon Sep 17 00:00:00 2001 From: Anastasiya Pronina Date: Fri, 10 Nov 2023 21:53:12 +0000 Subject: [PATCH 04/12] Added detections for VASOT tracking and reference --- .../detections_30_frames.yml | 216 +++++++++++++ .../trackings_30_frames.yml | 298 ++++++++++++++++++ 2 files changed, 514 insertions(+) create mode 100644 testdata/cv/video/vas_object_tracking/detections_30_frames.yml create mode 100644 testdata/cv/video/vas_object_tracking/trackings_30_frames.yml diff --git a/testdata/cv/video/vas_object_tracking/detections_30_frames.yml b/testdata/cv/video/vas_object_tracking/detections_30_frames.yml new file mode 100644 index 000000000..4c94ab562 --- /dev/null +++ b/testdata/cv/video/vas_object_tracking/detections_30_frames.yml @@ -0,0 +1,216 @@ +%YAML:1.0 +--- +Frame_0: + {} +Frame_1: + box_1: + x: 278. + y: 251. + width: 39. + height: 108. + id: 15 +Frame_2: + box_1: + x: 288. + y: 252. + width: 38. + height: 102. + id: 15 +Frame_3: + box_1: + x: 297. + y: 251. + width: 31. + height: 100. + id: 15 +Frame_4: + box_1: + x: 288. + y: 252. + width: 38. + height: 102. + id: 15 +Frame_5: + box_1: + x: 297. + y: 251. + width: 31. + height: 100. + id: 15 +Frame_6: + box_1: + x: 303. + y: 245. + width: 28. + height: 103. + id: 15 +Frame_7: + box_1: + x: 311. + y: 243. + width: 36. + height: 102. + id: 15 +Frame_8: + box_1: + x: 316. + y: 244. + width: 35. + height: 99. + id: 15 +Frame_9: + box_1: + x: 319. + y: 239. + width: 35. + height: 104. + id: 15 +Frame_10: + box_1: + x: 330. + y: 235. + width: 31. + height: 103. + id: 15 +Frame_11: + box_1: + x: 332. + y: 237. + width: 34. + height: 99. + id: 15 +Frame_12: + box_1: + x: 335. + y: 236. + width: 36. + height: 100. + id: 15 +Frame_13: + box_1: + x: 340. + y: 234. + width: 34. + height: 101. + id: 15 +Frame_14: + box_1: + x: 340. + y: 234. + width: 34. + height: 101. + id: 15 +Frame_15: + box_1: + x: 349. + y: 230. + width: 38. + height: 97. + id: 15 +Frame_16: + box_1: + x: 352. + y: 232. + width: 37. + height: 93. + id: 15 +Frame_17: + box_1: + x: 357. + y: 233. + width: 36. + height: 92. + id: 15 +Frame_18: + box_1: + x: 359. + y: 227. + width: 36. + height: 97. + id: 15 +Frame_19: + box_1: + x: 358. + y: 225. + width: 36. + height: 97. + id: 15 +Frame_20: + box_1: + x: 364. + y: 225. + width: 28. + height: 100. + id: 15 +Frame_21: + box_1: + x: 379. + y: 216. + width: 28. + height: 94. + id: 15 +Frame_22: + {} +Frame_23: + {} +Frame_24: + {} +Frame_25: + box_1: + x: 374. + y: 210. + width: 30. + height: 104. + id: 15 +Frame_26: + box_1: + x: 373. + y: 209. + width: 32. + height: 107. + id: 15 + box_1: + x: 665. + y: 294. + width: 31. + height: 123. + id: 15 +Frame_27: + box_1: + x: 374. + y: 210. + width: 30. + height: 102. + id: 15 + box_2: + x: 659. + y: 291. + width: 34. + height: 117. + id: 15 +Frame_28: + box_1: + x: 374. + y: 209. + width: 30. + height: 105. + id: 15 + box_2: + x: 659. + y: 291. + width: 34. + height: 117. + id: 15 +Frame_29: + box_1: + x: 375. + y: 208. + width: 30. + height: 105. + id: 15 + box_2: + x: 643. + y: 285. + width: 32. + height: 126. + id: 15 diff --git a/testdata/cv/video/vas_object_tracking/trackings_30_frames.yml b/testdata/cv/video/vas_object_tracking/trackings_30_frames.yml new file mode 100644 index 000000000..b74b6ffb0 --- /dev/null +++ b/testdata/cv/video/vas_object_tracking/trackings_30_frames.yml @@ -0,0 +1,298 @@ +%YAML:1.0 +--- +Frame_0: + {} +Frame_1: + box_0: + x: 278 + y: 251 + width: 39 + height: 108 + id: 15 + tracking_id: 1 + tracking_status: NEW +Frame_2: + box_0: + x: 281 + y: 251 + width: 38 + height: 104 + id: 15 + tracking_id: 1 + tracking_status: NEW +Frame_3: + box_0: + x: 291 + y: 251 + width: 33 + height: 101 + id: 15 + tracking_id: 1 + tracking_status: TRACKED +Frame_4: + box_0: + x: 289 + y: 251 + width: 36 + height: 101 + id: 15 + tracking_id: 1 + tracking_status: TRACKED +Frame_5: + box_0: + x: 295 + y: 250 + width: 32 + height: 100 + id: 15 + tracking_id: 1 + tracking_status: TRACKED +Frame_6: + box_0: + x: 301 + y: 246 + width: 29 + height: 102 + id: 15 + tracking_id: 1 + tracking_status: TRACKED +Frame_7: + box_0: + x: 309 + y: 243 + width: 33 + height: 102 + id: 15 + tracking_id: 1 + tracking_status: TRACKED +Frame_8: + box_0: + x: 315 + y: 243 + width: 34 + height: 100 + id: 15 + tracking_id: 1 + tracking_status: TRACKED +Frame_9: + box_0: + x: 319 + y: 240 + width: 34 + height: 102 + id: 15 + tracking_id: 1 + tracking_status: TRACKED +Frame_10: + box_0: + x: 328 + y: 235 + width: 32 + height: 102 + id: 15 + tracking_id: 1 + tracking_status: TRACKED +Frame_11: + box_0: + x: 332 + y: 235 + width: 33 + height: 100 + id: 15 + tracking_id: 1 + tracking_status: TRACKED +Frame_12: + box_0: + x: 335 + y: 235 + width: 34 + height: 100 + id: 15 + tracking_id: 1 + tracking_status: TRACKED +Frame_13: + box_0: + x: 340 + y: 234 + width: 34 + height: 100 + id: 15 + tracking_id: 1 + tracking_status: TRACKED +Frame_14: + box_0: + x: 341 + y: 233 + width: 34 + height: 100 + id: 15 + tracking_id: 1 + tracking_status: TRACKED +Frame_15: + box_0: + x: 348 + y: 230 + width: 36 + height: 98 + id: 15 + tracking_id: 1 + tracking_status: TRACKED +Frame_16: + box_0: + x: 352 + y: 230 + width: 36 + height: 95 + id: 15 + tracking_id: 1 + tracking_status: TRACKED +Frame_17: + box_0: + x: 356 + y: 231 + width: 36 + height: 93 + id: 15 + tracking_id: 1 + tracking_status: TRACKED +Frame_18: + box_0: + x: 359 + y: 228 + width: 36 + height: 95 + id: 15 + tracking_id: 1 + tracking_status: TRACKED +Frame_19: + box_0: + x: 359 + y: 225 + width: 36 + height: 96 + id: 15 + tracking_id: 1 + tracking_status: TRACKED +Frame_20: + box_0: + x: 363 + y: 224 + width: 30 + height: 98 + id: 15 + tracking_id: 1 + tracking_status: TRACKED +Frame_21: + box_0: + x: 375 + y: 217 + width: 29 + height: 95 + id: 15 + tracking_id: 1 + tracking_status: TRACKED +Frame_22: + box_0: + x: 381 + y: 215 + width: 28 + height: 94 + id: 15 + tracking_id: 1 + tracking_status: LOST +Frame_23: + box_0: + x: 386 + y: 212 + width: 28 + height: 94 + id: 15 + tracking_id: 1 + tracking_status: LOST +Frame_24: + box_0: + x: 390 + y: 209 + width: 28 + height: 94 + id: 15 + tracking_id: 1 + tracking_status: LOST +Frame_25: + box_0: + x: 374 + y: 210 + width: 30 + height: 104 + id: 15 + tracking_id: 1 + tracking_status: TRACKED +Frame_26: + box_0: + x: 372 + y: 209 + width: 31 + height: 105 + id: 15 + tracking_id: 1 + tracking_status: TRACKED + box_1: + x: 665 + y: 294 + width: 31 + height: 123 + id: 15 + tracking_id: 2 + tracking_status: NEW +Frame_27: + box_0: + x: 373 + y: 209 + width: 30 + height: 103 + id: 15 + tracking_id: 1 + tracking_status: TRACKED + box_1: + x: 662 + y: 293 + width: 32 + height: 120 + id: 15 + tracking_id: 2 + tracking_status: NEW +Frame_28: + box_0: + x: 373 + y: 209 + width: 30 + height: 104 + id: 15 + tracking_id: 1 + tracking_status: TRACKED + box_1: + x: 660 + y: 292 + width: 33 + height: 118 + id: 15 + tracking_id: 2 + tracking_status: TRACKED +Frame_29: + box_0: + x: 374 + y: 208 + width: 30 + height: 104 + id: 15 + tracking_id: 1 + tracking_status: TRACKED + box_1: + x: 648 + y: 287 + width: 32 + height: 123 + id: 15 + tracking_id: 2 + tracking_status: TRACKED + From b10177244583906d279cb2977211ef760408edc4 Mon Sep 17 00:00:00 2001 From: fengyuentau Date: Sat, 11 Nov 2023 14:31:00 +0800 Subject: [PATCH 05/12] put layer norm tests into conformance --- .../model.onnx} | Bin 232 -> 261 bytes .../test_data_set_0/input_0.pb} | 0 .../test_data_set_0/input_1.pb} | 0 .../test_data_set_0/input_2.pb} | 0 .../test_data_set_0/output_0.pb} | 0 .../test_data_set_0/output_1.pb | 1 + .../test_data_set_0/output_2.pb | 1 + .../model.onnx | Bin 0 -> 253 bytes .../test_data_set_0/input_0.pb} | 0 .../test_data_set_0/input_1.pb} | 0 .../test_data_set_0/input_2.pb} | 0 .../test_data_set_0/output_0.pb} | 0 .../test_data_set_0/output_1.pb | 1 + .../test_data_set_0/output_2.pb | 1 + .../model.onnx} | Bin 243 -> 272 bytes .../test_data_set_0/input_0.pb} | 0 .../test_data_set_0/input_1.pb} | 0 .../test_data_set_0/input_2.pb} | 0 .../test_data_set_0/output_0.pb} | Bin .../test_data_set_0/output_1.pb | 1 + .../test_data_set_0/output_2.pb | 1 + .../model.onnx} | Bin 251 -> 280 bytes .../test_data_set_0/input_0.pb} | 0 .../test_data_set_0/input_1.pb} | 0 .../test_data_set_0/input_2.pb} | 0 .../test_data_set_0/output_0.pb} | 0 .../test_data_set_0/output_1.pb | 1 + .../test_data_set_0/output_2.pb | 1 + .../model.onnx} | Bin 275 -> 312 bytes .../test_data_set_0/input_0.pb} | 0 .../test_data_set_0/input_1.pb} | 0 .../test_data_set_0/input_2.pb} | 0 .../test_data_set_0/output_0.pb} | Bin .../test_data_set_0/output_1.pb | 1 + .../test_data_set_0/output_2.pb | 1 + .../model.onnx} | Bin 267 -> 304 bytes .../test_data_set_0/input_0.pb} | 0 .../test_data_set_0/input_1.pb} | 0 .../test_data_set_0/input_2.pb} | 0 .../test_data_set_0/output_0.pb} | 0 .../test_data_set_0/output_1.pb | 1 + .../test_data_set_0/output_2.pb | 1 + .../model.onnx} | Bin 259 -> 296 bytes .../test_data_set_0/input_0.pb} | 0 .../test_data_set_0/input_1.pb} | 0 .../test_data_set_0/input_2.pb} | 0 .../test_data_set_0/output_0.pb} | 0 .../test_data_set_0/output_1.pb | 1 + .../test_data_set_0/output_2.pb | 1 + .../model.onnx} | Bin 278 -> 315 bytes .../test_data_set_0/input_0.pb} | 0 .../test_data_set_0/input_1.pb} | 0 .../test_data_set_0/input_2.pb} | 0 .../test_data_set_0/output_0.pb} | Bin .../test_data_set_0/output_1.pb | 1 + .../test_data_set_0/output_2.pb | 1 + .../model.onnx} | Bin 286 -> 323 bytes .../test_data_set_0/input_0.pb} | 0 .../test_data_set_0/input_1.pb} | Bin .../test_data_set_0/input_2.pb} | 0 .../test_data_set_0/output_0.pb} | 0 .../test_data_set_0/output_1.pb | 1 + .../test_data_set_0/output_2.pb | 1 + .../model.onnx} | Bin 294 -> 331 bytes .../test_data_set_0/input_0.pb} | 0 .../test_data_set_0/input_1.pb} | 0 .../test_data_set_0/input_2.pb} | 0 .../test_data_set_0/output_0.pb} | 0 .../test_data_set_0/output_1.pb | 1 + .../test_data_set_0/output_2.pb | 1 + .../model.onnx} | Bin 264 -> 309 bytes .../test_data_set_0/input_0.pb} | 0 .../test_data_set_0/input_1.pb} | Bin .../test_data_set_0/input_2.pb} | 0 .../test_data_set_0/output_0.pb} | Bin .../test_data_set_0/output_1.pb | 1 + .../test_data_set_0/output_2.pb | 1 + .../model.onnx} | Bin 256 -> 301 bytes .../test_data_set_0/input_0.pb} | 0 .../test_data_set_0/input_1.pb} | Bin .../test_data_set_0/input_2.pb} | Bin .../test_data_set_0/output_0.pb} | Bin .../test_data_set_0/output_1.pb | 1 + .../test_data_set_0/output_2.pb | 1 + .../model.onnx} | Bin 248 -> 293 bytes .../test_data_set_0/input_0.pb} | 0 .../test_data_set_0/input_1.pb} | 0 .../test_data_set_0/input_2.pb} | 0 .../test_data_set_0/output_0.pb} | Bin .../test_data_set_0/output_1.pb | 1 + .../test_data_set_0/output_2.pb | 1 + .../model.onnx | Bin 0 -> 285 bytes .../test_data_set_0/input_0.pb} | 0 .../test_data_set_0/input_1.pb} | 0 .../test_data_set_0/input_2.pb} | 0 .../test_data_set_0/output_0.pb} | Bin .../test_data_set_0/output_1.pb | Bin 0 -> 114 bytes .../test_data_set_0/output_2.pb | 2 ++ .../model.onnx} | Bin 259 -> 304 bytes .../test_data_set_0/input_0.pb} | 0 .../test_data_set_0/input_1.pb} | 0 .../test_data_set_0/input_2.pb} | 0 .../test_data_set_0/output_0.pb} | Bin .../test_data_set_0/output_1.pb | Bin 0 -> 114 bytes .../test_data_set_0/output_2.pb | 2 ++ .../model.onnx} | Bin 267 -> 312 bytes .../test_data_set_0/input_0.pb} | 0 .../test_data_set_0/input_1.pb} | 0 .../test_data_set_0/input_2.pb} | 0 .../test_data_set_0/output_0.pb} | Bin .../test_data_set_0/output_1.pb | 1 + .../test_data_set_0/output_2.pb | 1 + .../model.onnx} | Bin 275 -> 320 bytes .../test_data_set_0/input_0.pb} | 0 .../test_data_set_0/input_1.pb} | 0 .../test_data_set_0/input_2.pb} | Bin .../test_data_set_0/output_0.pb} | Bin .../test_data_set_0/output_1.pb | 1 + .../test_data_set_0/output_2.pb | 1 + .../model.onnx} | Bin 283 -> 328 bytes .../test_data_set_0/input_0.pb} | 0 .../test_data_set_0/input_1.pb} | Bin .../test_data_set_0/input_2.pb} | Bin .../test_data_set_0/output_0.pb} | Bin .../test_data_set_0/output_1.pb | 1 + .../test_data_set_0/output_2.pb | 1 + .../model.onnx | Bin 0 -> 276 bytes .../test_data_set_0/input_0.pb} | 0 .../test_data_set_0/input_1.pb} | 0 .../test_data_set_0/input_2.pb} | 0 .../test_data_set_0/output_0.pb} | Bin .../test_data_set_0/output_1.pb | Bin 0 -> 114 bytes .../test_data_set_0/output_2.pb | 2 ++ .../test_layer_normalization_2d_axis1.onnx | 22 --------------- .../test_layer_normalization_4d_axis3.onnx | 26 ------------------ ...test_layer_normalization_default_axis.onnx | 25 ----------------- 136 files changed, 38 insertions(+), 73 deletions(-) rename testdata/dnn/onnx/{models/test_layer_normalization_2d_axis0.onnx => conformance/node/test_layer_normalization_2d_axis0/model.onnx} (50%) rename testdata/dnn/onnx/{data/input_test_layer_normalization_2d_axis0_0.pb => conformance/node/test_layer_normalization_2d_axis0/test_data_set_0/input_0.pb} (100%) rename testdata/dnn/onnx/{data/input_test_layer_normalization_2d_axis0_1.pb => conformance/node/test_layer_normalization_2d_axis0/test_data_set_0/input_1.pb} (100%) rename testdata/dnn/onnx/{data/input_test_layer_normalization_2d_axis0_2.pb => conformance/node/test_layer_normalization_2d_axis0/test_data_set_0/input_2.pb} (100%) rename testdata/dnn/onnx/{data/output_test_layer_normalization_2d_axis0.pb => conformance/node/test_layer_normalization_2d_axis0/test_data_set_0/output_0.pb} (100%) create mode 100644 testdata/dnn/onnx/conformance/node/test_layer_normalization_2d_axis0/test_data_set_0/output_1.pb create mode 100644 testdata/dnn/onnx/conformance/node/test_layer_normalization_2d_axis0/test_data_set_0/output_2.pb create mode 100644 testdata/dnn/onnx/conformance/node/test_layer_normalization_2d_axis1/model.onnx rename testdata/dnn/onnx/{data/input_test_layer_normalization_2d_axis1_0.pb => conformance/node/test_layer_normalization_2d_axis1/test_data_set_0/input_0.pb} (100%) rename testdata/dnn/onnx/{data/input_test_layer_normalization_2d_axis1_1.pb => conformance/node/test_layer_normalization_2d_axis1/test_data_set_0/input_1.pb} (100%) rename testdata/dnn/onnx/{data/input_test_layer_normalization_2d_axis1_2.pb => conformance/node/test_layer_normalization_2d_axis1/test_data_set_0/input_2.pb} (100%) rename testdata/dnn/onnx/{data/output_test_layer_normalization_2d_axis1.pb => conformance/node/test_layer_normalization_2d_axis1/test_data_set_0/output_0.pb} (100%) create mode 100644 testdata/dnn/onnx/conformance/node/test_layer_normalization_2d_axis1/test_data_set_0/output_1.pb create mode 100644 testdata/dnn/onnx/conformance/node/test_layer_normalization_2d_axis1/test_data_set_0/output_2.pb rename testdata/dnn/onnx/{models/test_layer_normalization_2d_axis_negative_1.onnx => conformance/node/test_layer_normalization_2d_axis_negative_1/model.onnx} (52%) rename testdata/dnn/onnx/{data/input_test_layer_normalization_2d_axis_negative_1_0.pb => conformance/node/test_layer_normalization_2d_axis_negative_1/test_data_set_0/input_0.pb} (100%) rename testdata/dnn/onnx/{data/input_test_layer_normalization_2d_axis_negative_1_1.pb => conformance/node/test_layer_normalization_2d_axis_negative_1/test_data_set_0/input_1.pb} (100%) rename testdata/dnn/onnx/{data/input_test_layer_normalization_2d_axis_negative_1_2.pb => conformance/node/test_layer_normalization_2d_axis_negative_1/test_data_set_0/input_2.pb} (100%) rename testdata/dnn/onnx/{data/output_test_layer_normalization_2d_axis_negative_1.pb => conformance/node/test_layer_normalization_2d_axis_negative_1/test_data_set_0/output_0.pb} (100%) create mode 100644 testdata/dnn/onnx/conformance/node/test_layer_normalization_2d_axis_negative_1/test_data_set_0/output_1.pb create mode 100644 testdata/dnn/onnx/conformance/node/test_layer_normalization_2d_axis_negative_1/test_data_set_0/output_2.pb rename testdata/dnn/onnx/{models/test_layer_normalization_2d_axis_negative_2.onnx => conformance/node/test_layer_normalization_2d_axis_negative_2/model.onnx} (53%) rename testdata/dnn/onnx/{data/input_test_layer_normalization_2d_axis_negative_2_0.pb => conformance/node/test_layer_normalization_2d_axis_negative_2/test_data_set_0/input_0.pb} (100%) rename testdata/dnn/onnx/{data/input_test_layer_normalization_2d_axis_negative_2_1.pb => conformance/node/test_layer_normalization_2d_axis_negative_2/test_data_set_0/input_1.pb} (100%) rename testdata/dnn/onnx/{data/input_test_layer_normalization_2d_axis_negative_2_2.pb => conformance/node/test_layer_normalization_2d_axis_negative_2/test_data_set_0/input_2.pb} (100%) rename testdata/dnn/onnx/{data/output_test_layer_normalization_2d_axis_negative_2.pb => conformance/node/test_layer_normalization_2d_axis_negative_2/test_data_set_0/output_0.pb} (100%) create mode 100644 testdata/dnn/onnx/conformance/node/test_layer_normalization_2d_axis_negative_2/test_data_set_0/output_1.pb create mode 100644 testdata/dnn/onnx/conformance/node/test_layer_normalization_2d_axis_negative_2/test_data_set_0/output_2.pb rename testdata/dnn/onnx/{models/test_layer_normalization_3d_axis0_epsilon.onnx => conformance/node/test_layer_normalization_3d_axis0_epsilon/model.onnx} (56%) rename testdata/dnn/onnx/{data/input_test_layer_normalization_3d_axis0_epsilon_0.pb => conformance/node/test_layer_normalization_3d_axis0_epsilon/test_data_set_0/input_0.pb} (100%) rename testdata/dnn/onnx/{data/input_test_layer_normalization_3d_axis0_epsilon_1.pb => conformance/node/test_layer_normalization_3d_axis0_epsilon/test_data_set_0/input_1.pb} (100%) rename testdata/dnn/onnx/{data/input_test_layer_normalization_3d_axis0_epsilon_2.pb => conformance/node/test_layer_normalization_3d_axis0_epsilon/test_data_set_0/input_2.pb} (100%) rename testdata/dnn/onnx/{data/output_test_layer_normalization_3d_axis0_epsilon.pb => conformance/node/test_layer_normalization_3d_axis0_epsilon/test_data_set_0/output_0.pb} (100%) create mode 100644 testdata/dnn/onnx/conformance/node/test_layer_normalization_3d_axis0_epsilon/test_data_set_0/output_1.pb create mode 100644 testdata/dnn/onnx/conformance/node/test_layer_normalization_3d_axis0_epsilon/test_data_set_0/output_2.pb rename testdata/dnn/onnx/{models/test_layer_normalization_3d_axis1_epsilon.onnx => conformance/node/test_layer_normalization_3d_axis1_epsilon/model.onnx} (54%) rename testdata/dnn/onnx/{data/input_test_layer_normalization_3d_axis1_epsilon_0.pb => conformance/node/test_layer_normalization_3d_axis1_epsilon/test_data_set_0/input_0.pb} (100%) rename testdata/dnn/onnx/{data/input_test_layer_normalization_3d_axis1_epsilon_1.pb => conformance/node/test_layer_normalization_3d_axis1_epsilon/test_data_set_0/input_1.pb} (100%) rename testdata/dnn/onnx/{data/input_test_layer_normalization_3d_axis1_epsilon_2.pb => conformance/node/test_layer_normalization_3d_axis1_epsilon/test_data_set_0/input_2.pb} (100%) rename testdata/dnn/onnx/{data/output_test_layer_normalization_3d_axis1_epsilon.pb => conformance/node/test_layer_normalization_3d_axis1_epsilon/test_data_set_0/output_0.pb} (100%) create mode 100644 testdata/dnn/onnx/conformance/node/test_layer_normalization_3d_axis1_epsilon/test_data_set_0/output_1.pb create mode 100644 testdata/dnn/onnx/conformance/node/test_layer_normalization_3d_axis1_epsilon/test_data_set_0/output_2.pb rename testdata/dnn/onnx/{models/test_layer_normalization_3d_axis2_epsilon.onnx => conformance/node/test_layer_normalization_3d_axis2_epsilon/model.onnx} (53%) rename testdata/dnn/onnx/{data/input_test_layer_normalization_3d_axis2_epsilon_0.pb => conformance/node/test_layer_normalization_3d_axis2_epsilon/test_data_set_0/input_0.pb} (100%) rename testdata/dnn/onnx/{data/input_test_layer_normalization_3d_axis2_epsilon_1.pb => conformance/node/test_layer_normalization_3d_axis2_epsilon/test_data_set_0/input_1.pb} (100%) rename testdata/dnn/onnx/{data/input_test_layer_normalization_3d_axis2_epsilon_2.pb => conformance/node/test_layer_normalization_3d_axis2_epsilon/test_data_set_0/input_2.pb} (100%) rename testdata/dnn/onnx/{data/output_test_layer_normalization_3d_axis2_epsilon.pb => conformance/node/test_layer_normalization_3d_axis2_epsilon/test_data_set_0/output_0.pb} (100%) create mode 100644 testdata/dnn/onnx/conformance/node/test_layer_normalization_3d_axis2_epsilon/test_data_set_0/output_1.pb create mode 100644 testdata/dnn/onnx/conformance/node/test_layer_normalization_3d_axis2_epsilon/test_data_set_0/output_2.pb rename testdata/dnn/onnx/{models/test_layer_normalization_3d_axis_negative_1_epsilon.onnx => conformance/node/test_layer_normalization_3d_axis_negative_1_epsilon/model.onnx} (59%) rename testdata/dnn/onnx/{data/input_test_layer_normalization_3d_axis_negative_1_epsilon_0.pb => conformance/node/test_layer_normalization_3d_axis_negative_1_epsilon/test_data_set_0/input_0.pb} (100%) rename testdata/dnn/onnx/{data/input_test_layer_normalization_3d_axis_negative_1_epsilon_1.pb => conformance/node/test_layer_normalization_3d_axis_negative_1_epsilon/test_data_set_0/input_1.pb} (100%) rename testdata/dnn/onnx/{data/input_test_layer_normalization_3d_axis_negative_1_epsilon_2.pb => conformance/node/test_layer_normalization_3d_axis_negative_1_epsilon/test_data_set_0/input_2.pb} (100%) rename testdata/dnn/onnx/{data/output_test_layer_normalization_3d_axis_negative_1_epsilon.pb => conformance/node/test_layer_normalization_3d_axis_negative_1_epsilon/test_data_set_0/output_0.pb} (100%) create mode 100644 testdata/dnn/onnx/conformance/node/test_layer_normalization_3d_axis_negative_1_epsilon/test_data_set_0/output_1.pb create mode 100644 testdata/dnn/onnx/conformance/node/test_layer_normalization_3d_axis_negative_1_epsilon/test_data_set_0/output_2.pb rename testdata/dnn/onnx/{models/test_layer_normalization_3d_axis_negative_2_epsilon.onnx => conformance/node/test_layer_normalization_3d_axis_negative_2_epsilon/model.onnx} (60%) rename testdata/dnn/onnx/{data/input_test_layer_normalization_3d_axis_negative_2_epsilon_0.pb => conformance/node/test_layer_normalization_3d_axis_negative_2_epsilon/test_data_set_0/input_0.pb} (100%) rename testdata/dnn/onnx/{data/input_test_layer_normalization_3d_axis_negative_2_epsilon_1.pb => conformance/node/test_layer_normalization_3d_axis_negative_2_epsilon/test_data_set_0/input_1.pb} (100%) rename testdata/dnn/onnx/{data/input_test_layer_normalization_3d_axis_negative_2_epsilon_2.pb => conformance/node/test_layer_normalization_3d_axis_negative_2_epsilon/test_data_set_0/input_2.pb} (100%) rename testdata/dnn/onnx/{data/output_test_layer_normalization_3d_axis_negative_2_epsilon.pb => conformance/node/test_layer_normalization_3d_axis_negative_2_epsilon/test_data_set_0/output_0.pb} (100%) create mode 100644 testdata/dnn/onnx/conformance/node/test_layer_normalization_3d_axis_negative_2_epsilon/test_data_set_0/output_1.pb create mode 100644 testdata/dnn/onnx/conformance/node/test_layer_normalization_3d_axis_negative_2_epsilon/test_data_set_0/output_2.pb rename testdata/dnn/onnx/{models/test_layer_normalization_3d_axis_negative_3_epsilon.onnx => conformance/node/test_layer_normalization_3d_axis_negative_3_epsilon/model.onnx} (58%) rename testdata/dnn/onnx/{data/input_test_layer_normalization_3d_axis_negative_3_epsilon_0.pb => conformance/node/test_layer_normalization_3d_axis_negative_3_epsilon/test_data_set_0/input_0.pb} (100%) rename testdata/dnn/onnx/{data/input_test_layer_normalization_3d_axis_negative_3_epsilon_1.pb => conformance/node/test_layer_normalization_3d_axis_negative_3_epsilon/test_data_set_0/input_1.pb} (100%) rename testdata/dnn/onnx/{data/input_test_layer_normalization_3d_axis_negative_3_epsilon_2.pb => conformance/node/test_layer_normalization_3d_axis_negative_3_epsilon/test_data_set_0/input_2.pb} (100%) rename testdata/dnn/onnx/{data/output_test_layer_normalization_3d_axis_negative_3_epsilon.pb => conformance/node/test_layer_normalization_3d_axis_negative_3_epsilon/test_data_set_0/output_0.pb} (100%) create mode 100644 testdata/dnn/onnx/conformance/node/test_layer_normalization_3d_axis_negative_3_epsilon/test_data_set_0/output_1.pb create mode 100644 testdata/dnn/onnx/conformance/node/test_layer_normalization_3d_axis_negative_3_epsilon/test_data_set_0/output_2.pb rename testdata/dnn/onnx/{models/test_layer_normalization_4d_axis0.onnx => conformance/node/test_layer_normalization_4d_axis0/model.onnx} (53%) rename testdata/dnn/onnx/{data/input_test_layer_normalization_4d_axis0_0.pb => conformance/node/test_layer_normalization_4d_axis0/test_data_set_0/input_0.pb} (100%) rename testdata/dnn/onnx/{data/input_test_layer_normalization_4d_axis0_1.pb => conformance/node/test_layer_normalization_4d_axis0/test_data_set_0/input_1.pb} (100%) rename testdata/dnn/onnx/{data/input_test_layer_normalization_4d_axis0_2.pb => conformance/node/test_layer_normalization_4d_axis0/test_data_set_0/input_2.pb} (100%) rename testdata/dnn/onnx/{data/output_test_layer_normalization_4d_axis0.pb => conformance/node/test_layer_normalization_4d_axis0/test_data_set_0/output_0.pb} (100%) create mode 100644 testdata/dnn/onnx/conformance/node/test_layer_normalization_4d_axis0/test_data_set_0/output_1.pb create mode 100644 testdata/dnn/onnx/conformance/node/test_layer_normalization_4d_axis0/test_data_set_0/output_2.pb rename testdata/dnn/onnx/{models/test_layer_normalization_4d_axis1.onnx => conformance/node/test_layer_normalization_4d_axis1/model.onnx} (51%) rename testdata/dnn/onnx/{data/input_test_layer_normalization_4d_axis1_0.pb => conformance/node/test_layer_normalization_4d_axis1/test_data_set_0/input_0.pb} (100%) rename testdata/dnn/onnx/{data/input_test_layer_normalization_4d_axis1_1.pb => conformance/node/test_layer_normalization_4d_axis1/test_data_set_0/input_1.pb} (100%) rename testdata/dnn/onnx/{data/input_test_layer_normalization_4d_axis1_2.pb => conformance/node/test_layer_normalization_4d_axis1/test_data_set_0/input_2.pb} (100%) rename testdata/dnn/onnx/{data/output_test_layer_normalization_4d_axis1.pb => conformance/node/test_layer_normalization_4d_axis1/test_data_set_0/output_0.pb} (100%) create mode 100644 testdata/dnn/onnx/conformance/node/test_layer_normalization_4d_axis1/test_data_set_0/output_1.pb create mode 100644 testdata/dnn/onnx/conformance/node/test_layer_normalization_4d_axis1/test_data_set_0/output_2.pb rename testdata/dnn/onnx/{models/test_layer_normalization_4d_axis2.onnx => conformance/node/test_layer_normalization_4d_axis2/model.onnx} (50%) rename testdata/dnn/onnx/{data/input_test_layer_normalization_4d_axis2_0.pb => conformance/node/test_layer_normalization_4d_axis2/test_data_set_0/input_0.pb} (100%) rename testdata/dnn/onnx/{data/input_test_layer_normalization_4d_axis2_1.pb => conformance/node/test_layer_normalization_4d_axis2/test_data_set_0/input_1.pb} (100%) rename testdata/dnn/onnx/{data/input_test_layer_normalization_4d_axis2_2.pb => conformance/node/test_layer_normalization_4d_axis2/test_data_set_0/input_2.pb} (100%) rename testdata/dnn/onnx/{data/output_test_layer_normalization_4d_axis2.pb => conformance/node/test_layer_normalization_4d_axis2/test_data_set_0/output_0.pb} (100%) create mode 100644 testdata/dnn/onnx/conformance/node/test_layer_normalization_4d_axis2/test_data_set_0/output_1.pb create mode 100644 testdata/dnn/onnx/conformance/node/test_layer_normalization_4d_axis2/test_data_set_0/output_2.pb create mode 100644 testdata/dnn/onnx/conformance/node/test_layer_normalization_4d_axis3/model.onnx rename testdata/dnn/onnx/{data/input_test_layer_normalization_4d_axis3_0.pb => conformance/node/test_layer_normalization_4d_axis3/test_data_set_0/input_0.pb} (100%) rename testdata/dnn/onnx/{data/input_test_layer_normalization_4d_axis3_1.pb => conformance/node/test_layer_normalization_4d_axis3/test_data_set_0/input_1.pb} (100%) rename testdata/dnn/onnx/{data/input_test_layer_normalization_4d_axis3_2.pb => conformance/node/test_layer_normalization_4d_axis3/test_data_set_0/input_2.pb} (100%) rename testdata/dnn/onnx/{data/output_test_layer_normalization_4d_axis3.pb => conformance/node/test_layer_normalization_4d_axis3/test_data_set_0/output_0.pb} (100%) create mode 100644 testdata/dnn/onnx/conformance/node/test_layer_normalization_4d_axis3/test_data_set_0/output_1.pb create mode 100644 testdata/dnn/onnx/conformance/node/test_layer_normalization_4d_axis3/test_data_set_0/output_2.pb rename testdata/dnn/onnx/{models/test_layer_normalization_4d_axis_negative_1.onnx => conformance/node/test_layer_normalization_4d_axis_negative_1/model.onnx} (54%) rename testdata/dnn/onnx/{data/input_test_layer_normalization_4d_axis_negative_1_0.pb => conformance/node/test_layer_normalization_4d_axis_negative_1/test_data_set_0/input_0.pb} (100%) rename testdata/dnn/onnx/{data/input_test_layer_normalization_4d_axis_negative_1_1.pb => conformance/node/test_layer_normalization_4d_axis_negative_1/test_data_set_0/input_1.pb} (100%) rename testdata/dnn/onnx/{data/input_test_layer_normalization_4d_axis_negative_1_2.pb => conformance/node/test_layer_normalization_4d_axis_negative_1/test_data_set_0/input_2.pb} (100%) rename testdata/dnn/onnx/{data/output_test_layer_normalization_4d_axis_negative_1.pb => conformance/node/test_layer_normalization_4d_axis_negative_1/test_data_set_0/output_0.pb} (100%) create mode 100644 testdata/dnn/onnx/conformance/node/test_layer_normalization_4d_axis_negative_1/test_data_set_0/output_1.pb create mode 100644 testdata/dnn/onnx/conformance/node/test_layer_normalization_4d_axis_negative_1/test_data_set_0/output_2.pb rename testdata/dnn/onnx/{models/test_layer_normalization_4d_axis_negative_2.onnx => conformance/node/test_layer_normalization_4d_axis_negative_2/model.onnx} (56%) rename testdata/dnn/onnx/{data/input_test_layer_normalization_4d_axis_negative_2_0.pb => conformance/node/test_layer_normalization_4d_axis_negative_2/test_data_set_0/input_0.pb} (100%) rename testdata/dnn/onnx/{data/input_test_layer_normalization_4d_axis_negative_2_1.pb => conformance/node/test_layer_normalization_4d_axis_negative_2/test_data_set_0/input_1.pb} (100%) rename testdata/dnn/onnx/{data/input_test_layer_normalization_4d_axis_negative_2_2.pb => conformance/node/test_layer_normalization_4d_axis_negative_2/test_data_set_0/input_2.pb} (100%) rename testdata/dnn/onnx/{data/output_test_layer_normalization_4d_axis_negative_2.pb => conformance/node/test_layer_normalization_4d_axis_negative_2/test_data_set_0/output_0.pb} (100%) create mode 100644 testdata/dnn/onnx/conformance/node/test_layer_normalization_4d_axis_negative_2/test_data_set_0/output_1.pb create mode 100644 testdata/dnn/onnx/conformance/node/test_layer_normalization_4d_axis_negative_2/test_data_set_0/output_2.pb rename testdata/dnn/onnx/{models/test_layer_normalization_4d_axis_negative_3.onnx => conformance/node/test_layer_normalization_4d_axis_negative_3/model.onnx} (57%) rename testdata/dnn/onnx/{data/input_test_layer_normalization_4d_axis_negative_3_0.pb => conformance/node/test_layer_normalization_4d_axis_negative_3/test_data_set_0/input_0.pb} (100%) rename testdata/dnn/onnx/{data/input_test_layer_normalization_4d_axis_negative_3_1.pb => conformance/node/test_layer_normalization_4d_axis_negative_3/test_data_set_0/input_1.pb} (100%) rename testdata/dnn/onnx/{data/input_test_layer_normalization_4d_axis_negative_3_2.pb => conformance/node/test_layer_normalization_4d_axis_negative_3/test_data_set_0/input_2.pb} (100%) rename testdata/dnn/onnx/{data/output_test_layer_normalization_4d_axis_negative_3.pb => conformance/node/test_layer_normalization_4d_axis_negative_3/test_data_set_0/output_0.pb} (100%) create mode 100644 testdata/dnn/onnx/conformance/node/test_layer_normalization_4d_axis_negative_3/test_data_set_0/output_1.pb create mode 100644 testdata/dnn/onnx/conformance/node/test_layer_normalization_4d_axis_negative_3/test_data_set_0/output_2.pb rename testdata/dnn/onnx/{models/test_layer_normalization_4d_axis_negative_4.onnx => conformance/node/test_layer_normalization_4d_axis_negative_4/model.onnx} (55%) rename testdata/dnn/onnx/{data/input_test_layer_normalization_4d_axis_negative_4_0.pb => conformance/node/test_layer_normalization_4d_axis_negative_4/test_data_set_0/input_0.pb} (100%) rename testdata/dnn/onnx/{data/input_test_layer_normalization_4d_axis_negative_4_1.pb => conformance/node/test_layer_normalization_4d_axis_negative_4/test_data_set_0/input_1.pb} (100%) rename testdata/dnn/onnx/{data/input_test_layer_normalization_4d_axis_negative_4_2.pb => conformance/node/test_layer_normalization_4d_axis_negative_4/test_data_set_0/input_2.pb} (100%) rename testdata/dnn/onnx/{data/output_test_layer_normalization_4d_axis_negative_4.pb => conformance/node/test_layer_normalization_4d_axis_negative_4/test_data_set_0/output_0.pb} (100%) create mode 100644 testdata/dnn/onnx/conformance/node/test_layer_normalization_4d_axis_negative_4/test_data_set_0/output_1.pb create mode 100644 testdata/dnn/onnx/conformance/node/test_layer_normalization_4d_axis_negative_4/test_data_set_0/output_2.pb create mode 100644 testdata/dnn/onnx/conformance/node/test_layer_normalization_default_axis/model.onnx rename testdata/dnn/onnx/{data/input_test_layer_normalization_default_axis_0.pb => conformance/node/test_layer_normalization_default_axis/test_data_set_0/input_0.pb} (100%) rename testdata/dnn/onnx/{data/input_test_layer_normalization_default_axis_1.pb => conformance/node/test_layer_normalization_default_axis/test_data_set_0/input_1.pb} (100%) rename testdata/dnn/onnx/{data/input_test_layer_normalization_default_axis_2.pb => conformance/node/test_layer_normalization_default_axis/test_data_set_0/input_2.pb} (100%) rename testdata/dnn/onnx/{data/output_test_layer_normalization_default_axis.pb => conformance/node/test_layer_normalization_default_axis/test_data_set_0/output_0.pb} (100%) create mode 100644 testdata/dnn/onnx/conformance/node/test_layer_normalization_default_axis/test_data_set_0/output_1.pb create mode 100644 testdata/dnn/onnx/conformance/node/test_layer_normalization_default_axis/test_data_set_0/output_2.pb delete mode 100644 testdata/dnn/onnx/models/test_layer_normalization_2d_axis1.onnx delete mode 100644 testdata/dnn/onnx/models/test_layer_normalization_4d_axis3.onnx delete mode 100644 testdata/dnn/onnx/models/test_layer_normalization_default_axis.onnx diff --git a/testdata/dnn/onnx/models/test_layer_normalization_2d_axis0.onnx b/testdata/dnn/onnx/conformance/node/test_layer_normalization_2d_axis0/model.onnx similarity index 50% rename from testdata/dnn/onnx/models/test_layer_normalization_2d_axis0.onnx rename to testdata/dnn/onnx/conformance/node/test_layer_normalization_2d_axis0/model.onnx index 985677833666ac18f8fd24479067ecf23a33ec5d..fdc5f486fa73954a38a4fe72061f3e4d6b4ff046 100644 GIT binary patch delta 118 zcmaFC*ve$Y!6C$xl$e~InwO$ml3HA1^@fqlj*BsZi!q#w(MgCgQi#PjH8D?!(=)Fu uxFp3TwQQo#4C^E@E{HH67Y_%c5C<0%2O|h4Npm3-3ZY3lv2Za62m%0^ffvyL delta 89 zcmZo=dco+!!69Uxl$e~InwO$ml3HA%kei>9nUME@D98d6a6%SH0&0sy*Ony41#u#(ag0gQ RTnI;_X<~F@;bIUF1OP5JFÞíó> \ No newline at end of file diff --git a/testdata/dnn/onnx/conformance/node/test_layer_normalization_2d_axis1/test_data_set_0/output_2.pb b/testdata/dnn/onnx/conformance/node/test_layer_normalization_2d_axis1/test_data_set_0/output_2.pb new file mode 100644 index 000000000..2515b32d3 --- /dev/null +++ b/testdata/dnn/onnx/conformance/node/test_layer_normalization_2d_axis1/test_data_set_0/output_2.pb @@ -0,0 +1 @@ +B InvStdDevJ €É´?ÃLm?•Ñ×? \ No newline at end of file diff --git a/testdata/dnn/onnx/models/test_layer_normalization_2d_axis_negative_1.onnx b/testdata/dnn/onnx/conformance/node/test_layer_normalization_2d_axis_negative_1/model.onnx similarity index 52% rename from testdata/dnn/onnx/models/test_layer_normalization_2d_axis_negative_1.onnx rename to testdata/dnn/onnx/conformance/node/test_layer_normalization_2d_axis_negative_1/model.onnx index 3a18cb7f75cce15a5c0f7774cc96529008bdac20..76810c717d717e424673c2984bfc986c7400d55d 100644 GIT binary patch delta 118 zcmey&IDyHCgF}cXDKR-aH7`ZCB(=E2>N_KsI~QXF7h^aVqmvM0q!5d5YGR%cr)OSS va7l_wYS~1e#nwq;To7SCE*=g>Ar3Ak4rU-`Op@k8C=^1IbYkIR5D)|at@#)V delta 89 zcmbQh^qJ9zgG0zXDKR-aH7`ZCB(=CiAvZrIGc7YUMIotDAw9Dsqclk`IX_oFzaTX) nxeQ9hr&g2{C0cD{Þíó> \ No newline at end of file diff --git a/testdata/dnn/onnx/conformance/node/test_layer_normalization_2d_axis_negative_1/test_data_set_0/output_2.pb b/testdata/dnn/onnx/conformance/node/test_layer_normalization_2d_axis_negative_1/test_data_set_0/output_2.pb new file mode 100644 index 000000000..2515b32d3 --- /dev/null +++ b/testdata/dnn/onnx/conformance/node/test_layer_normalization_2d_axis_negative_1/test_data_set_0/output_2.pb @@ -0,0 +1 @@ +B InvStdDevJ €É´?ÃLm?•Ñ×? \ No newline at end of file diff --git a/testdata/dnn/onnx/models/test_layer_normalization_2d_axis_negative_2.onnx b/testdata/dnn/onnx/conformance/node/test_layer_normalization_2d_axis_negative_2/model.onnx similarity index 53% rename from testdata/dnn/onnx/models/test_layer_normalization_2d_axis_negative_2.onnx rename to testdata/dnn/onnx/conformance/node/test_layer_normalization_2d_axis_negative_2/model.onnx index 5a5b010f36eac240a1c43f4d982d67f10e7044ab..570a3bd5ee6b2e774b2a2c6e09983775b20c6e9f 100644 GIT binary patch delta 118 zcmey(ID^TEgF}cXDKR-aH7`ZCB(=E2>OUiwI~QXF7h^aVqmvM0q!5d5YGR%cr)OSS ua7l_wYS~1e)z(R3To7SCE*=g>Ar3Ak4n`18lIB7v6hf19V&P&C5Cj0Z%NQmA delta 89 zcmbQi^qbL#gG0zXDKR-aH7`ZCB(=CiAvZrIGc7YUMIotDAw9Dsqclk`IX_oFzaTX) nxeQ9hr&g2{C0gxd0& delta 89 zcmdnNG?~eVgG0zXDKR-aH7`ZCB(=CiAvZrIGc7YUMIotDAw9Dsqclk`IX_oFzaTX) nxeQ9hr&g2{C0bo% \ No newline at end of file diff --git a/testdata/dnn/onnx/conformance/node/test_layer_normalization_3d_axis0_epsilon/test_data_set_0/output_2.pb b/testdata/dnn/onnx/conformance/node/test_layer_normalization_3d_axis0_epsilon/test_data_set_0/output_2.pb new file mode 100644 index 000000000..a76b1d4b4 --- /dev/null +++ b/testdata/dnn/onnx/conformance/node/test_layer_normalization_3d_axis0_epsilon/test_data_set_0/output_2.pb @@ -0,0 +1 @@ +B InvStdDevJp!c? \ No newline at end of file diff --git a/testdata/dnn/onnx/models/test_layer_normalization_3d_axis1_epsilon.onnx b/testdata/dnn/onnx/conformance/node/test_layer_normalization_3d_axis1_epsilon/model.onnx similarity index 54% rename from testdata/dnn/onnx/models/test_layer_normalization_3d_axis1_epsilon.onnx rename to testdata/dnn/onnx/conformance/node/test_layer_normalization_3d_axis1_epsilon/model.onnx index 4ceb21b1ad52cb039cfcf935046db644ebc789f4..2f451c51262bd77c4769e90fdef573e91efde030 100644 GIT binary patch delta 126 zcmeBX+Q4MQ!6C$xl$e~InwO$ml3HA1HJynokc%;bi!q#w(MgCgQi#PjH8D?!(=)Fu wxFp3TwQQo#Zs#N^E{L!YmjDN&5Dym<2NMu8f^d>N7ecWR76nc$Tnqw&03?zZ)&Kwi delta 89 zcmdnM)Xn6>!69Uxl$e~InwO$ml3HA%kei>9nU \ No newline at end of file diff --git a/testdata/dnn/onnx/conformance/node/test_layer_normalization_3d_axis1_epsilon/test_data_set_0/output_2.pb b/testdata/dnn/onnx/conformance/node/test_layer_normalization_3d_axis1_epsilon/test_data_set_0/output_2.pb new file mode 100644 index 000000000..acedd02d3 --- /dev/null +++ b/testdata/dnn/onnx/conformance/node/test_layer_normalization_3d_axis1_epsilon/test_data_set_0/output_2.pb @@ -0,0 +1 @@ +B InvStdDevJ§>Ž?K¥I? \ No newline at end of file diff --git a/testdata/dnn/onnx/models/test_layer_normalization_3d_axis2_epsilon.onnx b/testdata/dnn/onnx/conformance/node/test_layer_normalization_3d_axis2_epsilon/model.onnx similarity index 53% rename from testdata/dnn/onnx/models/test_layer_normalization_3d_axis2_epsilon.onnx rename to testdata/dnn/onnx/conformance/node/test_layer_normalization_3d_axis2_epsilon/model.onnx index de4c0edec05cceacfe645de507fcc9aa1012801f..d06ef7d01103de92989593002e8578a950e60952 100644 GIT binary patch delta 126 zcmZo>TES$*!6C$xl$e~InwO$ml3HA1)z8Eg$i*1J#Td@T=p@7#Da7KNnwTfV>6up+ xT$19FS~k&VvvZOZ7erWyOMrt>h=+@bg9(V4ftWE#o(rK^2#W$I7A^(>K>!!X7rFod delta 89 zcmZ3%)Xe0=!69Uxl$e~InwO$ml3HA%kei>9nU“ÊÉ=Š> \ No newline at end of file diff --git a/testdata/dnn/onnx/conformance/node/test_layer_normalization_3d_axis2_epsilon/test_data_set_0/output_2.pb b/testdata/dnn/onnx/conformance/node/test_layer_normalization_3d_axis2_epsilon/test_data_set_0/output_2.pb new file mode 100644 index 000000000..469229d8b --- /dev/null +++ b/testdata/dnn/onnx/conformance/node/test_layer_normalization_3d_axis2_epsilon/test_data_set_0/output_2.pb @@ -0,0 +1 @@ +B InvStdDevJät­?X³?¡ƒÚ?õq™?Ö?\? \ No newline at end of file diff --git a/testdata/dnn/onnx/models/test_layer_normalization_3d_axis_negative_1_epsilon.onnx b/testdata/dnn/onnx/conformance/node/test_layer_normalization_3d_axis_negative_1_epsilon/model.onnx similarity index 59% rename from testdata/dnn/onnx/models/test_layer_normalization_3d_axis_negative_1_epsilon.onnx rename to testdata/dnn/onnx/conformance/node/test_layer_normalization_3d_axis_negative_1_epsilon/model.onnx index 232d7a701b2af0800baa82bb02f4f090adb30a74..f59572ea1877b0739fbf3554de945341caef8edd 100644 GIT binary patch delta 126 zcmbQnw42F@gF}cXDKR-aH7`ZCB(=E2Y7rAx6c=Lz7h^aVqmvM0q!5d5YGR%cr)OSS xa7l_wYS~1eW6nuZTo7R)E&&ckAs#L!4kjRG24cn}c`k%vAuI}yrJgG0zXDKR-aH7`ZCB(=CiAvZrIGc7YUMIotDAw9Dsqclk`IX_oFzaTX) nxeQ9hr&g2{C0bo!“ÊÉ=Š> \ No newline at end of file diff --git a/testdata/dnn/onnx/conformance/node/test_layer_normalization_3d_axis_negative_1_epsilon/test_data_set_0/output_2.pb b/testdata/dnn/onnx/conformance/node/test_layer_normalization_3d_axis_negative_1_epsilon/test_data_set_0/output_2.pb new file mode 100644 index 000000000..469229d8b --- /dev/null +++ b/testdata/dnn/onnx/conformance/node/test_layer_normalization_3d_axis_negative_1_epsilon/test_data_set_0/output_2.pb @@ -0,0 +1 @@ +B InvStdDevJät­?X³?¡ƒÚ?õq™?Ö?\? \ No newline at end of file diff --git a/testdata/dnn/onnx/models/test_layer_normalization_3d_axis_negative_2_epsilon.onnx b/testdata/dnn/onnx/conformance/node/test_layer_normalization_3d_axis_negative_2_epsilon/model.onnx similarity index 60% rename from testdata/dnn/onnx/models/test_layer_normalization_3d_axis_negative_2_epsilon.onnx rename to testdata/dnn/onnx/conformance/node/test_layer_normalization_3d_axis_negative_2_epsilon/model.onnx index 6eecff5f507b5df718c36c4a42e09083d09962c7..ea52be584c7ff60c5df0433bb817f0d05b76193c 100644 GIT binary patch delta 126 zcmbQobePGAgF}cXDKR-aH7`ZCB(=E2Y84Y#6c=Lz7h^aVqmvM0q!5d5YGR%cr)OSS wa7l_wYS~1ebIwUpTo7R)E&&ckAs#L!4kjRG1mPrkE`(wsEDD@hxEKTk0Y`)wD*ylh delta 89 zcmX@iG>^%LgG0zXDKR-aH7`ZCB(=CiAvZrIGc7YUMIotDAw9Dsqclk`IX_oFzaTX) nxeQ9hr&g2{C0gBK \ No newline at end of file diff --git a/testdata/dnn/onnx/conformance/node/test_layer_normalization_3d_axis_negative_2_epsilon/test_data_set_0/output_2.pb b/testdata/dnn/onnx/conformance/node/test_layer_normalization_3d_axis_negative_2_epsilon/test_data_set_0/output_2.pb new file mode 100644 index 000000000..acedd02d3 --- /dev/null +++ b/testdata/dnn/onnx/conformance/node/test_layer_normalization_3d_axis_negative_2_epsilon/test_data_set_0/output_2.pb @@ -0,0 +1 @@ +B InvStdDevJ§>Ž?K¥I? \ No newline at end of file diff --git a/testdata/dnn/onnx/models/test_layer_normalization_3d_axis_negative_3_epsilon.onnx b/testdata/dnn/onnx/conformance/node/test_layer_normalization_3d_axis_negative_3_epsilon/model.onnx similarity index 58% rename from testdata/dnn/onnx/models/test_layer_normalization_3d_axis_negative_3_epsilon.onnx rename to testdata/dnn/onnx/conformance/node/test_layer_normalization_3d_axis_negative_3_epsilon/model.onnx index 21d55bb34c280215a004e470bf84941786975618..3cb5d846255ec0935119507d88e46cc30feb3d79 100644 GIT binary patch delta 126 zcmZ3+behSCgF}cXDKR-aH7`ZCB(=E2Y7-Mz6c=Lz7h^aVqmvM0q!5d5YGR%cr)OSS ua7l_wYS~1eYtBhhTo7R)E&&ckAs#L!4n`PGlIKDw7Q&*yiG_ \ No newline at end of file diff --git a/testdata/dnn/onnx/conformance/node/test_layer_normalization_3d_axis_negative_3_epsilon/test_data_set_0/output_2.pb b/testdata/dnn/onnx/conformance/node/test_layer_normalization_3d_axis_negative_3_epsilon/test_data_set_0/output_2.pb new file mode 100644 index 000000000..a76b1d4b4 --- /dev/null +++ b/testdata/dnn/onnx/conformance/node/test_layer_normalization_3d_axis_negative_3_epsilon/test_data_set_0/output_2.pb @@ -0,0 +1 @@ +B InvStdDevJp!c? \ No newline at end of file diff --git a/testdata/dnn/onnx/models/test_layer_normalization_4d_axis0.onnx b/testdata/dnn/onnx/conformance/node/test_layer_normalization_4d_axis0/model.onnx similarity index 53% rename from testdata/dnn/onnx/models/test_layer_normalization_4d_axis0.onnx rename to testdata/dnn/onnx/conformance/node/test_layer_normalization_4d_axis0/model.onnx index a0b2b51168fe736b277405daac64378b9a2d29c3..cd8300882a6d236cab793fa10a6b1c9087b5eed6 100644 GIT binary patch delta 134 zcmeBR+R9|a!6C$xl$e~InwO$ml3HA1HHV4Ij*BsZi!q#w(MgCgQi#PjH8D?!(=)Fu uxFp3TwQQo#4(}v6E{L!gmk0-=kN_7G2O~00QszQv5W=CziG_9nU \ No newline at end of file diff --git a/testdata/dnn/onnx/conformance/node/test_layer_normalization_4d_axis0/test_data_set_0/output_2.pb b/testdata/dnn/onnx/conformance/node/test_layer_normalization_4d_axis0/test_data_set_0/output_2.pb new file mode 100644 index 000000000..3c75e1e5c --- /dev/null +++ b/testdata/dnn/onnx/conformance/node/test_layer_normalization_4d_axis0/test_data_set_0/output_2.pb @@ -0,0 +1 @@ +B InvStdDevJóït? \ No newline at end of file diff --git a/testdata/dnn/onnx/models/test_layer_normalization_4d_axis1.onnx b/testdata/dnn/onnx/conformance/node/test_layer_normalization_4d_axis1/model.onnx similarity index 51% rename from testdata/dnn/onnx/models/test_layer_normalization_4d_axis1.onnx rename to testdata/dnn/onnx/conformance/node/test_layer_normalization_4d_axis1/model.onnx index d53b2502c64ca259d1b473980e5381f1f2137d2e..4960adea544c4f24f600a163fadeffc79344de9d 100644 GIT binary patch delta 134 zcmZo*TFYd_!6C$xl$e~InwO$ml3HA1HHC@Gj*BsZi!q#w(MgCgQi#PjH8D?!(=)Fu wxFp3TwQQo#2Ja*}E{L!gmk0-=kN_7G2NMu8!f=u@7ea#&4n)WGD!!69Uxl$e~InwO$ml3HA%kei>9nU \ No newline at end of file diff --git a/testdata/dnn/onnx/conformance/node/test_layer_normalization_4d_axis1/test_data_set_0/output_2.pb b/testdata/dnn/onnx/conformance/node/test_layer_normalization_4d_axis1/test_data_set_0/output_2.pb new file mode 100644 index 000000000..3f98a1912 --- /dev/null +++ b/testdata/dnn/onnx/conformance/node/test_layer_normalization_4d_axis1/test_data_set_0/output_2.pb @@ -0,0 +1 @@ +B InvStdDevJm‹q?„6y? \ No newline at end of file diff --git a/testdata/dnn/onnx/models/test_layer_normalization_4d_axis2.onnx b/testdata/dnn/onnx/conformance/node/test_layer_normalization_4d_axis2/model.onnx similarity index 50% rename from testdata/dnn/onnx/models/test_layer_normalization_4d_axis2.onnx rename to testdata/dnn/onnx/conformance/node/test_layer_normalization_4d_axis2/model.onnx index 6622679159285b8ec340f949fdfff4cd958a978c..662e6ecccf0fcc6567fe2295bac0ce17444ff494 100644 GIT binary patch delta 134 zcmeytxRl9=gF}cXDKR-aH7`ZCB(=E2s)vcoj*BsZi!q#w(MgCgQi#PjH8D?!(=)Fu zxFp3TwQQo#3hyL2E{L!gmk0-=kN_7G2NMu812H2ACn<9wGzj5PXFþ> \ No newline at end of file diff --git a/testdata/dnn/onnx/conformance/node/test_layer_normalization_4d_axis2/test_data_set_0/output_2.pb b/testdata/dnn/onnx/conformance/node/test_layer_normalization_4d_axis2/test_data_set_0/output_2.pb new file mode 100644 index 000000000..4b0b73a6e --- /dev/null +++ b/testdata/dnn/onnx/conformance/node/test_layer_normalization_4d_axis2/test_data_set_0/output_2.pb @@ -0,0 +1 @@ +B InvStdDevJŽ–?…W?ÓÕ‘?¢ô­?ç|‰?»'_? \ No newline at end of file diff --git a/testdata/dnn/onnx/conformance/node/test_layer_normalization_4d_axis3/model.onnx b/testdata/dnn/onnx/conformance/node/test_layer_normalization_4d_axis3/model.onnx new file mode 100644 index 0000000000000000000000000000000000000000..43791e663cf1459a9240141e1acfcd67ea410cdc GIT binary patch literal 285 zcmdL1PB2T0YU^#WnpegV8o)iKYbL_JSf2xKSP0CK9kDHJ&FR5KBr>| zzg~aBK4SL^zw}8AzkVv@z5t;ky$;4LzaU2Vz6O_WK2^B%zNS9=JXK&5KV7)-J^?!$ UKQ%=_zROZpKfwGoKX6VUKT4o200000 literal 0 HcmV?d00001 diff --git a/testdata/dnn/onnx/conformance/node/test_layer_normalization_4d_axis3/test_data_set_0/output_2.pb b/testdata/dnn/onnx/conformance/node/test_layer_normalization_4d_axis3/test_data_set_0/output_2.pb new file mode 100644 index 000000000..996fa15b2 --- /dev/null +++ b/testdata/dnn/onnx/conformance/node/test_layer_normalization_4d_axis3/test_data_set_0/output_2.pb @@ -0,0 +1,2 @@ +B InvStdDevJ`”ù¿?‰”Ç?ðÊ@ Ò¥?æ°?é±d?Z³—?²â´?°8C?O­˜?èEá?€v@gñÌ?a¹®?’zž?eF@, +Y?o„q?­²Ý?‡ûÈ?]–=?ñ Z?0e?¡Þ@ \ No newline at end of file diff --git a/testdata/dnn/onnx/models/test_layer_normalization_4d_axis_negative_1.onnx b/testdata/dnn/onnx/conformance/node/test_layer_normalization_4d_axis_negative_1/model.onnx similarity index 54% rename from testdata/dnn/onnx/models/test_layer_normalization_4d_axis_negative_1.onnx rename to testdata/dnn/onnx/conformance/node/test_layer_normalization_4d_axis_negative_1/model.onnx index b8263c69739737b76b4b901ce761b1d30af1edb9..3b71adb8d09bd22904c0345de9fd1d0b5738369e 100644 GIT binary patch delta 134 zcmZo>+Q4MQ!6C$xl$e~InwO$ml3HA1HJypeor^Joi!q#w(MgCgQi#PjH8D?!(=)Fu zxFp3TwQQo#X7409E{L!gmk0-=kN_7G2NMu812GE_GbSl>Av6f#P~^nI#ULOE0MI@d A7ytkO delta 89 zcmdnM)Xe0=!69Uxl$e~InwO$ml3HA%kei>9nUL1PB2T0YU^#WnpegV8o)iKYbL_JSf2xKSP0CK9kDHJ&FR5KBr>| zzg~aBK4SL^zw}8AzkVv@z5t;ky$;4LzaU2Vz6O_WK2^B%zNS9=JXK&5KV7)-J^?!$ UKQ%=_zROZpKfwGoKX6VUKT4o200000 literal 0 HcmV?d00001 diff --git a/testdata/dnn/onnx/conformance/node/test_layer_normalization_4d_axis_negative_1/test_data_set_0/output_2.pb b/testdata/dnn/onnx/conformance/node/test_layer_normalization_4d_axis_negative_1/test_data_set_0/output_2.pb new file mode 100644 index 000000000..996fa15b2 --- /dev/null +++ b/testdata/dnn/onnx/conformance/node/test_layer_normalization_4d_axis_negative_1/test_data_set_0/output_2.pb @@ -0,0 +1,2 @@ +B InvStdDevJ`”ù¿?‰”Ç?ðÊ@ Ò¥?æ°?é±d?Z³—?²â´?°8C?O­˜?èEá?€v@gñÌ?a¹®?’zž?eF@, +Y?o„q?­²Ý?‡ûÈ?]–=?ñ Z?0e?¡Þ@ \ No newline at end of file diff --git a/testdata/dnn/onnx/models/test_layer_normalization_4d_axis_negative_2.onnx b/testdata/dnn/onnx/conformance/node/test_layer_normalization_4d_axis_negative_2/model.onnx similarity index 56% rename from testdata/dnn/onnx/models/test_layer_normalization_4d_axis_negative_2.onnx rename to testdata/dnn/onnx/conformance/node/test_layer_normalization_4d_axis_negative_2/model.onnx index 0bd96ea36a2f194a514184f3fd25670763509cd3..83524076d120c4664667769771f541586ad83c88 100644 GIT binary patch delta 134 zcmeBX+QDSR!6C$xl$e~InwO$ml3HA1HJ^#gor^Joi!q#w(MgCgQi#PjH8D?!(=)Fu zxFp3TwQQo#Zto;HE{L!gmk0-=kN_7G2NMu812H2ACn<9wGzj5P!69Uxl$e~InwO$ml3HA%kei>9nUXFþ> \ No newline at end of file diff --git a/testdata/dnn/onnx/conformance/node/test_layer_normalization_4d_axis_negative_2/test_data_set_0/output_2.pb b/testdata/dnn/onnx/conformance/node/test_layer_normalization_4d_axis_negative_2/test_data_set_0/output_2.pb new file mode 100644 index 000000000..4b0b73a6e --- /dev/null +++ b/testdata/dnn/onnx/conformance/node/test_layer_normalization_4d_axis_negative_2/test_data_set_0/output_2.pb @@ -0,0 +1 @@ +B InvStdDevJŽ–?…W?ÓÕ‘?¢ô­?ç|‰?»'_? \ No newline at end of file diff --git a/testdata/dnn/onnx/models/test_layer_normalization_4d_axis_negative_3.onnx b/testdata/dnn/onnx/conformance/node/test_layer_normalization_4d_axis_negative_3/model.onnx similarity index 57% rename from testdata/dnn/onnx/models/test_layer_normalization_4d_axis_negative_3.onnx rename to testdata/dnn/onnx/conformance/node/test_layer_normalization_4d_axis_negative_3/model.onnx index 547ae07b9a39f19aa322cd8ba6077715b06d0a89..6c3a2a76c6d4bce13a8f25daa9511d47b0651400 100644 GIT binary patch delta 134 zcmbQtbb!f-gF}cXDKR-aH7`ZCB(=E2YB>{^I~QXF7h^aVqmvM0q!5d5YGR%cr)OSS wa7l_wYS~1e!`?}9To7R~E)fn!AptHX4kjRGgyAG*E`$al9EzM+xEKTk0qb`dP5=M^ delta 89 zcmX@WG?~eVgG0zXDKR-aH7`ZCB(=CiAvZrIGc7YUMIotDAw9Dsqclk`IX_oFzaTX) nxeQ9hr&g2{C0bo% \ No newline at end of file diff --git a/testdata/dnn/onnx/conformance/node/test_layer_normalization_4d_axis_negative_3/test_data_set_0/output_2.pb b/testdata/dnn/onnx/conformance/node/test_layer_normalization_4d_axis_negative_3/test_data_set_0/output_2.pb new file mode 100644 index 000000000..3f98a1912 --- /dev/null +++ b/testdata/dnn/onnx/conformance/node/test_layer_normalization_4d_axis_negative_3/test_data_set_0/output_2.pb @@ -0,0 +1 @@ +B InvStdDevJm‹q?„6y? \ No newline at end of file diff --git a/testdata/dnn/onnx/models/test_layer_normalization_4d_axis_negative_4.onnx b/testdata/dnn/onnx/conformance/node/test_layer_normalization_4d_axis_negative_4/model.onnx similarity index 55% rename from testdata/dnn/onnx/models/test_layer_normalization_4d_axis_negative_4.onnx rename to testdata/dnn/onnx/conformance/node/test_layer_normalization_4d_axis_negative_4/model.onnx index c76787ad31a20046c38b7632b06b6d23ecb1cd73..8f34b80299bba84847d66f83f7d87715fdcf7ed4 100644 GIT binary patch delta 134 zcmbQubb`r \ No newline at end of file diff --git a/testdata/dnn/onnx/conformance/node/test_layer_normalization_4d_axis_negative_4/test_data_set_0/output_2.pb b/testdata/dnn/onnx/conformance/node/test_layer_normalization_4d_axis_negative_4/test_data_set_0/output_2.pb new file mode 100644 index 000000000..3c75e1e5c --- /dev/null +++ b/testdata/dnn/onnx/conformance/node/test_layer_normalization_4d_axis_negative_4/test_data_set_0/output_2.pb @@ -0,0 +1 @@ +B InvStdDevJóït? \ No newline at end of file diff --git a/testdata/dnn/onnx/conformance/node/test_layer_normalization_default_axis/model.onnx b/testdata/dnn/onnx/conformance/node/test_layer_normalization_default_axis/model.onnx new file mode 100644 index 0000000000000000000000000000000000000000..9360997fc5927917c9971a557ab2519b9f6fe242 GIT binary patch literal 276 zcmdG8e)R OI1FKQV&P&C5Cj0Yk}?he literal 0 HcmV?d00001 diff --git a/testdata/dnn/onnx/data/input_test_layer_normalization_default_axis_0.pb b/testdata/dnn/onnx/conformance/node/test_layer_normalization_default_axis/test_data_set_0/input_0.pb similarity index 100% rename from testdata/dnn/onnx/data/input_test_layer_normalization_default_axis_0.pb rename to testdata/dnn/onnx/conformance/node/test_layer_normalization_default_axis/test_data_set_0/input_0.pb diff --git a/testdata/dnn/onnx/data/input_test_layer_normalization_default_axis_1.pb b/testdata/dnn/onnx/conformance/node/test_layer_normalization_default_axis/test_data_set_0/input_1.pb similarity index 100% rename from testdata/dnn/onnx/data/input_test_layer_normalization_default_axis_1.pb rename to testdata/dnn/onnx/conformance/node/test_layer_normalization_default_axis/test_data_set_0/input_1.pb diff --git a/testdata/dnn/onnx/data/input_test_layer_normalization_default_axis_2.pb b/testdata/dnn/onnx/conformance/node/test_layer_normalization_default_axis/test_data_set_0/input_2.pb similarity index 100% rename from testdata/dnn/onnx/data/input_test_layer_normalization_default_axis_2.pb rename to testdata/dnn/onnx/conformance/node/test_layer_normalization_default_axis/test_data_set_0/input_2.pb diff --git a/testdata/dnn/onnx/data/output_test_layer_normalization_default_axis.pb b/testdata/dnn/onnx/conformance/node/test_layer_normalization_default_axis/test_data_set_0/output_0.pb similarity index 100% rename from testdata/dnn/onnx/data/output_test_layer_normalization_default_axis.pb rename to testdata/dnn/onnx/conformance/node/test_layer_normalization_default_axis/test_data_set_0/output_0.pb diff --git a/testdata/dnn/onnx/conformance/node/test_layer_normalization_default_axis/test_data_set_0/output_1.pb b/testdata/dnn/onnx/conformance/node/test_layer_normalization_default_axis/test_data_set_0/output_1.pb new file mode 100644 index 0000000000000000000000000000000000000000..f1d0d7f58a37513acf07fc7f97cb8f8e30d6e1ab GIT binary patch literal 114 zcmV-&0FD0$0tf>L1PB2T0YU^#WnpegV8o)iKYbL_JSf2xKSP0CK9kDHJ&FR5KBr>| zzg~aBK4SL^zw}8AzkVv@z5t;ky$;4LzaU2Vz6O_WK2^B%zNS9=JXK&5KV7)-J^?!$ UKQ%=_zROZpKfwGoKX6VUKT4o200000 literal 0 HcmV?d00001 diff --git a/testdata/dnn/onnx/conformance/node/test_layer_normalization_default_axis/test_data_set_0/output_2.pb b/testdata/dnn/onnx/conformance/node/test_layer_normalization_default_axis/test_data_set_0/output_2.pb new file mode 100644 index 000000000..996fa15b2 --- /dev/null +++ b/testdata/dnn/onnx/conformance/node/test_layer_normalization_default_axis/test_data_set_0/output_2.pb @@ -0,0 +1,2 @@ +B InvStdDevJ`”ù¿?‰”Ç?ðÊ@ Ò¥?æ°?é±d?Z³—?²â´?°8C?O­˜?èEá?€v@gñÌ?a¹®?’zž?eF@, +Y?o„q?­²Ý?‡ûÈ?]–=?ñ Z?0e?¡Þ@ \ No newline at end of file diff --git a/testdata/dnn/onnx/models/test_layer_normalization_2d_axis1.onnx b/testdata/dnn/onnx/models/test_layer_normalization_2d_axis1.onnx deleted file mode 100644 index 9866c900d..000000000 --- a/testdata/dnn/onnx/models/test_layer_normalization_2d_axis1.onnx +++ /dev/null @@ -1,22 +0,0 @@ -7backend-test modified by github.com/opencv/opencv_extra:ž -- -X -W -BY"LayerNormalization* -axis !test_layer_normalization_2d_axis1Z -X -  - -Z -W - - -Z -B - - -b -Y -  - -B \ No newline at end of file diff --git a/testdata/dnn/onnx/models/test_layer_normalization_4d_axis3.onnx b/testdata/dnn/onnx/models/test_layer_normalization_4d_axis3.onnx deleted file mode 100644 index 568a51758..000000000 --- a/testdata/dnn/onnx/models/test_layer_normalization_4d_axis3.onnx +++ /dev/null @@ -1,26 +0,0 @@ -7backend-test modified by github.com/opencv/opencv_extra:® -- -X -W -BY"LayerNormalization* -axis !test_layer_normalization_4d_axis3Z -X - - - - -Z -W - - -Z -B - - -b -Y - - - - -B \ No newline at end of file diff --git a/testdata/dnn/onnx/models/test_layer_normalization_default_axis.onnx b/testdata/dnn/onnx/models/test_layer_normalization_default_axis.onnx deleted file mode 100644 index 3acea168d..000000000 --- a/testdata/dnn/onnx/models/test_layer_normalization_default_axis.onnx +++ /dev/null @@ -1,25 +0,0 @@ -7backend-test modified by github.com/opencv/opencv_extra:¥ - -X -W -BY"LayerNormalization%test_layer_normalization_default_axisZ -X - - - - -Z -W - - -Z -B - - -b -Y - - - - -B \ No newline at end of file From bde7fef89af1e04533b86e0df9a2081c6fd5b797 Mon Sep 17 00:00:00 2001 From: Dmitry Kurtaev Date: Mon, 20 Nov 2023 14:26:11 +0300 Subject: [PATCH 06/12] Add QR codes for Error Correction test --- testdata/cv/qrcode/err_correct_1M.png | Bin 0 -> 183 bytes testdata/cv/qrcode/err_correct_2L.png | Bin 0 -> 229 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 testdata/cv/qrcode/err_correct_1M.png create mode 100644 testdata/cv/qrcode/err_correct_2L.png diff --git a/testdata/cv/qrcode/err_correct_1M.png b/testdata/cv/qrcode/err_correct_1M.png new file mode 100644 index 0000000000000000000000000000000000000000..6786b75bacf073359b0af57ab43ef140a8b06d95 GIT binary patch literal 183 zcmeAS@N?(olHy`uVBq!ia0vp^q9DuxBp7;Xet7|@I!_nJ5D7`!gN=aig2l2evo~&v$lfBR-M#f%RQFU%U7zApo3BOLot^x1`cod?b16no zuBU9B!K2%K)MS=Hr0>5qnYw3%v!m3`ADOi#)vsHzTj$!WYg^R1x9a#PcW?DMJ?Bg& h$K?~7ugy~X&3KZD9&BV}au7JIu<8GW zuU}eil+$(XXI@U)a&6A0i0nw`?x{y-J%5U1yBQ2&`YcI|bySzmweeK0rZrL-{(vxN# zIWlX_Q=ja4%Q`PAosYV_<=O;GUf$kmsWaWWpZWkTk=m$pI?4B1hHvmQ6W{KwK9T2) c)|&FxGVHZjBvkrN&llu=Pgg&ebxsLQ0Lf=xjQ{`u literal 0 HcmV?d00001 From ea3730cb5077f7b9138ff506c49ac1e742c97201 Mon Sep 17 00:00:00 2001 From: Dmitry Kurtaev Date: Wed, 22 Nov 2023 20:04:27 +0300 Subject: [PATCH 07/12] Test data for graph simplifier --- testdata/dnn/onnx/data/input_bias_gelu.npy | Bin 0 -> 152 bytes testdata/dnn/onnx/data/output_bias_gelu.npy | Bin 0 -> 152 bytes .../onnx/generate_onnx_models_with_onnxscript.py | 15 +++++++++++++++ testdata/dnn/onnx/models/bias_gelu.onnx | Bin 0 -> 668 bytes 4 files changed, 15 insertions(+) create mode 100644 testdata/dnn/onnx/data/input_bias_gelu.npy create mode 100644 testdata/dnn/onnx/data/output_bias_gelu.npy create mode 100644 testdata/dnn/onnx/models/bias_gelu.onnx diff --git a/testdata/dnn/onnx/data/input_bias_gelu.npy b/testdata/dnn/onnx/data/input_bias_gelu.npy new file mode 100644 index 0000000000000000000000000000000000000000..7d60fe1d6c9500b1455622e3f17e17dd2931bf40 GIT binary patch literal 152 zcmbR27wQ`j$;eQ~P_3SlTAW;@Zl$1ZlV+l>qoAIaUsO_*m=~X4l#&V(cT3DEP6dh= zXCxM+0{I$-ItoTQ3dWi`3bhL40WR)(9{Xit=JuQYr0mOUx$Qk(-mnXdRJ8{HP8lP8 literal 0 HcmV?d00001 diff --git a/testdata/dnn/onnx/data/output_bias_gelu.npy b/testdata/dnn/onnx/data/output_bias_gelu.npy new file mode 100644 index 0000000000000000000000000000000000000000..89762b94c7eea8158f52041ef771af9aecf26265 GIT binary patch literal 152 zcmbR27wQ`j$;eQ~P_3SlTAW;@Zl$1ZlV+l>qoAIaUsO_*m=~X4l#&V(cT3DEP6dh= zXCxM+0{I$-ItoTQ3dWi`3bhL40WO8iZ*~)AMccb8DcM)mf3cf!lGi??Ue_J~YT_jS literal 0 HcmV?d00001 diff --git a/testdata/dnn/onnx/generate_onnx_models_with_onnxscript.py b/testdata/dnn/onnx/generate_onnx_models_with_onnxscript.py index c8c9e6122..8fadd6896 100644 --- a/testdata/dnn/onnx/generate_onnx_models_with_onnxscript.py +++ b/testdata/dnn/onnx/generate_onnx_models_with_onnxscript.py @@ -124,3 +124,18 @@ def two_resizes_with_shared_subgraphs(x: ost.FLOAT["batch", 1, "height", "width" return opset11.Add(resized_y, resized_z) make_model_and_data(two_resizes_with_shared_subgraphs, np.random.rand(1, 1, 4, 5).astype(np.float32), np.random.rand(1, 1, 3, 2).astype(np.float32), np.random.rand(1, 1, 2, 1).astype(np.float32)) + +@ost.script() +def bias_gelu(x: ost.FLOAT[1, 2, 3]) -> ost.FLOAT[1, 2, 3]: + bias = op.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.FLOAT, [3], np.array([0.1, 0.3, 0.2], dtype=np.float32))) + add1 = op.Add(x, bias) + tmp = op.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.FLOAT, [], np.array([np.sqrt(2)], dtype=np.float32))) + div = op.Div(add1, tmp) + erf = op.Erf(div) + tmp_0 = op.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.FLOAT, [], np.array([1], dtype=np.float32))) + add2 = op.Add(erf, tmp_0) + mul = op.Mul(add1, add2) + tmp_1 = op.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.FLOAT, [], np.array([0.5], dtype=np.float32))) + return op.Mul(mul, tmp_1) + +make_model_and_data(bias_gelu, np.random.rand(1, 2, 3).astype(np.float32)) diff --git a/testdata/dnn/onnx/models/bias_gelu.onnx b/testdata/dnn/onnx/models/bias_gelu.onnx new file mode 100644 index 0000000000000000000000000000000000000000..2d23e8f495589731317a7f8c19ccf86884b11e41 GIT binary patch literal 668 zcmaKp%TB^j5Qa}V2U8{(oADN_CZz62jI`d6M2x6AeE~O3NsED$YD!C7`U);_(I3?w=!Ec9CVr_z~Aos!nl}`+Q7Y?X=gjJfhTU0y!(}c0Ng~>ih1Z1jo zWs9_D#mam64ssI<`8f8edv5TD*#C8tN4EcQV+*$fkciC9LAN+D}SkOd}lv`UAGLt&J*a*l~Prze1E>pvsyero^# literal 0 HcmV?d00001 From 3ec46bb47ca2fee7df2c8dbf45b163e73c5a4c35 Mon Sep 17 00:00:00 2001 From: Maksim Shabunin Date: Mon, 27 Nov 2023 17:31:18 +0300 Subject: [PATCH 08/12] Refactored download_models.py - split functionality - support multiple URLs - reduce output - support new yolo models --- testdata/dnn/download_models.py | 444 ++++++++++++++++++-------------- 1 file changed, 257 insertions(+), 187 deletions(-) diff --git a/testdata/dnn/download_models.py b/testdata/dnn/download_models.py index eed01d68f..cb5491dde 100755 --- a/testdata/dnn/download_models.py +++ b/testdata/dnn/download_models.py @@ -5,215 +5,235 @@ import os import sys import tarfile -import requests import shutil import argparse +import time +from urllib.parse import urlparse from pathlib import Path +try: + import requests +except ImportError: + print("This script requires 'requests' library") + exit(13) -class Model: + +class BuiltinDownloader: MB = 1024*1024 BUFSIZE = 10*MB + TIMEOUT = 60 - def __init__(self, **kwargs): - self.name = kwargs.pop('name', None) - self.url = kwargs.pop('url', None) - self.downloader = kwargs.pop('downloader', None) - self.filename = Path(kwargs.pop('filename')) - self.sha = kwargs.pop('sha', None) - self.member = kwargs.pop('member', None) - self.sub = kwargs.pop('sub', []) - self.gdrive = kwargs.pop('gdrive', None) + def print_response(self, response): + rcode = response.status_code + rsize = int(response.headers.get('content-length', 0)) / self.MB + print(' {} [{:.2f} Mb]'.format(rcode, rsize)) - def __str__(self): - return 'Model <{}>'.format(self.name) + def make_response(self, url, session): + pieces = urlparse(url) + if pieces.netloc in ["docs.google.com", "drive.google.com"]: + return session.get(url, params={'confirm': True}, stream=True, timeout=self.TIMEOUT) + else: + return session.get(url, stream=True, timeout=self.TIMEOUT) + + def download_response(self, response, filename): + with open(filename, 'wb') as f: + print(' progress ', end='') + sys.stdout.flush() + for buf in response.iter_content(self.BUFSIZE): + if not buf: + continue + f.write(buf) + print('>', end='') + sys.stdout.flush() + print('') + + def download(self, url, filename): + try: + session = requests.Session() + response = self.make_response(url, session) + self.print_response(response) + response.raise_for_status() + self.download_response(response, filename) + return True + except Exception as e: + print(' download failed: {}'.format(e)) + return False - def printRequest(self, r): - def getMB(r): - d = dict(r.headers) - for c in ['content-length', 'Content-Length']: - if c in d: - return int(d[c]) / self.MB - return 0 - print(' {} [{:.2f} Mb]'.format(r.status_code, getMB(r))) - def prepare_file(self): - self.filename.parent.mkdir(parents=True, exist_ok=True) +class BuiltinVerifier: + MB = 1024*1024 + BUFSIZE = 100*MB - def verify(self): - if not self.sha: + def verify(self, filename, expected_sum): + if not filename.is_file(): return False - print(' expect {}'.format(self.sha)) - sha = hashlib.sha1() + sha_calculator = hashlib.sha1() try: - if not self.filename.is_file(): - print(' verify - file does not exist') - return False - with open(self.filename, 'rb') as f: + with open(filename, 'rb') as f: while True: buf = f.read(self.BUFSIZE) if not buf: break - sha.update(buf) - print(' actual {}'.format(sha.hexdigest())) - self.sha_actual = sha.hexdigest() - return self.sha == self.sha_actual + sha_calculator.update(buf) + if expected_sum != sha_calculator.hexdigest(): + print(' checksum mismatch:') + print(' expect {}'.format(expected_sum)) + print(' actual {}'.format(sha_calculator.hexdigest())) + return False + return True except Exception as e: - print(' verify {}'.format(e)) + print(' verify failed: {}'.format(e)) + return False + + +class BuiltinExtractor: + MB = 1024*1024 + BUFSIZE = 100*MB + + def extract(self, arch, member, filename): + if not arch.is_file(): + return False + try: + with tarfile.open(arch) as f: + if member not in f.getnames(): + print(' extract - missing member: {}'.format(member)) + return False + r = f.extractfile(member) + with open(filename, 'wb') as f: + # print(' progress ', end='') + sys.stdout.flush() + while True: + buf = r.read(self.BUFSIZE) + if not buf: + break + f.write(buf) + # print('>', end='') + sys.stdout.flush() + # print('') + return True + except Exception as e: + print(' extract failed: {}'.format(e)) + return False + + +class Processor: + def __init__(self, **kwargs): + self.reference = kwargs.pop('reference', None) + self.verifier = BuiltinVerifier() + self.downloader = BuiltinDownloader() + self.extractor = BuiltinExtractor() + + def prepare_folder(self, filename): + filename.parent.mkdir(parents=True, exist_ok=True) + + def download(self, url, filename): + return self.downloader.download(url, filename) + + def verify(self, mdl): + return self.verifier.verify(mdl.filename, mdl.sha) - def ref_copy(self, ref): - if not ref: + def extract(self, arch, mdl): + return self.extractor.extract(arch, mdl.member, mdl.filename) + + def ref_copy(self, mdl): + if not self.reference: + return False + candidate = self.reference / mdl.filename + if not candidate.is_file(): return False + print(' ref {} -> {}'.format(candidate, mdl.filename)) + try: + if candidate.absolute() != mdl.filename.absolute(): + self.prepare_folder(mdl.filename) + shutil.copy(candidate, mdl.filename) + if self.verify(mdl): + return True + else: + print(' ref - hash mismatch, removing') + mdl.filename.unlink() + return False + except Exception as e: + print(' ref failed: {}'.format(e)) + + def cleanup(self, filename): + print(" cleanup - {}".format(filename)) try: - candidate = ref / self.filename - if candidate.is_file(): - print(' ref {} -> {}'.format(candidate, self.filename)) - if candidate.absolute() == self.filename.absolute(): - print(' ref - skip copying the same file') - else: - self.prepare_file() - shutil.copy(candidate, self.filename) - if self.verify(): - return True - else: - print(' ref - hash mismatch, removing') - self.filename.unlink() + filename.unlink() except Exception as e: - print(' ref {}'.format(e)) + print(" cleanup failed: {}".format(e)) - def get_sub(self, ref, arch): - print('** {}'.format(self.filename)) + def handle_bad_download(self, filename): + # rename file for further investigation + rename_target = filename.with_suffix(filename.suffix + '.invalid') + print(' renaming invalid file to {}'.format(rename_target)) + try: + if rename_target.is_file(): # avoid FileExistsError on Windows from os.rename() + rename_target.unlink() + filename.rename(rename_target) + except Exception as e: + print(' rename failed: {}'.format(e)) - if self.verify(): + def get_sub(self, arch, mdl): + print('** {}'.format(mdl.filename)) + if self.verify(mdl): return True - if self.ref_copy(ref): + if self.ref_copy(mdl): return True - if arch.is_file(): - self.extract(arch) - return self.verify() + self.prepare_folder(mdl.filename) + return self.extract(arch, mdl) and self.verify(mdl) - def get(self, ref, arch=None): - print("* {}".format(m.name)) + def get(self, mdl): + print("* {}".format(mdl.name)) # Sub elements - first attempt (ref) - if len(self.sub) > 0: - res = [m.get_sub(ref, self.filename) for m in self.sub] - if all(res): + if len(mdl.sub) > 0: + if all(self.get_sub(mdl.filename, m) for m in mdl.sub): return True # File - exists or get from ref or download from internet verified = False - if self.verify() or self.ref_copy(ref): + if self.verify(mdl) or self.ref_copy(mdl): verified = True - elif self.url: - print(' hash check failed - downloading') - print(' get {}'.format(self.url)) - self.download() - elif self.gdrive: - print(' hash check failed - downloading') - print(' get {}'.format(self.gdrive)) - self.download_gdrive() - else: - raise Exception(info="Invalid model record", name=self.name) - if verified or self.verify(): + if not verified: + self.prepare_folder(mdl.filename) + for one_url in mdl.url: + print(' get {}'.format(one_url)) + if self.download(one_url, mdl.filename): + if self.verify(mdl): + verified = True + break + # TODO: we lose all failed files except the last one + if not verified and mdl.filename.is_file(): + self.handle_bad_download(mdl.filename) + + if verified or self.verify(mdl): # Sub elements - second attempt (extract) - if len(self.sub) > 0: - res = [m.get_sub(ref, self.filename) for m in self.sub] - return all(res) + if len(mdl.sub) > 0: + return all(self.get_sub(mdl.filename, m) for m in mdl.sub) else: return True else: - self.handle_bad_download() return False - def download_response(self, response): - self.printRequest(response) - try: - self.prepare_file() - with open(self.filename, 'wb') as f: - print(' progress ', end='') - sys.stdout.flush() - for buf in response.iter_content(self.BUFSIZE): - if not buf: - continue - f.write(buf) - print('>', end='') - sys.stdout.flush() - print('') - except Exception as e: - print(' download {}'.format(e)) - - def download(self, response=None): - try: - session = requests.Session() - response = session.get(self.url, stream=True, timeout=60) - self.download_response(response) - except Exception as e: - print(' download {}'.format(e)) - def download_gdrive(self): - try: - session = requests.Session() # re-use cookies - URL = "https://docs.google.com/uc?export=download" - response = session.get(URL, params={'id': self.gdrive}, stream=True, timeout=60) - def get_confirm_token(response): # in case of large files - for key, value in response.cookies.items(): - if key.startswith('download_warning'): - return value - token = get_confirm_token(response) - if token: - params = { 'id' : self.gdrive, 'confirm' : token } - response = session.get(URL, params = params, stream = True) - self.download_response(response) - except Exception as e: - print(' download {}'.format(e)) +class Model: - def extract(self, arch): - try: - with tarfile.open(arch) as f: - assert self.member in f.getnames() - r = f.extractfile(self.member) - self.prepare_file() - with open(self.filename, 'wb') as f: - print(' progress ', end='') - sys.stdout.flush() - while True: - buf = r.read(self.BUFSIZE) - if not buf: - break - f.write(buf) - print('>', end='') - sys.stdout.flush() - except Exception as e: - print(' extract {}'.format(e)) + def __init__(self, **kwargs): + self.name = kwargs.pop('name', None) + self.url = kwargs.pop('url', []) + self.filename = Path(kwargs.pop('filename')) + self.sha = kwargs.pop('sha', None) + self.member = kwargs.pop('member', None) + self.sub = kwargs.pop('sub', []) + if not isinstance(self.url, list) and self.url: + self.url = [self.url] + # TODO: add completeness assertion - def cleanup(self): - try: - if self.filename.is_file() and ".tar" in self.filename.suffixes: - print(" cleanup - {}".format(self.filename)) - self.filename.unlink() - except Exception as e: - print(" cleanup failed for {} - {}".format(self.filename, e)) + def __str__(self): + return 'Model <{}>'.format(self.name) - def handle_bad_download(self): - if self.filename.is_file(): - # rename file for further investigation - try: - # NB: using `self.sha_actual` may create unbounded number of files - rename_target = self.filename.with_suffix(self.filename.suffix + '.invalid') - try: - if rename_target.is_file(): # avoid FileExistsError on Windows from os.rename() - rename_target.unlink() - finally: - self.filename.rename(rename_target) - print(' renaming invalid file to {}'.format(rename_target)) - except: - import traceback - traceback.print_exc() - finally: - if self.filename.is_file(): - print(' deleting invalid file') - self.filename.unlink() + def is_archive(self): + return self.filename.is_file() and ".tar" in self.filename.suffixes models = [ @@ -249,7 +269,10 @@ def handle_bad_download(self): filename='VGG_ILSVRC2016_SSD_300x300_iter_440000.caffemodel'), Model( name='ResNet50', - url='https://onedrive.live.com/download?cid=4006CBB8476FF777&resid=4006CBB8476FF777%2117895&authkey=%21AAFW2%2DFVoxeVRck', + url=[ + 'https://onedrive.live.com/download?cid=4006CBB8476FF777&resid=4006CBB8476FF777%2117895&authkey=%21AAFW2%2DFVoxeVRck', + 'https://dl.opencv.org/models/ResNet-50-model.caffemodel' + ], sha='b7c79ccc21ad0479cddc0dd78b1d20c4d722908d', filename='ResNet-50-model.caffemodel'), Model( @@ -294,12 +317,18 @@ def handle_bad_download(self): filename='DenseNet_121.prototxt'), Model( name='Fast-Neural-Style (starry night)', - url='http://cs.stanford.edu/people/jcjohns/fast-neural-style/models/eccv16/starry_night.t7', + url=[ + 'https://cs.stanford.edu/people/jcjohns/fast-neural-style/models/eccv16/starry_night.t7', + 'https://dl.opencv.org/models/fast_neural_style_eccv16_starry_night.t7' + ], sha='5b5e115253197b84d6c6ece1dafe6c15d7105ca6', filename='fast_neural_style_eccv16_starry_night.t7'), Model( name='Fast-Neural-Style (feathers)', - url='http://cs.stanford.edu/people/jcjohns/fast-neural-style/models/instance_norm/feathers.t7', + url=[ + 'https://cs.stanford.edu/people/jcjohns/fast-neural-style/models/instance_norm/feathers.t7', + 'https://dl.opencv.org/models/fast_neural_style_instance_norm_feathers.t7' + ], sha='9838007df750d483b5b5e90b92d76e8ada5a31c0', filename='fast_neural_style_instance_norm_feathers.t7'), Model( @@ -344,7 +373,10 @@ def handle_bad_download(self): filename='colorization_deploy_v2.prototxt'), Model( name='Colorization (caffemodel)', - url='http://eecs.berkeley.edu/~rich.zhang/projects/2016_colorization/files/demo_v2/colorization_release_v2.caffemodel', + url=[ + 'http://eecs.berkeley.edu/~rich.zhang/projects/2016_colorization/files/demo_v2/colorization_release_v2.caffemodel', + 'https://dl.opencv.org/models/colorization_release_v2.caffemodel' + ], sha='21e61293a3fa6747308171c11b6dd18a68a26e7f', filename='colorization_release_v2.caffemodel'), Model( @@ -375,7 +407,10 @@ def handle_bad_download(self): ]), Model( name='Faster-RCNN', # https://github.com/rbgirshick/py-faster-rcnn - url='https://dl.dropboxusercontent.com/s/o6ii098bu51d139/faster_rcnn_models.tgz?dl=0', + url=[ + 'https://dl.dropboxusercontent.com/s/o6ii098bu51d139/faster_rcnn_models.tgz?dl=0', + 'https://dl.opencv.org/models/faster_rcnn_models.tgz' + ], sha='51bca62727c3fe5d14b66e9331373c1e297df7d1', filename='faster_rcnn_models.tgz', sub=[ @@ -390,7 +425,10 @@ def handle_bad_download(self): ]), Model( name='R-FCN', # https://github.com/YuwenXiong/py-R-FCN - url='https://onedrive.live.com/download?cid=10B28C0E28BF7B83&resid=10B28C0E28BF7B83%215317&authkey=%21AIeljruhoLuail8', + url=[ + 'https://onedrive.live.com/download?cid=10B28C0E28BF7B83&resid=10B28C0E28BF7B83%215317&authkey=%21AIeljruhoLuail8', + 'https://dl.opencv.org/models/rfcn_models.tar.gz' + ], sha='bb3180da68b2b71494f8d3eb8f51b2d47467da3e', filename='rfcn_models.tar.gz', sub=[ @@ -401,12 +439,18 @@ def handle_bad_download(self): ]), Model( name='OpenPose/pose/coco', # https://github.com/CMU-Perceptual-Computing-Lab/openpose - url='http://posefs1.perception.cs.cmu.edu/OpenPose/models/pose/coco/pose_iter_440000.caffemodel', + url=[ + 'http://posefs1.perception.cs.cmu.edu/OpenPose/models/pose/coco/pose_iter_440000.caffemodel', + 'https://dl.opencv.org/models/openpose_pose_coco.caffemodel' + ], sha='ac7e97da66f3ab8169af2e601384c144e23a95c1', filename='openpose_pose_coco.caffemodel'), Model( name='OpenPose/pose/mpi', # https://github.com/CMU-Perceptual-Computing-Lab/openpose - url='http://posefs1.perception.cs.cmu.edu/OpenPose/models/pose/mpi/pose_iter_160000.caffemodel', + url=[ + 'http://posefs1.perception.cs.cmu.edu/OpenPose/models/pose/mpi/pose_iter_160000.caffemodel', + 'https://dl.opencv.org/models/openpose_pose_mpi.caffemodel' + ], sha='a344f4da6b52892e44a0ca8a4c68ee605fc611cf', filename='openpose_pose_mpi.caffemodel'), Model( @@ -557,7 +601,10 @@ def handle_bad_download(self): ]), Model( name='ResNet-18v1 (ONNX)', - url='https://github.com/onnx/models/raw/69c5d3751dda5349fd3fc53f525395d180420c07/vision/classification/resnet/model/resnet18-v1-7.tar.gz', + url=[ + 'https://github.com/onnx/models/raw/69c5d3751dda5349fd3fc53f525395d180420c07/vision/classification/resnet/model/resnet18-v1-7.tar.gz', + 'https://dl.opencv.org/models/resnet18v1.tar.gz' + ], sha='d132be4857d024de9caa21fd5300dee7c063bc35', filename='resnet18v1.tar.gz', sub=[ @@ -576,7 +623,10 @@ def handle_bad_download(self): ]), Model( name='ResNet-50v1 (ONNX)', - url='https://github.com/onnx/models/raw/69c5d3751dda5349fd3fc53f525395d180420c07/vision/classification/resnet/model/resnet50-v1-7.tar.gz', + url=[ + 'https://github.com/onnx/models/raw/69c5d3751dda5349fd3fc53f525395d180420c07/vision/classification/resnet/model/resnet50-v1-7.tar.gz', + 'https://dl.opencv.org/models/resnet50v1.tar.gz' + ], sha='a4ac2da7e0024d61fdb80481496ba966b48b9fea', filename='resnet50v1.tar.gz', sub=[ @@ -612,10 +662,13 @@ def handle_bad_download(self): sha='6d45d2f06150e9045631c7928093728b07c8b12d', filename='onnx/data/output_resnet50_int8.pb'), ]), - + # TODO: bad file Model( name='ResNet101_DUC_HDC (ONNX)', - url='https://github.com/onnx/models/raw/69c5d3751dda5349fd3fc53f525395d180420c07/vision/classification/resnet/model/resnet101-v1-7.tar.gz', + url=[ + 'https://github.com/onnx/models/raw/69c5d3751dda5349fd3fc53f525395d180420c07/vision/classification/resnet/model/resnet101-v1-7.tar.gz', + 'https://dl.opencv.org/models/ResNet101_DUC_HDC.tar.gz' + ], sha='f8314f381939d01045ac31dbb53d7d35fe3ff9a0', filename='ResNet101_DUC_HDC.tar.gz', sub=[ @@ -859,7 +912,10 @@ def handle_bad_download(self): filename='yolov4x-mish.weights'), Model( name='GSOC2016-GOTURN', # https://github.com/opencv/opencv_contrib/issues/941 - gdrive='1j4UTqVE4EGaUFiK7a5I_CYX7twO9c5br', + url=[ + 'https://docs.google.com/uc?export=download&id=1j4UTqVE4EGaUFiK7a5I_CYX7twO9c5br', + 'https://dl.opencv.org/models/goturn.caffemodel' + ], sha='49776d262993c387542f84d9cd16566840404f26', filename='gsoc2016-goturn/goturn.caffemodel'), Model( @@ -933,9 +989,21 @@ def handle_bad_download(self): filename='wechat_2021-01/sr.caffemodel'), Model( name='yolov7_not_simplified', - gdrive='1rm3mIqjJNu0xPTCjMKnXccspazV1B2zv', + url=[ + 'https://docs.google.com/uc?export=download&id=1ljSh81ydO5ylsnDoV_mt3zj5RX_cgLu8', + 'https://dl.opencv.org/models/yolov7/yolov7_not_simplified.onnx' + ], sha='fcd0fa401c83bf2b29e18239a9c2c989c9b8669d', filename='onnx/models/yolov7_not_simplified.onnx'), + Model( + name='yolox_s_inf_decoder', + url=[ + 'https://drive.google.com/u/0/uc?id=12dVy3ob7T4fYHOkLYnrpUmlysq6JEc5P&export=download', + 'https://dl.opencv.org/models/yolox/yolox_s_inf_decoder.onnx' + ], + sha='b205b00122cc7bf559a0e845680408320df3a898', + filename='onnx/models/yolox_s_inf_decoder.onnx' + ), Model( name='NanoTrackV1 (ONNX, backbone)', url='https://raw.githubusercontent.com/zihaomu/opencv_extra_data_backup/main/NanoTrack/models/nanotrack_backbone_sim.onnx', @@ -1086,8 +1154,8 @@ def handle_bad_download(self): # List models if args.list: - for m in filtered: - print(m.name) + for mdl in filtered: + print(mdl.name) exit() # Destination directory @@ -1098,17 +1166,19 @@ def handle_bad_download(self): os.chdir(dest) # Actual download + proc = Processor(reference=ref) results = dict() - for m in filtered: - results[m] = m.get(ref=ref) - print("* OK" if results[m] else "* FAIL") + for mdl in filtered: + t = time.time() + results[mdl] = proc.get(mdl) + print("* {} ({:.2f} sec)".format("OK" if results[mdl] else "FAIL", time.time() - t)) # Result handling - for (m, res) in results.items(): - if args.cleanup and res: - m.cleanup() + for (mdl, res) in results.items(): + if args.cleanup and res and mdl.is_archive(): + proc.cleanup(mdl.filename) if not res: - print("FAILED: {} - {}".format(m.name, m.filename)) + print("FAILED: {} - {}".format(mdl.name, mdl.filename)) if list(results.values()).count(False) > 0: exit(15) else: From 577348c685aa0760d3e2d58f55d34d92c1cfb880 Mon Sep 17 00:00:00 2001 From: Maksim Shabunin Date: Fri, 1 Dec 2023 19:05:08 +0300 Subject: [PATCH 09/12] fixup! Refactored download_models.py - split functionality - support multiple URLs - reduce output - support new yolo models --- testdata/dnn/download_models.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/testdata/dnn/download_models.py b/testdata/dnn/download_models.py index cb5491dde..e95825ec8 100755 --- a/testdata/dnn/download_models.py +++ b/testdata/dnn/download_models.py @@ -1002,8 +1002,17 @@ def is_archive(self): 'https://dl.opencv.org/models/yolox/yolox_s_inf_decoder.onnx' ], sha='b205b00122cc7bf559a0e845680408320df3a898', - filename='onnx/models/yolox_s_inf_decoder.onnx' - ), + filename='onnx/models/yolox_s_inf_decoder.onnx'), + Model( + name='yolov6n', + url='https://dl.opencv.org/models/yolov6/yolov6n.onnx', + sha='a704c0ace51103a43920c50a396b2c8b09d2daec', + filename='onnx/models/yolov6n.onnx'), + Model( + name='yolov8n', + url='https://dl.opencv.org/models/yolov8/yolov8n.onnx', + sha='136807b88d0b02bc226bdeb9741141d857752e10', + filename='onnx/models/yolov8n.onnx'), Model( name='NanoTrackV1 (ONNX, backbone)', url='https://raw.githubusercontent.com/zihaomu/opencv_extra_data_backup/main/NanoTrack/models/nanotrack_backbone_sim.onnx', From b94ede6d825d315189ef510fe4eb3857eaa6f0c5 Mon Sep 17 00:00:00 2001 From: fengyuentau Date: Thu, 23 Nov 2023 18:30:15 +0800 Subject: [PATCH 10/12] add model and data --- testdata/dnn/download_models.py | 15 + testdata/dnn/onnx/data/input_attention.npy | Bin 0 -> 61568 bytes .../onnx/data/input_attention_single_head.npy | Bin 0 -> 61568 bytes testdata/dnn/onnx/data/output_attention.npy | Bin 0 -> 61568 bytes .../data/output_attention_single_head.npy | Bin 0 -> 61568 bytes ...put_object_tracking_vittrack_2023sep_0.npy | Bin 0 -> 1152 bytes ...put_object_tracking_vittrack_2023sep_1.npy | Bin 0 -> 2176 bytes ...put_object_tracking_vittrack_2023sep_2.npy | Bin 0 -> 2176 bytes testdata/dnn/onnx/data/output_vit_b_32.npy | Bin 0 -> 4128 bytes .../generate_onnx_models_with_onnxscript.py | 329 +++++++++++++----- testdata/dnn/onnx/models/attention.onnx | Bin 0 -> 31225 bytes .../onnx/models/attention_single_head.onnx | Bin 0 -> 30674 bytes 12 files changed, 259 insertions(+), 85 deletions(-) create mode 100644 testdata/dnn/onnx/data/input_attention.npy create mode 100644 testdata/dnn/onnx/data/input_attention_single_head.npy create mode 100644 testdata/dnn/onnx/data/output_attention.npy create mode 100644 testdata/dnn/onnx/data/output_attention_single_head.npy create mode 100644 testdata/dnn/onnx/data/output_object_tracking_vittrack_2023sep_0.npy create mode 100644 testdata/dnn/onnx/data/output_object_tracking_vittrack_2023sep_1.npy create mode 100644 testdata/dnn/onnx/data/output_object_tracking_vittrack_2023sep_2.npy create mode 100644 testdata/dnn/onnx/data/output_vit_b_32.npy create mode 100644 testdata/dnn/onnx/models/attention.onnx create mode 100644 testdata/dnn/onnx/models/attention_single_head.onnx diff --git a/testdata/dnn/download_models.py b/testdata/dnn/download_models.py index e95825ec8..c6c0338a6 100755 --- a/testdata/dnn/download_models.py +++ b/testdata/dnn/download_models.py @@ -1131,6 +1131,21 @@ def is_archive(self): url='https://github.com/opencv/opencv_zoo/raw/281d232cd99cd920853106d853c440edd35eb442/models/optical_flow_estimation_raft/optical_flow_estimation_raft_2023aug.onnx', sha='8165e43c7bd37cc651f66509532acdb3c292832b', filename='onnx/models/optical_flow_estimation_raft_2023aug.onnx'), + Model( + name='vit_b_32', + url=[ + 'https://drive.google.com/u/0/uc?id=1UEeAyBs76XVkypk56ou7B8rBEIAlirkD&export=download', # See https://github.com/opencv/opencv_extra/pull/1128 to generate this model from torchvision + 'https://dl.opencv.org/models/vit/vit_b_32.onnx', + ], + sha='88144dca52cf3c6fee3aed8f8ca5c0b431e0afbd', + filename='onnx/models/vit_b_32.onnx'), + Model( + name='object_tracking_vittrack', + url=[ + 'https://github.com/opencv/opencv_zoo/raw/fef72f8fa7c52eaf116d3df358d24e6e959ada0e/models/object_tracking_vittrack/object_tracking_vittrack_2023sep.onnx', + ], + sha='50008bb4f6a27b1aa940ad886b1bd1936ac4ed3e', + filename='onnx/models/object_tracking_vittrack_2023sep.onnx'), ] # Note: models will be downloaded to current working directory diff --git a/testdata/dnn/onnx/data/input_attention.npy b/testdata/dnn/onnx/data/input_attention.npy new file mode 100644 index 0000000000000000000000000000000000000000..48dfe7efefea710d479d807f5964017f72eb8795 GIT binary patch literal 61568 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 BNe=)3 literal 0 HcmV?d00001 diff --git a/testdata/dnn/onnx/data/output_attention.npy b/testdata/dnn/onnx/data/output_attention.npy new file mode 100644 index 0000000000000000000000000000000000000000..405063a6c71786d53a25518d4c50175f41143e3d GIT binary patch literal 61568 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 literal 0 HcmV?d00001 diff --git a/testdata/dnn/onnx/data/output_object_tracking_vittrack_2023sep_0.npy b/testdata/dnn/onnx/data/output_object_tracking_vittrack_2023sep_0.npy new file mode 100644 index 0000000000000000000000000000000000000000..6360992c7badb6c370b53c9b67b540d20e868b61 GIT binary patch literal 1152 zcmb7C{ZEy36hE$6SDSQawD2t-!g;SrQxcK;ob%DgsfZbNSD{ijk?^IwGsA0Y-Vrs>l}}R2Fp><>8FM#>NoI1>6t!GE{t2C(^TX$}^YS@6XZwPT zH22~`w3dn;**OI({0?1nNN%DdUUTHG_80oI-d?uapPloFPsz$J$g%i>yewaig`ElU z+9OYT6cggL677H6P#U+1DK?~2QVJ`Vm(39sY})oQZTN@5B-|S( zW=EoEr6T6^siJaUXIhcK##fcxxz>(*AHR&?utH={+=%si>ri$mgxRT|!8mvr$@i;3 zUAqt{s6}(zLb!jpBIN0_YB#gdVw1>=vtj?X5HV-oL+ETRCJ$_a@6blX%qv0s(o%S~ zl*90Uh+0nr+MKHpxpQC417}!mn#o4{Va^<5&5wNn7kA8nc_|a#f+?_{8ivg47QZh6 zHMetcv2hRbm$abt@>Wb6P^{AN7uNU*FA_*7Gmq0i} zBB!gwJF;2ar>7%)V-LKJI)rF3RQ>>~8)KNx&0_DdMyWqb@V#V;@y7vaULOsb(;?dN zy<)_EF5a$6srmCsth@Ru+WOu_S;`wQ6YsLIbO)Qmd)T~?1-kEtZG17*%@jn3to`fW zf$yiWsIMK2NZMKP`k#Y&(~X*jC7{P=gML5H<{iZ<)WXfNF8IF4fNgs&v|Ul?>?}w6 zE1Thr%Y!|+2p5Nzz>~HSk?uO|AH5sy;&cQi*u+?ToYn5Xxp{OFjP0WkJdg}~!#Kp0 zFN80+2-=UY!Khq`-ii${!dswzZovMuAnNC2L-j|CIu+)czup&n-Z(^xo5WsqK~(EG z2|j!l+Msv@r&*fwC!w!#Irjg$4Ux_udRFX3aKO6LoG76vlhvomVjtWg)ILeV2^nI{ ztCYY$?c!@_5^esMLL=J6{>gas_2eTvsS!OaD& zw~STicWkD2vsyP%wDBUHYs$s_pkK-}Rr!RNT~13^zPML6N@VVD5*qrosN=<~R#mXkdW%)uT&ALGohqz< z!ZlrW3saPJTiXD8yJLiITRLoRaSz!bfw#7ZZ^#Kzmy?*@4Cpj7s8iv9i)wefsJ_`n p-}k#H)uYqlqdG0RrPJugm`*&5F? literal 0 HcmV?d00001 diff --git a/testdata/dnn/onnx/data/output_object_tracking_vittrack_2023sep_1.npy b/testdata/dnn/onnx/data/output_object_tracking_vittrack_2023sep_1.npy new file mode 100644 index 0000000000000000000000000000000000000000..c92b5b197ca557509f91f2b8d6eb08821dffca9e GIT binary patch literal 2176 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 J`JB+N^f#8@#KZsq literal 0 HcmV?d00001 diff --git a/testdata/dnn/onnx/data/output_vit_b_32.npy b/testdata/dnn/onnx/data/output_vit_b_32.npy new file mode 100644 index 0000000000000000000000000000000000000000..eee2ec36d8dfda08dff2c46e0605b2e16fa1f701 GIT binary patch literal 4128 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 literal 0 HcmV?d00001 diff --git a/testdata/dnn/onnx/generate_onnx_models_with_onnxscript.py b/testdata/dnn/onnx/generate_onnx_models_with_onnxscript.py index 8fadd6896..0ce1ef109 100644 --- a/testdata/dnn/onnx/generate_onnx_models_with_onnxscript.py +++ b/testdata/dnn/onnx/generate_onnx_models_with_onnxscript.py @@ -43,99 +43,258 @@ def make_model_and_data(model, *args, **kwargs): output_files = os.path.join("data", "output_" + name) np.save(output_files, output) -''' - It builds a model with two Gather ops sharing a single same indices: +# ''' +# It builds a model with two Gather ops sharing a single same indices: + +# [Input] -> Gather(indices=0) -> Gather(indices=0) -> [Output] + +# , where the two indices constants have the same name. +# ''' +# @ost.script() +# def gather_shared_indices(x: ost.FLOAT[2, 1, 3, 4]) -> ost.FLOAT[3, 4]: +# indices = op.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.INT64, [], np.array([0], dtype=np.int64))) +# y0 = op.Gather(x, indices, axis=0) +# y1 = op.Gather(y0, indices, axis=0) +# return y1 +# make_model_and_data(gather_shared_indices, np.random.rand(2, 1, 3, 4).astype(np.float32)) + +# ''' +# [Input] -> Greater(B=61) -> [Output] +# \ +# dtype=np.int64 +# ''' +# @ost.script() +# def greater_input_dtype_int64(x: ost.FLOAT[27, 9]) ->ost.BOOL[27, 9]: +# y = op.Greater(x, op.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.INT64, [], np.array([61], dtype=np.int64)))) +# return y +# make_model_and_data(greater_input_dtype_int64, np.random.randint(0, 100, size=[27, 9], dtype=np.int64), force_saving_input_as_dtype_float32=True, force_saving_output_as_dtype_float32=True) + +# from onnxscript import opset11 + +# @ost.script() +# def two_resizes_with_shared_subgraphs(x: ost.FLOAT["batch", 1, "height", "width"], y: ost.FLOAT[1, 1, 3, 2], z: ost.FLOAT[1, 1, 2, 1]) ->ost.FLOAT["batch", 1, "height", "width"]: +# shape_src_1 = opset11.Shape(x) +# shape_src_2 = opset11.Shape(x) +# gather_h = opset11.Gather(shape_src_1, opset11.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.INT64, [], np.array([2], dtype=np.int64))), axis=0) +# gather_w = opset11.Gather(shape_src_2, opset11.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.INT64, [], np.array([3], dtype=np.int64))), axis=0) +# unsqueeze_w_1 = opset11.Unsqueeze(gather_w, axes=[0]) +# unsqueeze_w_2 = opset11.Unsqueeze(gather_w, axes=[0]) +# unsqueeze_h_1 = opset11.Unsqueeze(gather_h, axes=[0]) +# unsqueeze_h_2 = opset11.Unsqueeze(gather_h, axes=[0]) +# concat_1 = opset11.Cast(opset11.Concat(unsqueeze_h_1, unsqueeze_w_1, axis=0), to=ost.INT64.dtype) +# concat_2 = opset11.Cast(opset11.Concat(unsqueeze_h_2, unsqueeze_w_2, axis=0), to=ost.INT64.dtype) + +# # This op is required to test double node removal +# y = opset11.Add(y, opset11.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.FLOAT, [1], np.array([0.5], dtype=np.float32)))) + +# # First branch +# sliced = opset11.Slice(opset11.Shape(y), +# starts=opset11.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.INT64, [1], np.array([0], dtype=np.int64))), +# ends=opset11.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.INT64, [1], np.array([2], dtype=np.int64))), +# axes=opset11.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.INT64, [1], np.array([0], dtype=np.int64))), +# ) +# concat_y = opset11.Concat(sliced, concat_1, axis=0) +# resized_y = opset11.Resize(y, +# roi=opset11.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.FLOAT, [0], np.empty([0]))), +# scales=opset11.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.FLOAT, [0], np.empty([0]))), +# sizes=concat_y, +# coordinate_transformation_mode='pytorch_half_pixel', +# cubic_coeff_a=-0.75, +# mode='linear', +# nearest_mode='floor' +# ) - [Input] -> Gather(indices=0) -> Gather(indices=0) -> [Output] +# # Second branch +# sliced = opset11.Slice(opset11.Shape(z), +# starts=opset11.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.INT64, [1], np.array([0], dtype=np.int64))), +# ends=opset11.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.INT64, [1], np.array([2], dtype=np.int64))), +# axes=opset11.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.INT64, [1], np.array([0], dtype=np.int64))), +# ) +# concat_z = opset11.Concat(sliced, concat_2, axis=0) +# resized_z = opset11.Resize(z, +# roi=opset11.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.FLOAT, [0], np.empty([0]))), +# scales=opset11.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.FLOAT, [0], np.empty([0]))), +# sizes=concat_z, +# coordinate_transformation_mode='pytorch_half_pixel', +# cubic_coeff_a=-0.75, +# mode='linear', +# nearest_mode='floor' +# ) + +# return opset11.Add(resized_y, resized_z) + +# make_model_and_data(two_resizes_with_shared_subgraphs, np.random.rand(1, 1, 4, 5).astype(np.float32), np.random.rand(1, 1, 3, 2).astype(np.float32), np.random.rand(1, 1, 2, 1).astype(np.float32)) + + +# @ost.script() +# def bias_gelu(x: ost.FLOAT[1, 2, 3]) -> ost.FLOAT[1, 2, 3]: +# bias = op.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.FLOAT, [3], np.array([0.1, 0.3, 0.2], dtype=np.float32))) +# add1 = op.Add(x, bias) +# tmp = op.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.FLOAT, [], np.array([np.sqrt(2)], dtype=np.float32))) +# div = op.Div(add1, tmp) +# erf = op.Erf(div) +# tmp_0 = op.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.FLOAT, [], np.array([1], dtype=np.float32))) +# add2 = op.Add(erf, tmp_0) +# mul = op.Mul(add1, add2) +# tmp_1 = op.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.FLOAT, [], np.array([0.5], dtype=np.float32))) +# return op.Mul(mul, tmp_1) + +# make_model_and_data(bias_gelu, np.random.rand(1, 2, 3).astype(np.float32)) + +batch_size = 1 +sequence_length = 320 +input_hidden_size = 48 +qk_hidden_size = 48 +v_hidden_size = 48 +num_heads = 4 +qk_head_size = int(qk_hidden_size / num_heads) +v_head_size = int(v_hidden_size / num_heads) +attention_weight = np.random.rand(input_hidden_size, qk_hidden_size + qk_hidden_size + v_hidden_size).astype(np.float32) +attention_bias = np.random.rand(qk_hidden_size + qk_hidden_size + v_hidden_size).astype(np.float32) + +''' + Attention Subgraph. - , where the two indices constants have the same name. + [Input](BxSxW) + | + LayerNorm + | + Transpose(perm=[1, 0, 2]) + | + | (SxBxW) + | + Matmul[Weight(Wx3W)] + | + Add[Bias(3W)] + / | \ + q_Slice k_Slice v_Slice (output(SxBxW)) + | | | + q_Reshape k_Reshape v_Reshape (output(Sx(BxN)xH), could be optional if N=1) + | | | + q_Transpose k_Transpose v_Transpose + (1,0,2) (1,2,0) (perm=1,0,2) + |((BxN)xSxH) |((BxN)xHxS) | + q_Div / / + \ / / + qk_MatMul / + | / + qk_Softmax / + | ((BxN)xSxS) / ((BxN)xSxH) + \ / + qkv_MatMul (output((BxN)xSxH)) + | + Transpose(perm=1,2,0) + | + Reshape (output(SxH)) + | + MatMul + | + Add + | + [Output](BxSxW) ''' + @ost.script() -def gather_shared_indices(x: ost.FLOAT[2, 1, 3, 4]) -> ost.FLOAT[3, 4]: - indices = op.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.INT64, [], np.array([0], dtype=np.int64))) - y0 = op.Gather(x, indices, axis=0) - y1 = op.Gather(y0, indices, axis=0) - return y1 -make_model_and_data(gather_shared_indices, np.random.rand(2, 1, 3, 4).astype(np.float32)) +def attention(x: ost.FLOAT[batch_size, sequence_length, input_hidden_size]) -> ost.FLOAT[batch_size, sequence_length, input_hidden_size]: + transpose = op.Transpose(x, perm=[1, 0, 2]) + qkv_matmul_weight = op.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.FLOAT, attention_weight.shape, attention_weight)) + qkv_matmul = op.MatMul(transpose, qkv_matmul_weight) + + qkv_add_bias = op.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.FLOAT, attention_bias.shape, attention_bias)) + qkv_add = op.Add(qkv_add_bias, qkv_matmul) + + # q path + q_path_slice = op.Slice(qkv_add, + op.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.INT64, [1], np.array([0], dtype=np.int64))), + op.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.INT64, [1], np.array([qk_hidden_size], dtype=np.int64))), + op.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.INT64, [1], np.array([-1], dtype=np.int64)))) + q_path_reshape = op.Reshape(q_path_slice, op.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.INT64, [3], np.array([sequence_length, batch_size * num_heads, qk_head_size], dtype=np.int64))), allowzero=0) + q_path_transpose = op.Transpose(q_path_reshape, perm=[1, 0, 2]) + q_path_div = op.Div(q_path_transpose, op.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.FLOAT, [], np.array([np.sqrt(qk_hidden_size)], dtype=np.float32)))) + # k path + k_path_slice = op.Slice(qkv_add, + op.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.INT64, [1], np.array([qk_hidden_size], dtype=np.int64))), + op.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.INT64, [1], np.array([qk_hidden_size + qk_hidden_size], dtype=np.int64))), + op.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.INT64, [1], np.array([-1], dtype=np.int64)))) + k_path_reshape = op.Reshape(k_path_slice, op.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.INT64, [3], np.array([sequence_length, batch_size * num_heads, qk_head_size], dtype=np.int64))), allowzero=0) + k_path_transpose = op.Transpose(k_path_reshape, perm=[1, 2, 0]) + + # qk path + qk_matmul = op.MatMul(q_path_div, k_path_transpose) + qk_softmax = op.Softmax(qk_matmul, axis=-1) + + # v path + v_path_slice = op.Slice(qkv_add, + op.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.INT64, [1], np.array([qk_hidden_size + qk_hidden_size], dtype=np.int64))), + op.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.INT64, [1], np.array([qk_hidden_size + qk_hidden_size + v_hidden_size], dtype=np.int64))), + op.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.INT64, [1], np.array([-1], dtype=np.int64)))) + v_path_reshape = op.Reshape(v_path_slice, op.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.INT64, [3], np.array([sequence_length, batch_size * num_heads, v_head_size], dtype=np.int64))), allowzero=0) + v_path_transpose = op.Transpose(v_path_reshape, perm=[1, 0, 2]) + + # matmul + matmul = op.MatMul(qk_softmax, v_path_transpose) + trans = op.Transpose(matmul, perm=[1, 0, 2]) + reshape = op.Reshape(trans, op.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.INT64, [3], np.array([batch_size, sequence_length, v_hidden_size], dtype=np.int64)))) + + return reshape + +make_model_and_data(attention, np.random.rand(batch_size, sequence_length, input_hidden_size).astype(np.float32)) + +batch_size = 1 +sequence_length = 320 +input_hidden_size = 48 +qk_hidden_size = 48 +v_hidden_size = 48 +num_heads = 1 +qk_head_size = int(qk_hidden_size / num_heads) +v_head_size = int(v_hidden_size / num_heads) +attention_weight = np.random.rand(input_hidden_size, qk_hidden_size + qk_hidden_size + v_hidden_size).astype(np.float32) +attention_bias = np.random.rand(qk_hidden_size + qk_hidden_size + v_hidden_size).astype(np.float32) ''' - [Input] -> Greater(B=61) -> [Output] - \ - dtype=np.int64 + Single-head attention subgraph like the above one but without the appended Reshape after each Slice. + Also v_Slice.end = INT64_MAX which stands for slicing till the end of dimension of the actual tensor. ''' + @ost.script() -def greater_input_dtype_int64(x: ost.FLOAT[27, 9]) ->ost.BOOL[27, 9]: - y = op.Greater(x, op.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.INT64, [], np.array([61], dtype=np.int64)))) - return y -make_model_and_data(greater_input_dtype_int64, np.random.randint(0, 100, size=[27, 9], dtype=np.int64), force_saving_input_as_dtype_float32=True, force_saving_output_as_dtype_float32=True) +def attention_single_head(x: ost.FLOAT[batch_size, sequence_length, input_hidden_size]) -> ost.FLOAT[batch_size, sequence_length, input_hidden_size]: + transpose = op.Transpose(x, perm=[1, 0, 2]) + qkv_matmul_weight = op.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.FLOAT, attention_weight.shape, attention_weight)) + qkv_matmul = op.MatMul(transpose, qkv_matmul_weight) -from onnxscript import opset11 + qkv_add_bias = op.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.FLOAT, attention_bias.shape, attention_bias)) + qkv_add = op.Add(qkv_add_bias, qkv_matmul) -@ost.script() -def two_resizes_with_shared_subgraphs(x: ost.FLOAT["batch", 1, "height", "width"], y: ost.FLOAT[1, 1, 3, 2], z: ost.FLOAT[1, 1, 2, 1]) ->ost.FLOAT["batch", 1, "height", "width"]: - shape_src_1 = opset11.Shape(x) - shape_src_2 = opset11.Shape(x) - gather_h = opset11.Gather(shape_src_1, opset11.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.INT64, [], np.array([2], dtype=np.int64))), axis=0) - gather_w = opset11.Gather(shape_src_2, opset11.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.INT64, [], np.array([3], dtype=np.int64))), axis=0) - unsqueeze_w_1 = opset11.Unsqueeze(gather_w, axes=[0]) - unsqueeze_w_2 = opset11.Unsqueeze(gather_w, axes=[0]) - unsqueeze_h_1 = opset11.Unsqueeze(gather_h, axes=[0]) - unsqueeze_h_2 = opset11.Unsqueeze(gather_h, axes=[0]) - concat_1 = opset11.Cast(opset11.Concat(unsqueeze_h_1, unsqueeze_w_1, axis=0), to=ost.INT64.dtype) - concat_2 = opset11.Cast(opset11.Concat(unsqueeze_h_2, unsqueeze_w_2, axis=0), to=ost.INT64.dtype) - - # This op is required to test double node removal - y = opset11.Add(y, opset11.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.FLOAT, [1], np.array([0.5], dtype=np.float32)))) - - # First branch - sliced = opset11.Slice(opset11.Shape(y), - starts=opset11.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.INT64, [1], np.array([0], dtype=np.int64))), - ends=opset11.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.INT64, [1], np.array([2], dtype=np.int64))), - axes=opset11.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.INT64, [1], np.array([0], dtype=np.int64))), - ) - concat_y = opset11.Concat(sliced, concat_1, axis=0) - resized_y = opset11.Resize(y, - roi=opset11.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.FLOAT, [0], np.empty([0]))), - scales=opset11.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.FLOAT, [0], np.empty([0]))), - sizes=concat_y, - coordinate_transformation_mode='pytorch_half_pixel', - cubic_coeff_a=-0.75, - mode='linear', - nearest_mode='floor' - ) - - # Second branch - sliced = opset11.Slice(opset11.Shape(z), - starts=opset11.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.INT64, [1], np.array([0], dtype=np.int64))), - ends=opset11.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.INT64, [1], np.array([2], dtype=np.int64))), - axes=opset11.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.INT64, [1], np.array([0], dtype=np.int64))), - ) - concat_z = opset11.Concat(sliced, concat_2, axis=0) - resized_z = opset11.Resize(z, - roi=opset11.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.FLOAT, [0], np.empty([0]))), - scales=opset11.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.FLOAT, [0], np.empty([0]))), - sizes=concat_z, - coordinate_transformation_mode='pytorch_half_pixel', - cubic_coeff_a=-0.75, - mode='linear', - nearest_mode='floor' - ) - - return opset11.Add(resized_y, resized_z) - -make_model_and_data(two_resizes_with_shared_subgraphs, np.random.rand(1, 1, 4, 5).astype(np.float32), np.random.rand(1, 1, 3, 2).astype(np.float32), np.random.rand(1, 1, 2, 1).astype(np.float32)) + # q path + q_path_slice = op.Slice(qkv_add, + op.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.INT64, [1], np.array([0], dtype=np.int64))), + op.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.INT64, [1], np.array([qk_hidden_size], dtype=np.int64))), + op.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.INT64, [1], np.array([-1], dtype=np.int64)))) + q_path_transpose = op.Transpose(q_path_slice, perm=[1, 0, 2]) + q_path_div = op.Div(q_path_transpose, op.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.FLOAT, [], np.array([np.sqrt(qk_hidden_size)], dtype=np.float32)))) + # k path + k_path_slice = op.Slice(qkv_add, + op.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.INT64, [1], np.array([qk_hidden_size], dtype=np.int64))), + op.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.INT64, [1], np.array([qk_hidden_size + qk_hidden_size], dtype=np.int64))), + op.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.INT64, [1], np.array([-1], dtype=np.int64)))) + k_path_transpose = op.Transpose(k_path_slice, perm=[1, 2, 0]) -@ost.script() -def bias_gelu(x: ost.FLOAT[1, 2, 3]) -> ost.FLOAT[1, 2, 3]: - bias = op.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.FLOAT, [3], np.array([0.1, 0.3, 0.2], dtype=np.float32))) - add1 = op.Add(x, bias) - tmp = op.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.FLOAT, [], np.array([np.sqrt(2)], dtype=np.float32))) - div = op.Div(add1, tmp) - erf = op.Erf(div) - tmp_0 = op.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.FLOAT, [], np.array([1], dtype=np.float32))) - add2 = op.Add(erf, tmp_0) - mul = op.Mul(add1, add2) - tmp_1 = op.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.FLOAT, [], np.array([0.5], dtype=np.float32))) - return op.Mul(mul, tmp_1) - -make_model_and_data(bias_gelu, np.random.rand(1, 2, 3).astype(np.float32)) + # qk path + qk_matmul = op.MatMul(q_path_div, k_path_transpose) + qk_softmax = op.Softmax(qk_matmul, axis=-1) + + # v path + v_path_slice = op.Slice(qkv_add, + op.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.INT64, [1], np.array([qk_hidden_size + qk_hidden_size], dtype=np.int64))), + op.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.INT64, [1], np.array([np.iinfo(np.int64).max], dtype=np.int64))), + op.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.INT64, [1], np.array([-1], dtype=np.int64)))) + v_path_transpose = op.Transpose(v_path_slice, perm=[1, 0, 2]) + + # matmul + matmul = op.MatMul(qk_softmax, v_path_transpose) + trans = op.Transpose(matmul, perm=[1, 0, 2]) + reshape = op.Reshape(trans, op.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.INT64, [3], np.array([batch_size, sequence_length, v_hidden_size], dtype=np.int64)))) + + return reshape + +make_model_and_data(attention_single_head, np.random.rand(batch_size, sequence_length, input_hidden_size).astype(np.float32)) diff --git a/testdata/dnn/onnx/models/attention.onnx b/testdata/dnn/onnx/models/attention.onnx new file mode 100644 index 0000000000000000000000000000000000000000..0828623d0e9f5823d39a1d6f087037079a63ae6a GIT binary patch literal 31225 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 literal 0 HcmV?d00001 diff --git a/testdata/dnn/onnx/models/attention_single_head.onnx b/testdata/dnn/onnx/models/attention_single_head.onnx new file mode 100644 index 0000000000000000000000000000000000000000..f112e87d022cf63a5cfc14c6c43cfdb6c151e88f GIT binary patch literal 30674 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 Date: Fri, 22 Dec 2023 17:24:03 +0530 Subject: [PATCH 11/12] Merge pull request #1112 from Dhanwanth1803:feat-crop1 added testdata for crop #24384 #1112 --------- Co-authored-by: Dhanwanth1803 Co-authored-by: Dmitry Kurtaev --- testdata/dnn/darknet/crop.cfg | 13 +++++++++++++ testdata/dnn/darknet/crop_in.npy | Bin 0 -> 488 bytes testdata/dnn/darknet/crop_out.npy | Bin 0 -> 200 bytes testdata/dnn/darknet/generate_darknet_models.py | 2 +- 4 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 testdata/dnn/darknet/crop.cfg create mode 100644 testdata/dnn/darknet/crop_in.npy create mode 100644 testdata/dnn/darknet/crop_out.npy diff --git a/testdata/dnn/darknet/crop.cfg b/testdata/dnn/darknet/crop.cfg new file mode 100644 index 000000000..6020056e8 --- /dev/null +++ b/testdata/dnn/darknet/crop.cfg @@ -0,0 +1,13 @@ +[net] +batch=1 +channels=3 +height=5 +width=6 + +[crop] +crop_height=2 +crop_width=3 +flip=1 +exposure=1 +saturation=1 +angle=0 diff --git a/testdata/dnn/darknet/crop_in.npy b/testdata/dnn/darknet/crop_in.npy new file mode 100644 index 0000000000000000000000000000000000000000..06478c7b7a68763630d7563430738b49b4f9133f GIT binary patch literal 488 zcmbR27wQ`j$;eQ~P_3SlTAW;@Zl$1ZlV+l>qoAIaUsO_*m=~X4l#&V(cT3DEP6dh= zXCxM+0{I$-Its=*3Z^;=W|}$*wF+baF80t}HuvPr_m_Uu-uHav^L<|z8rk0pH?vK< z$7lcW@Q(dAI0Efc)B5&zDqpw%6j--!XSKxsW3C;xeosH|PhG{mKS}wWUEHlE`v)#7 z?5}fwv{n4DbiZNj!hKo{;`Wh7@%uvpSK1x$nPcw}s%H1%>D|4T_-yu9MjzW}_w1bg zi;FkyH4kw(uupzx@5q&8CvbSZeO}LneWr|B_FsY-9gf9&*cpfI*q1j`&i=GXlD#xH z$ANFN#O(Jj^WV3!RD9psrS0~83i|ff^9Aw0DgTx696Vc8GkTx&Otg t(|b=k&e(r{D*OJj=B@iK&suG7cFNjbI+x>stdP#Wb4?ceALg3d0|1Y0$jtx% literal 0 HcmV?d00001 diff --git a/testdata/dnn/darknet/crop_out.npy b/testdata/dnn/darknet/crop_out.npy new file mode 100644 index 0000000000000000000000000000000000000000..0b700919058e1e351f41335cfaa647080f14b0b0 GIT binary patch literal 200 zcmbR27wQ`j$;eQ~P_3SlTAW;@Zl$1ZlV+l>qoAIaUsO_*m=~X4l#&V(cT3DEP6dh= zXCxM+0{I$-Its=*3PwOuQ%9jzfegU)@NmU}4T4JcscC)(`rgIvU;b(40i&y|2d=QJ zuzRuG$wBsl^nPjX6$dt4H?dp)a`S$bcTer&PRkz Date: Mon, 25 Dec 2023 19:40:51 +0800 Subject: [PATCH 12/12] Merge pull request #1132 from fengyuentau:einsum_importer * undo comment * add model and data * update script --- .../onnx/data/input_einsum_const_inputs.npy | Bin 0 -> 320 bytes .../onnx/data/output_einsum_const_inputs.npy | Bin 0 -> 224 bytes .../generate_onnx_models_with_onnxscript.py | 206 +++++++++--------- .../dnn/onnx/models/einsum_const_inputs.onnx | Bin 0 -> 333 bytes 4 files changed, 109 insertions(+), 97 deletions(-) create mode 100644 testdata/dnn/onnx/data/input_einsum_const_inputs.npy create mode 100644 testdata/dnn/onnx/data/output_einsum_const_inputs.npy create mode 100644 testdata/dnn/onnx/models/einsum_const_inputs.onnx diff --git a/testdata/dnn/onnx/data/input_einsum_const_inputs.npy b/testdata/dnn/onnx/data/input_einsum_const_inputs.npy new file mode 100644 index 0000000000000000000000000000000000000000..5fe09d6444ead84e0da75dd3e97c2fcfb37936ce GIT binary patch literal 320 zcmbR27wQ`j$;eQ~P_3SlTAW;@Zl$1ZlV+l>qoAIaUsO_*m=~X4l#&V(cT3DEP6dh= zXCxM+0{I%oItoT$WTL5~P^&-&;Ia>&XSZ^9hh1})fqm?v#dZcsS++aZJg~XWn{97w zqoAIaUsO_*m=~X4l#&V(cT3DEP6dh= zXCxM+0{I%oItoS*q^YA&t3U?esuj<-Pp<2*7funhU-p^TKHA5{K0+nK{-|?_y?ctA z{U>2D`}t3G?O$x4Y+v>8xV=vJ9Q(tbW%e&8SK6EIX|dnYd(Pf>%QbtS)vWe{_I&p0 Uy=L}$i&^bW^Um4z>~63F0Nvj~%K!iX literal 0 HcmV?d00001 diff --git a/testdata/dnn/onnx/generate_onnx_models_with_onnxscript.py b/testdata/dnn/onnx/generate_onnx_models_with_onnxscript.py index 0ce1ef109..dc5942247 100644 --- a/testdata/dnn/onnx/generate_onnx_models_with_onnxscript.py +++ b/testdata/dnn/onnx/generate_onnx_models_with_onnxscript.py @@ -43,103 +43,103 @@ def make_model_and_data(model, *args, **kwargs): output_files = os.path.join("data", "output_" + name) np.save(output_files, output) -# ''' -# It builds a model with two Gather ops sharing a single same indices: - -# [Input] -> Gather(indices=0) -> Gather(indices=0) -> [Output] - -# , where the two indices constants have the same name. -# ''' -# @ost.script() -# def gather_shared_indices(x: ost.FLOAT[2, 1, 3, 4]) -> ost.FLOAT[3, 4]: -# indices = op.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.INT64, [], np.array([0], dtype=np.int64))) -# y0 = op.Gather(x, indices, axis=0) -# y1 = op.Gather(y0, indices, axis=0) -# return y1 -# make_model_and_data(gather_shared_indices, np.random.rand(2, 1, 3, 4).astype(np.float32)) - -# ''' -# [Input] -> Greater(B=61) -> [Output] -# \ -# dtype=np.int64 -# ''' -# @ost.script() -# def greater_input_dtype_int64(x: ost.FLOAT[27, 9]) ->ost.BOOL[27, 9]: -# y = op.Greater(x, op.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.INT64, [], np.array([61], dtype=np.int64)))) -# return y -# make_model_and_data(greater_input_dtype_int64, np.random.randint(0, 100, size=[27, 9], dtype=np.int64), force_saving_input_as_dtype_float32=True, force_saving_output_as_dtype_float32=True) - -# from onnxscript import opset11 - -# @ost.script() -# def two_resizes_with_shared_subgraphs(x: ost.FLOAT["batch", 1, "height", "width"], y: ost.FLOAT[1, 1, 3, 2], z: ost.FLOAT[1, 1, 2, 1]) ->ost.FLOAT["batch", 1, "height", "width"]: -# shape_src_1 = opset11.Shape(x) -# shape_src_2 = opset11.Shape(x) -# gather_h = opset11.Gather(shape_src_1, opset11.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.INT64, [], np.array([2], dtype=np.int64))), axis=0) -# gather_w = opset11.Gather(shape_src_2, opset11.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.INT64, [], np.array([3], dtype=np.int64))), axis=0) -# unsqueeze_w_1 = opset11.Unsqueeze(gather_w, axes=[0]) -# unsqueeze_w_2 = opset11.Unsqueeze(gather_w, axes=[0]) -# unsqueeze_h_1 = opset11.Unsqueeze(gather_h, axes=[0]) -# unsqueeze_h_2 = opset11.Unsqueeze(gather_h, axes=[0]) -# concat_1 = opset11.Cast(opset11.Concat(unsqueeze_h_1, unsqueeze_w_1, axis=0), to=ost.INT64.dtype) -# concat_2 = opset11.Cast(opset11.Concat(unsqueeze_h_2, unsqueeze_w_2, axis=0), to=ost.INT64.dtype) - -# # This op is required to test double node removal -# y = opset11.Add(y, opset11.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.FLOAT, [1], np.array([0.5], dtype=np.float32)))) - -# # First branch -# sliced = opset11.Slice(opset11.Shape(y), -# starts=opset11.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.INT64, [1], np.array([0], dtype=np.int64))), -# ends=opset11.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.INT64, [1], np.array([2], dtype=np.int64))), -# axes=opset11.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.INT64, [1], np.array([0], dtype=np.int64))), -# ) -# concat_y = opset11.Concat(sliced, concat_1, axis=0) -# resized_y = opset11.Resize(y, -# roi=opset11.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.FLOAT, [0], np.empty([0]))), -# scales=opset11.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.FLOAT, [0], np.empty([0]))), -# sizes=concat_y, -# coordinate_transformation_mode='pytorch_half_pixel', -# cubic_coeff_a=-0.75, -# mode='linear', -# nearest_mode='floor' -# ) - -# # Second branch -# sliced = opset11.Slice(opset11.Shape(z), -# starts=opset11.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.INT64, [1], np.array([0], dtype=np.int64))), -# ends=opset11.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.INT64, [1], np.array([2], dtype=np.int64))), -# axes=opset11.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.INT64, [1], np.array([0], dtype=np.int64))), -# ) -# concat_z = opset11.Concat(sliced, concat_2, axis=0) -# resized_z = opset11.Resize(z, -# roi=opset11.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.FLOAT, [0], np.empty([0]))), -# scales=opset11.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.FLOAT, [0], np.empty([0]))), -# sizes=concat_z, -# coordinate_transformation_mode='pytorch_half_pixel', -# cubic_coeff_a=-0.75, -# mode='linear', -# nearest_mode='floor' -# ) - -# return opset11.Add(resized_y, resized_z) - -# make_model_and_data(two_resizes_with_shared_subgraphs, np.random.rand(1, 1, 4, 5).astype(np.float32), np.random.rand(1, 1, 3, 2).astype(np.float32), np.random.rand(1, 1, 2, 1).astype(np.float32)) - - -# @ost.script() -# def bias_gelu(x: ost.FLOAT[1, 2, 3]) -> ost.FLOAT[1, 2, 3]: -# bias = op.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.FLOAT, [3], np.array([0.1, 0.3, 0.2], dtype=np.float32))) -# add1 = op.Add(x, bias) -# tmp = op.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.FLOAT, [], np.array([np.sqrt(2)], dtype=np.float32))) -# div = op.Div(add1, tmp) -# erf = op.Erf(div) -# tmp_0 = op.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.FLOAT, [], np.array([1], dtype=np.float32))) -# add2 = op.Add(erf, tmp_0) -# mul = op.Mul(add1, add2) -# tmp_1 = op.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.FLOAT, [], np.array([0.5], dtype=np.float32))) -# return op.Mul(mul, tmp_1) - -# make_model_and_data(bias_gelu, np.random.rand(1, 2, 3).astype(np.float32)) +''' + It builds a model with two Gather ops sharing a single same indices: + + [Input] -> Gather(indices=0) -> Gather(indices=0) -> [Output] + + , where the two indices constants have the same name. +''' +@ost.script() +def gather_shared_indices(x: ost.FLOAT[2, 1, 3, 4]) -> ost.FLOAT[3, 4]: + indices = op.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.INT64, [], np.array([0], dtype=np.int64))) + y0 = op.Gather(x, indices, axis=0) + y1 = op.Gather(y0, indices, axis=0) + return y1 +make_model_and_data(gather_shared_indices, np.random.rand(2, 1, 3, 4).astype(np.float32)) + +''' + [Input] -> Greater(B=61) -> [Output] + \ + dtype=np.int64 +''' +@ost.script() +def greater_input_dtype_int64(x: ost.FLOAT[27, 9]) ->ost.BOOL[27, 9]: + y = op.Greater(x, op.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.INT64, [], np.array([61], dtype=np.int64)))) + return y +make_model_and_data(greater_input_dtype_int64, np.random.randint(0, 100, size=[27, 9], dtype=np.int64), force_saving_input_as_dtype_float32=True, force_saving_output_as_dtype_float32=True) + +from onnxscript import opset11 + +@ost.script() +def two_resizes_with_shared_subgraphs(x: ost.FLOAT["batch", 1, "height", "width"], y: ost.FLOAT[1, 1, 3, 2], z: ost.FLOAT[1, 1, 2, 1]) ->ost.FLOAT["batch", 1, "height", "width"]: + shape_src_1 = opset11.Shape(x) + shape_src_2 = opset11.Shape(x) + gather_h = opset11.Gather(shape_src_1, opset11.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.INT64, [], np.array([2], dtype=np.int64))), axis=0) + gather_w = opset11.Gather(shape_src_2, opset11.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.INT64, [], np.array([3], dtype=np.int64))), axis=0) + unsqueeze_w_1 = opset11.Unsqueeze(gather_w, axes=[0]) + unsqueeze_w_2 = opset11.Unsqueeze(gather_w, axes=[0]) + unsqueeze_h_1 = opset11.Unsqueeze(gather_h, axes=[0]) + unsqueeze_h_2 = opset11.Unsqueeze(gather_h, axes=[0]) + concat_1 = opset11.Cast(opset11.Concat(unsqueeze_h_1, unsqueeze_w_1, axis=0), to=ost.INT64.dtype) + concat_2 = opset11.Cast(opset11.Concat(unsqueeze_h_2, unsqueeze_w_2, axis=0), to=ost.INT64.dtype) + + # This op is required to test double node removal + y = opset11.Add(y, opset11.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.FLOAT, [1], np.array([0.5], dtype=np.float32)))) + + # First branch + sliced = opset11.Slice(opset11.Shape(y), + starts=opset11.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.INT64, [1], np.array([0], dtype=np.int64))), + ends=opset11.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.INT64, [1], np.array([2], dtype=np.int64))), + axes=opset11.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.INT64, [1], np.array([0], dtype=np.int64))), + ) + concat_y = opset11.Concat(sliced, concat_1, axis=0) + resized_y = opset11.Resize(y, + roi=opset11.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.FLOAT, [0], np.empty([0]))), + scales=opset11.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.FLOAT, [0], np.empty([0]))), + sizes=concat_y, + coordinate_transformation_mode='pytorch_half_pixel', + cubic_coeff_a=-0.75, + mode='linear', + nearest_mode='floor' + ) + + # Second branch + sliced = opset11.Slice(opset11.Shape(z), + starts=opset11.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.INT64, [1], np.array([0], dtype=np.int64))), + ends=opset11.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.INT64, [1], np.array([2], dtype=np.int64))), + axes=opset11.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.INT64, [1], np.array([0], dtype=np.int64))), + ) + concat_z = opset11.Concat(sliced, concat_2, axis=0) + resized_z = opset11.Resize(z, + roi=opset11.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.FLOAT, [0], np.empty([0]))), + scales=opset11.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.FLOAT, [0], np.empty([0]))), + sizes=concat_z, + coordinate_transformation_mode='pytorch_half_pixel', + cubic_coeff_a=-0.75, + mode='linear', + nearest_mode='floor' + ) + + return opset11.Add(resized_y, resized_z) + +make_model_and_data(two_resizes_with_shared_subgraphs, np.random.rand(1, 1, 4, 5).astype(np.float32), np.random.rand(1, 1, 3, 2).astype(np.float32), np.random.rand(1, 1, 2, 1).astype(np.float32)) + + +@ost.script() +def bias_gelu(x: ost.FLOAT[1, 2, 3]) -> ost.FLOAT[1, 2, 3]: + bias = op.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.FLOAT, [3], np.array([0.1, 0.3, 0.2], dtype=np.float32))) + add1 = op.Add(x, bias) + tmp = op.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.FLOAT, [], np.array([np.sqrt(2)], dtype=np.float32))) + div = op.Div(add1, tmp) + erf = op.Erf(div) + tmp_0 = op.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.FLOAT, [], np.array([1], dtype=np.float32))) + add2 = op.Add(erf, tmp_0) + mul = op.Mul(add1, add2) + tmp_1 = op.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.FLOAT, [], np.array([0.5], dtype=np.float32))) + return op.Mul(mul, tmp_1) + +make_model_and_data(bias_gelu, np.random.rand(1, 2, 3).astype(np.float32)) batch_size = 1 sequence_length = 320 @@ -298,3 +298,15 @@ def attention_single_head(x: ost.FLOAT[batch_size, sequence_length, input_hidden return reshape make_model_and_data(attention_single_head, np.random.rand(batch_size, sequence_length, input_hidden_size).astype(np.float32)) + +# Einsum_const_inputs + +input_0_data = np.random.rand(3, 2, 2, 4).astype(np.float32) +input_1_data = np.random.rand(2, 2, 4).astype(np.float32) + +@ost.script() +def einsum_const_inputs(input_0: ost.FLOAT[3, 2, 2, 4]) -> ost.FLOAT[3, 2, 2, 2]: + input_1 = op.Constant(value=onnx.helper.make_tensor("", onnx.TensorProto.FLOAT, input_1_data.shape, input_1_data)) + return op.Einsum(input_0, input_1, equation="bhwc, hkc -> bhwk") + +make_model_and_data(einsum_const_inputs, input_0_data) diff --git a/testdata/dnn/onnx/models/einsum_const_inputs.onnx b/testdata/dnn/onnx/models/einsum_const_inputs.onnx new file mode 100644 index 0000000000000000000000000000000000000000..e0ccd890214a54ae93745c0394c3627d91f8ea4a GIT binary patch literal 333 zcmd7wnO9I+5^pHQlxLvC;hdjWT#}eqq7}i#T9%konyTf)!32aX0*p!y z2e0wlFN^oHE3Oo