Commit 9af582a7 by vincent

use env wrapper for browser related code

parent 3ed6b109
import { getContext2dOrThrow, getDefaultDrawOptions, resolveInput } from 'tfjs-image-recognition-base'; import { env, getContext2dOrThrow, getDefaultDrawOptions, resolveInput } from 'tfjs-image-recognition-base';
import { FaceLandmarks } from '../classes/FaceLandmarks'; import { FaceLandmarks } from '../classes/FaceLandmarks';
import { FaceLandmarks68 } from '../classes/FaceLandmarks68'; import { FaceLandmarks68 } from '../classes/FaceLandmarks68';
...@@ -11,7 +11,7 @@ export function drawLandmarks( ...@@ -11,7 +11,7 @@ export function drawLandmarks(
options?: DrawLandmarksOptions options?: DrawLandmarksOptions
) { ) {
const canvas = resolveInput(canvasArg) const canvas = resolveInput(canvasArg)
if (!(canvas instanceof HTMLCanvasElement)) { if (!(canvas instanceof env.getEnv().Canvas)) {
throw new Error('drawLandmarks - expected canvas to be of type: HTMLCanvasElement') throw new Error('drawLandmarks - expected canvas to be of type: HTMLCanvasElement')
} }
......
...@@ -8,6 +8,7 @@ import { ...@@ -8,6 +8,7 @@ import {
} from 'tfjs-image-recognition-base'; } from 'tfjs-image-recognition-base';
import { FaceDetection } from '../classes/FaceDetection'; import { FaceDetection } from '../classes/FaceDetection';
import { env } from 'tfjs-image-recognition-base';
/** /**
* Extracts the image regions containing the detected faces. * Extracts the image regions containing the detected faces.
...@@ -21,9 +22,11 @@ export async function extractFaces( ...@@ -21,9 +22,11 @@ export async function extractFaces(
detections: Array<FaceDetection | Rect> detections: Array<FaceDetection | Rect>
): Promise<HTMLCanvasElement[]> { ): Promise<HTMLCanvasElement[]> {
const { Canvas } = env.getEnv()
let canvas = input as HTMLCanvasElement let canvas = input as HTMLCanvasElement
if (!(input instanceof HTMLCanvasElement)) { if (!(input instanceof Canvas)) {
const netInput = await toNetInput(input) const netInput = await toNetInput(input)
if (netInput.batchSize > 1) { if (netInput.batchSize > 1) {
...@@ -31,7 +34,7 @@ export async function extractFaces( ...@@ -31,7 +34,7 @@ export async function extractFaces(
} }
const tensorOrCanvas = netInput.getInput(0) const tensorOrCanvas = netInput.getInput(0)
canvas = tensorOrCanvas instanceof HTMLCanvasElement canvas = tensorOrCanvas instanceof Canvas
? tensorOrCanvas ? tensorOrCanvas
: await imageTensorToCanvas(tensorOrCanvas) : await imageTensorToCanvas(tensorOrCanvas)
} }
......
...@@ -4,9 +4,9 @@ import { ConvParams, SeparableConvParams } from 'tfjs-tiny-yolov2'; ...@@ -4,9 +4,9 @@ import { ConvParams, SeparableConvParams } from 'tfjs-tiny-yolov2';
import { depthwiseSeparableConv } from './depthwiseSeparableConv'; import { depthwiseSeparableConv } from './depthwiseSeparableConv';
import { extractParams } from './extractParams'; import { extractParams } from './extractParams';
import { extractParamsFromWeigthMap } from './extractParamsFromWeigthMap';
import { FaceLandmark68NetBase } from './FaceLandmark68NetBase'; import { FaceLandmark68NetBase } from './FaceLandmark68NetBase';
import { fullyConnectedLayer } from './fullyConnectedLayer'; import { fullyConnectedLayer } from './fullyConnectedLayer';
import { loadQuantizedParams } from './loadQuantizedParams';
import { DenseBlock4Params, NetParams } from './types'; import { DenseBlock4Params, NetParams } from './types';
function denseBlock( function denseBlock(
...@@ -64,10 +64,13 @@ export class FaceLandmark68Net extends FaceLandmark68NetBase<NetParams> { ...@@ -64,10 +64,13 @@ export class FaceLandmark68Net extends FaceLandmark68NetBase<NetParams> {
}) })
} }
protected loadQuantizedParams(uri: string | undefined) { protected getDefaultModelName(): string {
return loadQuantizedParams(uri) return 'face_landmark_68_model'
} }
protected extractParamsFromWeigthMap(weightMap: tf.NamedTensorMap) {
return extractParamsFromWeigthMap(weightMap)
}
protected extractParams(weights: Float32Array) { protected extractParams(weights: Float32Array) {
return extractParams(weights) return extractParams(weights)
......
...@@ -3,7 +3,7 @@ import { IDimensions, isEven, NetInput, NeuralNetwork, Point, TNetInput, toNetIn ...@@ -3,7 +3,7 @@ import { IDimensions, isEven, NetInput, NeuralNetwork, Point, TNetInput, toNetIn
import { FaceLandmarks68 } from '../classes/FaceLandmarks68'; import { FaceLandmarks68 } from '../classes/FaceLandmarks68';
export class FaceLandmark68NetBase<NetParams> extends NeuralNetwork<NetParams> { export abstract class FaceLandmark68NetBase<NetParams> extends NeuralNetwork<NetParams> {
// TODO: make super.name protected // TODO: make super.name protected
private __name: string private __name: string
...@@ -13,9 +13,7 @@ export class FaceLandmark68NetBase<NetParams> extends NeuralNetwork<NetParams> { ...@@ -13,9 +13,7 @@ export class FaceLandmark68NetBase<NetParams> extends NeuralNetwork<NetParams> {
this.__name = _name this.__name = _name
} }
public runNet(_: NetInput): tf.Tensor2D { public abstract runNet(netInput: NetInput): tf.Tensor2D
throw new Error(`${this.__name} - runNet not implemented`)
}
public postProcess(output: tf.Tensor2D, inputSize: number, originalDimensions: IDimensions[]): tf.Tensor2D { public postProcess(output: tf.Tensor2D, inputSize: number, originalDimensions: IDimensions[]): tf.Tensor2D {
......
...@@ -6,7 +6,7 @@ import { depthwiseSeparableConv } from './depthwiseSeparableConv'; ...@@ -6,7 +6,7 @@ import { depthwiseSeparableConv } from './depthwiseSeparableConv';
import { extractParamsTiny } from './extractParamsTiny'; import { extractParamsTiny } from './extractParamsTiny';
import { FaceLandmark68NetBase } from './FaceLandmark68NetBase'; import { FaceLandmark68NetBase } from './FaceLandmark68NetBase';
import { fullyConnectedLayer } from './fullyConnectedLayer'; import { fullyConnectedLayer } from './fullyConnectedLayer';
import { loadQuantizedParamsTiny } from './loadQuantizedParamsTiny'; import { extractParamsFromWeigthMapTiny } from './extractParamsFromWeigthMapTiny';
import { DenseBlock3Params, TinyNetParams } from './types'; import { DenseBlock3Params, TinyNetParams } from './types';
function denseBlock( function denseBlock(
...@@ -60,8 +60,12 @@ export class FaceLandmark68TinyNet extends FaceLandmark68NetBase<TinyNetParams> ...@@ -60,8 +60,12 @@ export class FaceLandmark68TinyNet extends FaceLandmark68NetBase<TinyNetParams>
}) })
} }
protected loadQuantizedParams(uri: string | undefined) { protected getDefaultModelName(): string {
return loadQuantizedParamsTiny(uri) return 'face_landmark_68_tiny_model'
}
protected extractParamsFromWeigthMap(weightMap: tf.NamedTensorMap) {
return extractParamsFromWeigthMapTiny(weightMap)
} }
protected extractParams(weights: Float32Array) { protected extractParams(weights: Float32Array) {
......
import { disposeUnusedWeightTensors, loadWeightMap, ParamMapping } from 'tfjs-image-recognition-base'; import * as tf from '@tensorflow/tfjs-core';
import { disposeUnusedWeightTensors, ParamMapping } from 'tfjs-image-recognition-base';
import { loadParamsFactory } from './loadParamsFactory'; import { loadParamsFactory } from './loadParamsFactory';
import { NetParams } from './types'; import { NetParams } from './types';
const DEFAULT_MODEL_NAME = 'face_landmark_68_model' export function extractParamsFromWeigthMap(
weightMap: tf.NamedTensorMap
): { params: NetParams, paramMappings: ParamMapping[] } {
export async function loadQuantizedParams(
uri: string | undefined
): Promise<{ params: NetParams, paramMappings: ParamMapping[] }> {
const weightMap = await loadWeightMap(uri, DEFAULT_MODEL_NAME)
const paramMappings: ParamMapping[] = [] const paramMappings: ParamMapping[] = []
const { const {
......
import { disposeUnusedWeightTensors, loadWeightMap, ParamMapping } from 'tfjs-image-recognition-base'; import * as tf from '@tensorflow/tfjs-core';
import { disposeUnusedWeightTensors, ParamMapping } from 'tfjs-image-recognition-base';
import { loadParamsFactory } from './loadParamsFactory'; import { loadParamsFactory } from './loadParamsFactory';
import { TinyNetParams } from './types'; import { TinyNetParams } from './types';
const DEFAULT_MODEL_NAME = 'face_landmark_68_tiny_model' export function extractParamsFromWeigthMapTiny(
weightMap: tf.NamedTensorMap
): { params: TinyNetParams, paramMappings: ParamMapping[] } {
export async function loadQuantizedParamsTiny(
uri: string | undefined
): Promise<{ params: TinyNetParams, paramMappings: ParamMapping[] }> {
const weightMap = await loadWeightMap(uri, DEFAULT_MODEL_NAME)
const paramMappings: ParamMapping[] = [] const paramMappings: ParamMapping[] = []
const { const {
......
...@@ -3,7 +3,7 @@ import { NetInput, NeuralNetwork, normalize, TNetInput, toNetInput } from 'tfjs- ...@@ -3,7 +3,7 @@ import { NetInput, NeuralNetwork, normalize, TNetInput, toNetInput } from 'tfjs-
import { convDown } from './convLayer'; import { convDown } from './convLayer';
import { extractParams } from './extractParams'; import { extractParams } from './extractParams';
import { loadQuantizedParams } from './loadQuantizedParams'; import { extractParamsFromWeigthMap } from './extractParamsFromWeigthMap';
import { residual, residualDown } from './residualLayer'; import { residual, residualDown } from './residualLayer';
import { NetParams } from './types'; import { NetParams } from './types';
...@@ -78,8 +78,12 @@ export class FaceRecognitionNet extends NeuralNetwork<NetParams> { ...@@ -78,8 +78,12 @@ export class FaceRecognitionNet extends NeuralNetwork<NetParams> {
: faceDescriptorsForBatch[0] : faceDescriptorsForBatch[0]
} }
protected loadQuantizedParams(uri: string | undefined) { protected getDefaultModelName(): string {
return loadQuantizedParams(uri) return 'face_recognition_model'
}
protected extractParamsFromWeigthMap(weightMap: tf.NamedTensorMap) {
return extractParamsFromWeigthMap(weightMap)
} }
protected extractParams(weights: Float32Array) { protected extractParams(weights: Float32Array) {
......
...@@ -9,8 +9,6 @@ import { ...@@ -9,8 +9,6 @@ import {
import { ConvLayerParams, NetParams, ResidualLayerParams, ScaleLayerParams } from './types'; import { ConvLayerParams, NetParams, ResidualLayerParams, ScaleLayerParams } from './types';
const DEFAULT_MODEL_NAME = 'face_recognition_model'
function extractorsFactory(weightMap: any, paramMappings: ParamMapping[]) { function extractorsFactory(weightMap: any, paramMappings: ParamMapping[]) {
const extractWeightEntry = extractWeightEntryFactory(weightMap, paramMappings) const extractWeightEntry = extractWeightEntryFactory(weightMap, paramMappings)
...@@ -46,11 +44,10 @@ function extractorsFactory(weightMap: any, paramMappings: ParamMapping[]) { ...@@ -46,11 +44,10 @@ function extractorsFactory(weightMap: any, paramMappings: ParamMapping[]) {
} }
export async function loadQuantizedParams( export function extractParamsFromWeigthMap(
uri: string | undefined weightMap: tf.NamedTensorMap
): Promise<{ params: NetParams, paramMappings: ParamMapping[] }> { ): { params: NetParams, paramMappings: ParamMapping[] } {
const weightMap = await loadWeightMap(uri, DEFAULT_MODEL_NAME)
const paramMappings: ParamMapping[] = [] const paramMappings: ParamMapping[] = []
const { const {
......
...@@ -7,8 +7,8 @@ import { FaceLandmarks5 } from '../classes/FaceLandmarks5'; ...@@ -7,8 +7,8 @@ import { FaceLandmarks5 } from '../classes/FaceLandmarks5';
import { bgrToRgbTensor } from './bgrToRgbTensor'; import { bgrToRgbTensor } from './bgrToRgbTensor';
import { CELL_SIZE } from './config'; import { CELL_SIZE } from './config';
import { extractParams } from './extractParams'; import { extractParams } from './extractParams';
import { extractParamsFromWeigthMap } from './extractParamsFromWeigthMap';
import { getSizesForScale } from './getSizesForScale'; import { getSizesForScale } from './getSizesForScale';
import { loadQuantizedParams } from './loadQuantizedParams';
import { IMtcnnOptions, MtcnnOptions } from './MtcnnOptions'; import { IMtcnnOptions, MtcnnOptions } from './MtcnnOptions';
import { pyramidDown } from './pyramidDown'; import { pyramidDown } from './pyramidDown';
import { stage1 } from './stage1'; import { stage1 } from './stage1';
...@@ -146,9 +146,12 @@ export class Mtcnn extends NeuralNetwork<NetParams> { ...@@ -146,9 +146,12 @@ export class Mtcnn extends NeuralNetwork<NetParams> {
) )
} }
// none of the param tensors are quantized yet protected getDefaultModelName(): string {
protected loadQuantizedParams(uri: string | undefined) { return 'mtcnn_model'
return loadQuantizedParams(uri) }
protected extractParamsFromWeigthMap(weightMap: tf.NamedTensorMap) {
return extractParamsFromWeigthMap(weightMap)
} }
protected extractParams(weights: Float32Array) { protected extractParams(weights: Float32Array) {
......
import * as tf from '@tensorflow/tfjs-core'; import * as tf from '@tensorflow/tfjs-core';
import { import { disposeUnusedWeightTensors, extractWeightEntryFactory, ParamMapping } from 'tfjs-image-recognition-base';
disposeUnusedWeightTensors,
extractWeightEntryFactory,
loadWeightMap,
ParamMapping,
} from 'tfjs-image-recognition-base';
import { ConvParams, FCParams } from 'tfjs-tiny-yolov2'; import { ConvParams, FCParams } from 'tfjs-tiny-yolov2';
import { NetParams, ONetParams, PNetParams, RNetParams, SharedParams } from './types'; import { NetParams, ONetParams, PNetParams, RNetParams, SharedParams } from './types';
const DEFAULT_MODEL_NAME = 'mtcnn_model'
function extractorsFactory(weightMap: any, paramMappings: ParamMapping[]) { function extractorsFactory(weightMap: any, paramMappings: ParamMapping[]) {
const extractWeightEntry = extractWeightEntryFactory(weightMap, paramMappings) const extractWeightEntry = extractWeightEntryFactory(weightMap, paramMappings)
...@@ -87,11 +80,10 @@ function extractorsFactory(weightMap: any, paramMappings: ParamMapping[]) { ...@@ -87,11 +80,10 @@ function extractorsFactory(weightMap: any, paramMappings: ParamMapping[]) {
} }
export async function loadQuantizedParams( export function extractParamsFromWeigthMap(
uri: string | undefined weightMap: tf.NamedTensorMap
): Promise<{ params: NetParams, paramMappings: ParamMapping[] }> { ): { params: NetParams, paramMappings: ParamMapping[] } {
const weightMap = await loadWeightMap(uri, DEFAULT_MODEL_NAME)
const paramMappings: ParamMapping[] = [] const paramMappings: ParamMapping[] = []
const { const {
......
...@@ -3,7 +3,7 @@ import { NetInput, NeuralNetwork, Rect, TNetInput, toNetInput } from 'tfjs-image ...@@ -3,7 +3,7 @@ import { NetInput, NeuralNetwork, Rect, TNetInput, toNetInput } from 'tfjs-image
import { FaceDetection } from '../classes/FaceDetection'; import { FaceDetection } from '../classes/FaceDetection';
import { extractParams } from './extractParams'; import { extractParams } from './extractParams';
import { loadQuantizedParams } from './loadQuantizedParams'; import { extractParamsFromWeigthMap } from './extractParamsFromWeigthMap';
import { mobileNetV1 } from './mobileNetV1'; import { mobileNetV1 } from './mobileNetV1';
import { nonMaxSuppression } from './nonMaxSuppression'; import { nonMaxSuppression } from './nonMaxSuppression';
import { outputLayer } from './outputLayer'; import { outputLayer } from './outputLayer';
...@@ -116,8 +116,12 @@ export class SsdMobilenetv1 extends NeuralNetwork<NetParams> { ...@@ -116,8 +116,12 @@ export class SsdMobilenetv1 extends NeuralNetwork<NetParams> {
return results return results
} }
protected loadQuantizedParams(uri: string | undefined) { protected getDefaultModelName(): string {
return loadQuantizedParams(uri) return 'ssd_mobilenetv1_model'
}
protected extractParamsFromWeigthMap(weightMap: tf.NamedTensorMap) {
return extractParamsFromWeigthMap(weightMap)
} }
protected extractParams(weights: Float32Array) { protected extractParams(weights: Float32Array) {
......
...@@ -3,15 +3,12 @@ import { ...@@ -3,15 +3,12 @@ import {
disposeUnusedWeightTensors, disposeUnusedWeightTensors,
extractWeightEntryFactory, extractWeightEntryFactory,
isTensor3D, isTensor3D,
loadWeightMap,
ParamMapping, ParamMapping,
} from 'tfjs-image-recognition-base'; } from 'tfjs-image-recognition-base';
import { ConvParams } from 'tfjs-tiny-yolov2'; import { ConvParams } from 'tfjs-tiny-yolov2';
import { BoxPredictionParams, MobileNetV1, NetParams, PointwiseConvParams, PredictionLayerParams } from './types'; import { BoxPredictionParams, MobileNetV1, NetParams, PointwiseConvParams, PredictionLayerParams } from './types';
const DEFAULT_MODEL_NAME = 'ssd_mobilenetv1_model'
function extractorsFactory(weightMap: any, paramMappings: ParamMapping[]) { function extractorsFactory(weightMap: any, paramMappings: ParamMapping[]) {
const extractWeightEntry = extractWeightEntryFactory(weightMap, paramMappings) const extractWeightEntry = extractWeightEntryFactory(weightMap, paramMappings)
...@@ -114,11 +111,10 @@ function extractorsFactory(weightMap: any, paramMappings: ParamMapping[]) { ...@@ -114,11 +111,10 @@ function extractorsFactory(weightMap: any, paramMappings: ParamMapping[]) {
} }
} }
export async function loadQuantizedParams( export function extractParamsFromWeigthMap(
uri: string | undefined weightMap: tf.NamedTensorMap
): Promise<{ params: NetParams, paramMappings: ParamMapping[] }> { ): { params: NetParams, paramMappings: ParamMapping[] } {
const weightMap = await loadWeightMap(uri, DEFAULT_MODEL_NAME)
const paramMappings: ParamMapping[] = [] const paramMappings: ParamMapping[] = []
const { const {
......
import { Point, TNetInput } from 'tfjs-image-recognition-base'; import * as tf from '@tensorflow/tfjs-core';
import { TinyYolov2 as TinyYolov2Base, ITinyYolov2Options } from 'tfjs-tiny-yolov2'; 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 { FaceDetection } from '../classes'; import { FaceDetection } from '../classes';
import { BOX_ANCHORS, DEFAULT_MODEL_NAME, IOU_THRESHOLD, MEAN_RGB } from './const'; import { BOX_ANCHORS, IOU_THRESHOLD, MEAN_RGB } from './const';
export class TinyFaceDetector extends TinyYolov2Base { export class TinyFaceDetector extends TinyYolov2Base {
...@@ -29,8 +31,11 @@ export class TinyFaceDetector extends TinyYolov2Base { ...@@ -29,8 +31,11 @@ export class TinyFaceDetector extends TinyYolov2Base {
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 }))
} }
protected loadQuantizedParams(modelUri: string | undefined) { protected getDefaultModelName(): string {
const defaultModelName = DEFAULT_MODEL_NAME return 'tiny_face_detector_model'
return super.loadQuantizedParams(modelUri, defaultModelName) as any }
protected extractParamsFromWeigthMap(weightMap: tf.NamedTensorMap): { params: TinyYolov2NetParams, paramMappings: ParamMapping[] } {
return super.extractParamsFromWeigthMap(weightMap)
} }
} }
\ No newline at end of file
...@@ -10,6 +10,4 @@ export const BOX_ANCHORS = [ ...@@ -10,6 +10,4 @@ export const BOX_ANCHORS = [
new Point(9.041765, 10.66308) new Point(9.041765, 10.66308)
] ]
export const MEAN_RGB: [number, number, number] = [117.001, 114.697, 97.404] export const MEAN_RGB: [number, number, number] = [117.001, 114.697, 97.404]
\ No newline at end of file
export const DEFAULT_MODEL_NAME = 'tiny_face_detector_model'
\ No newline at end of file
import { Point, TNetInput } from 'tfjs-image-recognition-base'; import * as tf from '@tensorflow/tfjs-core';
import { ITinyYolov2Options, TinyYolov2 as TinyYolov2Base } from 'tfjs-tiny-yolov2'; import { ParamMapping, Point, 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 {
...@@ -46,8 +47,11 @@ export class TinyYolov2 extends TinyYolov2Base { ...@@ -46,8 +47,11 @@ export class TinyYolov2 extends TinyYolov2Base {
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 }))
} }
protected loadQuantizedParams(modelUri: string | undefined) { protected getDefaultModelName(): string {
const defaultModelName = this.withSeparableConvs ? DEFAULT_MODEL_NAME_SEPARABLE_CONV : DEFAULT_MODEL_NAME return this.withSeparableConvs ? DEFAULT_MODEL_NAME_SEPARABLE_CONV : DEFAULT_MODEL_NAME
return super.loadQuantizedParams(modelUri, defaultModelName) as any }
protected extractParamsFromWeigthMap(weightMap: tf.NamedTensorMap): { params: TinyYolov2NetParams, paramMappings: ParamMapping[] } {
return super.extractParamsFromWeigthMap(weightMap)
} }
} }
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment