This commit is contained in:
iperov 2021-09-09 17:03:31 +04:00
parent 5454f94a1b
commit 8843d874cf
2 changed files with 191 additions and 0 deletions

View file

@ -1,3 +1,194 @@
# import onnx
# import onnx.parser
# import onnx.checker
# from onnx import helper
# from onnx import AttributeProto, TensorProto, GraphProto
# import numpy as np
# from xlib import onnxruntime as lib_ort
# import cv2
# from io import BytesIO
# _str_to_type = {
# 'float32' : TensorProto.FLOAT,
# 'bool' : TensorProto.BOOL,
# }
# class ONNXGraphBuilder:
# """
# onnx graph builder.
# Tensors are defined with unknown shape dimensions,
# because onnx does not provide shape computation
# for example: broadcasting [1,3,5] with [1,5], user should compute it manually and specify output shape of broadcast operation.
# So the best way is to define tensors only with rank.
# """
# def __init__(self):
# self._nodes = []
# self._name_counter = 0
# def _generate_tensor_name(self, ):
# result = f'T{self._name_counter}'
# self._name_counter += 1
# return result
# def _get_shape(self, t):
# if isinstance(t, onnx.ValueInfoProto):
# return [ x.dim_value for x in t.type.tensor_type.shape.dim ]
# raise Exception()
# def _get_ndim(self, t):
# if isinstance(t, onnx.ValueInfoProto):
# return len(t.type.tensor_type.shape.dim)
# raise Exception()
# def _get_data_type(self, t):
# if isinstance(t, onnx.ValueInfoProto):
# return t.type.tensor_type.elem_type
# raise Exception()
# def tensor(self, ndim, data_type='float32', name=None):
# if name is None:
# name = self._generate_tensor_name()
# data_type = _str_to_type[data_type]
# return helper.make_tensor_value_info(name, data_type, [-1]*ndim)
# def constant(self, np_value : np.ndarray, data_type='float32', name=None):
# output_t = self.tensor(ndim=np_value.ndim, name=name)
# if isinstance(data_type, str):
# data_type = _str_to_type[data_type]
# node = helper.make_node('Constant', [], [output_t.name],
# value=helper.make_tensor(name=self._generate_tensor_name(), data_type=data_type, dims=np_value.shape, vals=np_value.flatten() ) )
# self._nodes.append(node)
# return output_t
# def greater_equal(self, input_t, value_t, output_t=None):
# input_ndim = self._get_ndim(input_t)
# value_ndim = self._get_ndim(value_t)
# if output_t is None:
# output_t = self.tensor(ndim=max(input_ndim, value_ndim), data_type='bool')
# self._nodes.append( helper.make_node('GreaterOrEqual', [input_t.name, value_t.name], [output_t.name]) )
# return output_t
# def conv2d(self, input_t, kernel_t, output_t=None, auto_pad='SAME_LOWER', strides=[1,1]):
# if output_t is None:
# output_t = self.tensor(ndim=self._get_ndim(input_t))
# self._nodes.append( helper.make_node('Conv', [input_t.name, kernel_t.name], [output_t.name], auto_pad=auto_pad, strides=strides) )
# return output_t
# def binary_erode(self, input_t, struct_np : np.ndarray):
# """
# input_t NCHW tensor
# struct_np np.ndarray
# HW structuring element
# """
# struct_t = self.constant(struct_np, data_type=self._get_data_type(input_t))
# import code
# code.interact(local=dict(globals(), **locals()))
# def make_model(self, inputs, outputs):
# graph_def = helper.make_graph(self._nodes, 'graph', inputs, outputs)
# model = helper.make_model(graph_def)
# model.ir_version=7
# model.opset_import[0].version=14
# onnx.checker.check_model(model)
# return model
# gb = ONNXGraphBuilder()
# # val1_t = gb.constant( np.ones( (4,4)) )
# # val2_t = gb.constant( np.ones( (1,1,4)) )
# # #val1_t = gb.tensor(ndim=2, name='I')
# # #val2_t = gb.tensor(ndim=2, name='W')
# # output_t = gb.greater_equal(val1_t, val2_t)
# # model = gb.make_model([], [output_t])
# # sess = lib_ort.InferenceSession_with_device(model, lib_ort.get_cpu_device() )
# # #x = sess.run(None, {'I': np.ones( (4,4), np.float32), 'W': np.ones( (1,4), np.float32) })[0]
# # x = sess.run(None, {})[0]
# # import code
# # code.interact(local=dict(globals(), **locals()))
# img = np.ones( (5,5), np.uint8 )
# img = np.pad(img, ( (2,2), (1,1) ))
# img[4,4] = 0
# img_er = cv2.dilate(img, el, iterations = 1 )
# input_t = gb.tensor(ndim=4, name='I')
# #kernel_t = gb.tensor(ndim=4, name='W')
# o = gb.binary_erode(input_t, el)
# # output_t = gb.conv2d(input_t, kernel_t)
# # model = gb.make_model([input_t, kernel_t], [output_t])
# # sess = lib_ort.InferenceSession_with_device(model, lib_ort.get_cpu_device() )
# # x = sess.run(None, {'I': img[None,None,...].astype(np.float32), 'W': el[None,None,...].astype(np.float32) })[0]
# import numpy as np
# import cv2
# el = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(3,3))#.astype(np.float32)
# from xlib import tensorcl as tcl
# x = tcl.get_available_devices_info()
# #dev = tcl.get_device(x[0])
# #tcl.set_argault_device(x[1])
# #x = tcl.Tensor.from_value( np.ones( (2,2))*2)
# tcl.test_all()
# #x = tcl.Tensor( [4,2], initializer=tcl.initializer.RandomUniform() )
from collections import deque from collections import deque
from queue import Queue from queue import Queue
from typing import Any, Union, Tuple from typing import Any, Union, Tuple

Binary file not shown.