Skip to content

Commit 0ffe6bc

Browse files
committed
Update onnx.js (#6)
1 parent cee0b8c commit 0ffe6bc

File tree

2 files changed

+35
-224
lines changed

2 files changed

+35
-224
lines changed

source/onnx.js

+28-217
Original file line numberDiff line numberDiff line change
@@ -1562,6 +1562,11 @@ onnx.ProtoReader = class {
15621562
return new onnx.ProtoReader(context, 'text', 'model');
15631563
}
15641564
}
1565+
const obj = context.peek('json');
1566+
if (obj && (obj.ir_version === undefined && obj.producer_name === undefined && !Array.isArray(obj.opset_import) && !Array.isArray(obj.metadata_props)) &&
1567+
(obj.irVersion !== undefined || obj.producerName !== undefined || Array.isArray(obj.opsetImport) || Array.isArray(obj.metadataProps) || (Array.isArray(obj.graph) && Array.isArray(obj.graph.node)))) {
1568+
return new onnx.ProtoReader(context, 'json', 'model');
1569+
}
15651570
return undefined;
15661571
}
15671572

@@ -1588,6 +1593,17 @@ onnx.ProtoReader = class {
15881593
}
15891594
break;
15901595
}
1596+
case 'json': {
1597+
try {
1598+
const obj = this.context.read('json');
1599+
this.model = onnx.proto.ModelProto.decodeJson(obj);
1600+
this.format = `ONNX${this.model.ir_version ? ` v${this.model.ir_version}` : ''}`;
1601+
} catch (error) {
1602+
const message = error && error.message ? error.message : error.toString();
1603+
throw new onnx.Error(`File JSON format is not onnx.ModelProto (${message.replace(/\.$/, '')}).`);
1604+
}
1605+
break;
1606+
}
15911607
case 'binary': {
15921608
switch (this.type) {
15931609
case 'tensor': {
@@ -1877,7 +1893,8 @@ onnx.JsonReader = class {
18771893

18781894
static open(context) {
18791895
const obj = context.peek('json');
1880-
if (obj && (obj.irVersion !== undefined || obj.ir_Version !== undefined || (obj.graph && Array.isArray(obj.graph.node)))) {
1896+
if (obj && obj.framework === undefined && obj.graph &&
1897+
(obj.ir_version !== undefined || obj.producer_name !== undefined || Array.isArray(obj.opset_import))) {
18811898
return new onnx.JsonReader(obj);
18821899
}
18831900
return null;
@@ -1886,145 +1903,20 @@ onnx.JsonReader = class {
18861903
constructor(obj) {
18871904
this.name = 'onnx.json';
18881905
this.model = obj;
1889-
this._attributeTypes = new Map(Object.entries(onnx.AttributeType));
18901906
}
18911907

18921908
async read() {
18931909
this.model = this._model(this.model);
18941910
this.format = `ONNX JSON${this.model.ir_version ? ` v${this.model.ir_version}` : ''}`;
18951911
}
18961912

1897-
_tensor_shape(value) {
1898-
if (Array.isArray(value.dim)) {
1899-
for (const dimension of value.dim) {
1900-
if (dimension.dimValue !== undefined) {
1901-
dimension.dim_value = parseInt(dimension.dimValue, 10);
1902-
delete dimension.dimValue;
1903-
} else if (dimension.dimParam !== undefined) {
1904-
dimension.dim_param = dimension.dimParam;
1905-
delete dimension.dimParam;
1906-
}
1907-
}
1908-
}
1909-
return value;
1910-
}
1911-
1912-
_tensor_type(value) {
1913-
if (value.elemType !== undefined) {
1914-
value.elem_type = value.elemType;
1915-
delete value.elemType;
1916-
}
1917-
if (value.shape) {
1918-
value.shape = this._tensor_shape(value.shape);
1919-
}
1920-
return value;
1921-
}
1922-
1923-
_optional_type(value) {
1924-
if (value.elemType !== undefined) {
1925-
value.elem_type = this._type(value.elemType);
1926-
delete value.elemType;
1927-
}
1928-
return value;
1929-
}
1930-
1931-
_sequence_type(value) {
1932-
if (value.elemType !== undefined) {
1933-
value.elem_type = this._type(value.elemType);
1934-
delete value.elemType;
1935-
}
1936-
return value;
1937-
}
1938-
1939-
_map_type(value) {
1940-
if (value.keyType !== undefined) {
1941-
value.key_type = value.keyType;
1942-
delete value.keyType;
1943-
}
1944-
if (value.valueType !== undefined) {
1945-
value.value_type = this._type(value.valueType);
1946-
delete value.valueType;
1947-
}
1948-
return value;
1949-
}
1950-
1951-
_sparse_tensor_type(value) {
1952-
if (value.elemType !== undefined) {
1953-
value.elem_type = value.elemType;
1954-
delete value.elemType;
1955-
}
1956-
if (value.shape) {
1957-
value.shape = this._tensor_shape(value.shape);
1958-
}
1959-
return value;
1960-
}
1961-
1962-
_type(value) {
1963-
if (value.tensorType) {
1964-
value.tensor_type = this._tensor_type(value.tensorType);
1965-
delete value.tensorType;
1966-
} else if (value.tensor_type) {
1967-
value.tensor_type = this._tensor_type(value.tensor_type);
1968-
} else if (value.sequenceType) {
1969-
value.sequence_type = this._sequence_type(value.sequenceType);
1970-
delete value.sequenceType;
1971-
} else if (value.sequence_type) {
1972-
value.sequence_type = this._sequence_type(value.sequenceType);
1973-
} else if (value.optionalType !== undefined) {
1974-
value.optional_type = this._optional_type(value.optionalType);
1975-
delete value.optionalType;
1976-
} else if (value.optional_type) {
1977-
value.optional_type = this._optional_type(value.optionalType);
1978-
} else if (value.mapType) {
1979-
value.map_type = this._map_type(value.mapType);
1980-
delete value.mapType;
1981-
} else if (value.map_type) {
1982-
value.map_type = this._map_type(value.mapType);
1983-
} else if (value.sparseTensorType) {
1984-
value.sparse_tensor_type = this._sparse_tensor_type(value.sparseTensorType);
1985-
delete value.sparseTensorType;
1986-
} else if (value.sparse_tensor_type) {
1987-
value.sparse_tensor_type = this._sparse_tensor_type(value.sparseTensorType);
1988-
} else if (Object.keys(value).length > 0) {
1989-
throw new onnx.Error(`Unsupported ONNX JSON type '${JSON.stringify(Object.keys(value))}'.`);
1990-
}
1991-
return value;
1992-
}
1993-
19941913
_tensor(value) {
1995-
if (value.dataType !== undefined) {
1996-
value.data_type = value.dataType;
1997-
delete value.dataType;
1998-
}
1999-
value.dims = Array.isArray(value.dims) ? value.dims.map((dim) => parseInt(dim, 10)) : [];
1914+
value.dims = Array.isArray(value.dims) ? value.dims : [];
20001915
if (value.raw_data !== undefined) {
2001-
if (value.raw_data && value.raw_data instanceof Uint8Array === false &&
2002-
value.raw_data.type === 'Buffer' && Array.isArray(value.raw_data.data)) {
1916+
if (value.raw_data && value.raw_data instanceof Uint8Array === false && value.raw_data.type === 'Buffer' && Array.isArray(value.raw_data.data)) {
20031917
value.data_location = onnx.DataLocation.DEFAULT;
20041918
value.raw_data = new Uint8Array(value.raw_data.data);
20051919
}
2006-
} else if (value.rawData !== undefined) {
2007-
value.data_location = onnx.DataLocation.DEFAULT;
2008-
const data = atob(value.rawData);
2009-
const length = data.length;
2010-
const array = new Uint8Array(length);
2011-
for (let i = 0; i < length; i++) {
2012-
array[i] = data[i].charCodeAt(0);
2013-
}
2014-
value.raw_data = array;
2015-
delete value.rawData;
2016-
} else if (Array.isArray(value.floatData)) {
2017-
value.data_location = onnx.DataLocation.DEFAULT;
2018-
value.float_data = value.floatData;
2019-
delete value.floatData;
2020-
} else if (Array.isArray(value.int32Data)) {
2021-
value.data_location = onnx.DataLocation.DEFAULT;
2022-
value.int32_data = value.int32Data;
2023-
delete value.int32Data;
2024-
} else if (Array.isArray(value.int64Data)) {
2025-
value.data_location = onnx.DataLocation.DEFAULT;
2026-
value.int64_data = value.int64Data.map((value) => parseInt(value, 10));
2027-
delete value.int64Data;
20281920
} else if ((Array.isArray(value.float_data) && value.float_data.length > 0) ||
20291921
(Array.isArray(value.int32_data) && value.int32_data.length > 0) ||
20301922
(Array.isArray(value.int64_data) && value.int64_data.length > 0)) {
@@ -2042,13 +1934,7 @@ onnx.JsonReader = class {
20421934
}
20431935

20441936
_attribute(value) {
2045-
if (value.type && this._attributeTypes.has(value.type)) {
2046-
value.type = this._attributeTypes.get(value.type);
2047-
}
2048-
if (value.refAttrName) {
2049-
value.ref_attr_name = value.refAttrName;
2050-
delete value.refAttrName;
2051-
} else if (value.ref_attr_name) {
1937+
if (value.ref_attr_name) {
20521938
value.ref_attr_name = value.ref_attr_name.toString();
20531939
} else if (value.type === onnx.AttributeType.FLOATS || (Array.isArray(value.floats) && value.floats.length > 0)) {
20541940
value.floats = value.floats.map((value) => parseFloat(value));
@@ -2060,24 +1946,18 @@ onnx.JsonReader = class {
20601946
value.tensors = value.tensors.map((value) => this._tensor(value));
20611947
} else if (value.type === onnx.AttributeType.GRAPHS || (Array.isArray(value.graphs) && value.graphs.length > 0)) {
20621948
value.graphs = value.graphs.map((value) => this._graph(value));
2063-
} else if (value.type === onnx.AttributeType.SPARSE_TENSORS || (Array.isArray(value.sparseTensors) && value.sparseTensors.length > 0)) {
2064-
value.sparse_tensors = value.sparseTensors.map((item) => this._sparse_tensor(item));
2065-
delete value.sparseTensors;
20661949
} else if (value.type === onnx.AttributeType.SPARSE_TENSORS || (Array.isArray(value.sparse_tensors) && value.sparse_tensors.length > 0)) {
20671950
value.sparse_tensors = value.sparse_tensors.map((item) => this._sparse_tensor(item));
20681951
} else if (value.type === onnx.AttributeType.FLOAT || value.f !== undefined) {
2069-
value.f = parseFloat(value.f);
1952+
// continue
20701953
} else if (value.type === onnx.AttributeType.INT || value.i !== undefined) {
2071-
value.i = parseInt(value.i, 10);
1954+
// continue
20721955
} else if (value.type === onnx.AttributeType.STRING || value.s !== undefined) {
20731956
value.s = atob(value.s);
20741957
} else if (value.type === onnx.AttributeType.TENSOR || value.t !== undefined) {
20751958
value.t = this._tensor(value.t);
20761959
} else if (value.type === onnx.AttributeType.GRAPH || value.g !== undefined) {
20771960
value.g = this._graph(value.g);
2078-
} else if (value.type === onnx.AttributeType.SPARSE_TENSOR || value.sparseTensor !== undefined) {
2079-
value.sparse_tensor = this._sparse_tensor(value.sparseTensor);
2080-
delete value.sparseTensor;
20811961
} else if (value.type === onnx.AttributeType.SPARSE_TENSOR || value.sparse_tensor !== undefined) {
20821962
value.sparse_tensor = this._sparse_tensor(value.sparse_tensor);
20831963
} else {
@@ -2087,43 +1967,18 @@ onnx.JsonReader = class {
20871967
}
20881968

20891969
_node(value) {
2090-
if (value.opType !== undefined) {
2091-
value.op_type = value.opType;
2092-
delete value.opType;
2093-
}
20941970
value.input = Array.isArray(value.input) ? value.input : [];
20951971
value.output = Array.isArray(value.output) ? value.output : [];
20961972
value.attribute = Array.isArray(value.attribute) ? value.attribute.map((value) => this._attribute(value)) : [];
20971973
return value;
20981974
}
20991975

2100-
_value_info(value) {
2101-
value.type = this._type(value.type);
2102-
return value;
2103-
}
2104-
2105-
_operator_set(value) {
2106-
value.version = parseInt(value.version, 10);
2107-
return value;
2108-
}
2109-
21101976
_graph(value) {
21111977
value.node = value.node.map((value) => this._node(value));
21121978
value.initializer = Array.isArray(value.initializer) ? value.initializer.map((value) => this._tensor(value)) : [];
2113-
if (Array.isArray(value.sparseInitializer) && value.sparseInitializer.length > 0) {
2114-
value.sparse_initializer = value.sparseInitializer.map((item) => this._sparse_tensor(item));
2115-
delete value.sparseInitializer;
2116-
} else if (Array.isArray(value.sparse_initializer) && value.sparse_initializer.length > 0) {
2117-
value.sparse_initializer = value.sparseInitializer.map((item) => this._sparse_tensor(item));
2118-
}
2119-
if (Array.isArray(value.valueInfo) && value.valueInfo.length > 0) {
2120-
value.value_info = value.valueInfo.map((item) => this._value_info(item));
2121-
delete value.valueInfo;
2122-
} else if (Array.isArray(value.value_info) && value.value_info.length > 0) {
2123-
value.value_info = value.value_info.map((item) => this._value_info(item));
2124-
}
2125-
value.input = Array.isArray(value.input) ? value.input.map((value) => this._value_info(value)) : [];
2126-
value.output = Array.isArray(value.output) ? value.output.map((value) => this._value_info(value)) : [];
1979+
value.sparse_initializer = Array.isArray(value.sparse_initializer) ? value.sparse_initializer.map((item) => this._sparse_tensor(item)) : [];
1980+
value.input = Array.isArray(value.input) ? value.input : [];
1981+
value.output = Array.isArray(value.output) ? value.output : [];
21271982
return value;
21281983
}
21291984

@@ -2132,57 +1987,13 @@ onnx.JsonReader = class {
21321987
value.input = Array.isArray(value.input) ? value.input : [];
21331988
value.output = Array.isArray(value.output) ? value.output : [];
21341989
value.attribute = Array.isArray(value.attribute) ? value.attribute : [];
2135-
if (Array.isArray(value.attributeProto) && value.attributeProto.length > 0) {
2136-
value.attribute_proto = value.attributeProto.map((value) => this._attribute(value));
2137-
delete value.attributeProto;
2138-
} else if (Array.isArray(value.attribute_proto) && value.attribute_proto.length > 0) {
2139-
value.attribute_proto = value.attribute_proto.map((value) => this._attribute(value));
2140-
}
2141-
if (value.docString) {
2142-
value.doc_string = value.docString;
2143-
delete value.docString;
2144-
}
1990+
value.attribute_proto = Array.isArray(value.attribute_proto) ? value.attribute_proto.map((value) => this._attribute(value)) : [];
21451991
return value;
21461992
}
21471993

21481994
_model(value) {
2149-
if (value.irVersion !== undefined) {
2150-
value.ir_version = parseInt(value.irVersion, 10);
2151-
delete value.irVersion;
2152-
}
2153-
if (value.version !== undefined) {
2154-
value.version = parseInt(value.version, 10);
2155-
}
2156-
if (value.producerName) {
2157-
value.producer_name = value.producerName;
2158-
delete value.producerName;
2159-
}
2160-
if (value.producerVersion) {
2161-
value.producer_version = value.producerVersion;
2162-
delete value.producerVersion;
2163-
}
2164-
if (value.modelVersion) {
2165-
value.model_version = parseInt(value.modelVersion, 10);
2166-
delete value.modelVersion;
2167-
}
2168-
if (value.docString) {
2169-
value.doc_string = value.docString;
2170-
delete value.docString;
2171-
}
21721995
value.graph = this._graph(value.graph);
2173-
if (Array.isArray(value.opsetImport) && value.opsetImport.length > 0) {
2174-
value.opset_import = value.opsetImport.map((item) => this._operator_set(item));
2175-
delete value.opsetImport;
2176-
} else if (Array.isArray(value.opset_import) && value.opset_import.length > 0) {
2177-
value.opset_import = value.opset_import.map((item) => this._operator_set(item));
2178-
}
2179-
if (Array.isArray(value.metadataProps)) {
2180-
value.metadata_props = value.metadataProps;
2181-
delete value.metadataProps;
2182-
}
2183-
if (Array.isArray(value.functions)) {
2184-
value.functions = value.functions.map((item) => this._function(item));
2185-
}
1996+
value.functions = Array.isArray(value.functions) ? value.functions.map((item) => this._function(item)) : [];
21861997
return value;
21871998
}
21881999
};

test/models.json

+7-7
Original file line numberDiff line numberDiff line change
@@ -4074,7 +4074,7 @@
40744074
"type": "onnx",
40754075
"target": "candy.json.zip",
40764076
"source": "https://github.com/lutzroeder/netron/files/12329067/candy.json.zip",
4077-
"format": "ONNX JSON v3",
4077+
"format": "ONNX v3",
40784078
"assert": "model.graphs[0].nodes[2].attributes[1].visible == false",
40794079
"tags": "validation",
40804080
"link": "https://github.com/lutzroeder/netron/issues/6"
@@ -4254,7 +4254,7 @@
42544254
"type": "onnx",
42554255
"target": "gather.json",
42564256
"source": "https://github.com/lutzroeder/netron/files/12306625/gather.json.zip[gather.json]",
4257-
"format": "ONNX JSON v6",
4257+
"format": "ONNX v6",
42584258
"link": "https://github.com/lutzroeder/netron/issues/6"
42594259
},
42604260
{
@@ -4374,7 +4374,7 @@
43744374
"type": "onnx",
43754375
"target": "issue_1138.json",
43764376
"source": "https://github.com/lutzroeder/netron/files/12343742/issue_1138.json.zip[issue_1138.json]",
4377-
"format": "ONNX JSON v9",
4377+
"format": "ONNX v9",
43784378
"link": "https://github.com/lutzroeder/netron/issues/1138"
43794379
},
43804380
{
@@ -4484,7 +4484,7 @@
44844484
"type": "onnx",
44854485
"target": "nms_base_component.json",
44864486
"source": "https://github.com/lutzroeder/netron/files/12306626/nms_base_component.json.zip[nms_base_component.json]",
4487-
"format": "ONNX JSON v8",
4487+
"format": "ONNX v8",
44884488
"link": "https://github.com/lutzroeder/netron/issues/6"
44894489
},
44904490
{
@@ -4507,7 +4507,7 @@
45074507
"type": "onnx",
45084508
"target": "optional_type.json",
45094509
"source": "https://github.com/lutzroeder/netron/files/12329086/optional_type.json.zip[optional_type.json]",
4510-
"format": "ONNX JSON v8",
4510+
"format": "ONNX v8",
45114511
"link": "https://github.com/lutzroeder/netron/issues/6"
45124512
},
45134513
{
@@ -4600,7 +4600,7 @@
46004600
"type": "onnx",
46014601
"target": "sparse_initializer_as_output.json",
46024602
"source": "https://github.com/lutzroeder/netron/files/12444489/sparse_initializer_as_output.json.zip[sparse_initializer_as_output.json]",
4603-
"format": "ONNX JSON v7",
4603+
"format": "ONNX v7",
46044604
"assert": "model.graphs[0].outputs[0].value[0].type.layout == 'sparse'",
46054605
"tags": "validation",
46064606
"link": "https://github.com/lutzroeder/netron/issues/741"
@@ -4769,7 +4769,7 @@
47694769
"type": "onnx",
47704770
"target": "zipmap_int64float.json",
47714771
"source": "https://github.com/lutzroeder/netron/files/12329104/zipmap_int64float.json.zip[zipmap_int64float.json]",
4772-
"format": "ONNX JSON v3",
4772+
"format": "ONNX v3",
47734773
"link": "https://github.com/lutzroeder/netron/issues/6"
47744774
},
47754775
{

0 commit comments

Comments
 (0)