def _test_net(self, net_name, input_blob_dims=(1, 3, 224, 224), decimal=7): np.random.seed(seed=0) model_dir = self._model_dir(net_name) if not os.path.exists(model_dir): self._download(net_name) c2_predict_pb = os.path.join(model_dir, 'predict_net.pb') c2_predict_net = caffe2_pb2.NetDef() with open(c2_predict_pb, 'rb') as f: c2_predict_net.ParseFromString(f.read()) c2_predict_net.name = net_name c2_init_pb = os.path.join(model_dir, 'init_net.pb') c2_init_net = caffe2_pb2.NetDef() with open(c2_init_pb, 'rb') as f: c2_init_net.ParseFromString(f.read()) c2_init_net.name = net_name + '_init' n, c, h, w = input_blob_dims data = np.random.randn(n, c, h, w).astype(np.float32) inputs = [data] _, c2_outputs = c2_native_run_net(c2_init_net, c2_predict_net, inputs) del _ model = c2_onnx.caffe2_net_to_onnx_model( predict_net=c2_predict_net, init_net=c2_init_net, value_info=json.load( open(os.path.join(model_dir, 'value_info.json')))) c2_ir = c2.prepare(model) onnx_outputs = c2_ir.run(inputs) self.assertSameOutputs(c2_outputs, onnx_outputs, decimal=decimal) self.report_mem_usage(net_name)
def caffe2_to_onnx(caffe2_net, caffe2_net_name, caffe2_init_net, value_info, output): c2_net_proto = caffe2_pb2.NetDef() c2_net_proto.ParseFromString(caffe2_net.read()) if not c2_net_proto.name and not caffe2_net_name: raise click.BadParameter( 'The input caffe2 net does not have name, ' '--caffe2-net-name must be provided') c2_net_proto.name = caffe2_net_name or c2_net_proto.name if caffe2_init_net: c2_init_net_proto = caffe2_pb2.NetDef() c2_init_net_proto.ParseFromString(caffe2_init_net.read()) c2_init_net_proto.name = '{}_init'.format(caffe2_net_name) else: c2_init_net_proto = None if value_info: value_info = json.loads(value_info) onnx_model = c2_onnx.caffe2_net_to_onnx_model( predict_net=c2_net_proto, init_net=c2_init_net_proto, value_info=value_info) output.write(onnx_model.SerializeToString())
def test_slice(self): X = np.random.randn(1, 2, 3).astype(np.float32) starts = np.array([0, 1, 0], dtype=np.int32) ends = np.array([-1, 2, 3], dtype=np.int32) predict_net = caffe2_pb2.NetDef() predict_net.name = 'test-slice-net' predict_net.external_input[:] = ['X'] predict_net.external_output[:] = ['Y'] predict_net.op.extend([ core.CreateOperator( 'Slice', inputs=['X'], outputs=['Y'], starts=starts, ends=ends, ), ]) ws, (Y, ) = c2_native_run_net(init_net=None, predict_net=predict_net, inputs=[X]) onnx_model = c2_onnx.caffe2_net_to_onnx_model( predict_net=predict_net, value_info={ 'X': (onnx.mapping.NP_TYPE_TO_TENSOR_TYPE[X.dtype], X.shape) }) Y, = c2.run_model(onnx_model, inputs=[X]) np.testing.assert_almost_equal(Y, X[:, 1:2, :])
def _test_net(self, net_name, input_blob_dims=(1, 3, 224, 224), decimal=7): np.random.seed(seed=0) model_dir = self._model_dir(net_name) if not os.path.exists(model_dir): self._download(net_name) c2_predict_pb = os.path.join(model_dir, 'predict_net.pb') c2_predict_net = caffe2_pb2.NetDef() with open(c2_predict_pb, 'rb') as f: c2_predict_net.ParseFromString(f.read()) c2_predict_net.name = net_name c2_init_pb = os.path.join(model_dir, 'init_net.pb') c2_init_net = caffe2_pb2.NetDef() with open(c2_init_pb, 'rb') as f: c2_init_net.ParseFromString(f.read()) c2_init_net.name = net_name + '_init' n, c, h, w = input_blob_dims data = np.random.randn(n, c, h, w).astype(np.float32) inputs = [data] c2_outputs = c2_native_run_net(c2_init_net, c2_predict_net, inputs) for input_name in c2_predict_net.external_input: if input_name == 'data' or input_name == 'gpu_0/data': break else: raise RuntimeError( 'Could not find input name of model {}'.format(net_name)) predict_model = c2_onnx.caffe2_net_to_onnx_model( predict_net=c2_predict_net, init_net=c2_init_net, value_info={ input_name: (onnx_pb2.TensorProto.FLOAT, (1, 3, 224, 224)) }) c2_ir = c2.prepare(predict_model) onnx_outputs = c2_ir.run(inputs) self.assertSameOutputs(c2_outputs, onnx_outputs, decimal=decimal) self.report_mem_usage(net_name)