Commit bbc0785a by vincent

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

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