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",
"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