Commit bbc0785a by vincent

remove tfjs-tiny-yolov2 dependency + bump tfjs-image-recognition-base + update dev dependencies

parent 8259275e
...@@ -36,27 +36,26 @@ ...@@ -36,27 +36,26 @@
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@tensorflow/tfjs-core": "0.14.2", "@tensorflow/tfjs-core": "0.14.2",
"tfjs-image-recognition-base": "^0.3.1", "tfjs-image-recognition-base": "^0.4.1",
"tfjs-tiny-yolov2": "^0.4.0",
"tslib": "^1.9.3" "tslib": "^1.9.3"
}, },
"devDependencies": { "devDependencies": {
"@tensorflow/tfjs-node": "^0.1.21", "@tensorflow/tfjs-node": "^0.2.3",
"@types/jasmine": "^2.8.8", "@types/jasmine": "^3.3.8",
"@types/node": "^10.12.12", "@types/node": "^10.12.18",
"canvas": "^2.0.1", "canvas": "2.0.1",
"jasmine": "^3.3.0", "jasmine": "^3.3.1",
"jasmine-core": "^3.2.1", "jasmine-core": "^3.3.0",
"karma": "^3.0.0", "karma": "^4.0.0",
"karma-chrome-launcher": "^2.2.0", "karma-chrome-launcher": "^2.2.0",
"karma-jasmine": "^1.1.2", "karma-jasmine": "^2.0.1",
"karma-typescript": "^3.0.12", "karma-typescript": "^3.0.13",
"rollup": "^0.65.0", "rollup": "^1.1.2",
"rollup-plugin-commonjs": "^9.1.6", "rollup-plugin-commonjs": "^9.2.0",
"rollup-plugin-node-resolve": "^3.3.0", "rollup-plugin-node-resolve": "^4.0.0",
"rollup-plugin-typescript2": "^0.16.1", "rollup-plugin-typescript2": "^0.19.2",
"rollup-plugin-uglify": "^4.0.0", "rollup-plugin-uglify": "^6.0.2",
"ts-node": "^7.0.1", "ts-node": "^8.0.2",
"typescript": "2.8.4" "typescript": "^3.2.4"
} }
} }
import * as tf from '@tensorflow/tfjs-core'; import * as tf from '@tensorflow/tfjs-core';
import { FCParams } from 'tfjs-tiny-yolov2'; import { TfjsImageRecognitionBase } from 'tfjs-image-recognition-base';
export function fullyConnectedLayer( export function fullyConnectedLayer(
x: tf.Tensor2D, x: tf.Tensor2D,
params: FCParams params: TfjsImageRecognitionBase.FCParams
): tf.Tensor2D { ): tf.Tensor2D {
return tf.tidy(() => return tf.tidy(() =>
tf.add( tf.add(
......
import { drawText, env, getContext2dOrThrow, getDefaultDrawOptions, resolveInput, round } from 'tfjs-image-recognition-base'; import { drawText, env, getContext2dOrThrow, getDefaultDrawOptions, resolveInput, round } from 'tfjs-image-recognition-base';
import { IRect } from 'tfjs-tiny-yolov2'; import { IRect } from 'tfjs-image-recognition-base';
import { DrawFaceExpressionsInput, DrawFaceExpressionsOptions } from './types'; import { DrawFaceExpressionsInput, DrawFaceExpressionsOptions } from './types';
......
import { IPoint, IRect } from 'tfjs-tiny-yolov2'; import { IPoint, IRect } from 'tfjs-image-recognition-base';
import { WithFaceExpressions } from '../factories/WithFaceExpressions'; import { WithFaceExpressions } from '../factories/WithFaceExpressions';
......
import * as tf from '@tensorflow/tfjs-core'; import * as tf from '@tensorflow/tfjs-core';
import { ConvParams, SeparableConvParams } from 'tfjs-tiny-yolov2'; import { TfjsImageRecognitionBase } from 'tfjs-image-recognition-base';
import { depthwiseSeparableConv } from './depthwiseSeparableConv'; import { depthwiseSeparableConv } from './depthwiseSeparableConv';
import { DenseBlock3Params, DenseBlock4Params } from './types'; import { DenseBlock3Params, DenseBlock4Params } from './types';
...@@ -13,10 +13,10 @@ export function denseBlock3( ...@@ -13,10 +13,10 @@ export function denseBlock3(
const out1 = tf.relu( const out1 = tf.relu(
isFirstLayer isFirstLayer
? tf.add( ? tf.add(
tf.conv2d(x, (denseBlockParams.conv0 as ConvParams).filters, [2, 2], 'same'), tf.conv2d(x, (denseBlockParams.conv0 as TfjsImageRecognitionBase.ConvParams).filters, [2, 2], 'same'),
denseBlockParams.conv0.bias denseBlockParams.conv0.bias
) )
: depthwiseSeparableConv(x, denseBlockParams.conv0 as SeparableConvParams, [2, 2]) : depthwiseSeparableConv(x, denseBlockParams.conv0 as TfjsImageRecognitionBase.SeparableConvParams, [2, 2])
) as tf.Tensor4D ) as tf.Tensor4D
const out2 = depthwiseSeparableConv(out1, denseBlockParams.conv1, [1, 1]) const out2 = depthwiseSeparableConv(out1, denseBlockParams.conv1, [1, 1])
...@@ -37,10 +37,10 @@ export function denseBlock4( ...@@ -37,10 +37,10 @@ export function denseBlock4(
const out1 = tf.relu( const out1 = tf.relu(
isFirstLayer isFirstLayer
? tf.add( ? tf.add(
tf.conv2d(x, (denseBlockParams.conv0 as ConvParams).filters, isScaleDown ? [2, 2] : [1, 1], 'same'), tf.conv2d(x, (denseBlockParams.conv0 as TfjsImageRecognitionBase.ConvParams).filters, isScaleDown ? [2, 2] : [1, 1], 'same'),
denseBlockParams.conv0.bias denseBlockParams.conv0.bias
) )
: depthwiseSeparableConv(x, denseBlockParams.conv0 as SeparableConvParams, isScaleDown ? [2, 2] : [1, 1]) : depthwiseSeparableConv(x, denseBlockParams.conv0 as TfjsImageRecognitionBase.SeparableConvParams, isScaleDown ? [2, 2] : [1, 1])
) as tf.Tensor4D ) as tf.Tensor4D
const out2 = depthwiseSeparableConv(out1, denseBlockParams.conv1, [1, 1]) const out2 = depthwiseSeparableConv(out1, denseBlockParams.conv1, [1, 1])
......
import * as tf from '@tensorflow/tfjs-core'; import * as tf from '@tensorflow/tfjs-core';
import { SeparableConvParams } from 'tfjs-tiny-yolov2'; import { TfjsImageRecognitionBase } from 'tfjs-image-recognition-base';
export function depthwiseSeparableConv( export function depthwiseSeparableConv(
x: tf.Tensor4D, x: tf.Tensor4D,
params: SeparableConvParams, params: TfjsImageRecognitionBase.SeparableConvParams,
stride: [number, number] stride: [number, number]
): tf.Tensor4D { ): tf.Tensor4D {
return tf.tidy(() => { return tf.tidy(() => {
......
import { extractWeightsFactory, ParamMapping } from 'tfjs-image-recognition-base';
import { extractorsFactory } from './extractorsFactory'; import { extractorsFactory } from './extractorsFactory';
import { FaceFeatureExtractorParams } from './types'; import { FaceFeatureExtractorParams } from './types';
import { TfjsImageRecognitionBase } from 'tfjs-image-recognition-base';
export function extractParams(weights: Float32Array): { params: FaceFeatureExtractorParams, paramMappings: ParamMapping[] } { export function extractParams(weights: Float32Array): { params: FaceFeatureExtractorParams, paramMappings: TfjsImageRecognitionBase.ParamMapping[] } {
const paramMappings: ParamMapping[] = [] const paramMappings: TfjsImageRecognitionBase.ParamMapping[] = []
const { const {
extractWeights, extractWeights,
getRemainingWeights getRemainingWeights
} = extractWeightsFactory(weights) } = TfjsImageRecognitionBase.extractWeightsFactory(weights)
const { const {
extractDenseBlock4Params extractDenseBlock4Params
......
import * as tf from '@tensorflow/tfjs-core'; import * as tf from '@tensorflow/tfjs-core';
import { disposeUnusedWeightTensors, ParamMapping } from 'tfjs-image-recognition-base'; import { TfjsImageRecognitionBase } from 'tfjs-image-recognition-base';
import { loadParamsFactory } from './loadParamsFactory'; import { loadParamsFactory } from './loadParamsFactory';
import { FaceFeatureExtractorParams } from './types'; import { FaceFeatureExtractorParams } from './types';
export function extractParamsFromWeigthMap( export function extractParamsFromWeigthMap(
weightMap: tf.NamedTensorMap weightMap: tf.NamedTensorMap
): { params: FaceFeatureExtractorParams, paramMappings: ParamMapping[] } { ): { params: FaceFeatureExtractorParams, paramMappings: TfjsImageRecognitionBase.ParamMapping[] } {
const paramMappings: ParamMapping[] = [] const paramMappings: TfjsImageRecognitionBase.ParamMapping[] = []
const { const {
extractDenseBlock4Params extractDenseBlock4Params
...@@ -21,7 +21,7 @@ export function extractParamsFromWeigthMap( ...@@ -21,7 +21,7 @@ export function extractParamsFromWeigthMap(
dense3: extractDenseBlock4Params('dense3') dense3: extractDenseBlock4Params('dense3')
} }
disposeUnusedWeightTensors(weightMap, paramMappings) TfjsImageRecognitionBase.disposeUnusedWeightTensors(weightMap, paramMappings)
return { params, paramMappings } return { params, paramMappings }
} }
\ No newline at end of file
import * as tf from '@tensorflow/tfjs-core'; import * as tf from '@tensorflow/tfjs-core';
import { disposeUnusedWeightTensors, ParamMapping } from 'tfjs-image-recognition-base'; import { TfjsImageRecognitionBase } from 'tfjs-image-recognition-base';
import { loadParamsFactory } from './loadParamsFactory'; import { loadParamsFactory } from './loadParamsFactory';
import { TinyFaceFeatureExtractorParams } from './types'; import { TinyFaceFeatureExtractorParams } from './types';
export function extractParamsFromWeigthMapTiny( export function extractParamsFromWeigthMapTiny(
weightMap: tf.NamedTensorMap weightMap: tf.NamedTensorMap
): { params: TinyFaceFeatureExtractorParams, paramMappings: ParamMapping[] } { ): { params: TinyFaceFeatureExtractorParams, paramMappings: TfjsImageRecognitionBase.ParamMapping[] } {
const paramMappings: ParamMapping[] = [] const paramMappings: TfjsImageRecognitionBase.ParamMapping[] = []
const { const {
extractDenseBlock3Params extractDenseBlock3Params
...@@ -20,7 +20,7 @@ export function extractParamsFromWeigthMapTiny( ...@@ -20,7 +20,7 @@ export function extractParamsFromWeigthMapTiny(
dense2: extractDenseBlock3Params('dense2') dense2: extractDenseBlock3Params('dense2')
} }
disposeUnusedWeightTensors(weightMap, paramMappings) TfjsImageRecognitionBase.disposeUnusedWeightTensors(weightMap, paramMappings)
return { params, paramMappings } return { params, paramMappings }
} }
\ No newline at end of file
import { extractWeightsFactory, ParamMapping } from 'tfjs-image-recognition-base'; import { TfjsImageRecognitionBase } from 'tfjs-image-recognition-base';
import { extractorsFactory } from './extractorsFactory'; import { extractorsFactory } from './extractorsFactory';
import { TinyFaceFeatureExtractorParams } from './types'; import { TinyFaceFeatureExtractorParams } from './types';
export function extractParamsTiny(weights: Float32Array): { params: TinyFaceFeatureExtractorParams, paramMappings: ParamMapping[] } {
const paramMappings: ParamMapping[] = [] export function extractParamsTiny(weights: Float32Array): { params: TinyFaceFeatureExtractorParams, paramMappings: TfjsImageRecognitionBase.ParamMapping[] } {
const paramMappings: TfjsImageRecognitionBase.ParamMapping[] = []
const { const {
extractWeights, extractWeights,
getRemainingWeights getRemainingWeights
} = extractWeightsFactory(weights) } = TfjsImageRecognitionBase.extractWeightsFactory(weights)
const { const {
extractDenseBlock3Params extractDenseBlock3Params
......
import * as tf from '@tensorflow/tfjs-core'; import * as tf from '@tensorflow/tfjs-core';
import { ExtractWeightsFunction, ParamMapping } from 'tfjs-image-recognition-base'; import { TfjsImageRecognitionBase } from 'tfjs-image-recognition-base';
import { extractConvParamsFactory, FCParams, SeparableConvParams } from 'tfjs-tiny-yolov2';
import { DenseBlock3Params, DenseBlock4Params } from './types'; import { DenseBlock3Params, DenseBlock4Params } from './types';
export function extractorsFactory(extractWeights: ExtractWeightsFunction, paramMappings: ParamMapping[]) { export function extractorsFactory(extractWeights: TfjsImageRecognitionBase.ExtractWeightsFunction, paramMappings: TfjsImageRecognitionBase.ParamMapping[]) {
function extractSeparableConvParams(channelsIn: number, channelsOut: number, mappedPrefix: string): SeparableConvParams { function extractSeparableConvParams(channelsIn: number, channelsOut: number, mappedPrefix: string): TfjsImageRecognitionBase.SeparableConvParams {
const depthwise_filter = tf.tensor4d(extractWeights(3 * 3 * channelsIn), [3, 3, channelsIn, 1]) const depthwise_filter = tf.tensor4d(extractWeights(3 * 3 * channelsIn), [3, 3, channelsIn, 1])
const pointwise_filter = tf.tensor4d(extractWeights(channelsIn * channelsOut), [1, 1, channelsIn, channelsOut]) const pointwise_filter = tf.tensor4d(extractWeights(channelsIn * channelsOut), [1, 1, channelsIn, channelsOut])
const bias = tf.tensor1d(extractWeights(channelsOut)) const bias = tf.tensor1d(extractWeights(channelsOut))
...@@ -17,14 +16,14 @@ export function extractorsFactory(extractWeights: ExtractWeightsFunction, paramM ...@@ -17,14 +16,14 @@ export function extractorsFactory(extractWeights: ExtractWeightsFunction, paramM
{ paramPath: `${mappedPrefix}/bias` } { paramPath: `${mappedPrefix}/bias` }
) )
return new SeparableConvParams( return new TfjsImageRecognitionBase.SeparableConvParams(
depthwise_filter, depthwise_filter,
pointwise_filter, pointwise_filter,
bias bias
) )
} }
const extractConvParams = extractConvParamsFactory(extractWeights, paramMappings) const extractConvParams = TfjsImageRecognitionBase.extractConvParamsFactory(extractWeights, paramMappings)
function extractDenseBlock3Params(channelsIn: number, channelsOut: number, mappedPrefix: string, isFirstLayer: boolean = false): DenseBlock3Params { function extractDenseBlock3Params(channelsIn: number, channelsOut: number, mappedPrefix: string, isFirstLayer: boolean = false): DenseBlock3Params {
......
import * as tf from '@tensorflow/tfjs-core'; import * as tf from '@tensorflow/tfjs-core';
import { extractWeightEntryFactory, ParamMapping } from 'tfjs-image-recognition-base'; import { TfjsImageRecognitionBase } from 'tfjs-image-recognition-base';
import { ConvParams, SeparableConvParams } from 'tfjs-tiny-yolov2';
import { DenseBlock3Params, DenseBlock4Params } from './types'; import { DenseBlock3Params, DenseBlock4Params } from './types';
export function loadParamsFactory(weightMap: any, paramMappings: ParamMapping[]) { export function loadParamsFactory(weightMap: any, paramMappings: TfjsImageRecognitionBase.ParamMapping[]) {
const extractWeightEntry = extractWeightEntryFactory(weightMap, paramMappings) const extractWeightEntry = TfjsImageRecognitionBase.extractWeightEntryFactory(weightMap, paramMappings)
function extractConvParams(prefix: string): ConvParams { function extractConvParams(prefix: string): TfjsImageRecognitionBase.ConvParams {
const filters = extractWeightEntry<tf.Tensor4D>(`${prefix}/filters`, 4) const filters = extractWeightEntry<tf.Tensor4D>(`${prefix}/filters`, 4)
const bias = extractWeightEntry<tf.Tensor1D>(`${prefix}/bias`, 1) const bias = extractWeightEntry<tf.Tensor1D>(`${prefix}/bias`, 1)
return { filters, bias } return { filters, bias }
} }
function extractSeparableConvParams(prefix: string): SeparableConvParams { function extractSeparableConvParams(prefix: string): TfjsImageRecognitionBase.SeparableConvParams {
const depthwise_filter = extractWeightEntry<tf.Tensor4D>(`${prefix}/depthwise_filter`, 4) const depthwise_filter = extractWeightEntry<tf.Tensor4D>(`${prefix}/depthwise_filter`, 4)
const pointwise_filter = extractWeightEntry<tf.Tensor4D>(`${prefix}/pointwise_filter`, 4) const pointwise_filter = extractWeightEntry<tf.Tensor4D>(`${prefix}/pointwise_filter`, 4)
const bias = extractWeightEntry<tf.Tensor1D>(`${prefix}/bias`, 1) const bias = extractWeightEntry<tf.Tensor1D>(`${prefix}/bias`, 1)
return new SeparableConvParams( return new TfjsImageRecognitionBase.SeparableConvParams(
depthwise_filter, depthwise_filter,
pointwise_filter, pointwise_filter,
bias bias
......
import * as tf from '@tensorflow/tfjs-core'; import * as tf from '@tensorflow/tfjs-core';
import { NetInput, NeuralNetwork, TNetInput } from 'tfjs-image-recognition-base'; import { NetInput, NeuralNetwork, TNetInput, TfjsImageRecognitionBase } from 'tfjs-image-recognition-base';
import { ConvParams, SeparableConvParams } from 'tfjs-tiny-yolov2';
export type ConvWithBatchNormParams = BatchNormParams & { export type ConvWithBatchNormParams = BatchNormParams & {
filter: tf.Tensor4D filter: tf.Tensor4D
...@@ -19,13 +18,13 @@ export type SeparableConvWithBatchNormParams = { ...@@ -19,13 +18,13 @@ export type SeparableConvWithBatchNormParams = {
} }
export type DenseBlock3Params = { export type DenseBlock3Params = {
conv0: SeparableConvParams | ConvParams conv0: TfjsImageRecognitionBase.SeparableConvParams | TfjsImageRecognitionBase.ConvParams
conv1: SeparableConvParams conv1: TfjsImageRecognitionBase.SeparableConvParams
conv2: SeparableConvParams conv2: TfjsImageRecognitionBase.SeparableConvParams
} }
export type DenseBlock4Params = DenseBlock3Params & { export type DenseBlock4Params = DenseBlock3Params & {
conv3: SeparableConvParams conv3: TfjsImageRecognitionBase.SeparableConvParams
} }
export type TinyFaceFeatureExtractorParams = { export type TinyFaceFeatureExtractorParams = {
......
import { extractWeightsFactory, ParamMapping } from 'tfjs-image-recognition-base'; import { TfjsImageRecognitionBase } from 'tfjs-image-recognition-base';
import { extractFCParamsFactory } from 'tfjs-tiny-yolov2';
import { NetParams } from './types'; import { NetParams } from './types';
export function extractParams(weights: Float32Array, channelsIn: number, channelsOut: number): { params: NetParams, paramMappings: ParamMapping[] } { export function extractParams(weights: Float32Array, channelsIn: number, channelsOut: number): { params: NetParams, paramMappings: TfjsImageRecognitionBase.ParamMapping[] } {
const paramMappings: ParamMapping[] = [] const paramMappings: TfjsImageRecognitionBase.ParamMapping[] = []
const { const {
extractWeights, extractWeights,
getRemainingWeights getRemainingWeights
} = extractWeightsFactory(weights) } = TfjsImageRecognitionBase.extractWeightsFactory(weights)
const extractFCParams = extractFCParamsFactory(extractWeights, paramMappings) const extractFCParams = TfjsImageRecognitionBase.extractFCParamsFactory(extractWeights, paramMappings)
const fc = extractFCParams(channelsIn, channelsOut, 'fc') const fc = extractFCParams(channelsIn, channelsOut, 'fc')
......
import * as tf from '@tensorflow/tfjs-core'; import * as tf from '@tensorflow/tfjs-core';
import { disposeUnusedWeightTensors, extractWeightEntryFactory, ParamMapping } from 'tfjs-image-recognition-base'; import { TfjsImageRecognitionBase } from 'tfjs-image-recognition-base';
import { FCParams } from 'tfjs-tiny-yolov2';
import { NetParams } from './types'; import { NetParams } from './types';
export function extractParamsFromWeigthMap( export function extractParamsFromWeigthMap(
weightMap: tf.NamedTensorMap weightMap: tf.NamedTensorMap
): { params: NetParams, paramMappings: ParamMapping[] } { ): { params: NetParams, paramMappings: TfjsImageRecognitionBase.ParamMapping[] } {
const paramMappings: ParamMapping[] = [] const paramMappings: TfjsImageRecognitionBase.ParamMapping[] = []
const extractWeightEntry = extractWeightEntryFactory(weightMap, paramMappings) const extractWeightEntry = TfjsImageRecognitionBase.extractWeightEntryFactory(weightMap, paramMappings)
function extractFcParams(prefix: string): FCParams { function extractFcParams(prefix: string): TfjsImageRecognitionBase.FCParams {
const weights = extractWeightEntry<tf.Tensor2D>(`${prefix}/weights`, 2) const weights = extractWeightEntry<tf.Tensor2D>(`${prefix}/weights`, 2)
const bias = extractWeightEntry<tf.Tensor1D>(`${prefix}/bias`, 1) const bias = extractWeightEntry<tf.Tensor1D>(`${prefix}/bias`, 1)
return { weights, bias } return { weights, bias }
...@@ -22,7 +21,7 @@ export function extractParamsFromWeigthMap( ...@@ -22,7 +21,7 @@ export function extractParamsFromWeigthMap(
fc: extractFcParams('fc') fc: extractFcParams('fc')
} }
disposeUnusedWeightTensors(weightMap, paramMappings) TfjsImageRecognitionBase.disposeUnusedWeightTensors(weightMap, paramMappings)
return { params, paramMappings } return { params, paramMappings }
} }
\ No newline at end of file
import { FCParams } from 'tfjs-tiny-yolov2'; import { TfjsImageRecognitionBase } from 'tfjs-image-recognition-base';
export type NetParams = { export type NetParams = {
fc: FCParams fc: TfjsImageRecognitionBase.FCParams
} }
import * as tf from '@tensorflow/tfjs-core'; import * as tf from '@tensorflow/tfjs-core';
import { extractWeightsFactory, ExtractWeightsFunction, isFloat, ParamMapping } from 'tfjs-image-recognition-base'; import { isFloat, TfjsImageRecognitionBase } from 'tfjs-image-recognition-base';
import { ConvParams } from 'tfjs-tiny-yolov2';
import { ConvLayerParams, NetParams, ResidualLayerParams, ScaleLayerParams } from './types'; import { ConvLayerParams, NetParams, ResidualLayerParams, ScaleLayerParams } from './types';
function extractorsFactory(extractWeights: ExtractWeightsFunction, paramMappings: ParamMapping[]) { function extractorsFactory(extractWeights: TfjsImageRecognitionBase.ExtractWeightsFunction, paramMappings: TfjsImageRecognitionBase.ParamMapping[]) {
function extractFilterValues(numFilterValues: number, numFilters: number, filterSize: number): tf.Tensor4D { function extractFilterValues(numFilterValues: number, numFilters: number, filterSize: number): tf.Tensor4D {
const weights = extractWeights(numFilterValues) const weights = extractWeights(numFilterValues)
...@@ -27,7 +26,7 @@ function extractorsFactory(extractWeights: ExtractWeightsFunction, paramMappings ...@@ -27,7 +26,7 @@ function extractorsFactory(extractWeights: ExtractWeightsFunction, paramMappings
numFilters: number, numFilters: number,
filterSize: number, filterSize: number,
mappedPrefix: string mappedPrefix: string
): ConvParams { ): TfjsImageRecognitionBase.ConvParams {
const filters = extractFilterValues(numFilterValues, numFilters, filterSize) const filters = extractFilterValues(numFilterValues, numFilters, filterSize)
const bias = tf.tensor1d(extractWeights(numFilters)) const bias = tf.tensor1d(extractWeights(numFilters))
...@@ -90,14 +89,14 @@ function extractorsFactory(extractWeights: ExtractWeightsFunction, paramMappings ...@@ -90,14 +89,14 @@ function extractorsFactory(extractWeights: ExtractWeightsFunction, paramMappings
} }
export function extractParams(weights: Float32Array): { params: NetParams, paramMappings: ParamMapping[] } { export function extractParams(weights: Float32Array): { params: NetParams, paramMappings: TfjsImageRecognitionBase.ParamMapping[] } {
const { const {
extractWeights, extractWeights,
getRemainingWeights getRemainingWeights
} = extractWeightsFactory(weights) } = TfjsImageRecognitionBase.extractWeightsFactory(weights)
const paramMappings: ParamMapping[] = [] const paramMappings: TfjsImageRecognitionBase.ParamMapping[] = []
const { const {
extractConvLayerParams, extractConvLayerParams,
......
import * as tf from '@tensorflow/tfjs-core'; import * as tf from '@tensorflow/tfjs-core';
import { import { isTensor2D, TfjsImageRecognitionBase } from 'tfjs-image-recognition-base';
disposeUnusedWeightTensors,
extractWeightEntryFactory,
isTensor2D,
loadWeightMap,
ParamMapping,
} from 'tfjs-image-recognition-base';
import { ConvLayerParams, NetParams, ResidualLayerParams, ScaleLayerParams } from './types'; import { ConvLayerParams, NetParams, ResidualLayerParams, ScaleLayerParams } from './types';
function extractorsFactory(weightMap: any, paramMappings: ParamMapping[]) { function extractorsFactory(weightMap: any, paramMappings: TfjsImageRecognitionBase.ParamMapping[]) {
const extractWeightEntry = extractWeightEntryFactory(weightMap, paramMappings) const extractWeightEntry = TfjsImageRecognitionBase.extractWeightEntryFactory(weightMap, paramMappings)
function extractScaleLayerParams(prefix: string): ScaleLayerParams { function extractScaleLayerParams(prefix: string): ScaleLayerParams {
...@@ -46,9 +40,9 @@ function extractorsFactory(weightMap: any, paramMappings: ParamMapping[]) { ...@@ -46,9 +40,9 @@ function extractorsFactory(weightMap: any, paramMappings: ParamMapping[]) {
export function extractParamsFromWeigthMap( export function extractParamsFromWeigthMap(
weightMap: tf.NamedTensorMap weightMap: tf.NamedTensorMap
): { params: NetParams, paramMappings: ParamMapping[] } { ): { params: NetParams, paramMappings: TfjsImageRecognitionBase.ParamMapping[] } {
const paramMappings: ParamMapping[] = [] const paramMappings: TfjsImageRecognitionBase.ParamMapping[] = []
const { const {
extractConvLayerParams, extractConvLayerParams,
...@@ -100,7 +94,7 @@ export function extractParamsFromWeigthMap( ...@@ -100,7 +94,7 @@ export function extractParamsFromWeigthMap(
fc fc
} }
disposeUnusedWeightTensors(weightMap, paramMappings) TfjsImageRecognitionBase.disposeUnusedWeightTensors(weightMap, paramMappings)
return { params, paramMappings } return { params, paramMappings }
} }
\ No newline at end of file
import * as tf from '@tensorflow/tfjs-core'; import * as tf from '@tensorflow/tfjs-core';
import { ConvParams } from 'tfjs-tiny-yolov2'; import { TfjsImageRecognitionBase } from 'tfjs-image-recognition-base';
export type ScaleLayerParams = { export type ScaleLayerParams = {
weights: tf.Tensor1D weights: tf.Tensor1D
...@@ -11,7 +11,7 @@ export type ResidualLayerParams = { ...@@ -11,7 +11,7 @@ export type ResidualLayerParams = {
} }
export type ConvLayerParams = { export type ConvLayerParams = {
conv: ConvParams conv: TfjsImageRecognitionBase.ConvParams
scale: ScaleLayerParams scale: ScaleLayerParams
} }
......
import { TNetInput } from 'tfjs-image-recognition-base'; import { TfjsImageRecognitionBase, TNetInput } from 'tfjs-image-recognition-base';
import { TinyYolov2Options } from 'tfjs-tiny-yolov2';
import { FaceDetection } from '../classes/FaceDetection'; import { FaceDetection } from '../classes/FaceDetection';
import { extendWithFaceDetection, WithFaceDetection } from '../factories/WithFaceDetection'; import { extendWithFaceDetection, WithFaceDetection } from '../factories/WithFaceDetection';
...@@ -9,8 +8,8 @@ import { TinyFaceDetectorOptions } from '../tinyFaceDetector/TinyFaceDetectorOpt ...@@ -9,8 +8,8 @@ import { TinyFaceDetectorOptions } from '../tinyFaceDetector/TinyFaceDetectorOpt
import { ComposableTask } from './ComposableTask'; import { ComposableTask } from './ComposableTask';
import { DetectAllFaceLandmarksTask, DetectSingleFaceLandmarksTask } from './DetectFaceLandmarksTasks'; import { DetectAllFaceLandmarksTask, DetectSingleFaceLandmarksTask } from './DetectFaceLandmarksTasks';
import { nets } from './nets'; import { nets } from './nets';
import { FaceDetectionOptions } from './types';
import { PredictAllFaceExpressionsTask, PredictSingleFaceExpressionTask } from './PredictFaceExpressionsTask'; import { PredictAllFaceExpressionsTask, PredictSingleFaceExpressionTask } from './PredictFaceExpressionsTask';
import { FaceDetectionOptions } from './types';
export class DetectFacesTaskBase<TReturn> extends ComposableTask<TReturn> { export class DetectFacesTaskBase<TReturn> extends ComposableTask<TReturn> {
constructor( constructor(
...@@ -38,7 +37,7 @@ export class DetectAllFacesTask extends DetectFacesTaskBase<FaceDetection[]> { ...@@ -38,7 +37,7 @@ export class DetectAllFacesTask extends DetectFacesTaskBase<FaceDetection[]> {
options instanceof SsdMobilenetv1Options options instanceof SsdMobilenetv1Options
? (input: TNetInput) => nets.ssdMobilenetv1.locateFaces(input, options) ? (input: TNetInput) => nets.ssdMobilenetv1.locateFaces(input, options)
: ( : (
options instanceof TinyYolov2Options options instanceof TfjsImageRecognitionBase.TinyYolov2Options
? (input: TNetInput) => nets.tinyYolov2.locateFaces(input, options) ? (input: TNetInput) => nets.tinyYolov2.locateFaces(input, options)
: null : null
) )
......
import * as tf from '@tensorflow/tfjs-core';
import { TNetInput } from 'tfjs-image-recognition-base'; import { TNetInput } from 'tfjs-image-recognition-base';
import { tf } from 'tfjs-tiny-yolov2';
import { extractFaces, extractFaceTensors } from '../dom'; import { extractFaces, extractFaceTensors } from '../dom';
import { FaceExpressionPrediction } from '../faceExpressionNet/types'; import { FaceExpressionPrediction } from '../faceExpressionNet/types';
......
import { TNetInput } from 'tfjs-image-recognition-base'; import { TfjsImageRecognitionBase, TNetInput } from 'tfjs-image-recognition-base';
import { ITinyYolov2Options, TinyYolov2Options } from 'tfjs-tiny-yolov2';
import { WithFaceDescriptor, WithFaceDetection, WithFaceLandmarks } from '../factories'; import { WithFaceDescriptor, WithFaceDetection, WithFaceLandmarks } from '../factories';
import { IMtcnnOptions, MtcnnOptions } from '../mtcnn/MtcnnOptions'; import { IMtcnnOptions, MtcnnOptions } from '../mtcnn/MtcnnOptions';
...@@ -19,9 +18,9 @@ export async function allFacesSsdMobilenetv1( ...@@ -19,9 +18,9 @@ export async function allFacesSsdMobilenetv1(
export async function allFacesTinyYolov2( export async function allFacesTinyYolov2(
input: TNetInput, input: TNetInput,
forwardParams: ITinyYolov2Options = {} forwardParams: TfjsImageRecognitionBase.ITinyYolov2Options = {}
): Promise<WithFaceDescriptor<WithFaceLandmarks<WithFaceDetection<{}>>>[]> { ): Promise<WithFaceDescriptor<WithFaceLandmarks<WithFaceDetection<{}>>>[]> {
return await detectAllFaces(input, new TinyYolov2Options(forwardParams)) return await detectAllFaces(input, new TfjsImageRecognitionBase.TinyYolov2Options(forwardParams))
.withFaceLandmarks() .withFaceLandmarks()
.withFaceDescriptors() .withFaceDescriptors()
} }
......
import { TNetInput } from 'tfjs-image-recognition-base'; import { TfjsImageRecognitionBase, TNetInput } from 'tfjs-image-recognition-base';
import { ITinyYolov2Options } from 'tfjs-tiny-yolov2';
import { FaceDetection } from '../classes/FaceDetection'; import { FaceDetection } from '../classes/FaceDetection';
import { FaceLandmarks5 } from '../classes/FaceLandmarks5'; import { FaceLandmarks5 } from '../classes/FaceLandmarks5';
...@@ -17,7 +16,7 @@ import { SsdMobilenetv1 } from '../ssdMobilenetv1/SsdMobilenetv1'; ...@@ -17,7 +16,7 @@ import { SsdMobilenetv1 } from '../ssdMobilenetv1/SsdMobilenetv1';
import { SsdMobilenetv1Options } from '../ssdMobilenetv1/SsdMobilenetv1Options'; import { SsdMobilenetv1Options } from '../ssdMobilenetv1/SsdMobilenetv1Options';
import { TinyFaceDetector } from '../tinyFaceDetector/TinyFaceDetector'; import { TinyFaceDetector } from '../tinyFaceDetector/TinyFaceDetector';
import { TinyFaceDetectorOptions } from '../tinyFaceDetector/TinyFaceDetectorOptions'; import { TinyFaceDetectorOptions } from '../tinyFaceDetector/TinyFaceDetectorOptions';
import { TinyYolov2 } from '../tinyYolov2/TinyYolov2'; import { TinyYolov2 } from '../tinyYolov2';
export const nets = { export const nets = {
ssdMobilenetv1: new SsdMobilenetv1(), ssdMobilenetv1: new SsdMobilenetv1(),
...@@ -57,7 +56,7 @@ export const tinyFaceDetector = (input: TNetInput, options: TinyFaceDetectorOpti ...@@ -57,7 +56,7 @@ export const tinyFaceDetector = (input: TNetInput, options: TinyFaceDetectorOpti
* @param options (optional, default: see TinyYolov2Options constructor for default parameters). * @param options (optional, default: see TinyYolov2Options constructor for default parameters).
* @returns Bounding box of each face with score. * @returns Bounding box of each face with score.
*/ */
export const tinyYolov2 = (input: TNetInput, options: ITinyYolov2Options): Promise<FaceDetection[]> => export const tinyYolov2 = (input: TNetInput, options: TfjsImageRecognitionBase.ITinyYolov2Options): Promise<FaceDetection[]> =>
nets.tinyYolov2.locateFaces(input, options) nets.tinyYolov2.locateFaces(input, options)
/** /**
......
import { TNetInput } from 'tfjs-image-recognition-base'; import { TfjsImageRecognitionBase, TNetInput } from 'tfjs-image-recognition-base';
import { TinyYolov2Options } from 'tfjs-tiny-yolov2';
import { FaceDetection } from '../classes/FaceDetection'; import { FaceDetection } from '../classes/FaceDetection';
import { MtcnnOptions } from '../mtcnn/MtcnnOptions'; import { MtcnnOptions } from '../mtcnn/MtcnnOptions';
import { SsdMobilenetv1Options } from '../ssdMobilenetv1/SsdMobilenetv1Options'; import { SsdMobilenetv1Options } from '../ssdMobilenetv1/SsdMobilenetv1Options';
import { TinyFaceDetectorOptions } from '../tinyFaceDetector/TinyFaceDetectorOptions'; import { TinyFaceDetectorOptions } from '../tinyFaceDetector/TinyFaceDetectorOptions';
export type FaceDetectionOptions = TinyFaceDetectorOptions | SsdMobilenetv1Options | MtcnnOptions | TinyYolov2Options export type FaceDetectionOptions = TinyFaceDetectorOptions | SsdMobilenetv1Options | MtcnnOptions | TfjsImageRecognitionBase.TinyYolov2Options
export type FaceDetectionFunction = (input: TNetInput) => Promise<FaceDetection[]> export type FaceDetectionFunction = (input: TNetInput) => Promise<FaceDetection[]>
\ No newline at end of file
import * as tf from '@tensorflow/tfjs-core'; import * as tf from '@tensorflow/tfjs-core';
import { convLayer } from 'tfjs-tiny-yolov2'; import { TfjsImageRecognitionBase } from 'tfjs-image-recognition-base';
import { fullyConnectedLayer } from '../common/fullyConnectedLayer'; import { fullyConnectedLayer } from '../common/fullyConnectedLayer';
import { prelu } from './prelu'; import { prelu } from './prelu';
...@@ -11,7 +11,7 @@ export function ONet(x: tf.Tensor4D, params: ONetParams): { scores: tf.Tensor1D, ...@@ -11,7 +11,7 @@ export function ONet(x: tf.Tensor4D, params: ONetParams): { scores: tf.Tensor1D,
let out = sharedLayer(x, params) let out = sharedLayer(x, params)
out = tf.maxPool(out, [2, 2], [2, 2], 'same') out = tf.maxPool(out, [2, 2], [2, 2], 'same')
out = convLayer(out, params.conv4, 'valid') out = TfjsImageRecognitionBase.convLayer(out, params.conv4, 'valid')
out = prelu<tf.Tensor4D>(out, params.prelu4_alpha) out = prelu<tf.Tensor4D>(out, params.prelu4_alpha)
const vectorized = tf.reshape(out, [out.shape[0], params.fc1.weights.shape[0]]) as tf.Tensor2D const vectorized = tf.reshape(out, [out.shape[0], params.fc1.weights.shape[0]]) as tf.Tensor2D
......
import * as tf from '@tensorflow/tfjs-core'; import * as tf from '@tensorflow/tfjs-core';
import { convLayer } from 'tfjs-tiny-yolov2'; import { TfjsImageRecognitionBase } from 'tfjs-image-recognition-base';
import { sharedLayer } from './sharedLayers'; import { sharedLayer } from './sharedLayers';
import { PNetParams } from './types'; import { PNetParams } from './types';
...@@ -8,10 +8,10 @@ export function PNet(x: tf.Tensor4D, params: PNetParams): { prob: tf.Tensor4D, r ...@@ -8,10 +8,10 @@ export function PNet(x: tf.Tensor4D, params: PNetParams): { prob: tf.Tensor4D, r
return tf.tidy(() => { return tf.tidy(() => {
let out = sharedLayer(x, params, true) let out = sharedLayer(x, params, true)
const conv = convLayer(out, params.conv4_1, 'valid') const conv = TfjsImageRecognitionBase.convLayer(out, params.conv4_1, 'valid')
const max = tf.expandDims(tf.max(conv, 3), 3) const max = tf.expandDims(tf.max(conv, 3), 3)
const prob = tf.softmax(tf.sub(conv, max), 3) as tf.Tensor4D const prob = tf.softmax(tf.sub(conv, max), 3) as tf.Tensor4D
const regions = convLayer(out, params.conv4_2, 'valid') const regions = TfjsImageRecognitionBase.convLayer(out, params.conv4_2, 'valid')
return { prob, regions } return { prob, regions }
}) })
......
import * as tf from '@tensorflow/tfjs-core'; import * as tf from '@tensorflow/tfjs-core';
import { extractWeightsFactory, ExtractWeightsFunction, ParamMapping } from 'tfjs-image-recognition-base'; import { TfjsImageRecognitionBase } from 'tfjs-image-recognition-base';
import { extractConvParamsFactory, extractFCParamsFactory } from 'tfjs-tiny-yolov2';
import { NetParams, ONetParams, PNetParams, RNetParams, SharedParams } from './types'; import { NetParams, ONetParams, PNetParams, RNetParams, SharedParams } from './types';
function extractorsFactory(extractWeights: ExtractWeightsFunction, paramMappings: ParamMapping[]) { function extractorsFactory(extractWeights: TfjsImageRecognitionBase.ExtractWeightsFunction, paramMappings: TfjsImageRecognitionBase.ParamMapping[]) {
const extractConvParams = extractConvParamsFactory(extractWeights, paramMappings) const extractConvParams = TfjsImageRecognitionBase.extractConvParamsFactory(extractWeights, paramMappings)
const extractFCParams = extractFCParamsFactory(extractWeights, paramMappings) const extractFCParams = TfjsImageRecognitionBase.extractFCParamsFactory(extractWeights, paramMappings)
function extractPReluParams(size: number, paramPath: string): tf.Tensor1D { function extractPReluParams(size: number, paramPath: string): tf.Tensor1D {
const alpha = tf.tensor1d(extractWeights(size)) const alpha = tf.tensor1d(extractWeights(size))
...@@ -69,14 +68,14 @@ function extractorsFactory(extractWeights: ExtractWeightsFunction, paramMappings ...@@ -69,14 +68,14 @@ function extractorsFactory(extractWeights: ExtractWeightsFunction, paramMappings
} }
export function extractParams(weights: Float32Array): { params: NetParams, paramMappings: ParamMapping[] } { export function extractParams(weights: Float32Array): { params: NetParams, paramMappings: TfjsImageRecognitionBase.ParamMapping[] } {
const { const {
extractWeights, extractWeights,
getRemainingWeights getRemainingWeights
} = extractWeightsFactory(weights) } = TfjsImageRecognitionBase.extractWeightsFactory(weights)
const paramMappings: ParamMapping[] = [] const paramMappings: TfjsImageRecognitionBase.ParamMapping[] = []
const { const {
extractPNetParams, extractPNetParams,
......
import * as tf from '@tensorflow/tfjs-core'; import * as tf from '@tensorflow/tfjs-core';
import { disposeUnusedWeightTensors, extractWeightEntryFactory, ParamMapping } from 'tfjs-image-recognition-base'; import { TfjsImageRecognitionBase } from 'tfjs-image-recognition-base';
import { ConvParams, FCParams } from 'tfjs-tiny-yolov2';
import { NetParams, ONetParams, PNetParams, RNetParams, SharedParams } from './types'; import { NetParams, ONetParams, PNetParams, RNetParams, SharedParams } from './types';
function extractorsFactory(weightMap: any, paramMappings: ParamMapping[]) { function extractorsFactory(weightMap: any, paramMappings: TfjsImageRecognitionBase.ParamMapping[]) {
const extractWeightEntry = extractWeightEntryFactory(weightMap, paramMappings) const extractWeightEntry = TfjsImageRecognitionBase.extractWeightEntryFactory(weightMap, paramMappings)
function extractConvParams(prefix: string): ConvParams { function extractConvParams(prefix: string): TfjsImageRecognitionBase.ConvParams {
const filters = extractWeightEntry<tf.Tensor4D>(`${prefix}/weights`, 4, `${prefix}/filters`) const filters = extractWeightEntry<tf.Tensor4D>(`${prefix}/weights`, 4, `${prefix}/filters`)
const bias = extractWeightEntry<tf.Tensor1D>(`${prefix}/bias`, 1) const bias = extractWeightEntry<tf.Tensor1D>(`${prefix}/bias`, 1)
return { filters, bias } return { filters, bias }
} }
function extractFCParams(prefix: string): FCParams { function extractFCParams(prefix: string): TfjsImageRecognitionBase.FCParams {
const weights = extractWeightEntry<tf.Tensor2D>(`${prefix}/weights`, 2) const weights = extractWeightEntry<tf.Tensor2D>(`${prefix}/weights`, 2)
const bias = extractWeightEntry<tf.Tensor1D>(`${prefix}/bias`, 1) const bias = extractWeightEntry<tf.Tensor1D>(`${prefix}/bias`, 1)
...@@ -82,9 +81,9 @@ function extractorsFactory(weightMap: any, paramMappings: ParamMapping[]) { ...@@ -82,9 +81,9 @@ function extractorsFactory(weightMap: any, paramMappings: ParamMapping[]) {
export function extractParamsFromWeigthMap( export function extractParamsFromWeigthMap(
weightMap: tf.NamedTensorMap weightMap: tf.NamedTensorMap
): { params: NetParams, paramMappings: ParamMapping[] } { ): { params: NetParams, paramMappings: TfjsImageRecognitionBase.ParamMapping[] } {
const paramMappings: ParamMapping[] = [] const paramMappings: TfjsImageRecognitionBase.ParamMapping[] = []
const { const {
extractPNetParams, extractPNetParams,
...@@ -96,7 +95,7 @@ export function extractParamsFromWeigthMap( ...@@ -96,7 +95,7 @@ export function extractParamsFromWeigthMap(
const rnet = extractRNetParams() const rnet = extractRNetParams()
const onet = extractONetParams() const onet = extractONetParams()
disposeUnusedWeightTensors(weightMap, paramMappings) TfjsImageRecognitionBase.disposeUnusedWeightTensors(weightMap, paramMappings)
return { params: { pnet, rnet, onet }, paramMappings } return { params: { pnet, rnet, onet }, paramMappings }
} }
\ No newline at end of file
import * as tf from '@tensorflow/tfjs-core'; import * as tf from '@tensorflow/tfjs-core';
import { convLayer } from 'tfjs-tiny-yolov2'; import { TfjsImageRecognitionBase } from 'tfjs-image-recognition-base';
import { prelu } from './prelu'; import { prelu } from './prelu';
import { SharedParams } from './types'; import { SharedParams } from './types';
...@@ -7,13 +7,13 @@ import { SharedParams } from './types'; ...@@ -7,13 +7,13 @@ import { SharedParams } from './types';
export function sharedLayer(x: tf.Tensor4D, params: SharedParams, isPnet: boolean = false) { export function sharedLayer(x: tf.Tensor4D, params: SharedParams, isPnet: boolean = false) {
return tf.tidy(() => { return tf.tidy(() => {
let out = convLayer(x, params.conv1, 'valid') let out = TfjsImageRecognitionBase.convLayer(x, params.conv1, 'valid')
out = prelu<tf.Tensor4D>(out, params.prelu1_alpha) out = prelu<tf.Tensor4D>(out, params.prelu1_alpha)
out = tf.maxPool(out, isPnet ? [2, 2]: [3, 3], [2, 2], 'same') out = tf.maxPool(out, isPnet ? [2, 2]: [3, 3], [2, 2], 'same')
out = convLayer(out, params.conv2, 'valid') out = TfjsImageRecognitionBase.convLayer(out, params.conv2, 'valid')
out = prelu<tf.Tensor4D>(out, params.prelu2_alpha) out = prelu<tf.Tensor4D>(out, params.prelu2_alpha)
out = isPnet ? out : tf.maxPool(out, [3, 3], [2, 2], 'valid') out = isPnet ? out : tf.maxPool(out, [3, 3], [2, 2], 'valid')
out = convLayer(out, params.conv3, 'valid') out = TfjsImageRecognitionBase.convLayer(out, params.conv3, 'valid')
out = prelu<tf.Tensor4D>(out, params.prelu3_alpha) out = prelu<tf.Tensor4D>(out, params.prelu3_alpha)
return out return out
......
import * as tf from '@tensorflow/tfjs-core'; import * as tf from '@tensorflow/tfjs-core';
import { ConvParams, FCParams } from 'tfjs-tiny-yolov2'; import { TfjsImageRecognitionBase } from 'tfjs-image-recognition-base';
import { FaceLandmarks5 } from '../classes/FaceLandmarks5'; import { FaceLandmarks5 } from '../classes/FaceLandmarks5';
import { WithFaceDetection, WithFaceLandmarks } from '../factories'; import { WithFaceDetection, WithFaceLandmarks } from '../factories';
export type SharedParams = { export type SharedParams = {
conv1: ConvParams conv1: TfjsImageRecognitionBase.ConvParams
prelu1_alpha: tf.Tensor1D prelu1_alpha: tf.Tensor1D
conv2: ConvParams conv2: TfjsImageRecognitionBase.ConvParams
prelu2_alpha: tf.Tensor1D prelu2_alpha: tf.Tensor1D
conv3: ConvParams conv3: TfjsImageRecognitionBase.ConvParams
prelu3_alpha: tf.Tensor1D prelu3_alpha: tf.Tensor1D
} }
export type PNetParams = SharedParams & { export type PNetParams = SharedParams & {
conv4_1: ConvParams conv4_1: TfjsImageRecognitionBase.ConvParams
conv4_2: ConvParams conv4_2: TfjsImageRecognitionBase.ConvParams
} }
export type RNetParams = SharedParams & { export type RNetParams = SharedParams & {
fc1: FCParams fc1: TfjsImageRecognitionBase.FCParams
prelu4_alpha: tf.Tensor1D prelu4_alpha: tf.Tensor1D
fc2_1: FCParams fc2_1: TfjsImageRecognitionBase.FCParams
fc2_2: FCParams fc2_2: TfjsImageRecognitionBase.FCParams
} }
export type ONetParams = SharedParams & { export type ONetParams = SharedParams & {
conv4: ConvParams conv4: TfjsImageRecognitionBase.ConvParams
prelu4_alpha: tf.Tensor1D prelu4_alpha: tf.Tensor1D
fc1: FCParams fc1: TfjsImageRecognitionBase.FCParams
prelu5_alpha: tf.Tensor1D prelu5_alpha: tf.Tensor1D
fc2_1: FCParams fc2_1: TfjsImageRecognitionBase.FCParams
fc2_2: FCParams fc2_2: TfjsImageRecognitionBase.FCParams
fc2_3: FCParams fc2_3: TfjsImageRecognitionBase.FCParams
} }
export type NetParams = { export type NetParams = {
......
import * as tf from '@tensorflow/tfjs-core'; import * as tf from '@tensorflow/tfjs-core';
import { convLayer } from 'tfjs-tiny-yolov2'; import { TfjsImageRecognitionBase } from 'tfjs-image-recognition-base';
import { BoxPredictionParams } from './types'; import { BoxPredictionParams } from './types';
...@@ -13,11 +13,11 @@ export function boxPredictionLayer( ...@@ -13,11 +13,11 @@ export function boxPredictionLayer(
const batchSize = x.shape[0] const batchSize = x.shape[0]
const boxPredictionEncoding = tf.reshape( const boxPredictionEncoding = tf.reshape(
convLayer(x, params.box_encoding_predictor), TfjsImageRecognitionBase.convLayer(x, params.box_encoding_predictor),
[batchSize, -1, 1, 4] [batchSize, -1, 1, 4]
) )
const classPrediction = tf.reshape( const classPrediction = tf.reshape(
convLayer(x, params.class_predictor), TfjsImageRecognitionBase.convLayer(x, params.class_predictor),
[batchSize, -1, 3] [batchSize, -1, 3]
) )
......
import * as tf from '@tensorflow/tfjs-core'; import * as tf from '@tensorflow/tfjs-core';
import { extractWeightsFactory, ExtractWeightsFunction, ParamMapping } from 'tfjs-image-recognition-base'; import { TfjsImageRecognitionBase } from 'tfjs-image-recognition-base';
import { ConvParams } from 'tfjs-tiny-yolov2';
import { MobileNetV1, NetParams, PointwiseConvParams, PredictionLayerParams } from './types'; import { MobileNetV1, NetParams, PointwiseConvParams, PredictionLayerParams } from './types';
function extractorsFactory(extractWeights: ExtractWeightsFunction, paramMappings: ParamMapping[]) { function extractorsFactory(extractWeights: TfjsImageRecognitionBase.ExtractWeightsFunction, paramMappings: TfjsImageRecognitionBase.ParamMapping[]) {
function extractDepthwiseConvParams(numChannels: number, mappedPrefix: string): MobileNetV1.DepthwiseConvParams { function extractDepthwiseConvParams(numChannels: number, mappedPrefix: string): MobileNetV1.DepthwiseConvParams {
...@@ -37,7 +36,7 @@ function extractorsFactory(extractWeights: ExtractWeightsFunction, paramMappings ...@@ -37,7 +36,7 @@ function extractorsFactory(extractWeights: ExtractWeightsFunction, paramMappings
filterSize: number, filterSize: number,
mappedPrefix: string, mappedPrefix: string,
isPointwiseConv?: boolean isPointwiseConv?: boolean
): ConvParams { ): TfjsImageRecognitionBase.ConvParams {
const filters = tf.tensor4d( const filters = tf.tensor4d(
extractWeights(channelsIn * channelsOut * filterSize * filterSize), extractWeights(channelsIn * channelsOut * filterSize * filterSize),
...@@ -192,14 +191,14 @@ function extractorsFactory(extractWeights: ExtractWeightsFunction, paramMappings ...@@ -192,14 +191,14 @@ function extractorsFactory(extractWeights: ExtractWeightsFunction, paramMappings
} }
export function extractParams(weights: Float32Array): { params: NetParams, paramMappings: ParamMapping[] } { export function extractParams(weights: Float32Array): { params: NetParams, paramMappings: TfjsImageRecognitionBase.ParamMapping[] } {
const paramMappings: ParamMapping[] = [] const paramMappings: TfjsImageRecognitionBase.ParamMapping[] = []
const { const {
extractWeights, extractWeights,
getRemainingWeights getRemainingWeights
} = extractWeightsFactory(weights) } = TfjsImageRecognitionBase.extractWeightsFactory(weights)
const { const {
extractMobilenetV1Params, extractMobilenetV1Params,
......
import * as tf from '@tensorflow/tfjs-core'; import * as tf from '@tensorflow/tfjs-core';
import { import { isTensor3D, TfjsImageRecognitionBase } from 'tfjs-image-recognition-base';
disposeUnusedWeightTensors,
extractWeightEntryFactory,
isTensor3D,
ParamMapping,
} from 'tfjs-image-recognition-base';
import { ConvParams } from 'tfjs-tiny-yolov2';
import { BoxPredictionParams, MobileNetV1, NetParams, PointwiseConvParams, PredictionLayerParams } from './types'; import { BoxPredictionParams, MobileNetV1, NetParams, PointwiseConvParams, PredictionLayerParams } from './types';
function extractorsFactory(weightMap: any, paramMappings: ParamMapping[]) { function extractorsFactory(weightMap: any, paramMappings: TfjsImageRecognitionBase.ParamMapping[]) {
const extractWeightEntry = extractWeightEntryFactory(weightMap, paramMappings) const extractWeightEntry = TfjsImageRecognitionBase.extractWeightEntryFactory(weightMap, paramMappings)
function extractPointwiseConvParams(prefix: string, idx: number, mappedPrefix: string): PointwiseConvParams { function extractPointwiseConvParams(prefix: string, idx: number, mappedPrefix: string): PointwiseConvParams {
...@@ -65,7 +59,7 @@ function extractorsFactory(weightMap: any, paramMappings: ParamMapping[]) { ...@@ -65,7 +59,7 @@ function extractorsFactory(weightMap: any, paramMappings: ParamMapping[]) {
} }
} }
function extractConvParams(prefix: string, mappedPrefix: string): ConvParams { function extractConvParams(prefix: string, mappedPrefix: string): TfjsImageRecognitionBase.ConvParams {
const filters = extractWeightEntry<tf.Tensor4D>(`${prefix}/weights`, 4, `${mappedPrefix}/filters`) const filters = extractWeightEntry<tf.Tensor4D>(`${prefix}/weights`, 4, `${mappedPrefix}/filters`)
const bias = extractWeightEntry<tf.Tensor1D>(`${prefix}/biases`, 1, `${mappedPrefix}/bias`) const bias = extractWeightEntry<tf.Tensor1D>(`${prefix}/biases`, 1, `${mappedPrefix}/bias`)
...@@ -113,9 +107,9 @@ function extractorsFactory(weightMap: any, paramMappings: ParamMapping[]) { ...@@ -113,9 +107,9 @@ function extractorsFactory(weightMap: any, paramMappings: ParamMapping[]) {
export function extractParamsFromWeigthMap( export function extractParamsFromWeigthMap(
weightMap: tf.NamedTensorMap weightMap: tf.NamedTensorMap
): { params: NetParams, paramMappings: ParamMapping[] } { ): { params: NetParams, paramMappings: TfjsImageRecognitionBase.ParamMapping[] } {
const paramMappings: ParamMapping[] = [] const paramMappings: TfjsImageRecognitionBase.ParamMapping[] = []
const { const {
extractMobilenetV1Params, extractMobilenetV1Params,
...@@ -137,7 +131,7 @@ export function extractParamsFromWeigthMap( ...@@ -137,7 +131,7 @@ export function extractParamsFromWeigthMap(
} }
} }
disposeUnusedWeightTensors(weightMap, paramMappings) TfjsImageRecognitionBase.disposeUnusedWeightTensors(weightMap, paramMappings)
return { params, paramMappings } return { params, paramMappings }
} }
\ No newline at end of file
...@@ -70,7 +70,7 @@ export function outputLayer( ...@@ -70,7 +70,7 @@ export function outputLayer(
scores = tf.reshape( scores = tf.reshape(
scores, scores,
[batchSize, scores.shape[1]] [batchSize, scores.shape[1] as number]
) )
const boxesByBatch = tf.unstack(boxes) as tf.Tensor2D[] const boxesByBatch = tf.unstack(boxes) as tf.Tensor2D[]
......
import * as tf from '@tensorflow/tfjs-core'; import * as tf from '@tensorflow/tfjs-core';
import { ConvParams } from 'tfjs-tiny-yolov2'; import { TfjsImageRecognitionBase } from 'tfjs-image-recognition-base';
export type PointwiseConvParams = { export type PointwiseConvParams = {
filters: tf.Tensor4D filters: tf.Tensor4D
...@@ -41,8 +41,8 @@ export namespace MobileNetV1 { ...@@ -41,8 +41,8 @@ export namespace MobileNetV1 {
} }
export type BoxPredictionParams = { export type BoxPredictionParams = {
box_encoding_predictor: ConvParams box_encoding_predictor: TfjsImageRecognitionBase.ConvParams
class_predictor: ConvParams class_predictor: TfjsImageRecognitionBase.ConvParams
} }
export type PredictionLayerParams = { export type PredictionLayerParams = {
......
import * as tf from '@tensorflow/tfjs-core'; import * as tf from '@tensorflow/tfjs-core';
import { ParamMapping, Point, TNetInput } from 'tfjs-image-recognition-base'; import { Point, TfjsImageRecognitionBase, TNetInput } from 'tfjs-image-recognition-base';
import { ITinyYolov2Options, TinyYolov2 as TinyYolov2Base } from 'tfjs-tiny-yolov2';
import { TinyYolov2NetParams } from 'tfjs-tiny-yolov2/build/commonjs/tinyYolov2/types';
import { FaceDetection } from '../classes'; import { FaceDetection } from '../classes';
import { BOX_ANCHORS, IOU_THRESHOLD, MEAN_RGB } from './const'; import { BOX_ANCHORS, IOU_THRESHOLD, MEAN_RGB } from './const';
export class TinyFaceDetector extends TinyYolov2Base { export class TinyFaceDetector extends TfjsImageRecognitionBase.TinyYolov2 {
constructor() { constructor() {
const config = { const config = {
...@@ -26,7 +24,7 @@ export class TinyFaceDetector extends TinyYolov2Base { ...@@ -26,7 +24,7 @@ export class TinyFaceDetector extends TinyYolov2Base {
return this.config.anchors return this.config.anchors
} }
public async locateFaces(input: TNetInput, forwardParams: ITinyYolov2Options): Promise<FaceDetection[]> { public async locateFaces(input: TNetInput, forwardParams: TfjsImageRecognitionBase.ITinyYolov2Options): Promise<FaceDetection[]> {
const objectDetections = await this.detect(input, forwardParams) const objectDetections = await this.detect(input, forwardParams)
return objectDetections.map(det => new FaceDetection(det.score, det.relativeBox, { width: det.imageWidth, height: det.imageHeight })) return objectDetections.map(det => new FaceDetection(det.score, det.relativeBox, { width: det.imageWidth, height: det.imageHeight }))
} }
...@@ -35,7 +33,7 @@ export class TinyFaceDetector extends TinyYolov2Base { ...@@ -35,7 +33,7 @@ export class TinyFaceDetector extends TinyYolov2Base {
return 'tiny_face_detector_model' return 'tiny_face_detector_model'
} }
protected extractParamsFromWeigthMap(weightMap: tf.NamedTensorMap): { params: TinyYolov2NetParams, paramMappings: ParamMapping[] } { protected extractParamsFromWeigthMap(weightMap: tf.NamedTensorMap): { params: TfjsImageRecognitionBase.TinyYolov2NetParams, paramMappings: TfjsImageRecognitionBase.ParamMapping[] } {
return super.extractParamsFromWeigthMap(weightMap) return super.extractParamsFromWeigthMap(weightMap)
} }
} }
\ No newline at end of file
import { ITinyYolov2Options, TinyYolov2Options } from 'tfjs-tiny-yolov2'; import { TfjsImageRecognitionBase } from 'tfjs-image-recognition-base';
export interface ITinyFaceDetectorOptions extends ITinyYolov2Options {} export interface ITinyFaceDetectorOptions extends TfjsImageRecognitionBase.ITinyYolov2Options {}
export class TinyFaceDetectorOptions extends TinyYolov2Options { export class TinyFaceDetectorOptions extends TfjsImageRecognitionBase.TinyYolov2Options {
protected _name: string = 'TinyFaceDetectorOptions' protected _name: string = 'TinyFaceDetectorOptions'
} }
\ No newline at end of file
import * as tf from '@tensorflow/tfjs-core'; import * as tf from '@tensorflow/tfjs-core';
import { ParamMapping, Point, TNetInput } from 'tfjs-image-recognition-base'; import { Point, TfjsImageRecognitionBase, TNetInput } from 'tfjs-image-recognition-base';
import { ITinyYolov2Options, TinyYolov2 as TinyYolov2Base, TinyYolov2NetParams } from 'tfjs-tiny-yolov2';
import { FaceDetection } from '../classes'; import { FaceDetection } from '../classes';
import { import {
...@@ -12,7 +11,7 @@ import { ...@@ -12,7 +11,7 @@ import {
MEAN_RGB_SEPARABLE, MEAN_RGB_SEPARABLE,
} from './const'; } from './const';
export class TinyYolov2 extends TinyYolov2Base { export class TinyYolov2 extends TfjsImageRecognitionBase.TinyYolov2 {
constructor(withSeparableConvs: boolean = true) { constructor(withSeparableConvs: boolean = true) {
const config = Object.assign({}, { const config = Object.assign({}, {
...@@ -42,7 +41,7 @@ export class TinyYolov2 extends TinyYolov2Base { ...@@ -42,7 +41,7 @@ export class TinyYolov2 extends TinyYolov2Base {
return this.config.anchors return this.config.anchors
} }
public async locateFaces(input: TNetInput, forwardParams: ITinyYolov2Options): Promise<FaceDetection[]> { public async locateFaces(input: TNetInput, forwardParams: TfjsImageRecognitionBase.ITinyYolov2Options): Promise<FaceDetection[]> {
const objectDetections = await this.detect(input, forwardParams) const objectDetections = await this.detect(input, forwardParams)
return objectDetections.map(det => new FaceDetection(det.score, det.relativeBox, { width: det.imageWidth, height: det.imageHeight })) return objectDetections.map(det => new FaceDetection(det.score, det.relativeBox, { width: det.imageWidth, height: det.imageHeight }))
} }
...@@ -51,7 +50,7 @@ export class TinyYolov2 extends TinyYolov2Base { ...@@ -51,7 +50,7 @@ export class TinyYolov2 extends TinyYolov2Base {
return this.withSeparableConvs ? DEFAULT_MODEL_NAME_SEPARABLE_CONV : DEFAULT_MODEL_NAME return this.withSeparableConvs ? DEFAULT_MODEL_NAME_SEPARABLE_CONV : DEFAULT_MODEL_NAME
} }
protected extractParamsFromWeigthMap(weightMap: tf.NamedTensorMap): { params: TinyYolov2NetParams, paramMappings: ParamMapping[] } { protected extractParamsFromWeigthMap(weightMap: tf.NamedTensorMap): { params: TfjsImageRecognitionBase.TinyYolov2NetParams, paramMappings: TfjsImageRecognitionBase.ParamMapping[] } {
return super.extractParamsFromWeigthMap(weightMap) return super.extractParamsFromWeigthMap(weightMap)
} }
} }
\ No newline at end of file
import { TinyYolov2 } from './TinyYolov2'; import { TinyYolov2 } from './TinyYolov2';
export * from './TinyYolov2'; export { TinyYolov2 }
export function createTinyYolov2(weights: Float32Array, withSeparableConvs: boolean = true) { export function createTinyYolov2(weights: Float32Array, withSeparableConvs: boolean = true) {
const net = new TinyYolov2(withSeparableConvs) const net = new TinyYolov2(withSeparableConvs)
......
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