From bd5a5a4bdb9e5ec4ca4f33b10439e7a76205159c Mon Sep 17 00:00:00 2001 From: chenhaoze Date: Fri, 15 May 2020 19:30:58 +0800 Subject: [PATCH] compataible with webgl1.0; rewrite sorting algorithm of ops; fix bugs --- src/feed/ImageFeed.es6 | 14 +- src/gpu/gpu.es6 | 89 +- src/graph/graph.es6 | 143 +- src/loader/loader.es6 | 11 +- src/paddle/paddle.es6 | 11 +- src/runtime/runtime.es6 | 12 +- src/shader/atom/getValueFromTensorPos.es6 | 27 +- src/shader/atom/prefix.es6 | 10 +- src/shader/atom/suffix.es6 | 7 +- src/shader/atom/transferFromNHWCtoNCHW.es6 | 8 +- src/shader/batchnorm/main.es6 | 12 +- src/shader/bilinear_interp/conf.es6 | 45 + src/shader/bilinear_interp/main.es6 | 34 + src/shader/bilinear_interp/params.es6 | 18 + src/shader/concat/main.es6 | 4 +- src/shader/concat/params.es6 | 2 +- src/shader/conv2d_transpose/main.es6 | 15 +- src/shader/elementwise_add/main.es6 | 12 +- src/shader/mul/main.es6 | 6 +- src/shader/split/main.es6 | 2 +- src/shader/split/params.es6 | 2 +- src/shader/transpose2/main.es6 | 4 +- src/utils/opData.es6 | 4 +- src/utils/utils.es6 | 65 +- test/data/map.json | 2002 ++++++++++---------- test/data/model.test.conv2d.json | 3 +- test/testUtils/testUtils.es6 | 11 +- 27 files changed, 1341 insertions(+), 1232 deletions(-) create mode 100644 src/shader/bilinear_interp/conf.es6 create mode 100644 src/shader/bilinear_interp/main.es6 create mode 100644 src/shader/bilinear_interp/params.es6 diff --git a/src/feed/ImageFeed.es6 b/src/feed/ImageFeed.es6 index f048b63c..fa9e1ac5 100644 --- a/src/feed/ImageFeed.es6 +++ b/src/feed/ImageFeed.es6 @@ -151,8 +151,6 @@ export default class imageFeed { } } } - console.log('this is the end of reshapetorgb !!!'); - console.dir(result); return result; }; @@ -164,7 +162,6 @@ export default class imageFeed { * @return {Object} 缩放后的尺寸 */ reSize(image, params) { - console.log('execute resize!!'); // 原始图片宽高 const width = this.pixelWidth; const height = this.pixelHeight; @@ -192,7 +189,6 @@ export default class imageFeed { * 根据scale缩放图像并且缩放成目标尺寸并居中 */ resizeAndFitTargetSize(image, params){ - console.log('execute resizeAndFitTargetSize!!'); // 原始图片宽高 const width = this.pixelWidth; const height = this.pixelHeight; @@ -249,7 +245,6 @@ export default class imageFeed { sh = Math.round(sw * this.pixelHeight / this.pixelWidth); y = Math.floor((targetHeight - sh) / 2); } - // console.log(x, y, sw, sh); if (center) { this.fromPixels2DContext.drawImage( image, x, y, sw, sh); @@ -327,24 +322,18 @@ export default class imageFeed { data = this.resizeAndFitTargetSize(pixels, opt); data2 = this.fromPixels2DContext2.getImageData(0, 0, this.pixelWidth, this.pixelHeight); } - else if (opt.scale) { // 兼容以前的,如果有scale就是短边缩放到scale模式 - + else if (opt.scale) { // 直接resize到targetShape Humanseg的情况 scaleSize = this.reSize(pixels, opt); - console.dir(scaleSize); - console.dir(pixels); data = this.getImageData(opt, 0, 0, scaleSize); - data2 = this.fromPixels2DContext2.getImageData(0, 0, this.pixelWidth, this.pixelHeight); } else if (opt.targetSize) { // 如果有targetSize,就是装在目标宽高里的模式 TinyYolo的情况 - scaleSize = this.fitToTargetSize(pixels, opt); data = this.getImageData(opt, 0, 0, scaleSize); data2 = this.fromPixels2DContext2.getImageData(0, 0, this.pixelWidth, this.pixelHeight); } } - if (opt.gray) { data = grayscale(data); } @@ -359,6 +348,7 @@ export default class imageFeed { else if (opt.targetShape) { data = this.allReshapeToRGB(data, opt, scaleSize); } + return [{data: data, shape: opt.shape || opt.targetShape, name: 'image', canvas: data2}]; } } diff --git a/src/gpu/gpu.es6 b/src/gpu/gpu.es6 index 39cc52a3..8a7afcb5 100644 --- a/src/gpu/gpu.es6 +++ b/src/gpu/gpu.es6 @@ -51,6 +51,10 @@ export default class gpu { console.log('float extension is started or not? ' + !!this.textureFloat); } } + + this.maxTextureSize = gl.getParameter(gl.MAX_TEXTURE_SIZE); + this.maxTextureImageUnits = gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS); + // 关闭相关功能 gl.disable(gl.DEPTH_TEST); gl.disable(gl.STENCIL_TEST); @@ -67,14 +71,22 @@ export default class gpu { this.waits = 0; console.log('WebGl版本是 ' + this.version); - console.log('MAX_TEXTURE_SIZE is ' + gl.getParameter(gl.MAX_TEXTURE_SIZE)); - console.log('MAX_TEXTURE_IMAGE_UNITS is ' + gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS)); + console.log('MAX_TEXTURE_SIZE is ' + this.maxTextureSize); + console.log('MAX_TEXTURE_IMAGE_UNITS is ' + this.maxTextureImageUnits); } getWebglVersion() { return this.version; } + getWebglMaxTextureSize() { + return this.maxTextureSize; + } + + getWebglMaxTextureImageUnits() { + return this.maxTextureImageUnits; + } + initCache() { // 运行次数 this.times = 0; @@ -145,7 +157,6 @@ export default class gpu { gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); - gl.texImage2D(gl.TEXTURE_2D, // Target, matches bind above. 0, // Level of detail. this.downloadInternalFormat, // Internal format. @@ -346,6 +357,7 @@ export default class gpu { } else { // texture = gl.createTexture(); if (isRendered && (iLayer > 0 || (iLayer === 0 && item.tensor !== 'origin'))) { + const tData = this.cacheTextures['' + iLayer]; texture = tData[item.variable + '_' + item.tensor]; } else { @@ -361,6 +373,7 @@ export default class gpu { gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + if (this.version == 2){ gl.texImage2D(gl.TEXTURE_2D, 0, this.internalFormat, @@ -369,8 +382,27 @@ export default class gpu { 0, this.textureFormat, gl.FLOAT, - item.data, - 0); + item.data); + } + else { + let oneSize = item.width_texture * item.height_texture; + let temp = new Float32Array(item.width_texture * item.height_texture * 4); + for (let i = 0; i < item.data.length; i++){ + temp[i*4] = (item.data[i]); + temp[i*4+1] = 0; + temp[i*4+2] = 0; + temp[i*4+3] = 0; + } + gl.texImage2D(gl.TEXTURE_2D, + 0, + gl.RGBA, + item.width_texture, + item.height_texture, + 0, + gl.RGBA, + gl.FLOAT, + temp); + } } } @@ -389,7 +421,7 @@ export default class gpu { // 生成帧缓存的texture makeTexure(type, data, opts = {}) { const gl = this.gl; - let index = this.textureBufferIndex % 2; + let index = int(mod(float(this.textureBufferIndex), 2.0)); let texture = this.textureBuffer[index]; gl.bindTexture(gl.TEXTURE_2D, texture); @@ -429,6 +461,7 @@ export default class gpu { } createPBO() { + if (this.version == 2){ const gl2 = this.gl; const buffer = this.pbo; gl2.bindBuffer(gl2.PIXEL_PACK_BUFFER, buffer); @@ -437,42 +470,40 @@ export default class gpu { gl2.readPixels(0, 0, this.width_texture_out, this.height_texture_out, gl2.RGBA, gl2.FLOAT, 0); gl2.bindBuffer(gl2.PIXEL_PACK_BUFFER, null); return buffer; + } + else { + let buffer = new Float32Array(this.width_texture_out * this.height_texture_out * 4); + const gl2 = this.gl; + gl2.readPixels(0, 0, this.width_texture_out, this.height_texture_out, gl2.RGBA, gl2.FLOAT, buffer); + return buffer; + } } downloadFoat32TensorFromBuffer(buffer) { const gl2 = this.gl; const size = 4 * this.width_texture_out * this.height_texture_out; + if (this.version == 2){ const pixels = new Float32Array(size); gl2.bindBuffer(gl2.PIXEL_PACK_BUFFER, buffer); gl2.getBufferSubData(gl2.PIXEL_PACK_BUFFER, 0, pixels); gl2.bindBuffer(gl2.PIXEL_PACK_BUFFER, null); - // log.start('后处理-readloop'); - // let result = []; - // let offset = 0; - // for (let h = 0; h < this.height_texture_out; h++) { - // // 纪录第1和2行数据 - // let temp1 = []; - // let temp2 = []; - // for (let w = 0; w < this.width_texture_out; w++) { - // temp1.push(pixels[offset]); - // temp1.push(pixels[offset + 1]); - // temp2.push(pixels[offset + 2]); - // temp2.push(pixels[offset + 3]); - // offset += 4; - // } - // result = result.concat(temp1); - // result = result.concat(temp2); - // } let result = []; for (let i = 0; i < this.width_texture_out * this.height_texture_out; i++) { result.push(pixels[4 * i]); } - // const result = Array.prototype.slice.call(pixels); - // console.dir(['result', result]); - // log.end('后处理-readloop'); return result; + } + else { + let pixels = buffer; + let result = []; + for (let i = 0; i < this.width_texture_out * this.height_texture_out; i++) { + result.push(pixels[4 * i]); + } + return result; + } } + getWebglError(status) { const gl2 = this.gl; switch (status) { @@ -497,7 +528,7 @@ export default class gpu { createAndWaitForFence() { const gl2 = this.gl; - const isFenceEnabled = (gl2.fenceSync !== null); + const isFenceEnabled = (gl2.fenceSync != null); let isFencePassed = () => true; if (isFenceEnabled) { const sync = gl2.fenceSync(gl2.SYNC_GPU_COMMANDS_COMPLETE, 0); @@ -531,10 +562,8 @@ export default class gpu { let pixels = new Float32Array(this.width_texture_out * this.height_texture_out * 4); // gl.pixelStorei(gl.UNPACK_ALIGNMENT, 1); const tt2 = +Date.now(); - gl.readPixels(0, 0, this.width_texture_out, this.height_texture_out, gl.RGBA, gl.FLOAT, pixels, 0); + gl.readPixels(0, 0, this.width_texture_out, this.height_texture_out, gl.RGBA, gl.FLOAT, pixels); // console.log('本次读取数据时间是' + (+Date.now() - tt2)+ ',' + (tt2 - tt)); - // log.end('后处理-readinside'); - // log.start('后处理-readloop'); let result = []; for (let i = 0; i < this.width_texture_out * this.height_texture_out; i++) { result.push(pixels[4 * i]); diff --git a/src/graph/graph.es6 b/src/graph/graph.es6 index a32d8bf7..99ac775f 100644 --- a/src/graph/graph.es6 +++ b/src/graph/graph.es6 @@ -1,6 +1,5 @@ /* eslint-disable */ import GraphExecutor from '../executor/executor'; -import IO from '../feed/imageFeed'; import Runtime from '../runtime/runtime'; import OpData from '../utils/opData'; import Factory from '../factory/fshader/factory'; @@ -92,9 +91,14 @@ export default class Graph { return; } opindex++; - // console.log(opindex); - //if (executor.opData) console.log(executor.opData.iLayer); executor.execute(this.inst, this.isExecuted); + if (false && executor.opData && opindex >= 184){ + console.log('return!'); + console.dir(executor); + console.dir(executor.type); + console.dir(this); + return; + } if (executor.next) { const id = executor.next; const next = this.getTensor(id); @@ -199,105 +203,63 @@ export default class Graph { }); } - execute_try(temp, ops, idtoindex, executed, inline, prev){ - console.log('execute_try!first look at this op'); - console.log(ops[temp]); - let canrun = this.checkifcanrun(temp, ops, idtoindex, executed); - if (canrun === false) { - // console.log('canrun === false!'); - var a = inline.pop(); - this.execute_try(idtoindex[a.id], ops, idtoindex, executed, inline, prev); - return; - } - if (prev >=0) { - ops[prev].next = ops[temp].id; - } - ops[temp].outputsName.forEach(function(item, index) { - executed[item] = true; - }) - let next = this.getNextByOp(ops, ops[temp]); - // console.log('this is its next:'); - // console.dir(next); - while (next.length === 1) { - let flag = true; - for (let i = 0; i < next[0].inputsName.length; i++){ - if (executed[next[0].inputsName[i]] === false) flag = false; - } - if (flag === false) { - // console.log('can not execute next now! jump to another op:'); - - if (inline.length === 0) return; - prev = temp; - let a = inline.pop(); - // console.dir(a); - ops[temp].next = a.id; - temp = idtoindex[a.id]; - this.execute_try(temp, ops, idtoindex, executed, inline, prev); - return; - } - else { - // console.log('now execute next op! it is'); - ops[temp].next = next[0].id; - temp = idtoindex[next[0].id]; - // console.dir(ops[temp]); - next = this.getNextByOp(ops, ops[temp]); - // console.log('its next is: '); - ops[temp].outputsName.forEach(function(item, index) { - executed[item] = true; - }) - // console.dir(next); - } - } - if (next.length > 1){ - // console.log('next.length > 1!!!'); - for (let i = next.length - 1; i >=0 ; i--){ - inline.push(next[i]); - } - - var a = inline.pop(); - this.execute_try(idtoindex[a.id], ops, idtoindex, executed, inline, temp); - } - return; - } arrangeMap(ops) { - // console.log('arrangeMap!'); - // console.dir(ops); - var idtoindex = {}; var executed = {}; - var inline = []; + var inIndex = []; + var idtoindex = {}; let temp = 0; - // console.log('graph ops:'); - // console.dir(ops); let ops1 = ops; ops1.forEach(function(item, index) { - idtoindex[item.id] = index; - // console.dir(item); item.outputsName.forEach(function(i, idx){ - executed[i] = false; + executed[i] = true; }) }); - //ops[0].inputsName[0] = {name : "feed"}; - // ops[0].outputsName[0] = {name : "image"}; - this.execute_try(temp, ops, idtoindex, executed, inline, -1); + ops1.forEach(function(item, index) { + inIndex[index] = 0; + idtoindex[item.id] = index; + if (item.inputsName.length > 1) { + item.inputsName.forEach(function(i,idx){ + if (executed[i] == true) inIndex[index]++; + }) + } + else inIndex[index] = item.inputsName.length; + }); + this.topoSort(ops, inIndex, idtoindex); return ops; } - checkifcanrun(temp, ops, executed){ - if (!ops[temp].inputsName) return true; - for (let i = 0; i < ops[temp].inputsName.length; i++){ - if (executed[ops[temp].inputsName[i]] === false) return false; + topoSort(ops, inIndex, idtoindex){ + var inline = []; + inline.push(ops[0]); + let ops_temp = ops.slice(0); + let prev = null; + let a = ops[0]; + while(inline.length > 0){ + if (prev != null) ops[idtoindex[prev.id]].next = a.id; + prev = a; + a = inline.pop(); + for (let i = 0; i < a.outputsName.length; i++){ + for (let k = 0; k < ops_temp.length; k++){ + for (let j = 0; j < ops_temp[k].inputsName.length; j++){ + if (ops_temp[k].inputsName[j] == a.outputsName[i]) { + inIndex[idtoindex[ops_temp[k].id]]--; + if (inIndex[idtoindex[ops_temp[k].id]] == 0){ + inline.push(ops[idtoindex[ops_temp[k].id]]); + ops_temp.splice(k,1); + k--; + break; + } + } + } + } + } } - return true; } - - - - /** * Get Ops Nets Start Node * @param ops @@ -348,8 +310,6 @@ export default class Graph { * @returns {*} */ createOpsMap(ops) { - // console.log('ops!!'); - // console.dir(ops); return ops.map((item, idx) => { item.idx = idx; const graphExecutor = new GraphExecutor(item); @@ -372,17 +332,6 @@ export default class Graph { }); } - getNextByOp(ops, op) { - return ops.filter((item, key) => { - for (let i = 0; i < item.inputsName.length; i++) { - for(let j = 0; j < op.outputsName.length; j++) { - if (item.inputsName[i] === op.outputsName[j]) { - return true; - } - } - } - }); - } /** * dispose */ diff --git a/src/loader/loader.es6 b/src/loader/loader.es6 index 8981ae87..73eec40f 100644 --- a/src/loader/loader.es6 +++ b/src/loader/loader.es6 @@ -109,8 +109,9 @@ export default class Loader { const TMP_REGEX = /\-/; let requesterArr = arr.map(item => { if (item.name - && item.name.match(TMP_SCHEME_REGEX) === null - && item.name.match(TMP_REGEX) === null) { + // && item.name.match(TMP_SCHEME_REGEX) === null + // && item.name.match(TMP_REGEX) === null + ) { return this.fetchData(item.name).then(data => item.data = data); } return Promise.resolve(); @@ -124,9 +125,9 @@ export default class Loader { let marker = 0; // 读到哪个位置了 let len; // 当前op长度 arr.filter(item => { - return item.name - && item.name.match(TMP_SCHEME_REGEX) === null - && item.name.match(TMP_REGEX) === null; + return item.name; + // && item.name.match(TMP_SCHEME_REGEX) === null + // && item.name.match(TMP_REGEX) === null; }) // .sort((a, b) => { // if (a.name > b.name) { diff --git a/src/paddle/paddle.es6 b/src/paddle/paddle.es6 index 4a5c359c..8c79d5ea 100644 --- a/src/paddle/paddle.es6 +++ b/src/paddle/paddle.es6 @@ -48,13 +48,9 @@ export default class Paddle { that.graph = graph; that.graph.data = artifacts.data; that.graph.formatWeight(that.graph.data.vars); - const opsMap = that.graph.createOpsMap(that.graph.data.ops, that.graph.data.vars); + const opsMap = that.graph.createOpsMap(that.graph.data.ops); const opsMap1 = that.graph.constructOpsMap(opsMap); - // console.log('opsMap1!'); - // console.dir(opsMap1); const opsMap2 = that.graph.arrangeMap(opsMap1); - // console.log('opsMap2!'); - // console.dir(opsMap2); that.graph.weightMap = opsMap2; } /** @@ -68,10 +64,10 @@ export default class Paddle { this.feed = this.graph.feed = inputs; // 生成op数据 if (!this.graph.isExecuted) { - this.graph.weightMap.forEach(op => { + this.graph.weightMap.forEach((op, index) => { const type = op.type; if (type !== 'feed' && type !== 'fetch') { - console.log(op.type); + that.graph.buildOpData(op); } }); @@ -81,7 +77,6 @@ export default class Paddle { } updateFeed() { this.graph.feedItem.data = this.graph.feed.input[0].data; - // Utils.img2texture(this.graph.feedItem); } /** * dispose diff --git a/src/runtime/runtime.es6 b/src/runtime/runtime.es6 index 1fe5db1b..3aead47e 100644 --- a/src/runtime/runtime.es6 +++ b/src/runtime/runtime.es6 @@ -2,9 +2,6 @@ import Gpu from '../gpu/gpu'; import getMaxUniforms from '../test/getMaxUniforms'; import Factory from '../factory/fshader/factory'; -// import {getTextureShapeInfo} from '../utils/opData'; -// 生成factory实例 -// const factory = new Factory({}); /** * @file gpu运行时 * @author wangqun@baidu.com, yangmingming@baidu.com @@ -29,6 +26,14 @@ export default { return this.gpu.getWebglVersion(); }, + getWebglMaxTextureSize() { + return this.gpu.maxTextureSize(); + }, + + getWebglMaxTextureImageUnits() { + return this.gpu.maxTextureImageUnits(); + }, + run(opName, opData, isRendered) { // console.dir(['fscode', opData.fsCode]); // let time = +Date.now(); @@ -64,6 +69,7 @@ export default { this.gpu.render(opData.renderData, opData.iLayer, isRendered); // } }); + }, /** diff --git a/src/shader/atom/getValueFromTensorPos.es6 b/src/shader/atom/getValueFromTensorPos.es6 index d18f2f24..57dc8f70 100644 --- a/src/shader/atom/getValueFromTensorPos.es6 +++ b/src/shader/atom/getValueFromTensorPos.es6 @@ -7,29 +7,38 @@ export default ` // 根据tensor坐标获取这个tensor位置的值 float getValueFromTensorPos_TENSOR_NAME(int r, int g, int b, int a) { - vec4 pixels = TEXTURE2D(texture_TENSOR_NAME, + vec4 pixels = TEXTURE2D(texture_TENSOR_NAME, vec2( - (float(a * channel_TENSOR_NAME + g) + 0.5) / float(width_texture_TENSOR_NAME), + (float(a * channel_TENSOR_NAME + g) + 0.5) / float(width_texture_TENSOR_NAME), (float(r * height_shape_TENSOR_NAME + b) + 0.5) / float(height_texture_TENSOR_NAME) ) ); // 只用了r通道 return pixels.r; } -// 紧凑型布局根据tensor坐标获取这个tensor位置的值 + +// 超限布局根据tensor坐标获取这个tensor位置的值 float getValueFromTensorPosLimit_TENSOR_NAME(int r, int g, int b, int a) { - float halfW = ceil(float(width_shape_TENSOR_NAME) / 2.0); - int x = int(mod(float(a), halfW)); + float pieceW = ceil(float(width_shape_TENSOR_NAME) / 4.0); + int x = int(mod(float(a), pieceW)); int offsetY = 0; - if (a > x) { + + if ((float(a) / pieceW) >= 3.0) { + offsetY = 3 * height_shape_TENSOR_NAME; + } + else if (float(a) / pieceW >= 2.0) { + offsetY = 2 * height_shape_TENSOR_NAME; + } + else if (float(a) >= pieceW) { offsetY = height_shape_TENSOR_NAME; } - vec4 pixels = TEXTURE2D(texture_TENSOR_NAME, + vec4 pixels = TEXTURE2D(texture_TENSOR_NAME, vec2( - (float(x * channel_TENSOR_NAME + g) + 0.5) / float(width_texture_TENSOR_NAME), - (float(r * 2 * height_shape_TENSOR_NAME + b + offsetY) + 0.5) / float(height_texture_TENSOR_NAME) + (float(x * channel_TENSOR_NAME + g) + 0.5) / float(width_texture_TENSOR_NAME), + (float(r * 4 * height_shape_TENSOR_NAME + b + offsetY) + 0.5) / float(height_texture_TENSOR_NAME) ) ); return pixels.r; } + `; diff --git a/src/shader/atom/prefix.es6 b/src/shader/atom/prefix.es6 index 0d028a6b..f3547ce3 100644 --- a/src/shader/atom/prefix.es6 +++ b/src/shader/atom/prefix.es6 @@ -8,11 +8,13 @@ export default ` precision highp float; precision highp int; #else - precision mediump float; - precision mediump int; + precision highp float; + precision highp int; #endif - + varying vec2 vCoord; + varying vec4 outColor; void setOutput(float result) { - gl_FragColor.r = result; + gl_FragColor.r = result; } `; + diff --git a/src/shader/atom/suffix.es6 b/src/shader/atom/suffix.es6 index 840ef29d..d536169e 100644 --- a/src/shader/atom/suffix.es6 +++ b/src/shader/atom/suffix.es6 @@ -15,17 +15,18 @@ ivec4 getOutputTensorPos() { return ivec4(b, c, y, x); } + ivec4 getOutputTensorPosLimit() { // 获取原始长度 vec2 outCoord = vCoord.xy * _2d_shape_texture_out; float offsetY = floor(outCoord.y / float(height_shape_out)); int x = int(outCoord.x / float(channel_out)); - if (mod(offsetY, 2.0) > 0.0) { - x += int(ceil(float(width_shape_out) / 2.0)); + if (mod(offsetY, 4.0) > 0.0) { + x += int(mod(offsetY, 4.0)) * int(ceil(float(width_shape_out) / 4.0)); } int y = int(mod(outCoord.y, float(height_shape_out))); int c = int(mod(outCoord.x, float(channel_out))); - int b = int(outCoord.y / float(2 * height_shape_out)); + int b = int(outCoord.y / float(4 * height_shape_out)); return ivec4(b, c, y, x); } diff --git a/src/shader/atom/transferFromNHWCtoNCHW.es6 b/src/shader/atom/transferFromNHWCtoNCHW.es6 index 5677607c..ad35419a 100644 --- a/src/shader/atom/transferFromNHWCtoNCHW.es6 +++ b/src/shader/atom/transferFromNHWCtoNCHW.es6 @@ -10,13 +10,13 @@ export default ` ivec4 transferFromNHWCtoNCHW( int sumVal, const int channel, const int width_shape, const int height_shape, const int total_shape) { int n_origin = int(total_shape/(channel * width_shape * height_shape)); - int new_a = sumVal % width_shape; + int new_a = int(mod(float(sumVal), float(width_shape))); sumVal = int((sumVal - new_a) / width_shape); - int new_b = sumVal % height_shape; + int new_b = int(mod(float(sumVal), float(height_shape))); sumVal = int((sumVal - new_b) / height_shape); - int new_g = sumVal % channel; + int new_g = int(mod(float(sumVal), float(channel))); sumVal = int((sumVal - new_g) / channel); - int new_r = sumVal % n_origin; + int new_r = int(mod(float(sumVal), float(n_origin))); return ivec4(new_r,new_g,new_b,new_a); } `; diff --git a/src/shader/batchnorm/main.es6 b/src/shader/batchnorm/main.es6 index 4a65b27c..71f2695f 100644 --- a/src/shader/batchnorm/main.es6 +++ b/src/shader/batchnorm/main.es6 @@ -7,14 +7,14 @@ export default ` // start函数 void main(void) { // 输出数据 - ivec4 oPos = getOutputTensorPos(); - float o = getValueFromTensorPos_origin(oPos.r, oPos.g, oPos.b, oPos.a); + ivec4 oPos = getOutputTensorPosLIMIT_OUT(); + float o = getValueFromTensorPosLIMIT_ORIGIN_origin(oPos.r, oPos.g, oPos.b, oPos.a); // 归一化数据 - vec4 scale = getPixelsFromTexturePos_texture_scale(vec2( float(oPos.g) / float(width_texture_scale), 0.0)); - vec4 bias = getPixelsFromTexturePos_texture_bias(vec2((float(oPos.g)) / float(width_texture_bias), 0.0)); - vec4 mean = getPixelsFromTexturePos_texture_mean(vec2((float(oPos.g)) / float(width_texture_mean), 0.0)); - vec4 variance = getPixelsFromTexturePos_texture_variance(vec2((float(oPos.g)) / float(width_texture_variance), 0.0)); + vec4 scale = getPixelsFromTexturePos_texture_scale(vec2((float(oPos.g) + 0.5) / float(width_texture_scale), 0.0)); + vec4 bias = getPixelsFromTexturePos_texture_bias(vec2((float(oPos.g) + 0.5) / float(width_texture_bias), 0.0)); + vec4 mean = getPixelsFromTexturePos_texture_mean(vec2((float(oPos.g) + 0.5) / float(width_texture_mean), 0.0)); + vec4 variance = getPixelsFromTexturePos_texture_variance(vec2((float(oPos.g) + 0.5) / float(width_texture_variance), 0.0)); float x = (o - mean[0]) / sqrt(variance[0] + epsilon); float res = scale[0] * x + bias[0]; diff --git a/src/shader/bilinear_interp/conf.es6 b/src/shader/bilinear_interp/conf.es6 new file mode 100644 index 00000000..7bd08b72 --- /dev/null +++ b/src/shader/bilinear_interp/conf.es6 @@ -0,0 +1,45 @@ +/* eslint-disable */ +/** + * @file bilinear_interp的配置文件 + * @author chenhaoze + */ +export default { + dep: [ + { + func: 'getValueFromTensorPos', + conf: { + TENSOR_NAME: 'origin' + } + }, + { + func: 'transferFromNHWCtoNCHW', + conf:{ + } + } + ], + conf: [ + 'WIDTH_SHAPE_ORIGIN', + 'HEIGHT_SHAPE_ORIGIN', + 'LENGTH_SHAPE_ORIGIN', + 'WIDTH_TEXTURE_ORIGIN', + 'HEIGHT_TEXTURE_ORIGIN', + 'CHANNEL_ORIGIN', + 'WIDTH_SHAPE_OUT', + 'HEIGHT_SHAPE_OUT', + 'WIDTH_TEXTURE_OUT', + 'HEIGHT_TEXTURE_OUT', + 'CHANNEL_OUT', + 'OFFSET_Y_OUT', + 'MULTI_VALUE', + 'BIAS_VALUE', + 'ACTIVE_FUNCTION' + ], + input: [ + { + tensor: 'origin', + variable: 'texture', + setter: 'initTexture', + type: 'texture' + } + ] +}; diff --git a/src/shader/bilinear_interp/main.es6 b/src/shader/bilinear_interp/main.es6 new file mode 100644 index 00000000..fdbf28b2 --- /dev/null +++ b/src/shader/bilinear_interp/main.es6 @@ -0,0 +1,34 @@ +/* eslint-disable */ +/** + * @file bilinear_interp主函数 + * @author chenhaoze + */ +export default ` +// start函数 +void main(void) { + // 输出数据 + ivec4 oPos = getOutputTensorPos(); + // 输出坐标转换为输入坐标 + //int sumVal = oPos.g + oPos.a * channel_out + oPos.b * channel_out * width_shape_out + oPos.r * channel_out * width_shape_out * height_shape_out; + //oPos = transferFromNHWCtoNCHW(sumVal, channel_out, width_shape_out, height_shape_out, total_shape_out); + float o = getValueFromTensorPos_origin(oPos.r, oPos.g, oPos.b, oPos.a); + float scale_x = float(width_shape_out - 1) / float(width_shape_origin - 1); + float scale_y = float(height_shape_out - 1) / float(height_shape_origin - 1); + float x = float(oPos.a) / scale_x; + float y = float(oPos.b) / scale_y; + int x1 = int(floor(x)); + int y1 = int(floor(y)); + int x2 = int(ceil(x)); + int y2 = int(ceil(y)); + float dist_x = x - float(x1); + float dist_y = y - float(y1); + float value11 = getValueFromTensorPos_origin(oPos.r, oPos.g, y1, x1); + float value12 = getValueFromTensorPos_origin(oPos.r, oPos.g, y2, x1); + float value21 = getValueFromTensorPos_origin(oPos.r, oPos.g, y1, x2); + float value22 = getValueFromTensorPos_origin(oPos.r, oPos.g, y2, x2); + float value = (1.0 - dist_x) * (1.0 - dist_y) * value11 + + (1.0 - dist_x) * dist_y * value12 + dist_x * (1.0 - dist_y) * value21 + + dist_x * dist_y * value22; + setOutput(float(value)); +} +`; diff --git a/src/shader/bilinear_interp/params.es6 b/src/shader/bilinear_interp/params.es6 new file mode 100644 index 00000000..cec17c3d --- /dev/null +++ b/src/shader/bilinear_interp/params.es6 @@ -0,0 +1,18 @@ +/* eslint-disable */ +/** + * @file bilinear_interp参数文件 + * @author chenhaoze + */ +export default ` +// 输入数据 +const int width_shape_origin = WIDTH_SHAPE_ORIGIN; +const int height_shape_origin = HEIGHT_SHAPE_ORIGIN; +const int length_shape_origin = LENGTH_SHAPE_ORIGIN; +const int width_texture_origin = WIDTH_TEXTURE_ORIGIN; +const int height_texture_origin = HEIGHT_TEXTURE_ORIGIN; +const int channel_origin = CHANNEL_ORIGIN; +const int total_shape_origin = TOTAL_SHAPE_ORIGIN; +const int total_shape_out = TOTAL_SHAPE_OUT; +// 输入数据 + uniform sampler2D texture_origin; +`; diff --git a/src/shader/concat/main.es6 b/src/shader/concat/main.es6 index b5636cd5..a112e86b 100644 --- a/src/shader/concat/main.es6 +++ b/src/shader/concat/main.es6 @@ -11,8 +11,8 @@ void main(void) { // int sumVal = oPos.g + oPos.a * channel_out + oPos.b * channel_out * width_shape_out + oPos.r * channel_out * width_shape_out * height_shape_out; // ivec4 new_oPos = transferFromNHWCtoNCHW(sumVal, channel_out, width_shape_out, height_shape_out, total_shape_out); float o = 0.0; - if (oPos[dim] > inputs_dim[0] - 1) { - oPos[dim] = oPos[dim] - inputs_dim[0]; + if (oPos[dim] > inputs_dim - 1) { + oPos[dim] = oPos[dim] - inputs_dim; o = getValueFromTensorPos_counter(oPos.r, oPos.g, oPos.b, oPos.a); } else { diff --git a/src/shader/concat/params.es6 b/src/shader/concat/params.es6 index 1dec1d3e..ec92c390 100644 --- a/src/shader/concat/params.es6 +++ b/src/shader/concat/params.es6 @@ -28,7 +28,7 @@ const int total_shape_origin = TOTAL_SHAPE_ORIGIN; const int total_shape_out = TOTAL_SHAPE_OUT; const int dim = DIM; -const int inputs_dim[1] = int[](INPUTS_DIM); +const int inputs_dim = INPUTS_DIM; // uniform变量 diff --git a/src/shader/conv2d_transpose/main.es6 b/src/shader/conv2d_transpose/main.es6 index 90257c28..e693b81f 100644 --- a/src/shader/conv2d_transpose/main.es6 +++ b/src/shader/conv2d_transpose/main.es6 @@ -16,16 +16,8 @@ export default ` int temp_y = 0; float o = 0.0; float f = 0.0; - if (x % 2 == 1) x = x - 2; - if (y % 2 == 1) y = y - 2; -// 重排遍历顺序 -//int sumVal = oPos.g + oPos.a * channel_out + oPos.b * channel_out * width_shape_out; -//int new_a = sumVal % width_shape_out; -//int new_b = int((sumVal - new_a) / width_shape_out) % height_shape_out; -//int new_g = int((((sumVal - new_a) / width_shape_out) - new_b) / height_shape_out); -//int x = new_a; -//int c = new_g; -//int y = new_b; + if (int(mod(float(x), 2.0)) == 1) x = x - 2; + if (int(mod(float(y), 2.0)) == 1) y = y - 2; // 获取output的坐标 int oTensorChannel = int(c * groups / channel_out) * channel_origin; int oy = y; @@ -43,8 +35,7 @@ export default ` } // channel计算 for (int j = 0; j < channel_origin; j++) { - - if (ox % stride_h == 0 && oy % stride_v == 0) { + if (int(mod(float(ox), float(stride_h))) == 0 && int(mod(float(oy), float(stride_v))) == 0) { temp_x = int(floor(float(ox) / float(stride_h))); temp_y = int(floor(float(oy) / float(stride_v))); if (temp_x < width_shape_origin && temp_y < height_shape_origin){ diff --git a/src/shader/elementwise_add/main.es6 b/src/shader/elementwise_add/main.es6 index 2dff9f1f..d9cef059 100644 --- a/src/shader/elementwise_add/main.es6 +++ b/src/shader/elementwise_add/main.es6 @@ -7,22 +7,22 @@ export default ` // start函数 void main(void) { // 输出数据 - ivec4 oPos = getOutputTensorPos(); - float o = getValueFromTensorPos_origin(oPos.r, oPos.g, oPos.b, oPos.a); + ivec4 oPos = getOutputTensorPosLIMIT_OUT(); + float o = getValueFromTensorPosLIMIT_ORIGIN_origin(oPos.r, oPos.g, oPos.b, oPos.a); ivec4 pos_counter; float c = 0.0; if (axis == 1){ - c = getValueFromTensorPos_counter(0, oPos.r, oPos.g, oPos.b); + c = getValueFromTensorPosLIMIT_COUNTER_counter(0, oPos.r, oPos.g, oPos.b); } else if (axis == 2){ - c = getValueFromTensorPos_counter(0, 0, oPos.r, oPos.g); + c = getValueFromTensorPosLIMIT_COUNTER_counter(0, 0, oPos.r, oPos.g); } else if (axis == 3){ - c = getValueFromTensorPos_counter(0, 0, 0, oPos.r); + c = getValueFromTensorPosLIMIT_COUNTER_counter(0, 0, 0, oPos.r); } else { - c = getValueFromTensorPos_counter(oPos.r, oPos.g, oPos.b, oPos.a); + c = getValueFromTensorPosLIMIT_COUNTER_counter(oPos.r, oPos.g, oPos.b, oPos.a); } float res = c + o; setOutput(float(res)); diff --git a/src/shader/mul/main.es6 b/src/shader/mul/main.es6 index bdec1041..9b955b07 100644 --- a/src/shader/mul/main.es6 +++ b/src/shader/mul/main.es6 @@ -7,10 +7,10 @@ export default ` void main(void) { float res = 0.0; // 获取output的坐标 - ivec4 out_pos = getOutputTensorPos(); + ivec4 out_pos = getOutputTensorPosLIMIT_OUT(); for (int j = 0; j < width_shape_origin; j++) { - float c = getValueFromTensorPos_counter(out_pos[0], out_pos[1], j, out_pos[3]); - float o = getValueFromTensorPos_origin(out_pos[0], out_pos[1], out_pos[2], j); + float c = getValueFromTensorPosLIMIT_COUNTER_counter(out_pos[0], out_pos[1], j, out_pos[3]); + float o = getValueFromTensorPosLIMIT_COUNTER_origin(out_pos[0], out_pos[1], out_pos[2], j); res += c * o; } setOutput(res); diff --git a/src/shader/split/main.es6 b/src/shader/split/main.es6 index 029d6b16..e92a956c 100644 --- a/src/shader/split/main.es6 +++ b/src/shader/split/main.es6 @@ -6,7 +6,7 @@ export default ` // start函数 void main(void) { - int length = int(target_value.length() / num); + int length = int(target_length / num); ivec4 oPos = getOutputTensorPos(); // 输出坐标转换为输入坐标 //int sumVal = oPos.g + oPos.a * channel_out + oPos.b * channel_out * width_shape_out + oPos.r * channel_out * width_shape_out * height_shape_out; diff --git a/src/shader/split/params.es6 b/src/shader/split/params.es6 index 18d776d4..85cf88a6 100644 --- a/src/shader/split/params.es6 +++ b/src/shader/split/params.es6 @@ -18,7 +18,7 @@ const int total_shape_out = TOTAL_SHAPE_OUT; const int dim = DIM; const int num = NUM; -const int target_value[TARGET_LENGTH] = int[](TARGET_VALUE); +const int target_length = TARGET_LENGTH; // 输入数据 diff --git a/src/shader/transpose2/main.es6 b/src/shader/transpose2/main.es6 index 109bcf20..cdde15db 100644 --- a/src/shader/transpose2/main.es6 +++ b/src/shader/transpose2/main.es6 @@ -19,10 +19,10 @@ void main(void) { o = getValueFromTensorPos_origin(oPos[0], oPos[1], oPos[2], oPos[3]); } else if (perm_size == 2) { - o = getValueFromTensorPos_origin(oPos[0], oPos[1], oPos[min(2 + perm_0, 3)], oPos[min(2 + perm_1, 3)]); + o = getValueFromTensorPos_origin(oPos[0], oPos[1], oPos[(2 + perm_0)>3?3:(2 + perm_0)], oPos[(2 + perm_1)>3?3:(2 + perm_1)]); } else if (perm_size == 3) { - o = getValueFromTensorPos_origin(oPos[0], oPos[min(1 + perm_0, 3)], oPos[min(1 + perm_1, 3)], oPos[min(1 + perm_2, 3)]); + o = getValueFromTensorPos_origin(oPos[0], oPos[(1 + perm_0)>3?3:(1 + perm_0)], oPos[(1 + perm_1)>3?3:(1 + perm_1)], oPos[(1 + perm_2)>3?3:(1 + perm_2)]); } else if (perm_size == 4) { o = getValueFromTensorPos_origin(oPos[perm_0], oPos[perm_1], oPos[perm_2], oPos[perm_3]); diff --git a/src/utils/opData.es6 b/src/utils/opData.es6 index 24590a16..386c5782 100644 --- a/src/utils/opData.es6 +++ b/src/utils/opData.es6 @@ -125,7 +125,6 @@ const mergeType = 'conv2d-elementwise_add'; export default class OpData { constructor(name, input = {}, output = {}, attrs = {}) { - // console.dir(this); this.realName = name; this.name = name; this.attrs = attrs; @@ -205,7 +204,6 @@ export default class OpData { // 默认取第一个数据 const data = this.output[key] || [{}]; if (tensorName[key.toLowerCase()]) { - // console.dir(this); data.forEach(item => { item.tensorName = tensorName[key.toLowerCase()]; tensorData.push(item); @@ -453,7 +451,7 @@ export default class OpData { this.attrs.target_length = dim_value.length; this.attrs.target_value = dim_value; // 保存 输入 tensor 对应dim 的长度 - this.attrs.inputs_dim = [origin_shape[axis]]; + this.attrs.inputs_dim = origin_shape[axis]; this.attrs.dim = 4 - origin_shape.length + axis; } diff --git a/src/utils/utils.es6 b/src/utils/utils.es6 index ab3ad95c..73b00aed 100644 --- a/src/utils/utils.es6 +++ b/src/utils/utils.es6 @@ -119,12 +119,13 @@ export default { let offsetY = 0; // 安卓和ios的max texture size是4096, 改造存储空间(2bh, cw / 2) let exceedMax = false; - // FIXME:为了让mobilenet能正常执行,这里先注释掉,待群哥修复 - // if (height > MAX_TEXTURE_SIZE || width > MAX_TEXTURE_SIZE) { - // height *= 2; - // width = c * (Math.ceil(w / 2)); - // exceedMax = true; - // } + // trick TEXTURE_SIZE 超限问题,后续升级更优解 + if (height > 4096 || width > 4096) { + //console.error('大小超限', shape); + //height *= 4; + //width = c * (Math.ceil(w / 4)); + //exceedMax = true; + } if (isPacked) { // 紧凑布局 height = b * c * Math.ceil(h / 2); @@ -203,7 +204,7 @@ export default { return fourDimShape; }, - /* + /* * 将nhwc排布数据转为nchw排布数据 */ nhwc2nchw(data, shape) { @@ -226,7 +227,7 @@ export default { return nchwData; }, - /* + /* * 将nchw排布数据转为nhwc排布数据 */ nchw2nhwc(data, shape) { @@ -249,9 +250,9 @@ export default { return nhwcData; }, - /* + /* * 等距间隔打印数据 - */ + */ stridePrint(data, count = 20) { let realPrintCount = count; if (data.length <= realPrintCount) { @@ -267,10 +268,10 @@ export default { for (let i = 0; i < realPrintCount; i++) { numbers.push(i * stride + ": " + data[i * stride]); } - console.log(numbers) + console.log(numbers); }, - /* + /* * 连续打印数据 */ continuousPrint(data, count = 100) { @@ -282,7 +283,7 @@ export default { for (let i = 0; i < realPrintCount; i++) { numbers.push(i + ": " + data[i]); } - console.log(numbers) + console.log(numbers); }, softmax(nchwData) { @@ -306,6 +307,44 @@ export default { } return result; + }, + + // 针对model final texture输出超限后,inst.read读取数据不对的case + formatReadData(nchwData, nchwShape) { + if (nchwShape.length < 4) { + let batch = []; + for (let i = 0; i < (4 - nchwShape.length); i++) { + batch.push(1); + } + nchwShape = batch.concat(nchwShape); + } + const shape_b = nchwShape[0]; + const shape_c = nchwShape[1]; + const shape_h = nchwShape[2]; + const shape_w = nchwShape[3]; + const texture_height = shape_b * shape_h; + const texture_width = shape_c * shape_w; + + if (texture_height <= 4096 && texture_width <= 4096) { + return nchwData; + } + let pos = 0; + const formatData = []; + const pieceW = Math.ceil(shape_w / 4); // reshape后的 shape_width + + for (let bIndex = 0; bIndex < shape_b; bIndex++) { + for (let cIndex = 0; cIndex < shape_c; cIndex++) { + for (let hIndex = 0; hIndex < shape_h; hIndex++) { + for (let wIndex = 0; wIndex < shape_w; wIndex++) { + pos = Math.floor(wIndex / pieceW) * pieceW * (shape_h - 1) + wIndex + hIndex * pieceW; + pos += bIndex * shape_c * shape_h * shape_w+ cIndex * shape_h * shape_w; + formatData.push(nchwData[pos]); + } + } + } + } + + return formatData; } }; /* eslint-enable */ diff --git a/test/data/map.json b/test/data/map.json index df234963..8233b1d7 100644 --- a/test/data/map.json +++ b/test/data/map.json @@ -1,1000 +1,1002 @@ -{0: 'tench, Tinca tinca', - 1: 'goldfish, Carassius auratus', - 2: 'great white shark, white shark, man-eater, man-eating shark, Carcharodon carcharias', - 3: 'tiger shark, Galeocerdo cuvieri', - 4: 'hammerhead, hammerhead shark', - 5: 'electric ray, crampfish, numbfish, torpedo', - 6: 'stingray', - 7: 'cock', - 8: 'hen', - 9: 'ostrich, Struthio camelus', - 10: 'brambling, Fringilla montifringilla', - 11: 'goldfinch, Carduelis carduelis', - 12: 'house finch, linnet, Carpodacus mexicanus', - 13: 'junco, snowbird', - 14: 'indigo bunting, indigo finch, indigo bird, Passerina cyanea', - 15: 'robin, American robin, Turdus migratorius', - 16: 'bulbul', - 17: 'jay', - 18: 'magpie', - 19: 'chickadee', - 20: 'water ouzel, dipper', - 21: 'kite', - 22: 'bald eagle, American eagle, Haliaeetus leucocephalus', - 23: 'vulture', - 24: 'great grey owl, great gray owl, Strix nebulosa', - 25: 'European fire salamander, Salamandra salamandra', - 26: 'common newt, Triturus vulgaris', - 27: 'eft', - 28: 'spotted salamander, Ambystoma maculatum', - 29: 'axolotl, mud puppy, Ambystoma mexicanum', - 30: 'bullfrog, Rana catesbeiana', - 31: 'tree frog, tree-frog', - 32: 'tailed frog, bell toad, ribbed toad, tailed toad, Ascaphus trui', - 33: 'loggerhead, loggerhead turtle, Caretta caretta', - 34: 'leatherback turtle, leatherback, leathery turtle, Dermochelys coriacea', - 35: 'mud turtle', - 36: 'terrapin', - 37: 'box turtle, box tortoise', - 38: 'banded gecko', - 39: 'common iguana, iguana, Iguana iguana', - 40: 'American chameleon, anole, Anolis carolinensis', - 41: 'whiptail, whiptail lizard', - 42: 'agama', - 43: 'frilled lizard, Chlamydosaurus kingi', - 44: 'alligator lizard', - 45: 'Gila monster, Heloderma suspectum', - 46: 'green lizard, Lacerta viridis', - 47: 'African chameleon, Chamaeleo chamaeleon', - 48: 'Komodo dragon, Komodo lizard, dragon lizard, giant lizard, Varanus komodoensis', - 49: 'African crocodile, Nile crocodile, Crocodylus niloticus', - 50: 'American alligator, Alligator mississipiensis', - 51: 'triceratops', - 52: 'thunder snake, worm snake, Carphophis amoenus', - 53: 'ringneck snake, ring-necked snake, ring snake', - 54: 'hognose snake, puff adder, sand viper', - 55: 'green snake, grass snake', - 56: 'king snake, kingsnake', - 57: 'garter snake, grass snake', - 58: 'water snake', - 59: 'vine snake', - 60: 'night snake, Hypsiglena torquata', - 61: 'boa constrictor, Constrictor constrictor', - 62: 'rock python, rock snake, Python sebae', - 63: 'Indian cobra, Naja naja', - 64: 'green mamba', - 65: 'sea snake', - 66: 'horned viper, cerastes, sand viper, horned asp, Cerastes cornutus', - 67: 'diamondback, diamondback rattlesnake, Crotalus adamanteus', - 68: 'sidewinder, horned rattlesnake, Crotalus cerastes', - 69: 'trilobite', - 70: 'harvestman, daddy longlegs, Phalangium opilio', - 71: 'scorpion', - 72: 'black and gold garden spider, Argiope aurantia', - 73: 'barn spider, Araneus cavaticus', - 74: 'garden spider, Aranea diademata', - 75: 'black widow, Latrodectus mactans', - 76: 'tarantula', - 77: 'wolf spider, hunting spider', - 78: 'tick', - 79: 'centipede', - 80: 'black grouse', - 81: 'ptarmigan', - 82: 'ruffed grouse, partridge, Bonasa umbellus', - 83: 'prairie chicken, prairie grouse, prairie fowl', - 84: 'peacock', - 85: 'quail', - 86: 'partridge', - 87: 'African grey, African gray, Psittacus erithacus', - 88: 'macaw', - 89: 'sulphur-crested cockatoo, Kakatoe galerita, Cacatua galerita', - 90: 'lorikeet', - 91: 'coucal', - 92: 'bee eater', - 93: 'hornbill', - 94: 'hummingbird', - 95: 'jacamar', - 96: 'toucan', - 97: 'drake', - 98: 'red-breasted merganser, Mergus serrator', - 99: 'goose', - 100: 'black swan, Cygnus atratus', - 101: 'tusker', - 102: 'echidna, spiny anteater, anteater', - 103: 'platypus, duckbill, duckbilled platypus, duck-billed platypus, Ornithorhynchus anatinus', - 104: 'wallaby, brush kangaroo', - 105: 'koala, koala bear, kangaroo bear, native bear, Phascolarctos cinereus', - 106: 'wombat', - 107: 'jellyfish', - 108: 'sea anemone, anemone', - 109: 'brain coral', - 110: 'flatworm, platyhelminth', - 111: 'nematode, nematode worm, roundworm', - 112: 'conch', - 113: 'snail', - 114: 'slug', - 115: 'sea slug, nudibranch', - 116: 'chiton, coat-of-mail shell, sea cradle, polyplacophore', - 117: 'chambered nautilus, pearly nautilus, nautilus', - 118: 'Dungeness crab, Cancer magister', - 119: 'rock crab, Cancer irroratus', - 120: 'fiddler crab', - 121: 'king crab, Alaska crab, Alaskan king crab, Alaska king crab, Paralithodes camtschatica', - 122: 'American lobster, Northern lobster, Maine lobster, Homarus americanus', - 123: 'spiny lobster, langouste, rock lobster, crawfish, crayfish, sea crawfish', - 124: 'crayfish, crawfish, crawdad, crawdaddy', - 125: 'hermit crab', - 126: 'isopod', - 127: 'white stork, Ciconia ciconia', - 128: 'black stork, Ciconia nigra', - 129: 'spoonbill', - 130: 'flamingo', - 131: 'little blue heron, Egretta caerulea', - 132: 'American egret, great white heron, Egretta albus', - 133: 'bittern', - 134: 'crane', - 135: 'limpkin, Aramus pictus', - 136: 'European gallinule, Porphyrio porphyrio', - 137: 'American coot, marsh hen, mud hen, water hen, Fulica americana', - 138: 'bustard', - 139: 'ruddy turnstone, Arenaria interpres', - 140: 'red-backed sandpiper, dunlin, Erolia alpina', - 141: 'redshank, Tringa totanus', - 142: 'dowitcher', - 143: 'oystercatcher, oyster catcher', - 144: 'pelican', - 145: 'king penguin, Aptenodytes patagonica', - 146: 'albatross, mollymawk', - 147: 'grey whale, gray whale, devilfish, Eschrichtius gibbosus, Eschrichtius robustus', - 148: 'killer whale, killer, orca, grampus, sea wolf, Orcinus orca', - 149: 'dugong, Dugong dugon', - 150: 'sea lion', - 151: 'Chihuahua', - 152: 'Japanese spaniel', - 153: 'Maltese dog, Maltese terrier, Maltese', - 154: 'Pekinese, Pekingese, Peke', - 155: 'Shih-Tzu', - 156: 'Blenheim spaniel', - 157: 'papillon', - 158: 'toy terrier', - 159: 'Rhodesian ridgeback', - 160: 'Afghan hound, Afghan', - 161: 'basset, basset hound', - 162: 'beagle', - 163: 'bloodhound, sleuthhound', - 164: 'bluetick', - 165: 'black-and-tan coonhound', - 166: 'Walker hound, Walker foxhound', - 167: 'English foxhound', - 168: 'redbone', - 169: 'borzoi, Russian wolfhound', - 170: 'Irish wolfhound', - 171: 'Italian greyhound', - 172: 'whippet', - 173: 'Ibizan hound, Ibizan Podenco', - 174: 'Norwegian elkhound, elkhound', - 175: 'otterhound, otter hound', - 176: 'Saluki, gazelle hound', - 177: 'Scottish deerhound, deerhound', - 178: 'Weimaraner', - 179: 'Staffordshire bullterrier, Staffordshire bull terrier', - 180: 'American Staffordshire terrier, Staffordshire terrier, American pit bull terrier, pit bull terrier', - 181: 'Bedlington terrier', - 182: 'Border terrier', - 183: 'Kerry blue terrier', - 184: 'Irish terrier', - 185: 'Norfolk terrier', - 186: 'Norwich terrier', - 187: 'Yorkshire terrier', - 188: 'wire-haired fox terrier', - 189: 'Lakeland terrier', - 190: 'Sealyham terrier, Sealyham', - 191: 'Airedale, Airedale terrier', - 192: 'cairn, cairn terrier', - 193: 'Australian terrier', - 194: 'Dandie Dinmont, Dandie Dinmont terrier', - 195: 'Boston bull, Boston terrier', - 196: 'miniature schnauzer', - 197: 'giant schnauzer', - 198: 'standard schnauzer', - 199: 'Scotch terrier, Scottish terrier, Scottie', - 200: 'Tibetan terrier, chrysanthemum dog', - 201: 'silky terrier, Sydney silky', - 202: 'soft-coated wheaten terrier', - 203: 'West Highland white terrier', - 204: 'Lhasa, Lhasa apso', - 205: 'flat-coated retriever', - 206: 'curly-coated retriever', - 207: 'golden retriever', - 208: 'Labrador retriever', - 209: 'Chesapeake Bay retriever', - 210: 'German short-haired pointer', - 211: 'vizsla, Hungarian pointer', - 212: 'English setter', - 213: 'Irish setter, red setter', - 214: 'Gordon setter', - 215: 'Brittany spaniel', - 216: 'clumber, clumber spaniel', - 217: 'English springer, English springer spaniel', - 218: 'Welsh springer spaniel', - 219: 'cocker spaniel, English cocker spaniel, cocker', - 220: 'Sussex spaniel', - 221: 'Irish water spaniel', - 222: 'kuvasz', - 223: 'schipperke', - 224: 'groenendael', - 225: 'malinois', - 226: 'briard', - 227: 'kelpie', - 228: 'komondor', - 229: 'Old English sheepdog, bobtail', - 230: 'Shetland sheepdog, Shetland sheep dog, Shetland', - 231: 'collie', - 232: 'Border collie', - 233: 'Bouvier des Flandres, Bouviers des Flandres', - 234: 'Rottweiler', - 235: 'German shepherd, German shepherd dog, German police dog, alsatian', - 236: 'Doberman, Doberman pinscher', - 237: 'miniature pinscher', - 238: 'Greater Swiss Mountain dog', - 239: 'Bernese mountain dog', - 240: 'Appenzeller', - 241: 'EntleBucher', - 242: 'boxer', - 243: 'bull mastiff', - 244: 'Tibetan mastiff', - 245: 'French bulldog', - 246: 'Great Dane', - 247: 'Saint Bernard, St Bernard', - 248: 'Eskimo dog, husky', - 249: 'malamute, malemute, Alaskan malamute', - 250: 'Siberian husky', - 251: 'dalmatian, coach dog, carriage dog', - 252: 'affenpinscher, monkey pinscher, monkey dog', - 253: 'basenji', - 254: 'pug, pug-dog', - 255: 'Leonberg', - 256: 'Newfoundland, Newfoundland dog', - 257: 'Great Pyrenees', - 258: 'Samoyed, Samoyede', - 259: 'Pomeranian', - 260: 'chow, chow chow', - 261: 'keeshond', - 262: 'Brabancon griffon', - 263: 'Pembroke, Pembroke Welsh corgi', - 264: 'Cardigan, Cardigan Welsh corgi', - 265: 'toy poodle', - 266: 'miniature poodle', - 267: 'standard poodle', - 268: 'Mexican hairless', - 269: 'timber wolf, grey wolf, gray wolf, Canis lupus', - 270: 'white wolf, Arctic wolf, Canis lupus tundrarum', - 271: 'red wolf, maned wolf, Canis rufus, Canis niger', - 272: 'coyote, prairie wolf, brush wolf, Canis latrans', - 273: 'dingo, warrigal, warragal, Canis dingo', - 274: 'dhole, Cuon alpinus', - 275: 'African hunting dog, hyena dog, Cape hunting dog, Lycaon pictus', - 276: 'hyena, hyaena', - 277: 'red fox, Vulpes vulpes', - 278: 'kit fox, Vulpes macrotis', - 279: 'Arctic fox, white fox, Alopex lagopus', - 280: 'grey fox, gray fox, Urocyon cinereoargenteus', - 281: 'tabby, tabby cat', - 282: 'tiger cat', - 283: 'Persian cat', - 284: 'Siamese cat, Siamese', - 285: 'Egyptian cat', - 286: 'cougar, puma, catamount, mountain lion, painter, panther, Felis concolor', - 287: 'lynx, catamount', - 288: 'leopard, Panthera pardus', - 289: 'snow leopard, ounce, Panthera uncia', - 290: 'jaguar, panther, Panthera onca, Felis onca', - 291: 'lion, king of beasts, Panthera leo', - 292: 'tiger, Panthera tigris', - 293: 'cheetah, chetah, Acinonyx jubatus', - 294: 'brown bear, bruin, Ursus arctos', - 295: 'American black bear, black bear, Ursus americanus, Euarctos americanus', - 296: 'ice bear, polar bear, Ursus Maritimus, Thalarctos maritimus', - 297: 'sloth bear, Melursus ursinus, Ursus ursinus', - 298: 'mongoose', - 299: 'meerkat, mierkat', - 300: 'tiger beetle', - 301: 'ladybug, ladybeetle, lady beetle, ladybird, ladybird beetle', - 302: 'ground beetle, carabid beetle', - 303: 'long-horned beetle, longicorn, longicorn beetle', - 304: 'leaf beetle, chrysomelid', - 305: 'dung beetle', - 306: 'rhinoceros beetle', - 307: 'weevil', - 308: 'fly', - 309: 'bee', - 310: 'ant, emmet, pismire', - 311: 'grasshopper, hopper', - 312: 'cricket', - 313: 'walking stick, walkingstick, stick insect', - 314: 'cockroach, roach', - 315: 'mantis, mantid', - 316: 'cicada, cicala', - 317: 'leafhopper', - 318: 'lacewing, lacewing fly', - 319: "dragonfly, darning needle, devil's darning needle, sewing needle, snake feeder, snake doctor, mosquito hawk, skeeter hawk", - 320: 'damselfly', - 321: 'admiral', - 322: 'ringlet, ringlet butterfly', - 323: 'monarch, monarch butterfly, milkweed butterfly, Danaus plexippus', - 324: 'cabbage butterfly', - 325: 'sulphur butterfly, sulfur butterfly', - 326: 'lycaenid, lycaenid butterfly', - 327: 'starfish, sea star', - 328: 'sea urchin', - 329: 'sea cucumber, holothurian', - 330: 'wood rabbit, cottontail, cottontail rabbit', - 331: 'hare', - 332: 'Angora, Angora rabbit', - 333: 'hamster', - 334: 'porcupine, hedgehog', - 335: 'fox squirrel, eastern fox squirrel, Sciurus niger', - 336: 'marmot', - 337: 'beaver', - 338: 'guinea pig, Cavia cobaya', - 339: 'sorrel', - 340: 'zebra', - 341: 'hog, pig, grunter, squealer, Sus scrofa', - 342: 'wild boar, boar, Sus scrofa', - 343: 'warthog', - 344: 'hippopotamus, hippo, river horse, Hippopotamus amphibius', - 345: 'ox', - 346: 'water buffalo, water ox, Asiatic buffalo, Bubalus bubalis', - 347: 'bison', - 348: 'ram, tup', - 349: 'bighorn, bighorn sheep, cimarron, Rocky Mountain bighorn, Rocky Mountain sheep, Ovis canadensis', - 350: 'ibex, Capra ibex', - 351: 'hartebeest', - 352: 'impala, Aepyceros melampus', - 353: 'gazelle', - 354: 'Arabian camel, dromedary, Camelus dromedarius', - 355: 'llama', - 356: 'weasel', - 357: 'mink', - 358: 'polecat, fitch, foulmart, foumart, Mustela putorius', - 359: 'black-footed ferret, ferret, Mustela nigripes', - 360: 'otter', - 361: 'skunk, polecat, wood pussy', - 362: 'badger', - 363: 'armadillo', - 364: 'three-toed sloth, ai, Bradypus tridactylus', - 365: 'orangutan, orang, orangutang, Pongo pygmaeus', - 366: 'gorilla, Gorilla gorilla', - 367: 'chimpanzee, chimp, Pan troglodytes', - 368: 'gibbon, Hylobates lar', - 369: 'siamang, Hylobates syndactylus, Symphalangus syndactylus', - 370: 'guenon, guenon monkey', - 371: 'patas, hussar monkey, Erythrocebus patas', - 372: 'baboon', - 373: 'macaque', - 374: 'langur', - 375: 'colobus, colobus monkey', - 376: 'proboscis monkey, Nasalis larvatus', - 377: 'marmoset', - 378: 'capuchin, ringtail, Cebus capucinus', - 379: 'howler monkey, howler', - 380: 'titi, titi monkey', - 381: 'spider monkey, Ateles geoffroyi', - 382: 'squirrel monkey, Saimiri sciureus', - 383: 'Madagascar cat, ring-tailed lemur, Lemur catta', - 384: 'indri, indris, Indri indri, Indri brevicaudatus', - 385: 'Indian elephant, Elephas maximus', - 386: 'African elephant, Loxodonta africana', - 387: 'lesser panda, red panda, panda, bear cat, cat bear, Ailurus fulgens', - 388: 'giant panda, panda, panda bear, coon bear, Ailuropoda melanoleuca', - 389: 'barracouta, snoek', - 390: 'eel', - 391: 'coho, cohoe, coho salmon, blue jack, silver salmon, Oncorhynchus kisutch', - 392: 'rock beauty, Holocanthus tricolor', - 393: 'anemone fish', - 394: 'sturgeon', - 395: 'gar, garfish, garpike, billfish, Lepisosteus osseus', - 396: 'lionfish', - 397: 'puffer, pufferfish, blowfish, globefish', - 398: 'abacus', - 399: 'abaya', - 400: "academic gown, academic robe, judge's robe", - 401: 'accordion, piano accordion, squeeze box', - 402: 'acoustic guitar', - 403: 'aircraft carrier, carrier, flattop, attack aircraft carrier', - 404: 'airliner', - 405: 'airship, dirigible', - 406: 'altar', - 407: 'ambulance', - 408: 'amphibian, amphibious vehicle', - 409: 'analog clock', - 410: 'apiary, bee house', - 411: 'apron', - 412: 'ashcan, trash can, garbage can, wastebin, ash bin, ash-bin, ashbin, dustbin, trash barrel, trash bin', - 413: 'assault rifle, assault gun', - 414: 'backpack, back pack, knapsack, packsack, rucksack, haversack', - 415: 'bakery, bakeshop, bakehouse', - 416: 'balance beam, beam', - 417: 'balloon', - 418: 'ballpoint, ballpoint pen, ballpen, Biro', - 419: 'Band Aid', - 420: 'banjo', - 421: 'bannister, banister, balustrade, balusters, handrail', - 422: 'barbell', - 423: 'barber chair', - 424: 'barbershop', - 425: 'barn', - 426: 'barometer', - 427: 'barrel, cask', - 428: 'barrow, garden cart, lawn cart, wheelbarrow', - 429: 'baseball', - 430: 'basketball', - 431: 'bassinet', - 432: 'bassoon', - 433: 'bathing cap, swimming cap', - 434: 'bath towel', - 435: 'bathtub, bathing tub, bath, tub', - 436: 'beach wagon, station wagon, wagon, estate car, beach waggon, station waggon, waggon', - 437: 'beacon, lighthouse, beacon light, pharos', - 438: 'beaker', - 439: 'bearskin, busby, shako', - 440: 'beer bottle', - 441: 'beer glass', - 442: 'bell cote, bell cot', - 443: 'bib', - 444: 'bicycle-built-for-two, tandem bicycle, tandem', - 445: 'bikini, two-piece', - 446: 'binder, ring-binder', - 447: 'binoculars, field glasses, opera glasses', - 448: 'birdhouse', - 449: 'boathouse', - 450: 'bobsled, bobsleigh, bob', - 451: 'bolo tie, bolo, bola tie, bola', - 452: 'bonnet, poke bonnet', - 453: 'bookcase', - 454: 'bookshop, bookstore, bookstall', - 455: 'bottlecap', - 456: 'bow', - 457: 'bow tie, bow-tie, bowtie', - 458: 'brass, memorial tablet, plaque', - 459: 'brassiere, bra, bandeau', - 460: 'breakwater, groin, groyne, mole, bulwark, seawall, jetty', - 461: 'breastplate, aegis, egis', - 462: 'broom', - 463: 'bucket, pail', - 464: 'buckle', - 465: 'bulletproof vest', - 466: 'bullet train, bullet', - 467: 'butcher shop, meat market', - 468: 'cab, hack, taxi, taxicab', - 469: 'caldron, cauldron', - 470: 'candle, taper, wax light', - 471: 'cannon', - 472: 'canoe', - 473: 'can opener, tin opener', - 474: 'cardigan', - 475: 'car mirror', - 476: 'carousel, carrousel, merry-go-round, roundabout, whirligig', - 477: "carpenter's kit, tool kit", - 478: 'carton', - 479: 'car wheel', - 480: 'cash machine, cash dispenser, automated teller machine, automatic teller machine, automated teller, automatic teller, ATM', - 481: 'cassette', - 482: 'cassette player', - 483: 'castle', - 484: 'catamaran', - 485: 'CD player', - 486: 'cello, violoncello', - 487: 'cellular telephone, cellular phone, cellphone, cell, mobile phone', - 488: 'chain', - 489: 'chainlink fence', - 490: 'chain mail, ring mail, mail, chain armor, chain armour, ring armor, ring armour', - 491: 'chain saw, chainsaw', - 492: 'chest', - 493: 'chiffonier, commode', - 494: 'chime, bell, gong', - 495: 'china cabinet, china closet', - 496: 'Christmas stocking', - 497: 'church, church building', - 498: 'cinema, movie theater, movie theatre, movie house, picture palace', - 499: 'cleaver, meat cleaver, chopper', - 500: 'cliff dwelling', - 501: 'cloak', - 502: 'clog, geta, patten, sabot', - 503: 'cocktail shaker', - 504: 'coffee mug', - 505: 'coffeepot', - 506: 'coil, spiral, volute, whorl, helix', - 507: 'combination lock', - 508: 'computer keyboard, keypad', - 509: 'confectionery, confectionary, candy store', - 510: 'container ship, containership, container vessel', - 511: 'convertible', - 512: 'corkscrew, bottle screw', - 513: 'cornet, horn, trumpet, trump', - 514: 'cowboy boot', - 515: 'cowboy hat, ten-gallon hat', - 516: 'cradle', - 517: 'crane', - 518: 'crash helmet', - 519: 'crate', - 520: 'crib, cot', - 521: 'Crock Pot', - 522: 'croquet ball', - 523: 'crutch', - 524: 'cuirass', - 525: 'dam, dike, dyke', - 526: 'desk', - 527: 'desktop computer', - 528: 'dial telephone, dial phone', - 529: 'diaper, nappy, napkin', - 530: 'digital clock', - 531: 'digital watch', - 532: 'dining table, board', - 533: 'dishrag, dishcloth', - 534: 'dishwasher, dish washer, dishwashing machine', - 535: 'disk brake, disc brake', - 536: 'dock, dockage, docking facility', - 537: 'dogsled, dog sled, dog sleigh', - 538: 'dome', - 539: 'doormat, welcome mat', - 540: 'drilling platform, offshore rig', - 541: 'drum, membranophone, tympan', - 542: 'drumstick', - 543: 'dumbbell', - 544: 'Dutch oven', - 545: 'electric fan, blower', - 546: 'electric guitar', - 547: 'electric locomotive', - 548: 'entertainment center', - 549: 'envelope', - 550: 'espresso maker', - 551: 'face powder', - 552: 'feather boa, boa', - 553: 'file, file cabinet, filing cabinet', - 554: 'fireboat', - 555: 'fire engine, fire truck', - 556: 'fire screen, fireguard', - 557: 'flagpole, flagstaff', - 558: 'flute, transverse flute', - 559: 'folding chair', - 560: 'football helmet', - 561: 'forklift', - 562: 'fountain', - 563: 'fountain pen', - 564: 'four-poster', - 565: 'freight car', - 566: 'French horn, horn', - 567: 'frying pan, frypan, skillet', - 568: 'fur coat', - 569: 'garbage truck, dustcart', - 570: 'gasmask, respirator, gas helmet', - 571: 'gas pump, gasoline pump, petrol pump, island dispenser', - 572: 'goblet', - 573: 'go-kart', - 574: 'golf ball', - 575: 'golfcart, golf cart', - 576: 'gondola', - 577: 'gong, tam-tam', - 578: 'gown', - 579: 'grand piano, grand', - 580: 'greenhouse, nursery, glasshouse', - 581: 'grille, radiator grille', - 582: 'grocery store, grocery, food market, market', - 583: 'guillotine', - 584: 'hair slide', - 585: 'hair spray', - 586: 'half track', - 587: 'hammer', - 588: 'hamper', - 589: 'hand blower, blow dryer, blow drier, hair dryer, hair drier', - 590: 'hand-held computer, hand-held microcomputer', - 591: 'handkerchief, hankie, hanky, hankey', - 592: 'hard disc, hard disk, fixed disk', - 593: 'harmonica, mouth organ, harp, mouth harp', - 594: 'harp', - 595: 'harvester, reaper', - 596: 'hatchet', - 597: 'holster', - 598: 'home theater, home theatre', - 599: 'honeycomb', - 600: 'hook, claw', - 601: 'hoopskirt, crinoline', - 602: 'horizontal bar, high bar', - 603: 'horse cart, horse-cart', - 604: 'hourglass', - 605: 'iPod', - 606: 'iron, smoothing iron', - 607: "jack-o'-lantern", - 608: 'jean, blue jean, denim', - 609: 'jeep, landrover', - 610: 'jersey, T-shirt, tee shirt', - 611: 'jigsaw puzzle', - 612: 'jinrikisha, ricksha, rickshaw', - 613: 'joystick', - 614: 'kimono', - 615: 'knee pad', - 616: 'knot', - 617: 'lab coat, laboratory coat', - 618: 'ladle', - 619: 'lampshade, lamp shade', - 620: 'laptop, laptop computer', - 621: 'lawn mower, mower', - 622: 'lens cap, lens cover', - 623: 'letter opener, paper knife, paperknife', - 624: 'library', - 625: 'lifeboat', - 626: 'lighter, light, igniter, ignitor', - 627: 'limousine, limo', - 628: 'liner, ocean liner', - 629: 'lipstick, lip rouge', - 630: 'Loafer', - 631: 'lotion', - 632: 'loudspeaker, speaker, speaker unit, loudspeaker system, speaker system', - 633: "loupe, jeweler's loupe", - 634: 'lumbermill, sawmill', - 635: 'magnetic compass', - 636: 'mailbag, postbag', - 637: 'mailbox, letter box', - 638: 'maillot', - 639: 'maillot, tank suit', - 640: 'manhole cover', - 641: 'maraca', - 642: 'marimba, xylophone', - 643: 'mask', - 644: 'matchstick', - 645: 'maypole', - 646: 'maze, labyrinth', - 647: 'measuring cup', - 648: 'medicine chest, medicine cabinet', - 649: 'megalith, megalithic structure', - 650: 'microphone, mike', - 651: 'microwave, microwave oven', - 652: 'military uniform', - 653: 'milk can', - 654: 'minibus', - 655: 'miniskirt, mini', - 656: 'minivan', - 657: 'missile', - 658: 'mitten', - 659: 'mixing bowl', - 660: 'mobile home, manufactured home', - 661: 'Model T', - 662: 'modem', - 663: 'monastery', - 664: 'monitor', - 665: 'moped', - 666: 'mortar', - 667: 'mortarboard', - 668: 'mosque', - 669: 'mosquito net', - 670: 'motor scooter, scooter', - 671: 'mountain bike, all-terrain bike, off-roader', - 672: 'mountain tent', - 673: 'mouse, computer mouse', - 674: 'mousetrap', - 675: 'moving van', - 676: 'muzzle', - 677: 'nail', - 678: 'neck brace', - 679: 'necklace', - 680: 'nipple', - 681: 'notebook, notebook computer', - 682: 'obelisk', - 683: 'oboe, hautboy, hautbois', - 684: 'ocarina, sweet potato', - 685: 'odometer, hodometer, mileometer, milometer', - 686: 'oil filter', - 687: 'organ, pipe organ', - 688: 'oscilloscope, scope, cathode-ray oscilloscope, CRO', - 689: 'overskirt', - 690: 'oxcart', - 691: 'oxygen mask', - 692: 'packet', - 693: 'paddle, boat paddle', - 694: 'paddlewheel, paddle wheel', - 695: 'padlock', - 696: 'paintbrush', - 697: "pajama, pyjama, pj's, jammies", - 698: 'palace', - 699: 'panpipe, pandean pipe, syrinx', - 700: 'paper towel', - 701: 'parachute, chute', - 702: 'parallel bars, bars', - 703: 'park bench', - 704: 'parking meter', - 705: 'passenger car, coach, carriage', - 706: 'patio, terrace', - 707: 'pay-phone, pay-station', - 708: 'pedestal, plinth, footstall', - 709: 'pencil box, pencil case', - 710: 'pencil sharpener', - 711: 'perfume, essence', - 712: 'Petri dish', - 713: 'photocopier', - 714: 'pick, plectrum, plectron', - 715: 'pickelhaube', - 716: 'picket fence, paling', - 717: 'pickup, pickup truck', - 718: 'pier', - 719: 'piggy bank, penny bank', - 720: 'pill bottle', - 721: 'pillow', - 722: 'ping-pong ball', - 723: 'pinwheel', - 724: 'pirate, pirate ship', - 725: 'pitcher, ewer', - 726: "plane, carpenter's plane, woodworking plane", - 727: 'planetarium', - 728: 'plastic bag', - 729: 'plate rack', - 730: 'plow, plough', - 731: "plunger, plumber's helper", - 732: 'Polaroid camera, Polaroid Land camera', - 733: 'pole', - 734: 'police van, police wagon, paddy wagon, patrol wagon, wagon, black Maria', - 735: 'poncho', - 736: 'pool table, billiard table, snooker table', - 737: 'pop bottle, soda bottle', - 738: 'pot, flowerpot', - 739: "potter's wheel", - 740: 'power drill', - 741: 'prayer rug, prayer mat', - 742: 'printer', - 743: 'prison, prison house', - 744: 'projectile, missile', - 745: 'projector', - 746: 'puck, hockey puck', - 747: 'punching bag, punch bag, punching ball, punchball', - 748: 'purse', - 749: 'quill, quill pen', - 750: 'quilt, comforter, comfort, puff', - 751: 'racer, race car, racing car', - 752: 'racket, racquet', - 753: 'radiator', - 754: 'radio, wireless', - 755: 'radio telescope, radio reflector', - 756: 'rain barrel', - 757: 'recreational vehicle, RV, R.V.', - 758: 'reel', - 759: 'reflex camera', - 760: 'refrigerator, icebox', - 761: 'remote control, remote', - 762: 'restaurant, eating house, eating place, eatery', - 763: 'revolver, six-gun, six-shooter', - 764: 'rifle', - 765: 'rocking chair, rocker', - 766: 'rotisserie', - 767: 'rubber eraser, rubber, pencil eraser', - 768: 'rugby ball', - 769: 'rule, ruler', - 770: 'running shoe', - 771: 'safe', - 772: 'safety pin', - 773: 'saltshaker, salt shaker', - 774: 'sandal', - 775: 'sarong', - 776: 'sax, saxophone', - 777: 'scabbard', - 778: 'scale, weighing machine', - 779: 'school bus', - 780: 'schooner', - 781: 'scoreboard', - 782: 'screen, CRT screen', - 783: 'screw', - 784: 'screwdriver', - 785: 'seat belt, seatbelt', - 786: 'sewing machine', - 787: 'shield, buckler', - 788: 'shoe shop, shoe-shop, shoe store', - 789: 'shoji', - 790: 'shopping basket', - 791: 'shopping cart', - 792: 'shovel', - 793: 'shower cap', - 794: 'shower curtain', - 795: 'ski', - 796: 'ski mask', - 797: 'sleeping bag', - 798: 'slide rule, slipstick', - 799: 'sliding door', - 800: 'slot, one-armed bandit', - 801: 'snorkel', - 802: 'snowmobile', - 803: 'snowplow, snowplough', - 804: 'soap dispenser', - 805: 'soccer ball', - 806: 'sock', - 807: 'solar dish, solar collector, solar furnace', - 808: 'sombrero', - 809: 'soup bowl', - 810: 'space bar', - 811: 'space heater', - 812: 'space shuttle', - 813: 'spatula', - 814: 'speedboat', - 815: "spider web, spider's web", - 816: 'spindle', - 817: 'sports car, sport car', - 818: 'spotlight, spot', - 819: 'stage', - 820: 'steam locomotive', - 821: 'steel arch bridge', - 822: 'steel drum', - 823: 'stethoscope', - 824: 'stole', - 825: 'stone wall', - 826: 'stopwatch, stop watch', - 827: 'stove', - 828: 'strainer', - 829: 'streetcar, tram, tramcar, trolley, trolley car', - 830: 'stretcher', - 831: 'studio couch, day bed', - 832: 'stupa, tope', - 833: 'submarine, pigboat, sub, U-boat', - 834: 'suit, suit of clothes', - 835: 'sundial', - 836: 'sunglass', - 837: 'sunglasses, dark glasses, shades', - 838: 'sunscreen, sunblock, sun blocker', - 839: 'suspension bridge', - 840: 'swab, swob, mop', - 841: 'sweatshirt', - 842: 'swimming trunks, bathing trunks', - 843: 'swing', - 844: 'switch, electric switch, electrical switch', - 845: 'syringe', - 846: 'table lamp', - 847: 'tank, army tank, armored combat vehicle, armoured combat vehicle', - 848: 'tape player', - 849: 'teapot', - 850: 'teddy, teddy bear', - 851: 'television, television system', - 852: 'tennis ball', - 853: 'thatch, thatched roof', - 854: 'theater curtain, theatre curtain', - 855: 'thimble', - 856: 'thresher, thrasher, threshing machine', - 857: 'throne', - 858: 'tile roof', - 859: 'toaster', - 860: 'tobacco shop, tobacconist shop, tobacconist', - 861: 'toilet seat', - 862: 'torch', - 863: 'totem pole', - 864: 'tow truck, tow car, wrecker', - 865: 'toyshop', - 866: 'tractor', - 867: 'trailer truck, tractor trailer, trucking rig, rig, articulated lorry, semi', - 868: 'tray', - 869: 'trench coat', - 870: 'tricycle, trike, velocipede', - 871: 'trimaran', - 872: 'tripod', - 873: 'triumphal arch', - 874: 'trolleybus, trolley coach, trackless trolley', - 875: 'trombone', - 876: 'tub, vat', - 877: 'turnstile', - 878: 'typewriter keyboard', - 879: 'umbrella', - 880: 'unicycle, monocycle', - 881: 'upright, upright piano', - 882: 'vacuum, vacuum cleaner', - 883: 'vase', - 884: 'vault', - 885: 'velvet', - 886: 'vending machine', - 887: 'vestment', - 888: 'viaduct', - 889: 'violin, fiddle', - 890: 'volleyball', - 891: 'waffle iron', - 892: 'wall clock', - 893: 'wallet, billfold, notecase, pocketbook', - 894: 'wardrobe, closet, press', - 895: 'warplane, military plane', - 896: 'washbasin, handbasin, washbowl, lavabo, wash-hand basin', - 897: 'washer, automatic washer, washing machine', - 898: 'water bottle', - 899: 'water jug', - 900: 'water tower', - 901: 'whiskey jug', - 902: 'whistle', - 903: 'wig', - 904: 'window screen', - 905: 'window shade', - 906: 'Windsor tie', - 907: 'wine bottle', - 908: 'wing', - 909: 'wok', - 910: 'wooden spoon', - 911: 'wool, woolen, woollen', - 912: 'worm fence, snake fence, snake-rail fence, Virginia fence', - 913: 'wreck', - 914: 'yawl', - 915: 'yurt', - 916: 'web site, website, internet site, site', - 917: 'comic book', - 918: 'crossword puzzle, crossword', - 919: 'street sign', - 920: 'traffic light, traffic signal, stoplight', - 921: 'book jacket, dust cover, dust jacket, dust wrapper', - 922: 'menu', - 923: 'plate', - 924: 'guacamole', - 925: 'consomme', - 926: 'hot pot, hotpot', - 927: 'trifle', - 928: 'ice cream, icecream', - 929: 'ice lolly, lolly, lollipop, popsicle', - 930: 'French loaf', - 931: 'bagel, beigel', - 932: 'pretzel', - 933: 'cheeseburger', - 934: 'hotdog, hot dog, red hot', - 935: 'mashed potato', - 936: 'head cabbage', - 937: 'broccoli', - 938: 'cauliflower', - 939: 'zucchini, courgette', - 940: 'spaghetti squash', - 941: 'acorn squash', - 942: 'butternut squash', - 943: 'cucumber, cuke', - 944: 'artichoke, globe artichoke', - 945: 'bell pepper', - 946: 'cardoon', - 947: 'mushroom', - 948: 'Granny Smith', - 949: 'strawberry', - 950: 'orange', - 951: 'lemon', - 952: 'fig', - 953: 'pineapple, ananas', - 954: 'banana', - 955: 'jackfruit, jak, jack', - 956: 'custard apple', - 957: 'pomegranate', - 958: 'hay', - 959: 'carbonara', - 960: 'chocolate sauce, chocolate syrup', - 961: 'dough', - 962: 'meat loaf, meatloaf', - 963: 'pizza, pizza pie', - 964: 'potpie', - 965: 'burrito', - 966: 'red wine', - 967: 'espresso', - 968: 'cup', - 969: 'eggnog', - 970: 'alp', - 971: 'bubble', - 972: 'cliff, drop, drop-off', - 973: 'coral reef', - 974: 'geyser', - 975: 'lakeside, lakeshore', - 976: 'promontory, headland, head, foreland', - 977: 'sandbar, sand bar', - 978: 'seashore, coast, seacoast, sea-coast', - 979: 'valley, vale', - 980: 'volcano', - 981: 'ballplayer, baseball player', - 982: 'groom, bridegroom', - 983: 'scuba diver', - 984: 'rapeseed', - 985: 'daisy', - 986: "yellow lady's slipper, yellow lady-slipper, Cypripedium calceolus, Cypripedium parviflorum", - 987: 'corn', - 988: 'acorn', - 989: 'hip, rose hip, rosehip', - 990: 'buckeye, horse chestnut, conker', - 991: 'coral fungus', - 992: 'agaric', - 993: 'gyromitra', - 994: 'stinkhorn, carrion fungus', - 995: 'earthstar', - 996: 'hen-of-the-woods, hen of the woods, Polyporus frondosus, Grifola frondosa', - 997: 'bolete', - 998: 'ear, spike, capitulum', - 999: 'toilet tissue, toilet paper, bathroom tissue'} +{ + "0": "tench, Tinca tinca", + "1": "goldfish, Carassius auratus", + "2": "great white shark, white shark, man-eater, man-eating shark, Carcharodon carcharias", + "3": "tiger shark, Galeocerdo cuvieri", + "4": "hammerhead, hammerhead shark", + "5": "electric ray, crampfish, numbfish, torpedo", + "6": "stingray", + "7": "cock", + "8": "hen", + "9": "ostrich, Struthio camelus", + "10": "brambling, Fringilla montifringilla", + "11": "goldfinch, Carduelis carduelis", + "12": "house finch, linnet, Carpodacus mexicanus", + "13": "junco, snowbird", + "14": "indigo bunting, indigo finch, indigo bird, Passerina cyanea", + "15": "robin, American robin, Turdus migratorius", + "16": "bulbul", + "17": "jay", + "18": "magpie", + "19": "chickadee", + "20": "water ouzel, dipper", + "21": "kite", + "22": "bald eagle, American eagle, Haliaeetus leucocephalus", + "23": "vulture", + "24": "great grey owl, great gray owl, Strix nebulosa", + "25": "European fire salamander, Salamandra salamandra", + "26": "common newt, Triturus vulgaris", + "27": "eft", + "28": "spotted salamander, Ambystoma maculatum", + "29": "axolotl, mud puppy, Ambystoma mexicanum", + "30": "bullfrog, Rana catesbeiana", + "31": "tree frog, tree-frog", + "32": "tailed frog, bell toad, ribbed toad, tailed toad, Ascaphus trui", + "33": "loggerhead, loggerhead turtle, Caretta caretta", + "34": "leatherback turtle, leatherback, leathery turtle, Dermochelys coriacea", + "35": "mud turtle", + "36": "terrapin", + "37": "box turtle, box tortoise", + "38": "banded gecko", + "39": "common iguana, iguana, Iguana iguana", + "40": "American chameleon, anole, Anolis carolinensis", + "41": "whiptail, whiptail lizard", + "42": "agama", + "43": "frilled lizard, Chlamydosaurus kingi", + "44": "alligator lizard", + "45": "Gila monster, Heloderma suspectum", + "46": "green lizard, Lacerta viridis", + "47": "African chameleon, Chamaeleo chamaeleon", + "48": "Komodo dragon, Komodo lizard, dragon lizard, giant lizard, Varanus komodoensis", + "49": "African crocodile, Nile crocodile, Crocodylus niloticus", + "50": "American alligator, Alligator mississipiensis", + "51": "triceratops", + "52": "thunder snake, worm snake, Carphophis amoenus", + "53": "ringneck snake, ring-necked snake, ring snake", + "54": "hognose snake, puff adder, sand viper", + "55": "green snake, grass snake", + "56": "king snake, kingsnake", + "57": "garter snake, grass snake", + "58": "water snake", + "59": "vine snake", + "60": "night snake, Hypsiglena torquata", + "61": "boa constrictor, Constrictor constrictor", + "62": "rock python, rock snake, Python sebae", + "63": "Indian cobra, Naja naja", + "64": "green mamba", + "65": "sea snake", + "66": "horned viper, cerastes, sand viper, horned asp, Cerastes cornutus", + "67": "diamondback, diamondback rattlesnake, Crotalus adamanteus", + "68": "sidewinder, horned rattlesnake, Crotalus cerastes", + "69": "trilobite", + "70": "harvestman, daddy longlegs, Phalangium opilio", + "71": "scorpion", + "72": "black and gold garden spider, Argiope aurantia", + "73": "barn spider, Araneus cavaticus", + "74": "garden spider, Aranea diademata", + "75": "black widow, Latrodectus mactans", + "76": "tarantula", + "77": "wolf spider, hunting spider", + "78": "tick", + "79": "centipede", + "80": "black grouse", + "81": "ptarmigan", + "82": "ruffed grouse, partridge, Bonasa umbellus", + "83": "prairie chicken, prairie grouse, prairie fowl", + "84": "peacock", + "85": "quail", + "86": "partridge", + "87": "African grey, African gray, Psittacus erithacus", + "88": "macaw", + "89": "sulphur-crested cockatoo, Kakatoe galerita, Cacatua galerita", + "90": "lorikeet", + "91": "coucal", + "92": "bee eater", + "93": "hornbill", + "94": "hummingbird", + "95": "jacamar", + "96": "toucan", + "97": "drake", + "98": "red-breasted merganser, Mergus serrator", + "99": "goose", + "100": "black swan, Cygnus atratus", + "101": "tusker", + "102": "echidna, spiny anteater, anteater", + "103": "platypus, duckbill, duckbilled platypus, duck-billed platypus, Ornithorhynchus anatinus", + "104": "wallaby, brush kangaroo", + "105": "koala, koala bear, kangaroo bear, native bear, Phascolarctos cinereus", + "106": "wombat", + "107": "jellyfish", + "108": "sea anemone, anemone", + "109": "brain coral", + "110": "flatworm, platyhelminth", + "111": "nematode, nematode worm, roundworm", + "112": "conch", + "113": "snail", + "114": "slug", + "115": "sea slug, nudibranch", + "116": "chiton, coat-of-mail shell, sea cradle, polyplacophore", + "117": "chambered nautilus, pearly nautilus, nautilus", + "118": "Dungeness crab, Cancer magister", + "119": "rock crab, Cancer irroratus", + "120": "fiddler crab", + "121": "king crab, Alaska crab, Alaskan king crab, Alaska king crab, Paralithodes camtschatica", + "122": "American lobster, Northern lobster, Maine lobster, Homarus americanus", + "123": "spiny lobster, langouste, rock lobster, crawfish, crayfish, sea crawfish", + "124": "crayfish, crawfish, crawdad, crawdaddy", + "125": "hermit crab", + "126": "isopod", + "127": "white stork, Ciconia ciconia", + "128": "black stork, Ciconia nigra", + "129": "spoonbill", + "130": "flamingo", + "131": "little blue heron, Egretta caerulea", + "132": "American egret, great white heron, Egretta albus", + "133": "bittern", + "134": "crane", + "135": "limpkin, Aramus pictus", + "136": "European gallinule, Porphyrio porphyrio", + "137": "American coot, marsh hen, mud hen, water hen, Fulica americana", + "138": "bustard", + "139": "ruddy turnstone, Arenaria interpres", + "140": "red-backed sandpiper, dunlin, Erolia alpina", + "141": "redshank, Tringa totanus", + "142": "dowitcher", + "143": "oystercatcher, oyster catcher", + "144": "pelican", + "145": "king penguin, Aptenodytes patagonica", + "146": "albatross, mollymawk", + "147": "grey whale, gray whale, devilfish, Eschrichtius gibbosus, Eschrichtius robustus", + "148": "killer whale, killer, orca, grampus, sea wolf, Orcinus orca", + "149": "dugong, Dugong dugon", + "150": "sea lion", + "151": "Chihuahua", + "152": "Japanese spaniel", + "153": "Maltese dog, Maltese terrier, Maltese", + "154": "Pekinese, Pekingese, Peke", + "155": "Shih-Tzu", + "156": "Blenheim spaniel", + "157": "papillon", + "158": "toy terrier", + "159": "Rhodesian ridgeback", + "160": "Afghan hound, Afghan", + "161": "basset, basset hound", + "162": "beagle", + "163": "bloodhound, sleuthhound", + "164": "bluetick", + "165": "black-and-tan coonhound", + "166": "Walker hound, Walker foxhound", + "167": "English foxhound", + "168": "redbone", + "169": "borzoi, Russian wolfhound", + "170": "Irish wolfhound", + "171": "Italian greyhound", + "172": "whippet", + "173": "Ibizan hound, Ibizan Podenco", + "174": "Norwegian elkhound, elkhound", + "175": "otterhound, otter hound", + "176": "Saluki, gazelle hound", + "177": "Scottish deerhound, deerhound", + "178": "Weimaraner", + "179": "Staffordshire bullterrier, Staffordshire bull terrier", + "180": "American Staffordshire terrier, Staffordshire terrier, American pit bull terrier, pit bull terrier", + "181": "Bedlington terrier", + "182": "Border terrier", + "183": "Kerry blue terrier", + "184": "Irish terrier", + "185": "Norfolk terrier", + "186": "Norwich terrier", + "187": "Yorkshire terrier", + "188": "wire-haired fox terrier", + "189": "Lakeland terrier", + "190": "Sealyham terrier, Sealyham", + "191": "Airedale, Airedale terrier", + "192": "cairn, cairn terrier", + "193": "Australian terrier", + "194": "Dandie Dinmont, Dandie Dinmont terrier", + "195": "Boston bull, Boston terrier", + "196": "miniature schnauzer", + "197": "giant schnauzer", + "198": "standard schnauzer", + "199": "Scotch terrier, Scottish terrier, Scottie", + "200": "Tibetan terrier, chrysanthemum dog", + "201": "silky terrier, Sydney silky", + "202": "soft-coated wheaten terrier", + "203": "West Highland white terrier", + "204": "Lhasa, Lhasa apso", + "205": "flat-coated retriever", + "206": "curly-coated retriever", + "207": "golden retriever", + "208": "Labrador retriever", + "209": "Chesapeake Bay retriever", + "210": "German short-haired pointer", + "211": "vizsla, Hungarian pointer", + "212": "English setter", + "213": "Irish setter, red setter", + "214": "Gordon setter", + "215": "Brittany spaniel", + "216": "clumber, clumber spaniel", + "217": "English springer, English springer spaniel", + "218": "Welsh springer spaniel", + "219": "cocker spaniel, English cocker spaniel, cocker", + "220": "Sussex spaniel", + "221": "Irish water spaniel", + "222": "kuvasz", + "223": "schipperke", + "224": "groenendael", + "225": "malinois", + "226": "briard", + "227": "kelpie", + "228": "komondor", + "229": "Old English sheepdog, bobtail", + "230": "Shetland sheepdog, Shetland sheep dog, Shetland", + "231": "collie", + "232": "Border collie", + "233": "Bouvier des Flandres, Bouviers des Flandres", + "234": "Rottweiler", + "235": "German shepherd, German shepherd dog, German police dog, alsatian", + "236": "Doberman, Doberman pinscher", + "237": "miniature pinscher", + "238": "Greater Swiss Mountain dog", + "239": "Bernese mountain dog", + "240": "Appenzeller", + "241": "EntleBucher", + "242": "boxer", + "243": "bull mastiff", + "244": "Tibetan mastiff", + "245": "French bulldog", + "246": "Great Dane", + "247": "Saint Bernard, St Bernard", + "248": "Eskimo dog, husky", + "249": "malamute, malemute, Alaskan malamute", + "250": "Siberian husky", + "251": "dalmatian, coach dog, carriage dog", + "252": "affenpinscher, monkey pinscher, monkey dog", + "253": "basenji", + "254": "pug, pug-dog", + "255": "Leonberg", + "256": "Newfoundland, Newfoundland dog", + "257": "Great Pyrenees", + "258": "Samoyed, Samoyede", + "259": "Pomeranian", + "260": "chow, chow chow", + "261": "keeshond", + "262": "Brabancon griffon", + "263": "Pembroke, Pembroke Welsh corgi", + "264": "Cardigan, Cardigan Welsh corgi", + "265": "toy poodle", + "266": "miniature poodle", + "267": "standard poodle", + "268": "Mexican hairless", + "269": "timber wolf, grey wolf, gray wolf, Canis lupus", + "270": "white wolf, Arctic wolf, Canis lupus tundrarum", + "271": "red wolf, maned wolf, Canis rufus, Canis niger", + "272": "coyote, prairie wolf, brush wolf, Canis latrans", + "273": "dingo, warrigal, warragal, Canis dingo", + "274": "dhole, Cuon alpinus", + "275": "African hunting dog, hyena dog, Cape hunting dog, Lycaon pictus", + "276": "hyena, hyaena", + "277": "red fox, Vulpes vulpes", + "278": "kit fox, Vulpes macrotis", + "279": "Arctic fox, white fox, Alopex lagopus", + "280": "grey fox, gray fox, Urocyon cinereoargenteus", + "281": "tabby, tabby cat", + "282": "tiger cat", + "283": "Persian cat", + "284": "Siamese cat, Siamese", + "285": "Egyptian cat", + "286": "cougar, puma, catamount, mountain lion, painter, panther, Felis concolor", + "287": "lynx, catamount", + "288": "leopard, Panthera pardus", + "289": "snow leopard, ounce, Panthera uncia", + "290": "jaguar, panther, Panthera onca, Felis onca", + "291": "lion, king of beasts, Panthera leo", + "292": "tiger, Panthera tigris", + "293": "cheetah, chetah, Acinonyx jubatus", + "294": "brown bear, bruin, Ursus arctos", + "295": "American black bear, black bear, Ursus americanus, Euarctos americanus", + "296": "ice bear, polar bear, Ursus Maritimus, Thalarctos maritimus", + "297": "sloth bear, Melursus ursinus, Ursus ursinus", + "298": "mongoose", + "299": "meerkat, mierkat", + "300": "tiger beetle", + "301": "ladybug, ladybeetle, lady beetle, ladybird, ladybird beetle", + "302": "ground beetle, carabid beetle", + "303": "long-horned beetle, longicorn, longicorn beetle", + "304": "leaf beetle, chrysomelid", + "305": "dung beetle", + "306": "rhinoceros beetle", + "307": "weevil", + "308": "fly", + "309": "bee", + "310": "ant, emmet, pismire", + "311": "grasshopper, hopper", + "312": "cricket", + "313": "walking stick, walkingstick, stick insect", + "314": "cockroach, roach", + "315": "mantis, mantid", + "316": "cicada, cicala", + "317": "leafhopper", + "318": "lacewing, lacewing fly", + "319": "dragonfly, darning needle, devil's darning needle, sewing needle, snake feeder, snake doctor, mosquito hawk, skeeter hawk", + "320": "damselfly", + "321": "admiral", + "322": "ringlet, ringlet butterfly", + "323": "monarch, monarch butterfly, milkweed butterfly, Danaus plexippus", + "324": "cabbage butterfly", + "325": "sulphur butterfly, sulfur butterfly", + "326": "lycaenid, lycaenid butterfly", + "327": "starfish, sea star", + "328": "sea urchin", + "329": "sea cucumber, holothurian", + "330": "wood rabbit, cottontail, cottontail rabbit", + "331": "hare", + "332": "Angora, Angora rabbit", + "333": "hamster", + "334": "porcupine, hedgehog", + "335": "fox squirrel, eastern fox squirrel, Sciurus niger", + "336": "marmot", + "337": "beaver", + "338": "guinea pig, Cavia cobaya", + "339": "sorrel", + "340": "zebra", + "341": "hog, pig, grunter, squealer, Sus scrofa", + "342": "wild boar, boar, Sus scrofa", + "343": "warthog", + "344": "hippopotamus, hippo, river horse, Hippopotamus amphibius", + "345": "ox", + "346": "water buffalo, water ox, Asiatic buffalo, Bubalus bubalis", + "347": "bison", + "348": "ram, tup", + "349": "bighorn, bighorn sheep, cimarron, Rocky Mountain bighorn, Rocky Mountain sheep, Ovis canadensis", + "350": "ibex, Capra ibex", + "351": "hartebeest", + "352": "impala, Aepyceros melampus", + "353": "gazelle", + "354": "Arabian camel, dromedary, Camelus dromedarius", + "355": "llama", + "356": "weasel", + "357": "mink", + "358": "polecat, fitch, foulmart, foumart, Mustela putorius", + "359": "black-footed ferret, ferret, Mustela nigripes", + "360": "otter", + "361": "skunk, polecat, wood pussy", + "362": "badger", + "363": "armadillo", + "364": "three-toed sloth, ai, Bradypus tridactylus", + "365": "orangutan, orang, orangutang, Pongo pygmaeus", + "366": "gorilla, Gorilla gorilla", + "367": "chimpanzee, chimp, Pan troglodytes", + "368": "gibbon, Hylobates lar", + "369": "siamang, Hylobates syndactylus, Symphalangus syndactylus", + "370": "guenon, guenon monkey", + "371": "patas, hussar monkey, Erythrocebus patas", + "372": "baboon", + "373": "macaque", + "374": "langur", + "375": "colobus, colobus monkey", + "376": "proboscis monkey, Nasalis larvatus", + "377": "marmoset", + "378": "capuchin, ringtail, Cebus capucinus", + "379": "howler monkey, howler", + "380": "titi, titi monkey", + "381": "spider monkey, Ateles geoffroyi", + "382": "squirrel monkey, Saimiri sciureus", + "383": "Madagascar cat, ring-tailed lemur, Lemur catta", + "384": "indri, indris, Indri indri, Indri brevicaudatus", + "385": "Indian elephant, Elephas maximus", + "386": "African elephant, Loxodonta africana", + "387": "lesser panda, red panda, panda, bear cat, cat bear, Ailurus fulgens", + "388": "giant panda, panda, panda bear, coon bear, Ailuropoda melanoleuca", + "389": "barracouta, snoek", + "390": "eel", + "391": "coho, cohoe, coho salmon, blue jack, silver salmon, Oncorhynchus kisutch", + "392": "rock beauty, Holocanthus tricolor", + "393": "anemone fish", + "394": "sturgeon", + "395": "gar, garfish, garpike, billfish, Lepisosteus osseus", + "396": "lionfish", + "397": "puffer, pufferfish, blowfish, globefish", + "398": "abacus", + "399": "abaya", + "400": "academic gown, academic robe, judge's robe", + "401": "accordion, piano accordion, squeeze box", + "402": "acoustic guitar", + "403": "aircraft carrier, carrier, flattop, attack aircraft carrier", + "404": "airliner", + "405": "airship, dirigible", + "406": "altar", + "407": "ambulance", + "408": "amphibian, amphibious vehicle", + "409": "analog clock", + "410": "apiary, bee house", + "411": "apron", + "412": "ashcan, trash can, garbage can, wastebin, ash bin, ash-bin, ashbin, dustbin, trash barrel, trash bin", + "413": "assault rifle, assault gun", + "414": "backpack, back pack, knapsack, packsack, rucksack, haversack", + "415": "bakery, bakeshop, bakehouse", + "416": "balance beam, beam", + "417": "balloon", + "418": "ballpoint, ballpoint pen, ballpen, Biro", + "419": "Band Aid", + "420": "banjo", + "421": "bannister, banister, balustrade, balusters, handrail", + "422": "barbell", + "423": "barber chair", + "424": "barbershop", + "425": "barn", + "426": "barometer", + "427": "barrel, cask", + "428": "barrow, garden cart, lawn cart, wheelbarrow", + "429": "baseball", + "430": "basketball", + "431": "bassinet", + "432": "bassoon", + "433": "bathing cap, swimming cap", + "434": "bath towel", + "435": "bathtub, bathing tub, bath, tub", + "436": "beach wagon, station wagon, wagon, estate car, beach waggon, station waggon, waggon", + "437": "beacon, lighthouse, beacon light, pharos", + "438": "beaker", + "439": "bearskin, busby, shako", + "440": "beer bottle", + "441": "beer glass", + "442": "bell cote, bell cot", + "443": "bib", + "444": "bicycle-built-for-two, tandem bicycle, tandem", + "445": "bikini, two-piece", + "446": "binder, ring-binder", + "447": "binoculars, field glasses, opera glasses", + "448": "birdhouse", + "449": "boathouse", + "450": "bobsled, bobsleigh, bob", + "451": "bolo tie, bolo, bola tie, bola", + "452": "bonnet, poke bonnet", + "453": "bookcase", + "454": "bookshop, bookstore, bookstall", + "455": "bottlecap", + "456": "bow", + "457": "bow tie, bow-tie, bowtie", + "458": "brass, memorial tablet, plaque", + "459": "brassiere, bra, bandeau", + "460": "breakwater, groin, groyne, mole, bulwark, seawall, jetty", + "461": "breastplate, aegis, egis", + "462": "broom", + "463": "bucket, pail", + "464": "buckle", + "465": "bulletproof vest", + "466": "bullet train, bullet", + "467": "butcher shop, meat market", + "468": "cab, hack, taxi, taxicab", + "469": "caldron, cauldron", + "470": "candle, taper, wax light", + "471": "cannon", + "472": "canoe", + "473": "can opener, tin opener", + "474": "cardigan", + "475": "car mirror", + "476": "carousel, carrousel, merry-go-round, roundabout, whirligig", + "477": "carpenter's kit, tool kit", + "478": "carton", + "479": "car wheel", + "480": "cash machine, cash dispenser, automated teller machine, automatic teller machine, automated teller, automatic teller, ATM", + "481": "cassette", + "482": "cassette player", + "483": "castle", + "484": "catamaran", + "485": "CD player", + "486": "cello, violoncello", + "487": "cellular telephone, cellular phone, cellphone, cell, mobile phone", + "488": "chain", + "489": "chainlink fence", + "490": "chain mail, ring mail, mail, chain armor, chain armour, ring armor, ring armour", + "491": "chain saw, chainsaw", + "492": "chest", + "493": "chiffonier, commode", + "494": "chime, bell, gong", + "495": "china cabinet, china closet", + "496": "Christmas stocking", + "497": "church, church building", + "498": "cinema, movie theater, movie theatre, movie house, picture palace", + "499": "cleaver, meat cleaver, chopper", + "500": "cliff dwelling", + "501": "cloak", + "502": "clog, geta, patten, sabot", + "503": "cocktail shaker", + "504": "coffee mug", + "505": "coffeepot", + "506": "coil, spiral, volute, whorl, helix", + "507": "combination lock", + "508": "computer keyboard, keypad", + "509": "confectionery, confectionary, candy store", + "510": "container ship, containership, container vessel", + "511": "convertible", + "512": "corkscrew, bottle screw", + "513": "cornet, horn, trumpet, trump", + "514": "cowboy boot", + "515": "cowboy hat, ten-gallon hat", + "516": "cradle", + "517": "crane", + "518": "crash helmet", + "519": "crate", + "520": "crib, cot", + "521": "Crock Pot", + "522": "croquet ball", + "523": "crutch", + "524": "cuirass", + "525": "dam, dike, dyke", + "526": "desk", + "527": "desktop computer", + "528": "dial telephone, dial phone", + "529": "diaper, nappy, napkin", + "530": "digital clock", + "531": "digital watch", + "532": "dining table, board", + "533": "dishrag, dishcloth", + "534": "dishwasher, dish washer, dishwashing machine", + "535": "disk brake, disc brake", + "536": "dock, dockage, docking facility", + "537": "dogsled, dog sled, dog sleigh", + "538": "dome", + "539": "doormat, welcome mat", + "540": "drilling platform, offshore rig", + "541": "drum, membranophone, tympan", + "542": "drumstick", + "543": "dumbbell", + "544": "Dutch oven", + "545": "electric fan, blower", + "546": "electric guitar", + "547": "electric locomotive", + "548": "entertainment center", + "549": "envelope", + "550": "espresso maker", + "551": "face powder", + "552": "feather boa, boa", + "553": "file, file cabinet, filing cabinet", + "554": "fireboat", + "555": "fire engine, fire truck", + "556": "fire screen, fireguard", + "557": "flagpole, flagstaff", + "558": "flute, transverse flute", + "559": "folding chair", + "560": "football helmet", + "561": "forklift", + "562": "fountain", + "563": "fountain pen", + "564": "four-poster", + "565": "freight car", + "566": "French horn, horn", + "567": "frying pan, frypan, skillet", + "568": "fur coat", + "569": "garbage truck, dustcart", + "570": "gasmask, respirator, gas helmet", + "571": "gas pump, gasoline pump, petrol pump, island dispenser", + "572": "goblet", + "573": "go-kart", + "574": "golf ball", + "575": "golfcart, golf cart", + "576": "gondola", + "577": "gong, tam-tam", + "578": "gown", + "579": "grand piano, grand", + "580": "greenhouse, nursery, glasshouse", + "581": "grille, radiator grille", + "582": "grocery store, grocery, food market, market", + "583": "guillotine", + "584": "hair slide", + "585": "hair spray", + "586": "half track", + "587": "hammer", + "588": "hamper", + "589": "hand blower, blow dryer, blow drier, hair dryer, hair drier", + "590": "hand-held computer, hand-held microcomputer", + "591": "handkerchief, hankie, hanky, hankey", + "592": "hard disc, hard disk, fixed disk", + "593": "harmonica, mouth organ, harp, mouth harp", + "594": "harp", + "595": "harvester, reaper", + "596": "hatchet", + "597": "holster", + "598": "home theater, home theatre", + "599": "honeycomb", + "600": "hook, claw", + "601": "hoopskirt, crinoline", + "602": "horizontal bar, high bar", + "603": "horse cart, horse-cart", + "604": "hourglass", + "605": "iPod", + "606": "iron, smoothing iron", + "607": "jack-o'-lantern", + "608": "jean, blue jean, denim", + "609": "jeep, landrover", + "610": "jersey, T-shirt, tee shirt", + "611": "jigsaw puzzle", + "612": "jinrikisha, ricksha, rickshaw", + "613": "joystick", + "614": "kimono", + "615": "knee pad", + "616": "knot", + "617": "lab coat, laboratory coat", + "618": "ladle", + "619": "lampshade, lamp shade", + "620": "laptop, laptop computer", + "621": "lawn mower, mower", + "622": "lens cap, lens cover", + "623": "letter opener, paper knife, paperknife", + "624": "library", + "625": "lifeboat", + "626": "lighter, light, igniter, ignitor", + "627": "limousine, limo", + "628": "liner, ocean liner", + "629": "lipstick, lip rouge", + "630": "Loafer", + "631": "lotion", + "632": "loudspeaker, speaker, speaker unit, loudspeaker system, speaker system", + "633": "loupe, jeweler's loupe", + "634": "lumbermill, sawmill", + "635": "magnetic compass", + "636": "mailbag, postbag", + "637": "mailbox, letter box", + "638": "maillot", + "639": "maillot, tank suit", + "640": "manhole cover", + "641": "maraca", + "642": "marimba, xylophone", + "643": "mask", + "644": "matchstick", + "645": "maypole", + "646": "maze, labyrinth", + "647": "measuring cup", + "648": "medicine chest, medicine cabinet", + "649": "megalith, megalithic structure", + "650": "microphone, mike", + "651": "microwave, microwave oven", + "652": "military uniform", + "653": "milk can", + "654": "minibus", + "655": "miniskirt, mini", + "656": "minivan", + "657": "missile", + "658": "mitten", + "659": "mixing bowl", + "660": "mobile home, manufactured home", + "661": "Model T", + "662": "modem", + "663": "monastery", + "664": "monitor", + "665": "moped", + "666": "mortar", + "667": "mortarboard", + "668": "mosque", + "669": "mosquito net", + "670": "motor scooter, scooter", + "671": "mountain bike, all-terrain bike, off-roader", + "672": "mountain tent", + "673": "mouse, computer mouse", + "674": "mousetrap", + "675": "moving van", + "676": "muzzle", + "677": "nail", + "678": "neck brace", + "679": "necklace", + "680": "nipple", + "681": "notebook, notebook computer", + "682": "obelisk", + "683": "oboe, hautboy, hautbois", + "684": "ocarina, sweet potato", + "685": "odometer, hodometer, mileometer, milometer", + "686": "oil filter", + "687": "organ, pipe organ", + "688": "oscilloscope, scope, cathode-ray oscilloscope, CRO", + "689": "overskirt", + "690": "oxcart", + "691": "oxygen mask", + "692": "packet", + "693": "paddle, boat paddle", + "694": "paddlewheel, paddle wheel", + "695": "padlock", + "696": "paintbrush", + "697": "pajama, pyjama, pj's, jammies", + "698": "palace", + "699": "panpipe, pandean pipe, syrinx", + "700": "paper towel", + "701": "parachute, chute", + "702": "parallel bars, bars", + "703": "park bench", + "704": "parking meter", + "705": "passenger car, coach, carriage", + "706": "patio, terrace", + "707": "pay-phone, pay-station", + "708": "pedestal, plinth, footstall", + "709": "pencil box, pencil case", + "710": "pencil sharpener", + "711": "perfume, essence", + "712": "Petri dish", + "713": "photocopier", + "714": "pick, plectrum, plectron", + "715": "pickelhaube", + "716": "picket fence, paling", + "717": "pickup, pickup truck", + "718": "pier", + "719": "piggy bank, penny bank", + "720": "pill bottle", + "721": "pillow", + "722": "ping-pong ball", + "723": "pinwheel", + "724": "pirate, pirate ship", + "725": "pitcher, ewer", + "726": "plane, carpenter's plane, woodworking plane", + "727": "planetarium", + "728": "plastic bag", + "729": "plate rack", + "730": "plow, plough", + "731": "plunger, plumber's helper", + "732": "Polaroid camera, Polaroid Land camera", + "733": "pole", + "734": "police van, police wagon, paddy wagon, patrol wagon, wagon, black Maria", + "735": "poncho", + "736": "pool table, billiard table, snooker table", + "737": "pop bottle, soda bottle", + "738": "pot, flowerpot", + "739": "potter's wheel", + "740": "power drill", + "741": "prayer rug, prayer mat", + "742": "printer", + "743": "prison, prison house", + "744": "projectile, missile", + "745": "projector", + "746": "puck, hockey puck", + "747": "punching bag, punch bag, punching ball, punchball", + "748": "purse", + "749": "quill, quill pen", + "750": "quilt, comforter, comfort, puff", + "751": "racer, race car, racing car", + "752": "racket, racquet", + "753": "radiator", + "754": "radio, wireless", + "755": "radio telescope, radio reflector", + "756": "rain barrel", + "757": "recreational vehicle, RV, R.V.", + "758": "reel", + "759": "reflex camera", + "760": "refrigerator, icebox", + "761": "remote control, remote", + "762": "restaurant, eating house, eating place, eatery", + "763": "revolver, six-gun, six-shooter", + "764": "rifle", + "765": "rocking chair, rocker", + "766": "rotisserie", + "767": "rubber eraser, rubber, pencil eraser", + "768": "rugby ball", + "769": "rule, ruler", + "770": "running shoe", + "771": "safe", + "772": "safety pin", + "773": "saltshaker, salt shaker", + "774": "sandal", + "775": "sarong", + "776": "sax, saxophone", + "777": "scabbard", + "778": "scale, weighing machine", + "779": "school bus", + "780": "schooner", + "781": "scoreboard", + "782": "screen, CRT screen", + "783": "screw", + "784": "screwdriver", + "785": "seat belt, seatbelt", + "786": "sewing machine", + "787": "shield, buckler", + "788": "shoe shop, shoe-shop, shoe store", + "789": "shoji", + "790": "shopping basket", + "791": "shopping cart", + "792": "shovel", + "793": "shower cap", + "794": "shower curtain", + "795": "ski", + "796": "ski mask", + "797": "sleeping bag", + "798": "slide rule, slipstick", + "799": "sliding door", + "800": "slot, one-armed bandit", + "801": "snorkel", + "802": "snowmobile", + "803": "snowplow, snowplough", + "804": "soap dispenser", + "805": "soccer ball", + "806": "sock", + "807": "solar dish, solar collector, solar furnace", + "808": "sombrero", + "809": "soup bowl", + "810": "space bar", + "811": "space heater", + "812": "space shuttle", + "813": "spatula", + "814": "speedboat", + "815": "spider web, spider's web", + "816": "spindle", + "817": "sports car, sport car", + "818": "spotlight, spot", + "819": "stage", + "820": "steam locomotive", + "821": "steel arch bridge", + "822": "steel drum", + "823": "stethoscope", + "824": "stole", + "825": "stone wall", + "826": "stopwatch, stop watch", + "827": "stove", + "828": "strainer", + "829": "streetcar, tram, tramcar, trolley, trolley car", + "830": "stretcher", + "831": "studio couch, day bed", + "832": "stupa, tope", + "833": "submarine, pigboat, sub, U-boat", + "834": "suit, suit of clothes", + "835": "sundial", + "836": "sunglass", + "837": "sunglasses, dark glasses, shades", + "838": "sunscreen, sunblock, sun blocker", + "839": "suspension bridge", + "840": "swab, swob, mop", + "841": "sweatshirt", + "842": "swimming trunks, bathing trunks", + "843": "swing", + "844": "switch, electric switch, electrical switch", + "845": "syringe", + "846": "table lamp", + "847": "tank, army tank, armored combat vehicle, armoured combat vehicle", + "848": "tape player", + "849": "teapot", + "850": "teddy, teddy bear", + "851": "television, television system", + "852": "tennis ball", + "853": "thatch, thatched roof", + "854": "theater curtain, theatre curtain", + "855": "thimble", + "856": "thresher, thrasher, threshing machine", + "857": "throne", + "858": "tile roof", + "859": "toaster", + "860": "tobacco shop, tobacconist shop, tobacconist", + "861": "toilet seat", + "862": "torch", + "863": "totem pole", + "864": "tow truck, tow car, wrecker", + "865": "toyshop", + "866": "tractor", + "867": "trailer truck, tractor trailer, trucking rig, rig, articulated lorry, semi", + "868": "tray", + "869": "trench coat", + "870": "tricycle, trike, velocipede", + "871": "trimaran", + "872": "tripod", + "873": "triumphal arch", + "874": "trolleybus, trolley coach, trackless trolley", + "875": "trombone", + "876": "tub, vat", + "877": "turnstile", + "878": "typewriter keyboard", + "879": "umbrella", + "880": "unicycle, monocycle", + "881": "upright, upright piano", + "882": "vacuum, vacuum cleaner", + "883": "vase", + "884": "vault", + "885": "velvet", + "886": "vending machine", + "887": "vestment", + "888": "viaduct", + "889": "violin, fiddle", + "890": "volleyball", + "891": "waffle iron", + "892": "wall clock", + "893": "wallet, billfold, notecase, pocketbook", + "894": "wardrobe, closet, press", + "895": "warplane, military plane", + "896": "washbasin, handbasin, washbowl, lavabo, wash-hand basin", + "897": "washer, automatic washer, washing machine", + "898": "water bottle", + "899": "water jug", + "900": "water tower", + "901": "whiskey jug", + "902": "whistle", + "903": "wig", + "904": "window screen", + "905": "window shade", + "906": "Windsor tie", + "907": "wine bottle", + "908": "wing", + "909": "wok", + "910": "wooden spoon", + "911": "wool, woolen, woollen", + "912": "worm fence, snake fence, snake-rail fence, Virginia fence", + "913": "wreck", + "914": "yawl", + "915": "yurt", + "916": "web site, website, internet site, site", + "917": "comic book", + "918": "crossword puzzle, crossword", + "919": "street sign", + "920": "traffic light, traffic signal, stoplight", + "921": "book jacket, dust cover, dust jacket, dust wrapper", + "922": "menu", + "923": "plate", + "924": "guacamole", + "925": "consomme", + "926": "hot pot, hotpot", + "927": "trifle", + "928": "ice cream, icecream", + "929": "ice lolly, lolly, lollipop, popsicle", + "930": "French loaf", + "931": "bagel, beigel", + "932": "pretzel", + "933": "cheeseburger", + "934": "hotdog, hot dog, red hot", + "935": "mashed potato", + "936": "head cabbage", + "937": "broccoli", + "938": "cauliflower", + "939": "zucchini, courgette", + "940": "spaghetti squash", + "941": "acorn squash", + "942": "butternut squash", + "943": "cucumber, cuke", + "944": "artichoke, globe artichoke", + "945": "bell pepper", + "946": "cardoon", + "947": "mushroom", + "948": "Granny Smith", + "949": "strawberry", + "950": "orange", + "951": "lemon", + "952": "fig", + "953": "pineapple, ananas", + "954": "banana", + "955": "jackfruit, jak, jack", + "956": "custard apple", + "957": "pomegranate", + "958": "hay", + "959": "carbonara", + "960": "chocolate sauce, chocolate syrup", + "961": "dough", + "962": "meat loaf, meatloaf", + "963": "pizza, pizza pie", + "964": "potpie", + "965": "burrito", + "966": "red wine", + "967": "espresso", + "968": "cup", + "969": "eggnog", + "970": "alp", + "971": "bubble", + "972": "cliff, drop, drop-off", + "973": "coral reef", + "974": "geyser", + "975": "lakeside, lakeshore", + "976": "promontory, headland, head, foreland", + "977": "sandbar, sand bar", + "978": "seashore, coast, seacoast, sea-coast", + "979": "valley, vale", + "980": "volcano", + "981": "ballplayer, baseball player", + "982": "groom, bridegroom", + "983": "scuba diver", + "984": "rapeseed", + "985": "daisy", + "986": "yellow lady's slipper, yellow lady-slipper, Cypripedium calceolus, Cypripedium parviflorum", + "987": "corn", + "988": "acorn", + "989": "hip, rose hip, rosehip", + "990": "buckeye, horse chestnut, conker", + "991": "coral fungus", + "992": "agaric", + "993": "gyromitra", + "994": "stinkhorn, carrion fungus", + "995": "earthstar", + "996": "hen-of-the-woods, hen of the woods, Polyporus frondosus, Grifola frondosa", + "997": "bolete", + "998": "ear, spike, capitulum", + "999": "toilet tissue, toilet paper, bathroom tissue" +} \ No newline at end of file diff --git a/test/data/model.test.conv2d.json b/test/data/model.test.conv2d.json index 6da0b060..943f36a0 100644 --- a/test/data/model.test.conv2d.json +++ b/test/data/model.test.conv2d.json @@ -126,7 +126,6 @@ 2, 2 ] - }, - + } ] } diff --git a/test/testUtils/testUtils.es6 b/test/testUtils/testUtils.es6 index 68e77074..8ffb6365 100644 --- a/test/testUtils/testUtils.es6 +++ b/test/testUtils/testUtils.es6 @@ -22,7 +22,7 @@ const unitPath = { 'split': 'model.test.split.json' }; // 制定运行的 op -const modelType = 'split'; +const modelType = 'conv2d'; // 制定运行的 op const unitData = unitPath[modelType]; @@ -63,13 +63,13 @@ async function run() { // 获取 NHWC -> NCHW 的 输出 const outputNCHWShape = getOutputShape(); const outputNHWCShape = nchwShape2nhwcShape(outputNCHWShape); - let nchwResult = Utils.nhwc2nchw(result, outputNHWCShape); - console.log('result'); - console.log(result); + let nchwResult = Utils.nhwc2nchw(result, outputNHWCShape); + const formatData = Utils.formatReadData(nchwResult, outputNCHWShape); console.log('NCHW RESULT'); - console.log(nchwResult); + console.log(formatData); + } run(); @@ -112,6 +112,7 @@ function nchwShape2nhwcShape(nchw) { } batchNCHW = batch.concat(nchw); } + const N = batchNCHW[0]; const C = batchNCHW[1]; const H = batchNCHW[2];