Commit 495557a4 by vincent

init

parents
node_modules
_data
.rpt2_cache
\ No newline at end of file
export declare function euclideanDistance(arr1: number[], arr2: number[]): number;
export function euclideanDistance(arr1, arr2) {
if (arr1.length !== arr2.length)
throw new Error('euclideanDistance: arr1.length !== arr2.length');
return Math.sqrt(arr1
.map(function (val, i) { return val - arr2[i]; })
.reduce(function (res, diff) { return res + Math.pow(diff, 2); }, 0));
}
//# sourceMappingURL=euclideanDistance.js.map
\ No newline at end of file
{"version":3,"file":"euclideanDistance.js","sourceRoot":"","sources":["../src/euclideanDistance.ts"],"names":[],"mappings":"AAAA,MAAM,4BAA4B,IAAc,EAAE,IAAc;IAC9D,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM;QAC7B,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAA;IAEnE,OAAO,IAAI,CAAC,IAAI,CACd,IAAI;SACD,GAAG,CAAC,UAAC,GAAG,EAAE,CAAC,IAAK,OAAA,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,EAAb,CAAa,CAAC;SAC9B,MAAM,CAAC,UAAC,GAAG,EAAE,IAAI,IAAK,OAAA,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,EAAvB,CAAuB,EAAE,CAAC,CAAC,CACrD,CAAA;AACH,CAAC"}
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
import * as tf from '@tensorflow/tfjs-core';
export declare type ConvLayerParams = {
filters: tf.Tensor4D;
biases: tf.Tensor1D;
};
export declare type ScaleLayerParams = {
weights: tf.Tensor1D;
biases: tf.Tensor1D;
};
export declare type ConvBlockParams = {
conv: ConvLayerParams;
scale: ScaleLayerParams;
};
export declare type ResBlockParams = {
conv1: ConvBlockParams;
conv2: ConvBlockParams;
};
export declare type ParamMap = {
conv32_in: ConvBlockParams;
conv32_1: ResBlockParams;
conv32_2: ResBlockParams;
conv32_3: ResBlockParams;
conv64_in: ResBlockParams;
conv64_1: ResBlockParams;
conv64_2: ResBlockParams;
conv64_3: ResBlockParams;
conv128_in: ResBlockParams;
conv128_1: ResBlockParams;
conv128_2: ResBlockParams;
conv256_in: ResBlockParams;
conv256_1: ResBlockParams;
conv256_2: ResBlockParams;
conv256_3: ResBlockParams;
fc: tf.Tensor2D;
};
export declare function faceRecognitionNet(weights: Float32Array): (input: number[]) => number[];
import * as tf from '@tensorflow/tfjs-core';
function scale(x, params) {
return tf.add(tf.mul(x, params.weights), params.biases);
}
function createConvLayer(stride, withRelu) {
return function (x, params, useValidPadding) {
if (useValidPadding === void 0) { useValidPadding = false; }
var _a = params.conv, filters = _a.filters, biases = _a.biases;
var out = tf.conv2d(x, filters, [stride, stride], useValidPadding ? 'valid' : 'same');
out = tf.add(out, biases);
out = scale(out, params.scale);
return withRelu ? tf.relu(out) : out;
};
}
function createResBlock() {
var conv = createConvLayer(1, true);
var convNoRelu = createConvLayer(1, false);
return function (x, params) {
var out = conv(x, params.conv1);
out = convNoRelu(out, params.conv2);
out = tf.add(out, x);
out = tf.relu(out);
return out;
};
}
function createReduceDimsBlock() {
var convReduceDims = createConvLayer(2, true);
var convNoRelu = createConvLayer(1, false);
return function (x, params, useValidPadding) {
if (useValidPadding === void 0) { useValidPadding = false; }
var out = convReduceDims(x, params.conv1, useValidPadding);
out = convNoRelu(out, params.conv2);
var pooled = tf.avgPool(x, 2, 2, useValidPadding ? 'valid' : 'same');
var zeros = tf.zeros(pooled.shape);
var isPad = pooled.shape[3] !== out.shape[3];
var isAdjustShape = pooled.shape[1] !== out.shape[1] || pooled.shape[2] !== out.shape[2];
if (isAdjustShape) {
var padShapeX = out.shape.slice();
padShapeX[1] = 1;
var zerosW = tf.zeros(padShapeX);
out = tf.concat([out, zerosW], 1);
var padShapeY = out.shape.slice();
padShapeY[2] = 1;
var zerosH = tf.zeros(padShapeY);
out = tf.concat([out, zerosH], 2);
}
pooled = isPad ? tf.concat([pooled, zeros], 3) : pooled;
out = tf.add(pooled, out);
out = tf.relu(out);
return out;
};
}
function normalize(arr) {
var avg_r = 122.782;
var avg_g = 117.001;
var avg_b = 104.298;
var avgs = [avg_r, avg_g, avg_b];
return arr.map(function (val, i) {
var avg = avgs[i % 3];
return (val - avg) / 256;
});
}
function computeFaceDescriptor(input, params) {
var conv32_in = createConvLayer(2, true);
var res32 = createResBlock();
var reduceDims64 = createReduceDimsBlock();
var reduceDims128 = createReduceDimsBlock();
var reduceDims256 = createReduceDimsBlock();
var res64 = createResBlock();
var res128 = createResBlock();
var res256 = createResBlock();
var x = tf.tensor4d(normalize(input), [1, 150, 150, 3]);
var out = conv32_in(x, params.conv32_in, true);
out = tf.maxPool(out, 3, 2, 'valid');
out = res32(out, params.conv32_1);
out = res32(out, params.conv32_2);
out = res32(out, params.conv32_3);
out = reduceDims64(out, params.conv64_in, true);
out = res64(out, params.conv64_1);
out = res64(out, params.conv64_2);
out = res64(out, params.conv64_3);
out = reduceDims128(out, params.conv128_in, true);
out = res128(out, params.conv128_1);
out = res128(out, params.conv128_2);
out = reduceDims256(out, params.conv256_in, true);
out = res256(out, params.conv256_1);
out = res256(out, params.conv256_2);
out = reduceDims256(out, params.conv256_3, true);
// global average pooling of each of the 256 filters -> retrieve 256 entry vector
var global_avg = out.mean([1, 2]);
// fully connected
// TODO: kind of slow here
return Array.from(tf.matMul(global_avg, params.fc).dataSync());
}
function isFloat(num) {
return num % 1 !== 0;
}
function extractorsFactory(extractWeights) {
function extractFilterValues(numFilterValues, numFilters, filterSize) {
var weights = extractWeights(numFilterValues);
var depth = weights.length / (numFilters * filterSize * filterSize);
if (isFloat(depth)) {
throw new Error("depth has to be an integer: " + depth + ", weights.length: " + weights.length + ", numFilters: " + numFilters + ", filterSize: " + filterSize);
}
return tf.transpose(tf.tensor4d(weights, [numFilters, depth, filterSize, filterSize]), [2, 3, 1, 0]);
}
function extractScaleLayerParams(numWeights) {
var weights = tf.tensor1d(extractWeights(numWeights));
var biases = tf.tensor1d(extractWeights(numWeights));
return {
weights: weights,
biases: biases
};
}
function extractConvBlockParams(numFilterValues, numFilters, filterSize) {
var conv_filters = extractFilterValues(numFilterValues, numFilters, filterSize);
var conv_biases = tf.tensor1d(extractWeights(numFilters));
var scale = extractScaleLayerParams(numFilters);
return {
conv: {
filters: conv_filters,
biases: conv_biases
},
scale: scale
};
}
function extractResBlockParams(numFilterValues, numFilters, filterSize, isInBlock) {
if (isInBlock === void 0) { isInBlock = false; }
var conv1 = extractConvBlockParams((isInBlock ? 0.5 : 1) * numFilterValues, numFilters, filterSize);
var conv2 = extractConvBlockParams(numFilterValues, numFilters, filterSize);
return {
conv1: conv1,
conv2: conv2
};
}
return {
extractConvBlockParams: extractConvBlockParams,
extractResBlockParams: extractResBlockParams
};
}
function extractParams(weights) {
var extractWeights = function (numWeights) {
var ret = weights.slice(0, numWeights);
weights = weights.slice(numWeights);
return ret;
};
var _a = extractorsFactory(extractWeights), extractConvBlockParams = _a.extractConvBlockParams, extractResBlockParams = _a.extractResBlockParams;
var conv32_in = extractConvBlockParams(4704, 32, 7);
var conv32_1 = extractResBlockParams(9216, 32, 3);
var conv32_2 = extractResBlockParams(9216, 32, 3);
var conv32_3 = extractResBlockParams(9216, 32, 3);
var conv64_in = extractResBlockParams(36864, 64, 3, true);
var conv64_1 = extractResBlockParams(36864, 64, 3);
var conv64_2 = extractResBlockParams(36864, 64, 3);
var conv64_3 = extractResBlockParams(36864, 64, 3);
var conv128_in = extractResBlockParams(147456, 128, 3, true);
var conv128_1 = extractResBlockParams(147456, 128, 3);
var conv128_2 = extractResBlockParams(147456, 128, 3);
var conv256_in = extractResBlockParams(589824, 256, 3, true);
var conv256_1 = extractResBlockParams(589824, 256, 3);
var conv256_2 = extractResBlockParams(589824, 256, 3);
var conv256_3 = extractResBlockParams(589824, 256, 3);
var fc = tf.transpose(tf.tensor2d(extractWeights(256 * 128), [128, 256]), [1, 0]);
if (weights.length !== 0) {
throw new Error("weights remaing after extract: " + weights.length);
}
return {
conv32_in: conv32_in,
conv32_1: conv32_1,
conv32_2: conv32_2,
conv32_3: conv32_3,
conv64_in: conv64_in,
conv64_1: conv64_1,
conv64_2: conv64_2,
conv64_3: conv64_3,
conv128_in: conv128_in,
conv128_1: conv128_1,
conv128_2: conv128_2,
conv256_in: conv256_in,
conv256_1: conv256_1,
conv256_2: conv256_2,
conv256_3: conv256_3,
fc: fc
};
}
export function faceRecognitionNet(weights) {
var params = extractParams(weights);
return function (input) {
return computeFaceDescriptor(input, params);
};
}
//# sourceMappingURL=faceRecognitionNet.js.map
\ No newline at end of file
{"version":3,"file":"faceRecognitionNet.js","sourceRoot":"","sources":["../src/faceRecognitionNet.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
import { euclideanDistance } from './euclideanDistance';
import { faceRecognitionNet } from './faceRecognitionNet';
export { euclideanDistance, faceRecognitionNet };
import { euclideanDistance } from './euclideanDistance';
import { faceRecognitionNet } from './faceRecognitionNet';
export { euclideanDistance, faceRecognitionNet };
//# sourceMappingURL=index.js.map
\ No newline at end of file
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EACnB,CAAA"}
\ No newline at end of file
{
"name": "face-recognition.min",
"version": "0.0.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
"@tensorflow/tfjs-core": {
"version": "0.11.0",
"resolved": "https://registry.npmjs.org/@tensorflow/tfjs-core/-/tfjs-core-0.11.0.tgz",
"integrity": "sha512-1bCg1Lb7k0HKYknr8Dak0fX53HJZCoIT5Vp4/dw3oCzUI3/HjOIIuscSCFQvVdAhawuHJbPhptDWd838ybJCrQ==",
"requires": {
"seedrandom": "2.4.3"
}
},
"@types/estree": {
"version": "0.0.39",
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz",
"integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==",
"dev": true
},
"@types/node": {
"version": "10.1.1",
"resolved": "https://registry.npmjs.org/@types/node/-/node-10.1.1.tgz",
"integrity": "sha512-n7wxy8r2tjVcrzZoKJlyZmi1C1VhXGHAGhDEO1iqp7fbsTSsDF3dVA50KFsPg77EXqzNJqbzcna8Mi4m7a1lyw==",
"dev": true
},
"arr-flatten": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
"integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
"dev": true
},
"commander": {
"version": "2.13.0",
"resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz",
"integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==",
"dev": true
},
"estree-walker": {
"version": "0.5.2",
"resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.5.2.tgz",
"integrity": "sha512-XpCnW/AE10ws/kDAs37cngSkvgIR8aN3G0MS85m7dUpuK2EREo9VJ00uvw6Dg/hXEpfsE1I1TvJOJr+Z+TL+ig==",
"dev": true
},
"expand-range": {
"version": "1.8.2",
"resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz",
"integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=",
"dev": true,
"requires": {
"fill-range": "2.2.4"
},
"dependencies": {
"fill-range": {
"version": "2.2.4",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz",
"integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==",
"dev": true,
"requires": {
"is-number": "2.1.0",
"isobject": "2.1.0",
"randomatic": "3.0.0",
"repeat-element": "1.1.2",
"repeat-string": "1.6.1"
}
},
"is-number": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz",
"integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=",
"dev": true,
"requires": {
"kind-of": "3.2.2"
}
},
"isobject": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
"integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
"dev": true,
"requires": {
"isarray": "1.0.0"
}
},
"kind-of": {
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
"dev": true,
"requires": {
"is-buffer": "1.1.6"
}
}
}
},
"filename-regex": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz",
"integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=",
"dev": true
},
"for-in": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
"integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
"dev": true
},
"for-own": {
"version": "0.1.5",
"resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz",
"integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=",
"dev": true,
"requires": {
"for-in": "1.0.2"
}
},
"fs-extra": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz",
"integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==",
"dev": true,
"requires": {
"graceful-fs": "4.1.11",
"jsonfile": "4.0.0",
"universalify": "0.1.1"
}
},
"glob-base": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz",
"integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=",
"dev": true,
"requires": {
"glob-parent": "2.0.0",
"is-glob": "2.0.1"
},
"dependencies": {
"glob-parent": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz",
"integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=",
"dev": true,
"requires": {
"is-glob": "2.0.1"
}
},
"is-extglob": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
"integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
"dev": true
},
"is-glob": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
"integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
"dev": true,
"requires": {
"is-extglob": "1.0.0"
}
}
}
},
"graceful-fs": {
"version": "4.1.11",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
"integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
"dev": true
},
"is-buffer": {
"version": "1.1.6",
"resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
"integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
"dev": true
},
"is-dotfile": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz",
"integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=",
"dev": true
},
"is-equal-shallow": {
"version": "0.1.3",
"resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz",
"integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=",
"dev": true,
"requires": {
"is-primitive": "2.0.0"
}
},
"is-extendable": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
"integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
"dev": true
},
"is-module": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz",
"integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=",
"dev": true
},
"is-posix-bracket": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz",
"integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=",
"dev": true
},
"is-primitive": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz",
"integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=",
"dev": true
},
"isarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
"integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
"dev": true
},
"jsonfile": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
"integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
"dev": true,
"requires": {
"graceful-fs": "4.1.11"
}
},
"kind-of": {
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
"integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
"dev": true
},
"magic-string": {
"version": "0.22.5",
"resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.22.5.tgz",
"integrity": "sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w==",
"dev": true,
"requires": {
"vlq": "0.2.3"
}
},
"math-random": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz",
"integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=",
"dev": true
},
"normalize-path": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
"integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
"dev": true,
"requires": {
"remove-trailing-separator": "1.1.0"
}
},
"object.omit": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz",
"integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=",
"dev": true,
"requires": {
"for-own": "0.1.5",
"is-extendable": "0.1.1"
}
},
"parse-glob": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz",
"integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=",
"dev": true,
"requires": {
"glob-base": "0.3.0",
"is-dotfile": "1.0.3",
"is-extglob": "1.0.0",
"is-glob": "2.0.1"
},
"dependencies": {
"is-extglob": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
"integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
"dev": true
},
"is-glob": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
"integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
"dev": true,
"requires": {
"is-extglob": "1.0.0"
}
}
}
},
"path-parse": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz",
"integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=",
"dev": true
},
"preserve": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz",
"integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=",
"dev": true
},
"randomatic": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.0.0.tgz",
"integrity": "sha512-VdxFOIEY3mNO5PtSRkkle/hPJDHvQhK21oa73K4yAc9qmp6N429gAyF1gZMOTMeS0/AYzaV/2Trcef+NaIonSA==",
"dev": true,
"requires": {
"is-number": "4.0.0",
"kind-of": "6.0.2",
"math-random": "1.0.1"
},
"dependencies": {
"is-number": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
"integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==",
"dev": true
}
}
},
"regex-cache": {
"version": "0.4.4",
"resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz",
"integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==",
"dev": true,
"requires": {
"is-equal-shallow": "0.1.3"
}
},
"remove-trailing-separator": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
"integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=",
"dev": true
},
"repeat-element": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz",
"integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=",
"dev": true
},
"repeat-string": {
"version": "1.6.1",
"resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
"integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
"dev": true
},
"resolve": {
"version": "1.7.1",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz",
"integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==",
"dev": true,
"requires": {
"path-parse": "1.0.5"
}
},
"rollup": {
"version": "0.59.1",
"resolved": "https://registry.npmjs.org/rollup/-/rollup-0.59.1.tgz",
"integrity": "sha512-Zozx6Vq1ieUpl53mi8N7nvJD7yl4Kf4QUiuIjN/e8Fj54HxBmIeRDX1IawDO82N7NWKo4KaKoL3JOfXTtO9C2Q==",
"dev": true,
"requires": {
"@types/estree": "0.0.39",
"@types/node": "10.1.1"
}
},
"rollup-plugin-commonjs": {
"version": "9.1.3",
"resolved": "https://registry.npmjs.org/rollup-plugin-commonjs/-/rollup-plugin-commonjs-9.1.3.tgz",
"integrity": "sha512-g91ZZKZwTW7F7vL6jMee38I8coj/Q9GBdTmXXeFL7ldgC1Ky5WJvHgbKlAiXXTh762qvohhExwUgeQGFh9suGg==",
"dev": true,
"requires": {
"estree-walker": "0.5.2",
"magic-string": "0.22.5",
"resolve": "1.7.1",
"rollup-pluginutils": "2.2.0"
}
},
"rollup-plugin-node-resolve": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-3.3.0.tgz",
"integrity": "sha512-9zHGr3oUJq6G+X0oRMYlzid9fXicBdiydhwGChdyeNRGPcN/majtegApRKHLR5drboUvEWU+QeUmGTyEZQs3WA==",
"dev": true,
"requires": {
"builtin-modules": "2.0.0",
"is-module": "1.0.0",
"resolve": "1.7.1"
},
"dependencies": {
"builtin-modules": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-2.0.0.tgz",
"integrity": "sha512-3U5kUA5VPsRUA3nofm/BXX7GVHKfxz0hOBAPxXrIvHzlDRkQVqEn6yi8QJegxl4LzOHLdvb7XF5dVawa/VVYBg==",
"dev": true
}
}
},
"rollup-plugin-typescript2": {
"version": "0.14.0",
"resolved": "https://registry.npmjs.org/rollup-plugin-typescript2/-/rollup-plugin-typescript2-0.14.0.tgz",
"integrity": "sha512-+MQDb0K+1KwlQvnIZ57DkmQQ/scP12eEgwi5ORytZ8BLMRmFDktUl30ehgog09D5OrS5izlE0zIgnFJ8T0mFyw==",
"dev": true,
"requires": {
"fs-extra": "5.0.0",
"resolve": "1.7.1",
"rollup-pluginutils": "2.2.0",
"tslib": "1.9.1"
}
},
"rollup-plugin-uglify": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/rollup-plugin-uglify/-/rollup-plugin-uglify-3.0.0.tgz",
"integrity": "sha512-dehLu9eRRoV4l09aC+ySntRw1OAfoyKdbk8Nelblj03tHoynkSybqyEpgavemi1LBOH6S1vzI58/mpxkZIe1iQ==",
"dev": true,
"requires": {
"uglify-es": "3.3.9"
}
},
"rollup-pluginutils": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.2.0.tgz",
"integrity": "sha512-aqjTUCfZJK3O+TjH++PdQc8Lg6V6t/1Fhu8/6f3qPQzBt0xZruDgqblvb3RQOfKybTgfxKpyy2pQmQ4X2OmY4w==",
"dev": true,
"requires": {
"estree-walker": "0.5.2",
"micromatch": "2.3.11"
},
"dependencies": {
"arr-diff": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz",
"integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=",
"dev": true,
"requires": {
"arr-flatten": "1.1.0"
}
},
"array-unique": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz",
"integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=",
"dev": true
},
"braces": {
"version": "1.8.5",
"resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz",
"integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=",
"dev": true,
"requires": {
"expand-range": "1.8.2",
"preserve": "0.2.0",
"repeat-element": "1.1.2"
}
},
"expand-brackets": {
"version": "0.1.5",
"resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz",
"integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=",
"dev": true,
"requires": {
"is-posix-bracket": "0.1.1"
}
},
"extglob": {
"version": "0.3.2",
"resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz",
"integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=",
"dev": true,
"requires": {
"is-extglob": "1.0.0"
}
},
"is-extglob": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
"integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
"dev": true
},
"is-glob": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
"integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
"dev": true,
"requires": {
"is-extglob": "1.0.0"
}
},
"kind-of": {
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
"dev": true,
"requires": {
"is-buffer": "1.1.6"
}
},
"micromatch": {
"version": "2.3.11",
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz",
"integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=",
"dev": true,
"requires": {
"arr-diff": "2.0.0",
"array-unique": "0.2.1",
"braces": "1.8.5",
"expand-brackets": "0.1.5",
"extglob": "0.3.2",
"filename-regex": "2.0.1",
"is-extglob": "1.0.0",
"is-glob": "2.0.1",
"kind-of": "3.2.2",
"normalize-path": "2.1.1",
"object.omit": "2.0.1",
"parse-glob": "3.0.4",
"regex-cache": "0.4.4"
}
}
}
},
"seedrandom": {
"version": "2.4.3",
"resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-2.4.3.tgz",
"integrity": "sha1-JDhQTa0zkXMUv/GKxNeU8W1qrsw="
},
"tslib": {
"version": "1.9.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.1.tgz",
"integrity": "sha512-avfPS28HmGLLc2o4elcc2EIq2FcH++Yo5YxpBZi9Yw93BCTGFthI4HPE4Rpep6vSYQaK8e69PelM44tPj+RaQg==",
"dev": true
},
"typescript": {
"version": "2.8.3",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-2.8.3.tgz",
"integrity": "sha512-K7g15Bb6Ra4lKf7Iq2l/I5/En+hLIHmxWZGq3D4DIRNFxMNV6j2SHSvDOqs2tGd4UvD/fJvrwopzQXjLrT7Itw==",
"dev": true
},
"uglify-es": {
"version": "3.3.9",
"resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz",
"integrity": "sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==",
"dev": true,
"requires": {
"commander": "2.13.0",
"source-map": "0.6.1"
},
"dependencies": {
"source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
"dev": true
}
}
},
"universalify": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz",
"integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=",
"dev": true
},
"vlq": {
"version": "0.2.3",
"resolved": "https://registry.npmjs.org/vlq/-/vlq-0.2.3.tgz",
"integrity": "sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow==",
"dev": true
}
}
}
{
"name": "face-recognition.min",
"version": "0.0.0",
"description": "face recognition API for the browser with tensorflow.js",
"main": "./dist/index.js",
"typings": "./dist/index.d.ts",
"scripts": {
"build": "rollup -c rollup.config.js && tsc"
},
"keywords": [
"face",
"detection",
"recognition",
"tensorflow",
"tf"
],
"author": "justadudewhohacks",
"license": "MIT",
"dependencies": {
"@tensorflow/tfjs-core": "^0.11.0"
},
"devDependencies": {
"@types/node": "^10.1.1",
"rollup": "^0.59.1",
"rollup-plugin-commonjs": "^9.1.3",
"rollup-plugin-node-resolve": "^3.3.0",
"rollup-plugin-typescript2": "^0.14.0",
"rollup-plugin-uglify": "^3.0.0",
"tslib": "^1.9.1",
"typescript": "^2.8.3"
}
}
import commonjs from 'rollup-plugin-commonjs';
import node from 'rollup-plugin-node-resolve';
import typescript from 'rollup-plugin-typescript2';
import uglify from 'rollup-plugin-uglify';
import path from 'path';
export default {
input: 'src/index.ts',
plugins: [
typescript(),
node(),
uglify(),
commonjs(),
],
output: {
extend: true,
file: 'dist/face-recognition.min.js',
format: 'umd',
name: 'facerecognition',
globals: {
'crypto': 'crypto'
}
},
external: ['crypto'],
onwarn: (warning) => {
const ignoreWarnings = ['CIRCULAR_DEPENDENCY', 'CIRCULAR', 'THIS_IS_UNDEFINED']
if (ignoreWarnings.some(w => w === warning.code))
return
if (warning.missing === 'alea')
return
console.warn(warning.message)
}
}
\ No newline at end of file
export function euclideanDistance(arr1: number[], arr2: number[]) {
if (arr1.length !== arr2.length)
throw new Error('euclideanDistance: arr1.length !== arr2.length')
return Math.sqrt(
arr1
.map((val, i) => val - arr2[i])
.reduce((res, diff) => res + Math.pow(diff, 2), 0)
)
}
\ No newline at end of file
import * as tf from '@tensorflow/tfjs-core';
function scale(x: tf.Tensor4D, params: ScaleLayerParams): tf.Tensor4D {
return tf.add(tf.mul(x, params.weights), params.biases)
}
function createConvLayer(stride: number, withRelu: boolean) {
return function (x: tf.Tensor4D, params: ConvBlockParams, useValidPadding: boolean = false): tf.Tensor4D {
const { filters, biases } = params.conv
let out = tf.conv2d(x, filters, [stride, stride], useValidPadding ? 'valid' : 'same')
out = tf.add(out, biases)
out = scale(out, params.scale)
return withRelu ? tf.relu(out) : out
}
}
function createResBlock() {
const conv = createConvLayer(1, true)
const convNoRelu = createConvLayer(1, false)
return function (x: tf.Tensor4D, params: ResBlockParams): tf.Tensor4D {
let out = conv(x, params.conv1)
out = convNoRelu(out, params.conv2)
out = tf.add(out, x)
out = tf.relu(out)
return out
}
}
function createReduceDimsBlock() {
const convReduceDims = createConvLayer(2, true)
const convNoRelu = createConvLayer(1, false)
return function (x: tf.Tensor4D, params: ResBlockParams, useValidPadding: boolean = false): tf.Tensor4D {
let out = convReduceDims(x, params.conv1, useValidPadding)
out = convNoRelu(out, params.conv2)
let pooled = tf.avgPool(x, 2, 2, useValidPadding ? 'valid' : 'same') as tf.Tensor4D
const zeros = tf.zeros<tf.Rank.R4>(pooled.shape)
const isPad = pooled.shape[3] !== out.shape[3]
const isAdjustShape = pooled.shape[1] !== out.shape[1] || pooled.shape[2] !== out.shape[2]
if (isAdjustShape) {
const padShapeX = [...out.shape] as [number, number, number, number]
padShapeX[1] = 1
const zerosW = tf.zeros<tf.Rank.R4>(padShapeX)
out = tf.concat([out, zerosW], 1)
const padShapeY = [...out.shape] as [number, number, number, number]
padShapeY[2] = 1
const zerosH = tf.zeros<tf.Rank.R4>(padShapeY)
out = tf.concat([out, zerosH], 2)
}
pooled = isPad ? tf.concat([pooled, zeros], 3) : pooled
out = tf.add(pooled, out) as tf.Tensor4D
out = tf.relu(out)
return out
}
}
function normalize(arr: number[]) {
const avg_r = 122.782;
const avg_g = 117.001;
const avg_b = 104.298;
const avgs = [avg_r, avg_g, avg_b]
return arr.map((val, i) => {
const avg = avgs[i % 3]
return (val - avg) / 256
})
}
function computeFaceDescriptor(input: number[], params: ParamMap) {
const conv32_in = createConvLayer(2, true)
const res32 = createResBlock()
const reduceDims64 = createReduceDimsBlock()
const reduceDims128 = createReduceDimsBlock()
const reduceDims256 = createReduceDimsBlock()
const res64 = createResBlock()
const res128 = createResBlock()
const res256 = createResBlock()
const x = tf.tensor4d(normalize(input), [1, 150, 150, 3])
let out = conv32_in(x, params.conv32_in, true)
out = tf.maxPool(out, 3, 2, 'valid')
out = res32(out, params.conv32_1)
out = res32(out, params.conv32_2)
out = res32(out, params.conv32_3)
out = reduceDims64(out, params.conv64_in, true)
out = res64(out, params.conv64_1)
out = res64(out, params.conv64_2)
out = res64(out, params.conv64_3)
out = reduceDims128(out, params.conv128_in, true)
out = res128(out, params.conv128_1)
out = res128(out, params.conv128_2)
out = reduceDims256(out, params.conv256_in, true)
out = res256(out, params.conv256_1)
out = res256(out, params.conv256_2)
out = reduceDims256(out, params.conv256_3, true)
// global average pooling of each of the 256 filters -> retrieve 256 entry vector
const global_avg = out.mean([1, 2]) as tf.Tensor2D
// fully connected
// TODO: kind of slow here
return Array.from(tf.matMul(global_avg, params.fc).dataSync())
}
export type ConvLayerParams = {
filters: tf.Tensor4D
biases: tf.Tensor1D
}
export type ScaleLayerParams = {
weights: tf.Tensor1D
biases: tf.Tensor1D
}
export type ConvBlockParams = {
conv: ConvLayerParams
scale: ScaleLayerParams
}
export type ResBlockParams = {
conv1: ConvBlockParams
conv2: ConvBlockParams
}
export type ParamMap = {
conv32_in: ConvBlockParams
conv32_1: ResBlockParams
conv32_2: ResBlockParams
conv32_3: ResBlockParams
conv64_in: ResBlockParams
conv64_1: ResBlockParams
conv64_2: ResBlockParams
conv64_3: ResBlockParams
conv128_in: ResBlockParams
conv128_1: ResBlockParams
conv128_2: ResBlockParams
conv256_in: ResBlockParams
conv256_1: ResBlockParams
conv256_2: ResBlockParams
conv256_3: ResBlockParams
fc: tf.Tensor2D
}
function isFloat(num: number) {
return num % 1 !== 0
}
function extractorsFactory(extractWeights: (numWeights: number) => Float32Array) {
function extractFilterValues(numFilterValues: number, numFilters: number, filterSize: number): tf.Tensor4D {
const weights = extractWeights(numFilterValues)
const depth = weights.length / (numFilters * filterSize * filterSize)
if (isFloat(depth)) {
throw new Error(`depth has to be an integer: ${depth}, weights.length: ${weights.length}, numFilters: ${numFilters}, filterSize: ${filterSize}`)
}
return tf.transpose(
tf.tensor4d(weights, [numFilters, depth, filterSize, filterSize]),
[2, 3, 1, 0]
)
}
function extractScaleLayerParams(numWeights: number): ScaleLayerParams {
const weights = tf.tensor1d(extractWeights(numWeights))
const biases = tf.tensor1d(extractWeights(numWeights))
return {
weights,
biases
}
}
function extractConvBlockParams(numFilterValues: number, numFilters: number, filterSize: number): ConvBlockParams {
const conv_filters = extractFilterValues(numFilterValues, numFilters, filterSize)
const conv_biases = tf.tensor1d(extractWeights(numFilters))
const scale = extractScaleLayerParams(numFilters)
return {
conv: {
filters: conv_filters,
biases: conv_biases
},
scale
}
}
function extractResBlockParams(numFilterValues: number, numFilters: number, filterSize: number, isInBlock: boolean = false): ResBlockParams {
const conv1: ConvBlockParams = extractConvBlockParams((isInBlock ? 0.5 : 1) * numFilterValues, numFilters, filterSize)
const conv2: ConvBlockParams = extractConvBlockParams(numFilterValues, numFilters, filterSize)
return {
conv1,
conv2
}
}
return {
extractConvBlockParams,
extractResBlockParams
}
}
function extractParams(weights: Float32Array): ParamMap {
const extractWeights = (numWeights: number): Float32Array => {
const ret = weights.slice(0, numWeights)
weights = weights.slice(numWeights)
return ret
}
const {
extractConvBlockParams,
extractResBlockParams
} = extractorsFactory(extractWeights)
const conv32_in = extractConvBlockParams(4704, 32, 7)
const conv32_1 = extractResBlockParams(9216, 32, 3)
const conv32_2 = extractResBlockParams(9216, 32, 3)
const conv32_3 = extractResBlockParams(9216, 32, 3)
const conv64_in = extractResBlockParams(36864, 64, 3, true)
const conv64_1 = extractResBlockParams(36864, 64, 3)
const conv64_2 = extractResBlockParams(36864, 64, 3)
const conv64_3 = extractResBlockParams(36864, 64, 3)
const conv128_in = extractResBlockParams(147456, 128, 3, true)
const conv128_1 = extractResBlockParams(147456, 128, 3)
const conv128_2 = extractResBlockParams(147456, 128, 3)
const conv256_in = extractResBlockParams(589824, 256, 3, true)
const conv256_1 = extractResBlockParams(589824, 256, 3)
const conv256_2 = extractResBlockParams(589824, 256, 3)
const conv256_3 = extractResBlockParams(589824, 256, 3)
const fc = tf.transpose(tf.tensor2d(extractWeights(256 * 128), [128, 256]), [1, 0])
if (weights.length !== 0) {
throw new Error(`weights remaing after extract: ${weights.length}`)
}
return {
conv32_in,
conv32_1,
conv32_2,
conv32_3,
conv64_in,
conv64_1,
conv64_2,
conv64_3,
conv128_in,
conv128_1,
conv128_2,
conv256_in,
conv256_1,
conv256_2,
conv256_3,
fc
}
}
export function faceRecognitionNet(weights: Float32Array) {
const params = extractParams(weights)
return function(input: number[]) {
return computeFaceDescriptor(input, params)
}
}
\ No newline at end of file
import { euclideanDistance } from './euclideanDistance';
import { faceRecognitionNet } from './faceRecognitionNet';
export {
euclideanDistance,
faceRecognitionNet
}
\ No newline at end of file
descriptorHoward=[-0.08900658041238785,0.10903991758823395,0.027176208794116974,0.0440075621008873,-0.14542894065380096,0.11052004992961884,-0.044826459139585495,-0.05154901742935181,0.10313282907009125,-0.09580706059932709,0.11335687339305878,-0.027231775224208832,-0.20172204077243805,0.0940278172492981,-0.02581452578306198,0.07219456881284714,-0.12272307276725769,-0.07349634170532227,-0.17236188054084778,-0.17453305423259735,-0.034208014607429504,0.1051197499036789,0.026275131851434708,0.014430046081542969,-0.20353534817695618,-0.2949812114238739,-0.04833771288394928,-0.10960748046636581,0.08448511362075806,-0.03991013765335083,-0.03964321315288544,-0.09928630292415619,-0.1602567881345749,0.026378951966762543,0.09079921245574951,0.07745552062988281,-0.054152462631464005,-0.017411045730113983,0.16053830087184906,0.010681785643100739,-0.11814303696155548,0.03829622268676758,0.08098047226667404,0.2989161014556885,0.12581878900527954,0.0647912546992302,0.023303285241127014,-0.07838225364685059,0.13633489608764648,-0.21215596795082092,0.07675531506538391,0.1447518765926361,0.14686475694179535,0.0699121281504631,0.08843745291233063,-0.11935200542211533,-0.015284918248653412,0.16930952668190002,-0.04400303214788437,0.1650175303220749,0.10481946915388107,-0.01336788758635521,-0.050796136260032654,-0.0797152891755104,0.2541898190975189,0.07128539681434631,-0.14587090909481049,-0.15604129433631897,0.11365237832069397,-0.16018034517765045,-0.03458000719547272,0.05678928643465042,-0.0719192773103714,-0.15881866216659546,-0.1955045610666275,0.06456597149372101,0.5308966636657715,0.13605226576328278,-0.18340086936950684,-0.05473683401942253,-0.09668048471212387,-0.000602424144744873,0.06609033793210983,0.08351708948612213,-0.13018563389778137,-0.07167275249958038,-0.043135225772857666,0.08809376507997513,0.2999389171600342,-0.07008984684944153,0.005112119019031525,0.1464608609676361,0.030642826110124588,0.005341166630387306,-0.03758299723267555,-0.0027411580085754395,-0.19020092487335205,-0.005203835666179657,-0.03693883866071701,0.01771560311317444,0.0251515731215477,-0.13933824002742767,0.04255777597427368,0.08094561100006104,-0.23745450377464294,0.21049562096595764,-0.016159698367118835,-0.06422223895788193,0.0915207490324974,0.10660701990127563,-0.14731749892234802,-0.027426909655332565,0.23789143562316895,-0.2964036166667938,0.2034282386302948,0.2009483426809311,0.04705991595983505,0.1396426558494568,0.05233515799045563,0.11507779359817505,0.045886870473623276,0.12765640020370483,-0.15917259454727173,-0.13223722577095032,-0.023241132497787476,-0.1298847794532776,-0.027176383882761,0.009421631693840027]
\ No newline at end of file
descriptorLeonard=[0.016118615865707397,0.1272888332605362,-0.013150867074728012,-0.03657906502485275,-0.10901328921318054,-0.004170142114162445,-0.010215671733021736,0.006740286946296692,0.1793280392885208,-0.06382005661725998,0.20762376487255096,-0.016507171094417572,-0.2747085690498352,-0.026863690465688705,-0.0744708999991417,0.1404581367969513,-0.198239266872406,-0.12842532992362976,-0.15176594257354736,-0.12798485159873962,0.07055014371871948,-0.021530020982027054,-0.013443628326058388,0.05855056643486023,-0.10384566336870193,-0.26168593764305115,-0.04933137446641922,-0.10280363261699677,0.02998245507478714,-0.21771246194839478,0.07944433391094208,0.03573431074619293,-0.1271427869796753,-0.02638978511095047,-0.01610453426837921,0.05286967754364014,0.024109765887260437,-0.08603353798389435,0.18842941522598267,0.02356734871864319,-0.16014565527439117,0.07457999885082245,0.04670367389917374,0.32030463218688965,0.18153166770935059,0.031080730259418488,-0.01877094805240631,-0.09274949133396149,0.13673648238182068,-0.20436367392539978,0.03125997632741928,0.1889854222536087,0.07329613715410233,0.03783072903752327,0.12429258227348328,-0.10134827345609665,0.060723669826984406,0.13368329405784607,-0.22554075717926025,0.032615188509225845,0.05100584030151367,-0.008536417037248611,-0.028306663036346436,-0.09284669905900955,0.10282410681247711,0.05005515366792679,-0.05751366168260574,-0.16138313710689545,0.1641443520784378,-0.21432684361934662,-0.1301480382680893,0.051546234637498856,-0.1041136085987091,-0.1479661911725998,-0.32189327478408813,0.0080157071352005,0.40646892786026,0.17670349776744843,-0.11870051920413971,0.06668459624052048,-0.0077753327786922455,-0.0853877067565918,0.03622785955667496,0.022207416594028473,-0.1716664731502533,0.00936036929488182,-0.12650445103645325,0.1116786003112793,0.1721886694431305,0.018712684512138367,-0.029012983664870262,0.19890916347503662,0.004050761461257935,-0.06176470220088959,0.03496668487787247,0.010774612426757812,-0.10733450204133987,0.034917011857032776,-0.1856822967529297,-0.0436706580221653,0.08982815593481064,-0.16002188622951508,-0.01822887361049652,0.05696277320384979,-0.2110522985458374,0.03147541731595993,-0.009835068136453629,-0.059302788227796555,-0.060756754130125046,0.07512637972831726,-0.20573465526103973,0.023113828152418137,0.2548554837703705,-0.23949584364891052,0.17401018738746643,0.2319977581501007,0.09833789616823196,0.024068880826234818,0.12989574670791626,0.04740560054779053,-0.012434778735041618,-0.0918111503124237,-0.15748904645442963,-0.08378004282712936,-0.004624858498573303,-0.005299612879753113,0.055329449474811554,0.04065752774477005]
\ No newline at end of file
descriptorPenny=[-0.005881071090698242,0.035252682864665985,0.07666284590959549,-0.06133250892162323,-0.08197010308504105,0.014184653759002686,0.005242734216153622,-0.19035089015960693,0.13593840599060059,-0.09199994057416916,0.055665574967861176,-0.09802958369255066,-0.25256460905075073,0.05049600824713707,0.003990292549133301,0.15637768805027008,-0.051415905356407166,-0.28471335768699646,-0.16898605227470398,-0.06020534038543701,-0.006151877343654633,-0.011471755802631378,-0.005520425736904144,0.1003769263625145,-0.20014473795890808,-0.26222628355026245,-0.08959437161684036,-0.12957212328910828,-0.029134854674339294,-0.062256816774606705,-0.04312460869550705,0.08265750110149384,-0.14303170144557953,0.011085912585258484,0.10712425410747528,0.04088181257247925,0.0007619466632604599,-0.1466120481491089,0.260177880525589,-0.009320661425590515,-0.25915971398353577,-0.019178807735443115,0.11162054538726807,0.2115343064069748,0.21638226509094238,0.0045770928263664246,0.07745259255170822,-0.08094276487827301,0.13608475029468536,-0.31285080313682556,0.1226205825805664,0.14514890313148499,0.10254833102226257,0.11901462823152542,0.07176060229539871,-0.21035197377204895,-0.016285259276628494,0.11171358823776245,-0.22099058330059052,0.14237764477729797,0.06349137425422668,-0.09368033707141876,-0.07181331515312195,-0.12528066337108612,0.22090691328048706,0.16226458549499512,-0.16031241416931152,-0.2046929895877838,0.1601838767528534,-0.2115079164505005,-0.07380392402410507,0.06603492796421051,-0.19789603352546692,-0.15601742267608643,-0.285112589597702,-0.03280213475227356,0.41335564851760864,0.17521080374717712,-0.2080937772989273,0.026215683668851852,-0.11048824340105057,0.019838571548461914,-0.020542338490486145,0.11541588604450226,0.03076190873980522,-0.0232694149017334,0.0033110976219177246,0.028120767325162888,0.27188798785209656,-0.0759110227227211,-0.06393658369779587,0.22212064266204834,-0.048158712685108185,-0.03439009189605713,-0.08470702916383743,0.07175514847040176,-0.09915667027235031,-0.019413530826568604,-0.08236535638570786,-0.0213082954287529,-0.030551567673683167,0.1010485291481018,0.07094472646713257,0.15863054990768433,-0.200668603181839,0.16280920803546906,-0.07447126507759094,-0.007395192980766296,-0.023165743798017502,0.01478651911020279,-0.1056482344865799,-0.07202574610710144,0.17325882613658905,-0.28997519612312317,0.12274238467216492,0.18649500608444214,0.01748467981815338,0.03461623191833496,-0.009980626404285431,0.06018088012933731,0.11674463003873825,0.033887870609760284,-0.218181312084198,-0.05439690500497818,0.10635554790496826,-0.0007329434156417847,-0.021141983568668365,0.0820411890745163]
\ No newline at end of file
descriptorRaj=[-0.15496353805065155,0.043691255152225494,0.03724939376115799,0.016656994819641113,-0.049970414489507675,0.08455478399991989,-0.045141857117414474,-0.0610889196395874,0.11937284469604492,-0.08181658387184143,0.27349838614463806,0.025957435369491577,-0.2195511758327484,-0.015493396669626236,-0.10711826384067535,0.07597102224826813,-0.08671779185533524,-0.13454240560531616,-0.06495959311723709,-0.036077070981264114,-0.006286047399044037,0.02592059224843979,-0.014918237924575806,0.009378507733345032,-0.11585316807031631,-0.3628930449485779,-0.10048630833625793,-0.07691314816474915,0.001719092484563589,-0.03902893140912056,-0.03469265252351761,-0.020092345774173737,-0.19703790545463562,0.008729912340641022,0.03802715986967087,0.09341692179441452,-0.11134380102157593,-0.009015034884214401,0.14202813804149628,0.026977384462952614,-0.09668654203414917,0.0022040903568267822,0.031198769807815552,0.2793624997138977,0.17439183592796326,0.07265886664390564,0.006268925964832306,-0.13531382381916046,0.05125536024570465,-0.2435196340084076,0.10533908754587173,0.1630076915025711,0.0991237536072731,0.11345860362052917,0.07629163563251495,-0.16580615937709808,-0.024815142154693604,0.15595972537994385,-0.14484508335590363,0.04327581822872162,-0.053320854902267456,0.03464396297931671,-0.005613304674625397,-0.11897846311330795,0.18600404262542725,0.15069319307804108,-0.11564309895038605,-0.18291205167770386,0.1789712905883789,-0.18346670269966125,-0.017721213400363922,0.0858432874083519,-0.07925683259963989,-0.2650236487388611,-0.24118715524673462,0.10106492042541504,0.41431039571762085,0.2085058093070984,-0.09770824015140533,0.02742883935570717,-0.05898953229188919,-0.07701464742422104,0.028122015297412872,-0.0040946416556835175,-0.10734926909208298,-0.016904285177588463,-0.06405238062143326,0.008443355560302734,0.201746866106987,0.04558864235877991,-0.04860920086503029,0.1356211006641388,-0.06206119433045387,0.005768755450844765,0.07818647474050522,0.05297157168388367,-0.10372574627399445,0.042196549475193024,-0.16179141402244568,-0.031241916120052338,-0.11580236256122589,-0.08878964930772781,0.02395106852054596,0.059674158692359924,-0.14112776517868042,0.16106471419334412,-0.01805580034852028,-0.036857277154922485,-0.029434598982334137,0.0012199431657791138,-0.13350501656532288,0.02282126620411873,0.1603221446275711,-0.33153676986694336,0.22605177760124207,0.11830978095531464,0.11549906432628632,0.21082323789596558,0.11426876485347748,0.05354222655296326,-0.03111746534705162,-0.025937475264072418,-0.2007763385772705,-0.04948417842388153,-0.0020427852869033813,-0.045253459364175797,0.04411966726183891,0.02899453043937683]
\ No newline at end of file
descriptorSheldon=[-0.04457738250494003,-0.043990347534418106,-0.025750618427991867,0.016650959849357605,-0.05218123272061348,-0.051934950053691864,0.009930811822414398,-0.016631752252578735,0.11751081049442291,0.040901102125644684,0.221496120095253,-0.08035802841186523,-0.23618969321250916,-0.025104589760303497,-0.02730524353682995,0.10455028712749481,-0.12426766008138657,-0.08866177499294281,-0.14048157632350922,-0.0403841957449913,-0.041014257818460464,0.11965540796518326,-0.015900693833827972,0.08545821160078049,-0.10701243579387665,-0.29199138283729553,-0.09832726418972015,-0.15806680917739868,0.0072528645396232605,-0.09897308796644211,0.02866358309984207,0.17405939102172852,-0.17985643446445465,-0.11151746660470963,0.12910649180412292,0.023578159511089325,-0.048720214515924454,-0.023027973249554634,0.24042245745658875,0.09909329563379288,-0.1479608118534088,-0.03488050401210785,0.023121362552046776,0.35197967290878296,0.1343260109424591,0.025992773473262787,0.027310341596603394,-0.07258803397417068,0.09854952991008759,-0.265401691198349,0.09129731357097626,0.18322107195854187,0.14081576466560364,0.08943489193916321,0.07813340425491333,-0.18660837411880493,0.012191173620522022,0.13849547505378723,-0.19889040291309357,0.14307448267936707,0.04158569499850273,-0.06411264091730118,-0.0019705994054675102,-0.10619327425956726,0.1386486440896988,0.019395824521780014,-0.10675810277462006,-0.06835392862558365,0.19760599732398987,-0.10146252810955048,-0.005423944443464279,0.13664257526397705,-0.10927100479602814,-0.24490387737751007,-0.27884605526924133,0.025820117443799973,0.4047747850418091,0.08949815481901169,-0.21505051851272583,-0.004949783906340599,-0.055362775921821594,-0.06972619891166687,-0.008085280656814575,0.027283571660518646,-0.0860084667801857,0.017455322667956352,-0.07179910689592361,0.0487312376499176,0.2027968317270279,0.011654987931251526,-0.007634447887539864,0.1842338740825653,-0.06324949115514755,-0.07316185534000397,0.122040756046772,0.08807042986154556,-0.050539594143629074,-0.08226519823074341,-0.11426769942045212,0.000004231929779052734,0.027701571583747864,-0.2017858624458313,-0.021970629692077637,0.056306734681129456,-0.17306512594223022,0.20115011930465698,0.008511713705956936,-0.07041959464550018,-0.08531112968921661,-0.04338337481021881,-0.07298384606838226,0.07277841866016388,0.2568773627281189,-0.24525469541549683,0.21955132484436035,0.07719040662050247,0.011913388967514038,0.17791587114334106,-0.05779615789651871,0.10519659519195557,-0.1535077542066574,-0.09388455748558044,-0.1587708741426468,-0.14040732383728027,0.0359625518321991,0.04092983901500702,0.04888205975294113,0.014610011130571365]
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
<!DOCTYPE html>
<html>
<head>
<script src="./imgdata/howard.json"></script>
<script src="./imgdata/leonard.json"></script>
<script src="./imgdata/penny.json"></script>
<script src="./imgdata/raj.json"></script>
<script src="./imgdata/sheldon.json"></script>
<script src="./descriptors/howard.json"></script>
<script src="./descriptors/leonard.json"></script>
<script src="./descriptors/penny.json"></script>
<script src="./descriptors/raj.json"></script>
<script src="./descriptors/sheldon.json"></script>
<script src="../dist/face-recognition.min.js"></script>
</head>
<body>
<label for="file">Load Weights File: </label>
<input type="file" onchange="onWeightsSelected(event)"/>
<script>
function onWeightsSelected(e) {
var selectedFile = e.target.files[0]
var reader = new FileReader()
reader.onload = function(re) {
var weights = new Float32Array(re.target.result)
runTests(weights)
}
reader.readAsArrayBuffer(selectedFile)
}
function runTests(weights) {
console.log('running...')
var computeFaceDescriptor = facerecognition.faceRecognitionNet(weights)
run(imgdataHoward, descriptorHoward, computeFaceDescriptor, 'howard')
run(imgdataLeonard, descriptorLeonard, computeFaceDescriptor, 'leonard')
run(imgdataPenny, descriptorPenny, computeFaceDescriptor, 'penny')
run(imgdataRaj, descriptorRaj, computeFaceDescriptor, 'raj')
run(imgdataSheldon, descriptorSheldon, computeFaceDescriptor, 'howard')
console.log('done')
}
function run(data, refDescriptor, computeFaceDescriptor, name) {
var input = flatten(flatten(data))
console.time('computeFaceDescriptor')
var desc = computeFaceDescriptor(input)
console.timeEnd('computeFaceDescriptor')
var distance = facerecognition.euclideanDistance(desc, refDescriptor)
if (distance > 1e-6)
console.error('failed for descriptor %s with distance %s', name, distance)
}
function flatten(arr) {
return arr.reduce((res, curr) => res.concat(curr), [])
}
</script>
</body>
</html>
\ No newline at end of file
{
"compilerOptions": {
"removeComments": false,
"preserveConstEnums": true,
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"sourceMap": true,
"declaration": true,
"noImplicitAny": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"noImplicitReturns": true,
"noImplicitThis": true,
"noFallthroughCasesInSwitch": true,
"suppressImplicitAnyIndexErrors": true,
"strictNullChecks": true,
"importHelpers": true,
"module": "ES2015",
"moduleResolution": "node",
"target": "es5",
"outDir": "dist",
"baseUrl": ".",
"lib": ["es2015", "dom"],
"typeRoots": [
"typings",
"node_modules/@types"
]
},
"formatCodeOptions": {
"indentSize": 2,
"tabSize": 2
},
"include": [
"src"
]
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment