update dependencies and stricter linting rules

pull/97/head 1.5.5
Vladimir Mandic 2021-10-19 08:04:24 -04:00
parent 461e074993
commit d78dd3aae1
99 changed files with 194 additions and 225 deletions

View File

@ -1,4 +1,4 @@
# packageJson #
Version: **undefined** Version: **undefined**
Description: **undefined** Description: **undefined**
@ -9,8 +9,13 @@
## Changelog ## Changelog
### **HEAD -> master** 2021/09/29 mandic00@live.com ### **1.5.5** 2021/10/19 mandic00@live.com
### **origin/master** 2021/09/30 mandic00@live.com
- allow backend change in demo via url params
- add node-match demo
- fix face matcher - fix face matcher
### **1.5.4** 2021/09/29 mandic00@live.com ### **1.5.4** 2021/09/29 mandic00@live.com

View File

@ -539,9 +539,8 @@ function normalize(x, meanRgb) {
function padToSquare(imgTensor, isCenterImage = false) { function padToSquare(imgTensor, isCenterImage = false) {
return tfjs_esm_exports.tidy(() => { return tfjs_esm_exports.tidy(() => {
const [height, width] = imgTensor.shape.slice(1); const [height, width] = imgTensor.shape.slice(1);
if (height === width) { if (height === width)
return imgTensor; return imgTensor;
}
const dimDiff = Math.abs(height - width); const dimDiff = Math.abs(height - width);
const paddingAmount = Math.round(dimDiff * (isCenterImage ? 0.5 : 1)); const paddingAmount = Math.round(dimDiff * (isCenterImage ? 0.5 : 1));
const paddingAxis = height > width ? 2 : 1; const paddingAxis = height > width ? 2 : 1;
@ -553,11 +552,7 @@ function padToSquare(imgTensor, isCenterImage = false) {
const paddingTensorAppend = createPaddingTensor(paddingAmount); const paddingTensorAppend = createPaddingTensor(paddingAmount);
const remainingPaddingAmount = dimDiff - paddingTensorAppend.shape[paddingAxis]; const remainingPaddingAmount = dimDiff - paddingTensorAppend.shape[paddingAxis];
const paddingTensorPrepend = isCenterImage && remainingPaddingAmount ? createPaddingTensor(remainingPaddingAmount) : null; const paddingTensorPrepend = isCenterImage && remainingPaddingAmount ? createPaddingTensor(remainingPaddingAmount) : null;
const tensorsToStack = [ const tensorsToStack = [paddingTensorPrepend, imgTensor, paddingTensorAppend].filter((t) => !!t).map((t) => tfjs_esm_exports.cast(t, "float32"));
paddingTensorPrepend,
imgTensor,
paddingTensorAppend
].filter((t) => !!t).map((t) => tfjs_esm_exports.cast(t, "float32"));
return tfjs_esm_exports.concat(tensorsToStack, paddingAxis); return tfjs_esm_exports.concat(tensorsToStack, paddingAxis);
}); });
} }
@ -2152,7 +2147,7 @@ function drawFaceLandmarks(canvasArg, faceLandmarks) {
} }
// package.json // package.json
var version10 = "1.5.4"; var version10 = "1.5.5";
// src/xception/extractParams.ts // src/xception/extractParams.ts
function extractorsFactory2(extractWeights, paramMappings) { function extractorsFactory2(extractWeights, paramMappings) {

File diff suppressed because one or more lines are too long

11
dist/face-api.esm.js vendored
View File

@ -60600,9 +60600,8 @@ function normalize(x, meanRgb) {
function padToSquare(imgTensor, isCenterImage = false) { function padToSquare(imgTensor, isCenterImage = false) {
return tidy(() => { return tidy(() => {
const [height, width] = imgTensor.shape.slice(1); const [height, width] = imgTensor.shape.slice(1);
if (height === width) { if (height === width)
return imgTensor; return imgTensor;
}
const dimDiff = Math.abs(height - width); const dimDiff = Math.abs(height - width);
const paddingAmount = Math.round(dimDiff * (isCenterImage ? 0.5 : 1)); const paddingAmount = Math.round(dimDiff * (isCenterImage ? 0.5 : 1));
const paddingAxis = height > width ? 2 : 1; const paddingAxis = height > width ? 2 : 1;
@ -60614,11 +60613,7 @@ function padToSquare(imgTensor, isCenterImage = false) {
const paddingTensorAppend = createPaddingTensor(paddingAmount); const paddingTensorAppend = createPaddingTensor(paddingAmount);
const remainingPaddingAmount = dimDiff - paddingTensorAppend.shape[paddingAxis]; const remainingPaddingAmount = dimDiff - paddingTensorAppend.shape[paddingAxis];
const paddingTensorPrepend = isCenterImage && remainingPaddingAmount ? createPaddingTensor(remainingPaddingAmount) : null; const paddingTensorPrepend = isCenterImage && remainingPaddingAmount ? createPaddingTensor(remainingPaddingAmount) : null;
const tensorsToStack = [ const tensorsToStack = [paddingTensorPrepend, imgTensor, paddingTensorAppend].filter((t) => !!t).map((t) => cast(t, "float32"));
paddingTensorPrepend,
imgTensor,
paddingTensorAppend
].filter((t) => !!t).map((t) => cast(t, "float32"));
return concat(tensorsToStack, paddingAxis); return concat(tensorsToStack, paddingAxis);
}); });
} }
@ -62213,7 +62208,7 @@ function drawFaceLandmarks(canvasArg, faceLandmarks) {
} }
// package.json // package.json
var version6 = "1.5.4"; var version6 = "1.5.5";
// src/xception/extractParams.ts // src/xception/extractParams.ts
function extractorsFactory2(extractWeights, paramMappings) { function extractorsFactory2(extractWeights, paramMappings) {

File diff suppressed because one or more lines are too long

2
dist/face-api.js vendored

File diff suppressed because one or more lines are too long

View File

@ -665,9 +665,8 @@ var tf3 = __toModule(require_tfjs_esm());
function padToSquare(imgTensor, isCenterImage = false) { function padToSquare(imgTensor, isCenterImage = false) {
return tf3.tidy(() => { return tf3.tidy(() => {
const [height, width] = imgTensor.shape.slice(1); const [height, width] = imgTensor.shape.slice(1);
if (height === width) { if (height === width)
return imgTensor; return imgTensor;
}
const dimDiff = Math.abs(height - width); const dimDiff = Math.abs(height - width);
const paddingAmount = Math.round(dimDiff * (isCenterImage ? 0.5 : 1)); const paddingAmount = Math.round(dimDiff * (isCenterImage ? 0.5 : 1));
const paddingAxis = height > width ? 2 : 1; const paddingAxis = height > width ? 2 : 1;
@ -679,11 +678,7 @@ function padToSquare(imgTensor, isCenterImage = false) {
const paddingTensorAppend = createPaddingTensor(paddingAmount); const paddingTensorAppend = createPaddingTensor(paddingAmount);
const remainingPaddingAmount = dimDiff - paddingTensorAppend.shape[paddingAxis]; const remainingPaddingAmount = dimDiff - paddingTensorAppend.shape[paddingAxis];
const paddingTensorPrepend = isCenterImage && remainingPaddingAmount ? createPaddingTensor(remainingPaddingAmount) : null; const paddingTensorPrepend = isCenterImage && remainingPaddingAmount ? createPaddingTensor(remainingPaddingAmount) : null;
const tensorsToStack = [ const tensorsToStack = [paddingTensorPrepend, imgTensor, paddingTensorAppend].filter((t) => !!t).map((t) => tf3.cast(t, "float32"));
paddingTensorPrepend,
imgTensor,
paddingTensorAppend
].filter((t) => !!t).map((t) => tf3.cast(t, "float32"));
return tf3.concat(tensorsToStack, paddingAxis); return tf3.concat(tensorsToStack, paddingAxis);
}); });
} }
@ -2307,7 +2302,7 @@ function drawFaceLandmarks(canvasArg, faceLandmarks) {
} }
// package.json // package.json
var version = "1.5.4"; var version = "1.5.5";
// src/ageGenderNet/AgeGenderNet.ts // src/ageGenderNet/AgeGenderNet.ts
var tf20 = __toModule(require_tfjs_esm()); var tf20 = __toModule(require_tfjs_esm());

11
dist/face-api.node.js vendored
View File

@ -665,9 +665,8 @@ var tf3 = __toModule(require_tfjs_esm());
function padToSquare(imgTensor, isCenterImage = false) { function padToSquare(imgTensor, isCenterImage = false) {
return tf3.tidy(() => { return tf3.tidy(() => {
const [height, width] = imgTensor.shape.slice(1); const [height, width] = imgTensor.shape.slice(1);
if (height === width) { if (height === width)
return imgTensor; return imgTensor;
}
const dimDiff = Math.abs(height - width); const dimDiff = Math.abs(height - width);
const paddingAmount = Math.round(dimDiff * (isCenterImage ? 0.5 : 1)); const paddingAmount = Math.round(dimDiff * (isCenterImage ? 0.5 : 1));
const paddingAxis = height > width ? 2 : 1; const paddingAxis = height > width ? 2 : 1;
@ -679,11 +678,7 @@ function padToSquare(imgTensor, isCenterImage = false) {
const paddingTensorAppend = createPaddingTensor(paddingAmount); const paddingTensorAppend = createPaddingTensor(paddingAmount);
const remainingPaddingAmount = dimDiff - paddingTensorAppend.shape[paddingAxis]; const remainingPaddingAmount = dimDiff - paddingTensorAppend.shape[paddingAxis];
const paddingTensorPrepend = isCenterImage && remainingPaddingAmount ? createPaddingTensor(remainingPaddingAmount) : null; const paddingTensorPrepend = isCenterImage && remainingPaddingAmount ? createPaddingTensor(remainingPaddingAmount) : null;
const tensorsToStack = [ const tensorsToStack = [paddingTensorPrepend, imgTensor, paddingTensorAppend].filter((t) => !!t).map((t) => tf3.cast(t, "float32"));
paddingTensorPrepend,
imgTensor,
paddingTensorAppend
].filter((t) => !!t).map((t) => tf3.cast(t, "float32"));
return tf3.concat(tensorsToStack, paddingAxis); return tf3.concat(tensorsToStack, paddingAxis);
}); });
} }
@ -2307,7 +2302,7 @@ function drawFaceLandmarks(canvasArg, faceLandmarks) {
} }
// package.json // package.json
var version = "1.5.4"; var version = "1.5.5";
// src/ageGenderNet/AgeGenderNet.ts // src/ageGenderNet/AgeGenderNet.ts
var tf20 = __toModule(require_tfjs_esm()); var tf20 = __toModule(require_tfjs_esm());

View File

@ -52,18 +52,18 @@
"@tensorflow/tfjs-layers": "^3.9.0", "@tensorflow/tfjs-layers": "^3.9.0",
"@tensorflow/tfjs-node": "^3.9.0", "@tensorflow/tfjs-node": "^3.9.0",
"@tensorflow/tfjs-node-gpu": "^3.9.0", "@tensorflow/tfjs-node-gpu": "^3.9.0",
"@types/node": "^16.10.2", "@types/node": "^16.11.1",
"@typescript-eslint/eslint-plugin": "^4.32.0", "@typescript-eslint/eslint-plugin": "^5.1.0",
"@typescript-eslint/parser": "^4.32.0", "@typescript-eslint/parser": "^5.1.0",
"@vladmandic/build": "^0.5.3", "@vladmandic/build": "^0.6.1",
"@vladmandic/pilogger": "^0.3.3", "@vladmandic/pilogger": "^0.3.3",
"canvas": "^2.8.0", "canvas": "^2.8.0",
"chokidar": "^3.5.2", "chokidar": "^3.5.2",
"dayjs": "^1.10.7", "dayjs": "^1.10.7",
"esbuild": "^0.13.3", "esbuild": "^0.13.8",
"eslint": "^7.32.0", "eslint": "^8.0.1",
"eslint-config-airbnb-base": "^14.2.1", "eslint-config-airbnb-base": "^14.2.1",
"eslint-plugin-import": "^2.24.2", "eslint-plugin-import": "^2.25.2",
"eslint-plugin-json": "^3.1.0", "eslint-plugin-json": "^3.1.0",
"eslint-plugin-node": "^11.1.0", "eslint-plugin-node": "^11.1.0",
"eslint-plugin-promise": "^5.1.0", "eslint-plugin-promise": "^5.1.0",
@ -72,7 +72,7 @@
"seedrandom": "^3.0.5", "seedrandom": "^3.0.5",
"simple-git": "^2.46.0", "simple-git": "^2.46.0",
"tslib": "^2.3.1", "tslib": "^2.3.1",
"typedoc": "^0.22.4", "typedoc": "^0.22.6",
"typescript": "4.4.3" "typescript": "4.4.4"
} }
} }

View File

@ -10,9 +10,9 @@ export abstract class NeuralNetwork<TNetParams> {
this._name = name; this._name = name;
} }
protected _params: TNetParams | undefined = undefined protected _params: TNetParams | undefined = undefined;
protected _paramMappings: ParamMapping[] = [] protected _paramMappings: ParamMapping[] = [];
public _name: any; public _name: any;

View File

@ -10,7 +10,7 @@ import { NeuralNetwork } from '../NeuralNetwork';
import { NetInput, TNetInput, toNetInput } from '../dom/index'; import { NetInput, TNetInput, toNetInput } from '../dom/index';
export class AgeGenderNet extends NeuralNetwork<NetParams> { export class AgeGenderNet extends NeuralNetwork<NetParams> {
private _faceFeatureExtractor: TinyXception private _faceFeatureExtractor: TinyXception;
constructor(faceFeatureExtractor: TinyXception = new TinyXception(2)) { constructor(faceFeatureExtractor: TinyXception = new TinyXception(2)) {
super('AgeGenderNet'); super('AgeGenderNet');

View File

@ -19,13 +19,13 @@ export class Box<BoxType = any> implements IBoundingBox, IRect {
} }
} }
private _x: number private _x: number;
private _y: number private _y: number;
private _width: number private _width: number;
private _height: number private _height: number;
constructor(_box: IBoundingBox | IRect, allowNegativeDimensions = true) { constructor(_box: IBoundingBox | IRect, allowNegativeDimensions = true) {
const box = (_box || {}) as any; const box = (_box || {}) as any;

View File

@ -6,9 +6,9 @@ export interface IDimensions {
} }
export class Dimensions implements IDimensions { export class Dimensions implements IDimensions {
private _width: number private _width: number;
private _height: number private _height: number;
constructor(width: number, height: number) { constructor(width: number, height: number) {
if (!isValidNumber(width) || !isValidNumber(height)) { if (!isValidNumber(width) || !isValidNumber(height)) {

View File

@ -18,11 +18,11 @@ export interface IFaceLandmarks {
} }
export class FaceLandmarks implements IFaceLandmarks { export class FaceLandmarks implements IFaceLandmarks {
protected _shift: Point protected _shift: Point;
protected _positions: Point[] protected _positions: Point[];
protected _imgDims: Dimensions protected _imgDims: Dimensions;
constructor( constructor(
relativeFaceLandmarkPositions: Point[], relativeFaceLandmarkPositions: Point[],

View File

@ -6,8 +6,8 @@ export interface IFaceMatch {
} }
export class FaceMatch implements IFaceMatch { export class FaceMatch implements IFaceMatch {
private _label: string private _label: string;
private _distance: number private _distance: number;
constructor(label: string, distance: number) { constructor(label: string, distance: number) {
this._label = label; this._label = label;

View File

@ -12,7 +12,7 @@ export class LabeledBox extends Box<LabeledBox> {
} }
} }
private _label: number private _label: number;
constructor(box: IBoundingBox | IRect | any, label: number) { constructor(box: IBoundingBox | IRect | any, label: number) {
super(box); super(box);

View File

@ -1,7 +1,7 @@
export class LabeledFaceDescriptors { export class LabeledFaceDescriptors {
private _label: string private _label: string;
private _descriptors: Float32Array[] private _descriptors: Float32Array[];
constructor(label: string, descriptors: Float32Array[]) { constructor(label: string, descriptors: Float32Array[]) {
if (!(typeof label === 'string')) { if (!(typeof label === 'string')) {

View File

@ -3,15 +3,15 @@ import { Dimensions, IDimensions } from './Dimensions';
import { IRect, Rect } from './Rect'; import { IRect, Rect } from './Rect';
export class ObjectDetection { export class ObjectDetection {
private _score: number private _score: number;
private _classScore: number private _classScore: number;
private _className: string private _className: string;
private _box: Rect private _box: Rect;
private _imageDims: Dimensions private _imageDims: Dimensions;
constructor( constructor(
score: number, score: number,

View File

@ -4,9 +4,9 @@ export interface IPoint {
} }
export class Point implements IPoint { export class Point implements IPoint {
private _x: number private _x: number;
private _y: number private _y: number;
constructor(x: number, y: number) { constructor(x: number, y: number) {
this._x = x; this._x = x;

View File

@ -15,9 +15,9 @@ export class PredictedBox extends LabeledBox {
} }
} }
private _score: number private _score: number;
private _classScore: number private _classScore: number;
constructor(box: IBoundingBox | IRect | any, label: number, score: number, classScore: number) { constructor(box: IBoundingBox | IRect | any, label: number, score: number, classScore: number) {
super(box, label); super(box, label);

View File

@ -9,17 +9,17 @@ import { imageToSquare } from './imageToSquare';
import { TResolvedNetInput } from './types'; import { TResolvedNetInput } from './types';
export class NetInput { export class NetInput {
private _imageTensors: Array<tf.Tensor3D | tf.Tensor4D> = [] private _imageTensors: Array<tf.Tensor3D | tf.Tensor4D> = [];
private _canvases: HTMLCanvasElement[] = [] private _canvases: HTMLCanvasElement[] = [];
private _batchSize: number private _batchSize: number;
private _treatAsBatchInput = false private _treatAsBatchInput = false;
private _inputDimensions: number[][] = [] private _inputDimensions: number[][] = [];
private _inputSize = 0 private _inputSize = 0;
constructor(inputs: Array<TResolvedNetInput>, treatAsBatchInput = false) { constructor(inputs: Array<TResolvedNetInput>, treatAsBatchInput = false) {
if (!Array.isArray(inputs)) { if (!Array.isArray(inputs)) {

View File

@ -11,13 +11,13 @@ export interface IDrawBoxOptions {
} }
export class DrawBoxOptions { export class DrawBoxOptions {
public boxColor: string public boxColor: string;
public lineWidth: number public lineWidth: number;
public drawLabelOptions: DrawTextFieldOptions public drawLabelOptions: DrawTextFieldOptions;
public label?: string public label?: string;
constructor(options: IDrawBoxOptions = {}) { constructor(options: IDrawBoxOptions = {}) {
const { const {
@ -36,9 +36,9 @@ export class DrawBoxOptions {
} }
export class DrawBox { export class DrawBox {
public box: Box public box: Box;
public options: DrawBoxOptions public options: DrawBoxOptions;
constructor( constructor(
box: IBoundingBox | IRect, box: IBoundingBox | IRect,

View File

@ -17,17 +17,17 @@ export interface IDrawFaceLandmarksOptions {
} }
export class DrawFaceLandmarksOptions { export class DrawFaceLandmarksOptions {
public drawLines: boolean public drawLines: boolean;
public drawPoints: boolean public drawPoints: boolean;
public lineWidth: number public lineWidth: number;
public pointSize: number public pointSize: number;
public lineColor: string public lineColor: string;
public pointColor: string public pointColor: string;
constructor(options: IDrawFaceLandmarksOptions = {}) { constructor(options: IDrawFaceLandmarksOptions = {}) {
const { const {
@ -43,9 +43,9 @@ export class DrawFaceLandmarksOptions {
} }
export class DrawFaceLandmarks { export class DrawFaceLandmarks {
public faceLandmarks: FaceLandmarks public faceLandmarks: FaceLandmarks;
public options: DrawFaceLandmarksOptions public options: DrawFaceLandmarksOptions;
constructor( constructor(
faceLandmarks: FaceLandmarks, faceLandmarks: FaceLandmarks,

View File

@ -25,17 +25,17 @@ export interface IDrawTextFieldOptions {
} }
export class DrawTextFieldOptions implements IDrawTextFieldOptions { export class DrawTextFieldOptions implements IDrawTextFieldOptions {
public anchorPosition: AnchorPosition public anchorPosition: AnchorPosition;
public backgroundColor: string public backgroundColor: string;
public fontColor: string public fontColor: string;
public fontSize: number public fontSize: number;
public fontStyle: string public fontStyle: string;
public padding: number public padding: number;
constructor(options: IDrawTextFieldOptions = {}) { constructor(options: IDrawTextFieldOptions = {}) {
const { const {
@ -51,11 +51,11 @@ export class DrawTextFieldOptions implements IDrawTextFieldOptions {
} }
export class DrawTextField { export class DrawTextField {
public text: string[] public text: string[];
public anchor : IPoint public anchor : IPoint;
public options: DrawTextFieldOptions public options: DrawTextFieldOptions;
constructor( constructor(
text: string | string[] | DrawTextField, text: string | string[] | DrawTextField,

View File

@ -1,13 +1,13 @@
export const FACE_EXPRESSION_LABELS = ['neutral', 'happy', 'sad', 'angry', 'fearful', 'disgusted', 'surprised']; export const FACE_EXPRESSION_LABELS = ['neutral', 'happy', 'sad', 'angry', 'fearful', 'disgusted', 'surprised'];
export class FaceExpressions { export class FaceExpressions {
public neutral = 0 public neutral = 0;
public happy = 0 public happy = 0;
public sad = 0 public sad = 0;
public angry = 0 public angry = 0;
public fearful = 0 public fearful = 0;
public disgusted = 0 public disgusted = 0;
public surprised = 0 public surprised = 0;
constructor(probabilities: number[] | Float32Array) { constructor(probabilities: number[] | Float32Array) {
if (probabilities.length !== 7) { if (probabilities.length !== 7) {

View File

@ -13,7 +13,7 @@ export abstract class FaceProcessor<
TExtractorParams extends FaceFeatureExtractorParams | TinyFaceFeatureExtractorParams TExtractorParams extends FaceFeatureExtractorParams | TinyFaceFeatureExtractorParams
> >
extends NeuralNetwork<NetParams> { extends NeuralNetwork<NetParams> {
protected _faceFeatureExtractor: IFaceFeatureExtractor<TExtractorParams> protected _faceFeatureExtractor: IFaceFeatureExtractor<TExtractorParams>;
constructor(_name: string, faceFeatureExtractor: IFaceFeatureExtractor<TExtractorParams>) { constructor(_name: string, faceFeatureExtractor: IFaceFeatureExtractor<TExtractorParams>) {
super(_name); super(_name);

View File

@ -4,8 +4,8 @@ import { euclideanDistance } from '../euclideanDistance';
import { WithFaceDescriptor } from '../factories/index'; import { WithFaceDescriptor } from '../factories/index';
export class FaceMatcher { export class FaceMatcher {
private _labeledDescriptors: LabeledFaceDescriptors[] private _labeledDescriptors: LabeledFaceDescriptors[];
private _distanceThreshold: number private _distanceThreshold: number;
constructor(inputs: LabeledFaceDescriptors | WithFaceDescriptor<any> | Float32Array | Array<LabeledFaceDescriptors | WithFaceDescriptor<any> | Float32Array>, distanceThreshold = 0.6) { constructor(inputs: LabeledFaceDescriptors | WithFaceDescriptor<any> | Float32Array | Array<LabeledFaceDescriptors | WithFaceDescriptor<any> | Float32Array>, distanceThreshold = 0.6) {
this._distanceThreshold = distanceThreshold; this._distanceThreshold = distanceThreshold;

View File

@ -8,38 +8,22 @@ import * as tf from '../../dist/tfjs.esm';
* both sides of the minor dimension oof the image. * both sides of the minor dimension oof the image.
* @returns The padded tensor with width === height. * @returns The padded tensor with width === height.
*/ */
export function padToSquare( export function padToSquare(imgTensor: tf.Tensor4D, isCenterImage = false): tf.Tensor4D {
imgTensor: tf.Tensor4D,
isCenterImage = false,
): tf.Tensor4D {
return tf.tidy(() => { return tf.tidy(() => {
const [height, width] = imgTensor.shape.slice(1); const [height, width] = imgTensor.shape.slice(1);
if (height === width) { if (height === width) return imgTensor;
return imgTensor;
}
const dimDiff = Math.abs(height - width); const dimDiff = Math.abs(height - width);
const paddingAmount = Math.round(dimDiff * (isCenterImage ? 0.5 : 1)); const paddingAmount = Math.round(dimDiff * (isCenterImage ? 0.5 : 1));
const paddingAxis = height > width ? 2 : 1; const paddingAxis = height > width ? 2 : 1;
const createPaddingTensor = (paddingAmountLocal: number): tf.Tensor => { const createPaddingTensor = (paddingAmountLocal: number): tf.Tensor => {
const paddingTensorShape = imgTensor.shape.slice(); const paddingTensorShape = imgTensor.shape.slice();
paddingTensorShape[paddingAxis] = paddingAmountLocal; paddingTensorShape[paddingAxis] = paddingAmountLocal;
return tf.fill(paddingTensorShape, 0, 'float32'); return tf.fill(paddingTensorShape, 0, 'float32');
}; };
const paddingTensorAppend = createPaddingTensor(paddingAmount); const paddingTensorAppend = createPaddingTensor(paddingAmount);
const remainingPaddingAmount = dimDiff - (paddingTensorAppend.shape[paddingAxis] as number); const remainingPaddingAmount = dimDiff - (paddingTensorAppend.shape[paddingAxis] as number);
const paddingTensorPrepend = isCenterImage && remainingPaddingAmount ? createPaddingTensor(remainingPaddingAmount) : null;
const paddingTensorPrepend = isCenterImage && remainingPaddingAmount const tensorsToStack = [paddingTensorPrepend, imgTensor, paddingTensorAppend]
? createPaddingTensor(remainingPaddingAmount)
: null;
const tensorsToStack = [
paddingTensorPrepend,
imgTensor,
paddingTensorAppend,
]
.filter((t) => !!t) .filter((t) => !!t)
.map((t: tf.Tensor) => tf.cast(t, 'float32')) as tf.Tensor4D[]; .map((t: tf.Tensor) => tf.cast(t, 'float32')) as tf.Tensor4D[];
return tf.concat(tensorsToStack, paddingAxis); return tf.concat(tensorsToStack, paddingAxis);

View File

@ -4,11 +4,11 @@ export interface ISsdMobilenetv1Options {
} }
export class SsdMobilenetv1Options { export class SsdMobilenetv1Options {
protected _name = 'SsdMobilenetv1Options' protected _name = 'SsdMobilenetv1Options';
private _minConfidence: number private _minConfidence: number;
private _maxResults: number private _maxResults: number;
constructor({ minConfidence, maxResults }: ISsdMobilenetv1Options = {}) { constructor({ minConfidence, maxResults }: ISsdMobilenetv1Options = {}) {
this._minConfidence = minConfidence || 0.5; this._minConfidence = minConfidence || 0.5;

View File

@ -3,5 +3,5 @@ import { ITinyYolov2Options, TinyYolov2Options } from '../tinyYolov2/index';
export type ITinyFaceDetectorOptions = ITinyYolov2Options export type ITinyFaceDetectorOptions = ITinyYolov2Options
export class TinyFaceDetectorOptions extends TinyYolov2Options { export class TinyFaceDetectorOptions extends TinyYolov2Options {
protected override _name = 'TinyFaceDetectorOptions' protected override _name = 'TinyFaceDetectorOptions';
} }

View File

@ -24,7 +24,7 @@ import { DefaultTinyYolov2NetParams, MobilenetParams, TinyYolov2NetParams } from
export class TinyYolov2Base extends NeuralNetwork<TinyYolov2NetParams> { export class TinyYolov2Base extends NeuralNetwork<TinyYolov2NetParams> {
public static DEFAULT_FILTER_SIZES = [3, 16, 32, 64, 128, 256, 512, 1024, 1024]; public static DEFAULT_FILTER_SIZES = [3, 16, 32, 64, 128, 256, 512, 1024, 1024];
private _config: TinyYolov2Config private _config: TinyYolov2Config;
constructor(config: TinyYolov2Config) { constructor(config: TinyYolov2Config) {
super('TinyYolov2'); super('TinyYolov2');

View File

@ -4,11 +4,11 @@ export interface ITinyYolov2Options {
} }
export class TinyYolov2Options { export class TinyYolov2Options {
protected _name = 'TinyYolov2Options' protected _name = 'TinyYolov2Options';
private _inputSize: number private _inputSize: number;
private _scoreThreshold: number private _scoreThreshold: number;
constructor({ inputSize, scoreThreshold }: ITinyYolov2Options = {}) { constructor({ inputSize, scoreThreshold }: ITinyYolov2Options = {}) {
this._inputSize = inputSize || 416; this._inputSize = inputSize || 416;

View File

@ -31,7 +31,7 @@ function mainBlock(x: tf.Tensor4D, params: MainBlockParams): tf.Tensor4D {
} }
export class TinyXception extends NeuralNetwork<TinyXceptionParams> { export class TinyXception extends NeuralNetwork<TinyXceptionParams> {
private _numMainBlocks: number private _numMainBlocks: number;
constructor(numMainBlocks: number) { constructor(numMainBlocks: number) {
super('TinyXception'); super('TinyXception');

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long