UNPKG

@tensorflow-models/coco-ssd

Version:

Object detection model (coco-ssd) in TensorFlow.js

223 lines 10.1 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var compiled_api_1 = require("../data/compiled_api"); var utils_1 = require("./executors/utils"); var arithmetic = require("./op_list/arithmetic"); var basicMath = require("./op_list/basic_math"); var control = require("./op_list/control"); var convolution = require("./op_list/convolution"); var creation = require("./op_list/creation"); var dynamic = require("./op_list/dynamic"); var evaluation = require("./op_list/evaluation"); var graph = require("./op_list/graph"); var image = require("./op_list/image"); var logical = require("./op_list/logical"); var matrices = require("./op_list/matrices"); var normalization = require("./op_list/normalization"); var reduction = require("./op_list/reduction"); var sliceJoin = require("./op_list/slice_join"); var spectral = require("./op_list/spectral"); var transformation = require("./op_list/transformation"); var CONTROL_FLOW_OPS = ['Switch', 'Merge', 'Enter', 'Exit', 'NextIteration']; var DYNAMIC_SHAPE_OPS = ['NonMaxSuppressionV2', 'NonMaxSuppressionV3', 'Where']; var OperationMapper = (function () { function OperationMapper() { var ops = [ arithmetic, basicMath, control, convolution, creation, dynamic, evaluation, logical, image, graph, matrices, normalization, reduction, sliceJoin, spectral, transformation ]; var mappersJson = [].concat.apply([], ops.map(function (op) { return op.json; })); this.opMappers = mappersJson.reduce(function (map, mapper) { map[mapper.tfOpName] = mapper; return map; }, {}); } Object.defineProperty(OperationMapper, "Instance", { get: function () { return this._instance || (this._instance = new this()); }, enumerable: true, configurable: true }); OperationMapper.prototype.isControlFlow = function (node) { return CONTROL_FLOW_OPS.some(function (op) { return op === node.op; }); }; OperationMapper.prototype.isDynamicShape = function (node) { return DYNAMIC_SHAPE_OPS.some(function (op) { return op === node.op; }); }; OperationMapper.prototype.transformGraph = function (graph) { var _this = this; var tfNodes = graph.node; var withControlFlow = false; var withDynamicShape = false; var placeholders = []; var weights = []; var nodes = tfNodes.reduce(function (map, node) { map[node.name] = _this.mapNode(node); if (_this.isControlFlow(node)) withControlFlow = true; if (_this.isDynamicShape(node)) withDynamicShape = true; if (node.op === 'Placeholder') placeholders.push(map[node.name]); if (node.op === 'Const') weights.push(map[node.name]); return map; }, {}); var inputs = []; var outputs = []; Object.keys(nodes).forEach(function (key) { var node = nodes[key]; node.inputNames.forEach(function (name) { var nodeName = utils_1.getNodeNameAndIndex(name)[0]; node.inputs.push(nodes[nodeName]); nodes[nodeName].children.push(node); }); if (node.inputs.length === 0) inputs.push(node); }); Object.keys(nodes).forEach(function (key) { var node = nodes[key]; if (node.children.length === 0) outputs.push(node); }); return { nodes: nodes, inputs: inputs, outputs: outputs, weights: weights, placeholders: placeholders, withControlFlow: withControlFlow, withDynamicShape: withDynamicShape }; }; OperationMapper.prototype.mapNode = function (node) { var _this = this; var mapper = this.opMappers[node.op]; if (mapper === undefined) { throw new Error('Tensorflow Op is not supported: ' + node.op); } var newNode = { name: node.name, op: mapper.dlOpName, category: mapper.category, inputNames: (node.input || []).map(function (input) { return input.startsWith('^') ? input.substr(1) : input; }), inputs: [], children: [], params: {} }; if (!!mapper.params) { newNode.params = mapper.params.reduce(function (map, param) { var inputIndex = param.tfInputIndex; var inputParamLength = param.tfInputParamLength; var type = param.type; var value = undefined; if (inputIndex === undefined) { switch (param.type) { case 'string': value = _this.getStringParam(node.attr, param.tfParamName, param.defaultValue); if (value === undefined && !!param.tfParamNameDeprecated) { value = _this.getStringParam(node.attr, param.tfParamNameDeprecated, param.defaultValue); } break; case 'number': value = _this.getNumberParam(node.attr, param.tfParamName, (param.defaultValue || 0)); if (value === undefined && !!param.tfParamNameDeprecated) { value = _this.getNumberParam(node.attr, param.tfParamNameDeprecated, param.defaultValue); } break; case 'number[]': value = _this.getNumericArrayParam(node.attr, param.tfParamName, param.defaultValue); if (value === undefined && !!param.tfParamNameDeprecated) { value = _this.getNumericArrayParam(node.attr, param.tfParamNameDeprecated, param.defaultValue); } break; case 'bool': value = _this.getBoolParam(node.attr, param.tfParamName, param.defaultValue); if (value === undefined && !!param.tfParamNameDeprecated) { value = _this.getBoolParam(node.attr, param.tfParamNameDeprecated, param.defaultValue); } break; case 'shape': value = _this.getTensorShapeParam(node.attr, param.tfParamName, param.defaultValue); if (value === undefined && !!param.tfParamNameDeprecated) { value = _this.getTensorShapeParam(node.attr, param.tfParamNameDeprecated, param.defaultValue); } break; case 'dtype': value = _this.getDtypeParam(node.attr, param.tfParamName, param.defaultValue); if (value === undefined && !!param.tfParamNameDeprecated) { value = _this.getDtypeParam(node.attr, param.tfParamNameDeprecated, param.defaultValue); } break; case 'tensor': case 'tensors': break; default: throw new Error("Unsupported param type: " + param.type + " for op: " + node.op); } } map[param.dlParamName] = { value: value, inputIndex: inputIndex, type: type, inputParamLength: inputParamLength }; return map; }, {}); } return newNode; }; OperationMapper.prototype.getStringParam = function (attrs, name, def, keepCase) { if (keepCase === void 0) { keepCase = false; } var param = attrs[name]; if (param !== undefined) { var value = String.fromCharCode.apply(null, param.s); return keepCase ? value : value.toLowerCase(); } return def; }; OperationMapper.prototype.getBoolParam = function (attrs, name, def) { var param = attrs[name]; return param ? param.b : def; }; OperationMapper.prototype.getNumberParam = function (attrs, name, def) { var param = attrs[name]; var value = (param ? param[param.value] : def); return (typeof value === 'number') ? value : value['toInt'](); }; OperationMapper.prototype.getDtypeParam = function (attrs, name, def) { var param = attrs[name]; if (param && param.type) { switch (param.type) { case compiled_api_1.tensorflow.DataType.DT_FLOAT: return 'float32'; case compiled_api_1.tensorflow.DataType.DT_INT32: return 'int32'; case compiled_api_1.tensorflow.DataType.DT_BOOL: return 'bool'; default: return def; } } return def; }; OperationMapper.prototype.getTensorShapeParam = function (attrs, name, def) { var param = attrs[name]; if (param && param.shape) { return param.shape.dim.map(function (dim) { return (typeof dim.size === 'number') ? dim.size : dim.size['toInt'](); }); } return def; }; OperationMapper.prototype.getNumericArrayParam = function (attrs, name, def) { var param = attrs[name]; if (param) { return ((param.list.f && param.list.f.length ? param.list.f : param.list.i)) .map(function (v) { return (typeof v === 'number') ? v : v['toInt'](); }); } return def; }; return OperationMapper; }()); exports.OperationMapper = OperationMapper; //# sourceMappingURL=operation_mapper.js.map