re-added ssd_mobilenet
parent
8a86d4d626
commit
24470acb18
|
@ -0,0 +1 @@
|
|||
weights/** filter=lfs diff=lfs merge=lfs -text
|
33
README.md
33
README.md
|
@ -22,13 +22,19 @@ If original repository is updated, this one will become obsolete.
|
|||
- Updated dependencies to @tensorflow/tfjs since backends were removed from @tensorflow/tfjs-core
|
||||
|
||||
- Removed following models as they are either obsolete or non-functional with tfjs 2.0+
|
||||
- ssdMobilenetv1: Relies on batchNorm() function which is made obsolete in tfjs 2.0
|
||||
- mtcnn: Mostly obsolete
|
||||
- tinyYolov2: Non-functional since weights are missing
|
||||
|
||||
Which means the only valid model is **tinyFaceDetector**
|
||||
- Updated newer version for mobileNetv1 model from <https://github.com/yeephycho/tensorflow-face-detection>
|
||||
Note that updated model was in TF Frozen format and needed to be converted to TFJS Graph format
|
||||
|
||||
Due to reduced code and changed build process, resulting bundle is about **2.5x smaller** than the original!
|
||||
Which means valid models are **tinyFaceDetector** and **mobileNetv1**
|
||||
|
||||
Due to reduced code and changed build process, resulting bundle is about **2x smaller** than the original!
|
||||
|
||||
## Weights
|
||||
|
||||
Pretrained models are includes in `./weights` and uplodaed using GIT LFS support.
|
||||
|
||||
## Build
|
||||
|
||||
|
@ -44,3 +50,24 @@ Which will compile everything in `./src` into `./build` and create both standard
|
|||
## Documentation
|
||||
|
||||
For documentation refer to original project
|
||||
|
||||
## Todo
|
||||
|
||||
face-api.js mobilenetv1 model actuall comes from <https://github.com/yeephycho/tensorflow-face-detection> which has been updated for tfjs@2.0 compatibility.
|
||||
unfortunately, model provided at <https://drive.google.com/open?id=0B5ttP5kO_loUdWZWZVVrN2VmWFk> is in frozen format, so needed to convert it to tfjs graph model:
|
||||
|
||||
> summarize_graph \
|
||||
--in_graph="./frozen_inference_graph_face.pb" \
|
||||
--print_structure=false
|
||||
Found 4 possible outputs: (name=detection_boxes, op=Identity) (name=detection_scores, op=Identity) (name=detection_classes, op=Identity) (name=num_detections, op=Identity)
|
||||
> tensorflowjs_converter \
|
||||
--input_format tf_frozen_model \
|
||||
--output_format tfjs_graph_model \
|
||||
--skip_op_check \
|
||||
--strip_debug_ops=True \
|
||||
--weight_shard_size_bytes 4194304 \
|
||||
--output_node_names detection_boxes,detection_scores,num_detections \
|
||||
./frozen_inference_graph_face.pb \
|
||||
./converted/
|
||||
> cat converted/model.json | sed 's/group1-/ssd_mobilenetv1_model-/g' > converted/ssd_mobilenetv1_model-weights_manifest.json
|
||||
> rm converted/model.json
|
||||
|
|
|
@ -1 +1 @@
|
|||
{"version":3,"file":"NeuralNetwork.d.ts","sourceRoot":"","sources":["../src/NeuralNetwork.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAE5C,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAKxC,8BAAsB,aAAa,CAAC,UAAU;IAGhC,SAAS,CAAC,KAAK,EAAE,MAAM;IAFnC,SAAS,CAAC,OAAO,EAAE,UAAU,GAAG,SAAS,CAAY;IACrD,SAAS,CAAC,cAAc,EAAE,YAAY,EAAE,CAAK;gBACvB,KAAK,EAAE,MAAM;IACnC,IAAW,MAAM,IAAI,UAAU,GAAG,SAAS,CAAwB;IACnE,IAAW,aAAa,IAAI,YAAY,EAAE,CAA+B;IACzE,IAAW,QAAQ,IAAI,OAAO,CAAyB;IAChD,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,EAAE,CAAC,MAAM;IAI9C,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM;IAK1D,YAAY;;;;IAMZ,kBAAkB;;;;IAGlB,eAAe;;;;IAGf,QAAQ;IAKR,MAAM;IAON,OAAO,CAAC,gBAAgB,GAAE,OAAc;IASxC,eAAe,IAAI,YAAY;IAOzB,IAAI,CAAC,YAAY,EAAE,YAAY,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAOpE,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS;IAOnC,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS;IAc/C,iBAAiB,CAAC,SAAS,EAAE,EAAE,CAAC,cAAc;IAQ9C,cAAc,CAAC,OAAO,EAAE,YAAY;IAQ3C,OAAO,CAAC,oBAAoB;IAiB5B,SAAS,CAAC,QAAQ,CAAC,mBAAmB,IAAI,MAAM;IAChD,SAAS,CAAC,QAAQ,CAAC,0BAA0B,CAAC,SAAS,EAAE,EAAE,CAAC,cAAc,GAAG;QAAE,MAAM,EAAE,UAAU,CAAC;QAAC,aAAa,EAAE,YAAY,EAAE,CAAA;KAAE;IAClI,SAAS,CAAC,QAAQ,CAAC,aAAa,CAAC,OAAO,EAAE,YAAY,GAAG;QAAE,MAAM,EAAE,UAAU,CAAC;QAAC,aAAa,EAAE,YAAY,EAAE,CAAA;KAAE;CAC/G"}
|
||||
{"version":3,"file":"NeuralNetwork.d.ts","sourceRoot":"","sources":["../src/NeuralNetwork.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAE5C,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAKxC,8BAAsB,aAAa,CAAC,UAAU;IAKhC,SAAS,CAAC,KAAK,EAAE,MAAM;IAHnC,SAAS,CAAC,OAAO,EAAE,UAAU,GAAG,SAAS,CAAY;IACrD,SAAS,CAAC,cAAc,EAAE,YAAY,EAAE,CAAK;gBAEvB,KAAK,EAAE,MAAM;IAEnC,IAAW,MAAM,IAAI,UAAU,GAAG,SAAS,CAAwB;IACnE,IAAW,aAAa,IAAI,YAAY,EAAE,CAA+B;IACzE,IAAW,QAAQ,IAAI,OAAO,CAAyB;IAEhD,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,EAAE,CAAC,MAAM;IAK9C,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM;IAM1D,YAAY;;;;IAOZ,kBAAkB;;;;IAIlB,eAAe;;;;IAIf,QAAQ;IAMR,MAAM;IAQN,OAAO,CAAC,gBAAgB,GAAE,OAAc;IAUxC,eAAe,IAAI,YAAY;IAQzB,IAAI,CAAC,YAAY,EAAE,YAAY,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IASpE,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS;IASnC,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS;IAoB/C,iBAAiB,CAAC,SAAS,EAAE,EAAE,CAAC,cAAc;IAU9C,cAAc,CAAC,OAAO,EAAE,YAAY;IAU3C,OAAO,CAAC,oBAAoB;IAqB5B,SAAS,CAAC,QAAQ,CAAC,mBAAmB,IAAI,MAAM;IAChD,SAAS,CAAC,QAAQ,CAAC,0BAA0B,CAAC,SAAS,EAAE,EAAE,CAAC,cAAc,GAAG;QAAE,MAAM,EAAE,UAAU,CAAC;QAAC,aAAa,EAAE,YAAY,EAAE,CAAA;KAAE;IAClI,SAAS,CAAC,QAAQ,CAAC,aAAa,CAAC,OAAO,EAAE,YAAY,GAAG;QAAE,MAAM,EAAE,UAAU,CAAC;QAAC,aAAa,EAAE,YAAY,EAAE,CAAA;KAAE;CAC/G"}
|
|
@ -1 +1 @@
|
|||
{"version":3,"file":"NeuralNetwork.js","sourceRoot":"","sources":["../src/NeuralNetwork.ts"],"names":[],"mappings":"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"}
|
||||
{"version":3,"file":"NeuralNetwork.js","sourceRoot":"","sources":["../src/NeuralNetwork.ts"],"names":[],"mappings":"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"}
|
|
@ -1 +1 @@
|
|||
{"version":3,"file":"loadWeightMap.d.ts","sourceRoot":"","sources":["../../src/dom/loadWeightMap.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAK5C,wBAAsB,aAAa,CACjC,GAAG,EAAE,MAAM,GAAG,SAAS,EACvB,gBAAgB,EAAE,MAAM,GACvB,OAAO,CAAC,EAAE,CAAC,cAAc,CAAC,CAM5B"}
|
||||
{"version":3,"file":"loadWeightMap.d.ts","sourceRoot":"","sources":["../../src/dom/loadWeightMap.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAK5C,wBAAsB,aAAa,CACjC,GAAG,EAAE,MAAM,GAAG,SAAS,EACvB,gBAAgB,EAAE,MAAM,GACvB,OAAO,CAAC,EAAE,CAAC,cAAc,CAAC,CAK5B"}
|
|
@ -4,6 +4,7 @@ import { fetchJson } from './fetchJson';
|
|||
export async function loadWeightMap(uri, defaultModelName) {
|
||||
const { manifestUri, modelBaseUri } = getModelUris(uri, defaultModelName);
|
||||
const manifest = await fetchJson(manifestUri);
|
||||
console.log(typeof manifest, manifest);
|
||||
return tf.io.loadWeights(manifest, modelBaseUri);
|
||||
}
|
||||
//# sourceMappingURL=loadWeightMap.js.map
|
|
@ -1 +1 @@
|
|||
{"version":3,"file":"loadWeightMap.js","sourceRoot":"","sources":["../../src/dom/loadWeightMap.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAE5C,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,GAAuB,EACvB,gBAAwB;IAExB,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,GAAG,YAAY,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAA;IAEzE,MAAM,QAAQ,GAAG,MAAM,SAAS,CAA8B,WAAW,CAAC,CAAA;IAE1E,OAAO,EAAE,CAAC,EAAE,CAAC,WAAW,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAA;AAClD,CAAC"}
|
||||
{"version":3,"file":"loadWeightMap.js","sourceRoot":"","sources":["../../src/dom/loadWeightMap.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAE5C,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,GAAuB,EACvB,gBAAwB;IAExB,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,GAAG,YAAY,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAA;IACzE,MAAM,QAAQ,GAAG,MAAM,SAAS,CAA8B,WAAW,CAAC,CAAA;IAC1E,OAAO,CAAC,GAAG,CAAC,OAAO,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACvC,OAAO,EAAE,CAAC,EAAE,CAAC,WAAW,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAA;AAClD,CAAC"}
|
|
@ -1 +1 @@
|
|||
{"version":3,"file":"euclideanDistance.d.ts","sourceRoot":"","sources":["../src/euclideanDistance.ts"],"names":[],"mappings":"AAAA,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,YAAY,UAW7F"}
|
||||
{"version":3,"file":"euclideanDistance.d.ts","sourceRoot":"","sources":["../src/euclideanDistance.ts"],"names":[],"mappings":"AAAA,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,YAAY,UAY7F"}
|
|
@ -1,7 +1,6 @@
|
|||
export function euclideanDistance(arr1, arr2) {
|
||||
if (arr1.length !== arr2.length) {
|
||||
if (arr1.length !== arr2.length)
|
||||
throw new Error('euclideanDistance: arr1.length !== arr2.length');
|
||||
}
|
||||
const desc1 = Array.from(arr1);
|
||||
const desc2 = Array.from(arr2);
|
||||
return Math.sqrt(desc1
|
||||
|
|
|
@ -1 +1 @@
|
|||
{"version":3,"file":"euclideanDistance.js","sourceRoot":"","sources":["../src/euclideanDistance.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,iBAAiB,CAAC,IAA6B,EAAE,IAA6B;IAC5F,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,EAAE;QAC/B,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAA;KAClE;IACD,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC9B,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC9B,OAAO,IAAI,CAAC,IAAI,CACd,KAAK;SACF,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;SAC/B,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CACrD,CAAA;AACH,CAAC"}
|
||||
{"version":3,"file":"euclideanDistance.js","sourceRoot":"","sources":["../src/euclideanDistance.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,iBAAiB,CAAC,IAA6B,EAAE,IAA6B;IAC5F,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM;QAC7B,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAA;IAEnE,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC9B,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAE9B,OAAO,IAAI,CAAC,IAAI,CACd,KAAK;SACF,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;SAC/B,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CACrD,CAAA;AACH,CAAC"}
|
|
@ -1 +1 @@
|
|||
{"version":3,"file":"DetectFacesTasks.d.ts","sourceRoot":"","sources":["../../src/globalApi/DetectFacesTasks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAGnC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,0BAA0B,EAAE,6BAA6B,EAAE,MAAM,4BAA4B,CAAC;AAEvG,OAAO,EAAE,0BAA0B,EAAE,6BAA6B,EAAE,MAAM,2BAA2B,CAAC;AACtG,OAAO,EAAE,6BAA6B,EAAE,gCAAgC,EAAE,MAAM,8BAA8B,CAAC;AAC/G,OAAO,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAE/C,qBAAa,mBAAmB,CAAC,OAAO,CAAE,SAAQ,cAAc,CAAC,OAAO,CAAC;IAErE,SAAS,CAAC,KAAK,EAAE,SAAS;IAC1B,SAAS,CAAC,OAAO,EAAE,oBAAoB;gBAD7B,KAAK,EAAE,SAAS,EAChB,OAAO,GAAE,oBAAoD;CAI1E;AAED,qBAAa,kBAAmB,SAAQ,mBAAmB,CAAC,aAAa,EAAE,CAAC;IAE7D,GAAG,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;IAgB5C,OAAO,CAAC,8BAA8B;IAOtC,iBAAiB,CAAC,kBAAkB,GAAE,OAAe;;;IAQrD,mBAAmB;;;IAOnB,gBAAgB;;;CAMjB;AAED,qBAAa,oBAAqB,SAAQ,mBAAmB,CAAC,aAAa,GAAG,SAAS,CAAC;IAEzE,GAAG,IAAI,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC;IAWtD,OAAO,CAAC,6BAA6B;IAOrC,iBAAiB,CAAC,kBAAkB,GAAE,OAAe;;;IAQrD,mBAAmB;;;IAOnB,gBAAgB;;;CAMjB"}
|
||||
{"version":3,"file":"DetectFacesTasks.d.ts","sourceRoot":"","sources":["../../src/globalApi/DetectFacesTasks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAKnC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,0BAA0B,EAAE,6BAA6B,EAAE,MAAM,4BAA4B,CAAC;AAEvG,OAAO,EAAE,0BAA0B,EAAE,6BAA6B,EAAE,MAAM,2BAA2B,CAAC;AACtG,OAAO,EAAE,6BAA6B,EAAE,gCAAgC,EAAE,MAAM,8BAA8B,CAAC;AAC/G,OAAO,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAE/C,qBAAa,mBAAmB,CAAC,OAAO,CAAE,SAAQ,cAAc,CAAC,OAAO,CAAC;IAErE,SAAS,CAAC,KAAK,EAAE,SAAS;IAC1B,SAAS,CAAC,OAAO,EAAE,oBAAoB;gBAD7B,KAAK,EAAE,SAAS,EAChB,OAAO,GAAE,oBAAkD;CAIxE;AAED,qBAAa,kBAAmB,SAAQ,mBAAmB,CAAC,aAAa,EAAE,CAAC;IAE7D,GAAG,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;IAuB5C,OAAO,CAAC,8BAA8B;IAOtC,iBAAiB,CAAC,kBAAkB,GAAE,OAAe;;;IAQrD,mBAAmB;;;IAOnB,gBAAgB;;;CAMjB;AAED,qBAAa,oBAAqB,SAAQ,mBAAmB,CAAC,aAAa,GAAG,SAAS,CAAC;IAEzE,GAAG,IAAI,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC;IAWtD,OAAO,CAAC,6BAA6B;IAOrC,iBAAiB,CAAC,kBAAkB,GAAE,OAAe;;;IAQrD,mBAAmB;;;IAOnB,gBAAgB;;;CAMjB"}
|
|
@ -1,12 +1,14 @@
|
|||
import { extendWithFaceDetection } from '../factories/WithFaceDetection';
|
||||
import { SsdMobilenetv1Options } from '../ssdMobilenetv1/SsdMobilenetv1Options';
|
||||
import { TinyFaceDetectorOptions } from '../tinyFaceDetector/TinyFaceDetectorOptions';
|
||||
import { TinyYolov2Options } from '../tinyYolov2';
|
||||
import { ComposableTask } from './ComposableTask';
|
||||
import { DetectAllFaceLandmarksTask, DetectSingleFaceLandmarksTask } from './DetectFaceLandmarksTasks';
|
||||
import { nets } from './nets';
|
||||
import { PredictAllAgeAndGenderTask, PredictSingleAgeAndGenderTask } from './PredictAgeAndGenderTask';
|
||||
import { PredictAllFaceExpressionsTask, PredictSingleFaceExpressionsTask } from './PredictFaceExpressionsTask';
|
||||
export class DetectFacesTaskBase extends ComposableTask {
|
||||
constructor(input, options = new TinyFaceDetectorOptions()) {
|
||||
constructor(input, options = new SsdMobilenetv1Options()) {
|
||||
super();
|
||||
this.input = input;
|
||||
this.options = options;
|
||||
|
@ -17,7 +19,11 @@ export class DetectAllFacesTask extends DetectFacesTaskBase {
|
|||
const { input, options } = this;
|
||||
const faceDetectionFunction = options instanceof TinyFaceDetectorOptions
|
||||
? (input) => nets.tinyFaceDetector.locateFaces(input, options)
|
||||
: null;
|
||||
: (options instanceof SsdMobilenetv1Options
|
||||
? (input) => nets.ssdMobilenetv1.locateFaces(input, options)
|
||||
: (options instanceof TinyYolov2Options
|
||||
? (input) => nets.tinyYolov2.locateFaces(input, options)
|
||||
: null));
|
||||
if (!faceDetectionFunction) {
|
||||
throw new Error('detectFaces - expected options to be instance of TinyFaceDetectorOptions | SsdMobilenetv1Options | MtcnnOptions | TinyYolov2Options');
|
||||
}
|
||||
|
|
|
@ -1 +1 @@
|
|||
{"version":3,"file":"DetectFacesTasks.js","sourceRoot":"","sources":["../../src/globalApi/DetectFacesTasks.ts"],"names":[],"mappings":"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"}
|
||||
{"version":3,"file":"DetectFacesTasks.js","sourceRoot":"","sources":["../../src/globalApi/DetectFacesTasks.ts"],"names":[],"mappings":"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"}
|
|
@ -1,5 +1,7 @@
|
|||
import { TNetInput } from '../dom';
|
||||
import { WithFaceDescriptor, WithFaceDetection, WithFaceLandmarks } from '../factories';
|
||||
import { ITinyYolov2Options } from '../tinyYolov2';
|
||||
export declare function allFacesSsdMobilenetv1(input: TNetInput, minConfidence?: number): Promise<WithFaceDescriptor<WithFaceLandmarks<WithFaceDetection<{}>>>[]>;
|
||||
export declare function allFacesTinyYolov2(input: TNetInput, forwardParams?: ITinyYolov2Options): Promise<WithFaceDescriptor<WithFaceLandmarks<WithFaceDetection<{}>>>[]>;
|
||||
export declare const allFaces: typeof allFacesTinyYolov2;
|
||||
export declare const allFaces: typeof allFacesSsdMobilenetv1;
|
||||
//# sourceMappingURL=allFaces.d.ts.map
|
|
@ -0,0 +1 @@
|
|||
{"version":3,"file":"allFaces.d.ts","sourceRoot":"","sources":["../../src/globalApi/allFaces.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACnC,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAExF,OAAO,EAAE,kBAAkB,EAAqB,MAAM,eAAe,CAAC;AAKtE,wBAAsB,sBAAsB,CAC1C,KAAK,EAAE,SAAS,EAChB,aAAa,CAAC,EAAE,MAAM,GACrB,OAAO,CAAC,kBAAkB,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAKzE;AAED,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,SAAS,EAChB,aAAa,GAAE,kBAAuB,GACrC,OAAO,CAAC,kBAAkB,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAKzE;AAED,eAAO,MAAM,QAAQ,+BAAyB,CAAA"}
|
|
@ -1,11 +1,18 @@
|
|||
import { SsdMobilenetv1Options } from '../ssdMobilenetv1';
|
||||
import { TinyYolov2Options } from '../tinyYolov2';
|
||||
import { detectAllFaces } from './detectFaces';
|
||||
// export allFaces API for backward compatibility
|
||||
export async function allFacesSsdMobilenetv1(input, minConfidence) {
|
||||
console.warn('allFacesSsdMobilenetv1 is deprecated and will be removed soon, use the high level api instead');
|
||||
return await detectAllFaces(input, new SsdMobilenetv1Options(minConfidence ? { minConfidence } : {}))
|
||||
.withFaceLandmarks()
|
||||
.withFaceDescriptors();
|
||||
}
|
||||
export async function allFacesTinyYolov2(input, forwardParams = {}) {
|
||||
console.warn('allFacesTinyYolov2 is deprecated and will be removed soon, use the high level api instead');
|
||||
return await detectAllFaces(input, new TinyYolov2Options(forwardParams))
|
||||
.withFaceLandmarks()
|
||||
.withFaceDescriptors();
|
||||
}
|
||||
export const allFaces = allFacesTinyYolov2;
|
||||
export const allFaces = allFacesSsdMobilenetv1;
|
||||
//# sourceMappingURL=allFaces.js.map
|
|
@ -1 +1 @@
|
|||
{"version":3,"file":"allFaces.js","sourceRoot":"","sources":["../../src/globalApi/allFaces.ts"],"names":[],"mappings":"AAEA,OAAO,EAAsB,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE/C,iDAAiD;AAEjD,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,KAAgB,EAChB,gBAAoC,EAAE;IAEtC,OAAO,CAAC,IAAI,CAAC,2FAA2F,CAAC,CAAA;IACzG,OAAO,MAAM,cAAc,CAAC,KAAK,EAAE,IAAI,iBAAiB,CAAC,aAAa,CAAC,CAAC;SACrE,iBAAiB,EAAE;SACnB,mBAAmB,EAAE,CAAA;AAC1B,CAAC;AAGD,MAAM,CAAC,MAAM,QAAQ,GAAG,kBAAkB,CAAA"}
|
||||
{"version":3,"file":"allFaces.js","sourceRoot":"","sources":["../../src/globalApi/allFaces.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAsB,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE/C,iDAAiD;AAEjD,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,KAAgB,EAChB,aAAsB;IAEtB,OAAO,CAAC,IAAI,CAAC,+FAA+F,CAAC,CAAA;IAC7G,OAAO,MAAM,cAAc,CAAC,KAAK,EAAE,IAAI,qBAAqB,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;SAClG,iBAAiB,EAAE;SACnB,mBAAmB,EAAE,CAAA;AAC1B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,KAAgB,EAChB,gBAAoC,EAAE;IAEtC,OAAO,CAAC,IAAI,CAAC,2FAA2F,CAAC,CAAA;IACzG,OAAO,MAAM,cAAc,CAAC,KAAK,EAAE,IAAI,iBAAiB,CAAC,aAAa,CAAC,CAAC;SACrE,iBAAiB,EAAE;SACnB,mBAAmB,EAAE,CAAA;AAC1B,CAAC;AAED,MAAM,CAAC,MAAM,QAAQ,GAAG,sBAAsB,CAAA"}
|
|
@ -1 +1 @@
|
|||
{"version":3,"file":"detectFaces.d.ts","sourceRoot":"","sources":["../../src/globalApi/detectFaces.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACnC,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC9E,OAAO,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAI/C,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,SAAS,EAChB,OAAO,GAAE,oBAAoD,GAC5D,oBAAoB,CAEtB;AAED,wBAAgB,cAAc,CAC5B,KAAK,EAAE,SAAS,EAChB,OAAO,GAAE,oBAAoD,GAC5D,kBAAkB,CAEpB"}
|
||||
{"version":3,"file":"detectFaces.d.ts","sourceRoot":"","sources":["../../src/globalApi/detectFaces.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAEnC,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC9E,OAAO,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAE/C,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,SAAS,EAChB,OAAO,GAAE,oBAAkD,GAC1D,oBAAoB,CAEtB;AAED,wBAAgB,cAAc,CAC5B,KAAK,EAAE,SAAS,EAChB,OAAO,GAAE,oBAAkD,GAC1D,kBAAkB,CAEpB"}
|
|
@ -1,9 +1,9 @@
|
|||
import { SsdMobilenetv1Options } from '../ssdMobilenetv1/SsdMobilenetv1Options';
|
||||
import { DetectAllFacesTask, DetectSingleFaceTask } from './DetectFacesTasks';
|
||||
import { TinyFaceDetectorOptions } from '../tinyFaceDetector/TinyFaceDetectorOptions';
|
||||
export function detectSingleFace(input, options = new TinyFaceDetectorOptions()) {
|
||||
export function detectSingleFace(input, options = new SsdMobilenetv1Options()) {
|
||||
return new DetectSingleFaceTask(input, options);
|
||||
}
|
||||
export function detectAllFaces(input, options = new TinyFaceDetectorOptions()) {
|
||||
export function detectAllFaces(input, options = new SsdMobilenetv1Options()) {
|
||||
return new DetectAllFacesTask(input, options);
|
||||
}
|
||||
//# sourceMappingURL=detectFaces.js.map
|
|
@ -1 +1 @@
|
|||
{"version":3,"file":"detectFaces.js","sourceRoot":"","sources":["../../src/globalApi/detectFaces.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAE9E,OAAO,EAAE,uBAAuB,EAAE,MAAM,6CAA6C,CAAC;AAGtF,MAAM,UAAU,gBAAgB,CAC9B,KAAgB,EAChB,UAAgC,IAAI,uBAAuB,EAAE;IAE7D,OAAO,IAAI,oBAAoB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;AACjD,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,KAAgB,EAChB,UAAgC,IAAI,uBAAuB,EAAE;IAE7D,OAAO,IAAI,kBAAkB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;AAC/C,CAAC"}
|
||||
{"version":3,"file":"detectFaces.js","sourceRoot":"","sources":["../../src/globalApi/detectFaces.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,yCAAyC,CAAC;AAChF,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAG9E,MAAM,UAAU,gBAAgB,CAC9B,KAAgB,EAChB,UAAgC,IAAI,qBAAqB,EAAE;IAE3D,OAAO,IAAI,oBAAoB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;AACjD,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,KAAgB,EAChB,UAAgC,IAAI,qBAAqB,EAAE;IAE3D,OAAO,IAAI,kBAAkB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;AAC/C,CAAC"}
|
|
@ -1,3 +1,4 @@
|
|||
export * from './allFaces';
|
||||
export * from './ComposableTask';
|
||||
export * from './ComputeFaceDescriptorsTasks';
|
||||
export * from './detectFaces';
|
||||
|
|
|
@ -1 +1 @@
|
|||
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/globalApi/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAA;AAChC,cAAc,+BAA+B,CAAA;AAC7C,cAAc,eAAe,CAAA;AAC7B,cAAc,oBAAoB,CAAA;AAClC,cAAc,4BAA4B,CAAA;AAC1C,cAAc,eAAe,CAAA;AAC7B,cAAc,QAAQ,CAAA;AACtB,cAAc,SAAS,CAAA"}
|
||||
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/globalApi/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,cAAc,kBAAkB,CAAA;AAChC,cAAc,+BAA+B,CAAA;AAC7C,cAAc,eAAe,CAAA;AAC7B,cAAc,oBAAoB,CAAA;AAClC,cAAc,4BAA4B,CAAA;AAC1C,cAAc,eAAe,CAAA;AAC7B,cAAc,QAAQ,CAAA;AACtB,cAAc,SAAS,CAAA"}
|
|
@ -1,3 +1,4 @@
|
|||
export * from './allFaces';
|
||||
export * from './ComposableTask';
|
||||
export * from './ComputeFaceDescriptorsTasks';
|
||||
export * from './detectFaces';
|
||||
|
|
|
@ -1 +1 @@
|
|||
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/globalApi/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAA;AAChC,cAAc,+BAA+B,CAAA;AAC7C,cAAc,eAAe,CAAA;AAC7B,cAAc,oBAAoB,CAAA;AAClC,cAAc,4BAA4B,CAAA;AAC1C,cAAc,eAAe,CAAA;AAC7B,cAAc,QAAQ,CAAA;AACtB,cAAc,SAAS,CAAA"}
|
||||
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/globalApi/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,cAAc,kBAAkB,CAAA;AAChC,cAAc,+BAA+B,CAAA;AAC7C,cAAc,eAAe,CAAA;AAC7B,cAAc,oBAAoB,CAAA;AAClC,cAAc,4BAA4B,CAAA;AAC1C,cAAc,eAAe,CAAA;AAC7B,cAAc,QAAQ,CAAA;AACtB,cAAc,SAAS,CAAA"}
|
|
@ -8,10 +8,13 @@ import { FaceExpressions } from '../faceExpressionNet/FaceExpressions';
|
|||
import { FaceLandmark68Net } from '../faceLandmarkNet/FaceLandmark68Net';
|
||||
import { FaceLandmark68TinyNet } from '../faceLandmarkNet/FaceLandmark68TinyNet';
|
||||
import { FaceRecognitionNet } from '../faceRecognitionNet/FaceRecognitionNet';
|
||||
import { SsdMobilenetv1 } from '../ssdMobilenetv1/SsdMobilenetv1';
|
||||
import { SsdMobilenetv1Options } from '../ssdMobilenetv1/SsdMobilenetv1Options';
|
||||
import { TinyFaceDetector } from '../tinyFaceDetector/TinyFaceDetector';
|
||||
import { TinyFaceDetectorOptions } from '../tinyFaceDetector/TinyFaceDetectorOptions';
|
||||
import { TinyYolov2 } from '../tinyYolov2';
|
||||
import { ITinyYolov2Options, TinyYolov2 } from '../tinyYolov2';
|
||||
export declare const nets: {
|
||||
ssdMobilenetv1: SsdMobilenetv1;
|
||||
tinyFaceDetector: TinyFaceDetector;
|
||||
tinyYolov2: TinyYolov2;
|
||||
faceLandmark68Net: FaceLandmark68Net;
|
||||
|
@ -20,6 +23,14 @@ export declare const nets: {
|
|||
faceExpressionNet: FaceExpressionNet;
|
||||
ageGenderNet: AgeGenderNet;
|
||||
};
|
||||
/**
|
||||
* Attempts to detect all faces in an image using SSD Mobilenetv1 Network.
|
||||
*
|
||||
* @param input The input image.
|
||||
* @param options (optional, default: see SsdMobilenetv1Options constructor for default parameters).
|
||||
* @returns Bounding box of each face with score.
|
||||
*/
|
||||
export declare const ssdMobilenetv1: (input: TNetInput, options: SsdMobilenetv1Options) => Promise<FaceDetection[]>;
|
||||
/**
|
||||
* Attempts to detect all faces in an image using the Tiny Face Detector.
|
||||
*
|
||||
|
@ -28,6 +39,14 @@ export declare const nets: {
|
|||
* @returns Bounding box of each face with score.
|
||||
*/
|
||||
export declare const tinyFaceDetector: (input: TNetInput, options: TinyFaceDetectorOptions) => Promise<FaceDetection[]>;
|
||||
/**
|
||||
* Attempts to detect all faces in an image using the Tiny Yolov2 Network.
|
||||
*
|
||||
* @param input The input image.
|
||||
* @param options (optional, default: see TinyYolov2Options constructor for default parameters).
|
||||
* @returns Bounding box of each face with score.
|
||||
*/
|
||||
export declare const tinyYolov2: (input: TNetInput, options: ITinyYolov2Options) => Promise<FaceDetection[]>;
|
||||
/**
|
||||
* Detects the 68 point face landmark positions of the face shown in an image.
|
||||
*
|
||||
|
@ -73,6 +92,7 @@ export declare const recognizeFaceExpressions: (input: TNetInput) => Promise<Fac
|
|||
* @returns Predictions with age, gender and gender probability or array thereof in case of batch input.
|
||||
*/
|
||||
export declare const predictAgeAndGender: (input: TNetInput) => Promise<AgeAndGenderPrediction | AgeAndGenderPrediction[]>;
|
||||
export declare const loadSsdMobilenetv1Model: (url: string) => Promise<void>;
|
||||
export declare const loadTinyFaceDetectorModel: (url: string) => Promise<void>;
|
||||
export declare const loadTinyYolov2Model: (url: string) => Promise<void>;
|
||||
export declare const loadFaceLandmarkModel: (url: string) => Promise<void>;
|
||||
|
@ -81,6 +101,6 @@ export declare const loadFaceRecognitionModel: (url: string) => Promise<void>;
|
|||
export declare const loadFaceExpressionModel: (url: string) => Promise<void>;
|
||||
export declare const loadAgeGenderModel: (url: string) => Promise<void>;
|
||||
export declare const loadFaceDetectionModel: (url: string) => Promise<void>;
|
||||
export declare const locateFaces: typeof TinyFaceDetector;
|
||||
export declare const locateFaces: (input: TNetInput, options: SsdMobilenetv1Options) => Promise<FaceDetection[]>;
|
||||
export declare const detectLandmarks: (input: TNetInput) => Promise<FaceLandmarks68 | FaceLandmarks68[]>;
|
||||
//# sourceMappingURL=nets.d.ts.map
|
|
@ -1 +1 @@
|
|||
{"version":3,"file":"nets.d.ts","sourceRoot":"","sources":["../../src/globalApi/nets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAEzD,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACnC,OAAO,EAAE,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;AAC3E,OAAO,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AACzE,OAAO,EAAE,qBAAqB,EAAE,MAAM,0CAA0C,CAAC;AACjF,OAAO,EAAE,kBAAkB,EAAE,MAAM,0CAA0C,CAAC;AAG9E,OAAO,EAAE,gBAAgB,EAAE,MAAM,sCAAsC,CAAC;AACxE,OAAO,EAAE,uBAAuB,EAAE,MAAM,6CAA6C,CAAC;AACtF,OAAO,EAAsB,UAAU,EAAE,MAAM,eAAe,CAAC;AAE/D,eAAO,MAAM,IAAI;;;;;;;;CAQhB,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB,UAAW,SAAS,WAAW,uBAAuB,KAAG,QAAQ,aAAa,EAAE,CAC1D,CAAA;AAEnD;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,UAAW,SAAS,KAAG,QAAQ,eAAe,GAAG,eAAe,EAAE,CACnD,CAAA;AAE/C;;;;;;;;GAQG;AACH,eAAO,MAAM,uBAAuB,UAAW,SAAS,KAAG,QAAQ,eAAe,GAAG,eAAe,EAAE,CACnD,CAAA;AAEnD;;;;;;;;;GASG;AACH,eAAO,MAAM,qBAAqB,UAAW,SAAS,KAAG,QAAQ,YAAY,GAAG,YAAY,EAAE,CACxC,CAAA;AAGtD;;;;;;GAMG;AACH,eAAO,MAAM,wBAAwB,UAAW,SAAS,KAAG,QAAQ,eAAe,GAAG,eAAe,EAAE,CACrD,CAAA;AAElD;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,UAAW,SAAS,KAAG,QAAQ,sBAAsB,GAAG,sBAAsB,EAAE,CAClE,CAAA;AAE9C,eAAO,MAAM,yBAAyB,QAAS,MAAM,kBAAoC,CAAA;AACzF,eAAO,MAAM,mBAAmB,QAAS,MAAM,kBAA8B,CAAA;AAC7E,eAAO,MAAM,qBAAqB,QAAS,MAAM,kBAAqC,CAAA;AACtF,eAAO,MAAM,yBAAyB,QAAS,MAAM,kBAAyC,CAAA;AAC9F,eAAO,MAAM,wBAAwB,QAAS,MAAM,kBAAsC,CAAA;AAC1F,eAAO,MAAM,uBAAuB,QAAS,MAAM,kBAAqC,CAAA;AACxF,eAAO,MAAM,kBAAkB,QAAS,MAAM,kBAAgC,CAAA;AAG9E,eAAO,MAAM,sBAAsB,QATY,MAAM,kBASU,CAAA;AAC/D,eAAO,MAAM,WAAW,yBAAmB,CAAA;AAC3C,eAAO,MAAM,eAAe,UA5De,SAAS,KAAG,QAAQ,eAAe,GAAG,eAAe,EAAE,CA4DhD,CAAA"}
|
||||
{"version":3,"file":"nets.d.ts","sourceRoot":"","sources":["../../src/globalApi/nets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAEzD,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACnC,OAAO,EAAE,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;AAC3E,OAAO,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AACzE,OAAO,EAAE,qBAAqB,EAAE,MAAM,0CAA0C,CAAC;AACjF,OAAO,EAAE,kBAAkB,EAAE,MAAM,0CAA0C,CAAC;AAG9E,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAClE,OAAO,EAAE,qBAAqB,EAAE,MAAM,yCAAyC,CAAC;AAChF,OAAO,EAAE,gBAAgB,EAAE,MAAM,sCAAsC,CAAC;AACxE,OAAO,EAAE,uBAAuB,EAAE,MAAM,6CAA6C,CAAC;AACtF,OAAO,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE/D,eAAO,MAAM,IAAI;;;;;;;;;CAShB,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,cAAc,UAAW,SAAS,WAAW,qBAAqB,KAAG,QAAQ,aAAa,EAAE,CACxD,CAAA;AAEjD;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB,UAAW,SAAS,WAAW,uBAAuB,KAAG,QAAQ,aAAa,EAAE,CAC1D,CAAA;AAEnD;;;;;;GAMG;AACH,eAAO,MAAM,UAAU,UAAW,SAAS,WAAW,kBAAkB,KAAG,QAAQ,aAAa,EAAE,CACrD,CAAA;AAE7C;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,UAAW,SAAS,KAAG,QAAQ,eAAe,GAAG,eAAe,EAAE,CACnD,CAAA;AAE/C;;;;;;;;GAQG;AACH,eAAO,MAAM,uBAAuB,UAAW,SAAS,KAAG,QAAQ,eAAe,GAAG,eAAe,EAAE,CACnD,CAAA;AAEnD;;;;;;;;;GASG;AACH,eAAO,MAAM,qBAAqB,UAAW,SAAS,KAAG,QAAQ,YAAY,GAAG,YAAY,EAAE,CACxC,CAAA;AAGtD;;;;;;GAMG;AACH,eAAO,MAAM,wBAAwB,UAAW,SAAS,KAAG,QAAQ,eAAe,GAAG,eAAe,EAAE,CACrD,CAAA;AAElD;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,UAAW,SAAS,KAAG,QAAQ,sBAAsB,GAAG,sBAAsB,EAAE,CAClE,CAAA;AAE9C,eAAO,MAAM,uBAAuB,QAAS,MAAM,kBAAkC,CAAA;AACrF,eAAO,MAAM,yBAAyB,QAAS,MAAM,kBAAoC,CAAA;AACzF,eAAO,MAAM,mBAAmB,QAAS,MAAM,kBAA8B,CAAA;AAC7E,eAAO,MAAM,qBAAqB,QAAS,MAAM,kBAAqC,CAAA;AACtF,eAAO,MAAM,yBAAyB,QAAS,MAAM,kBAAyC,CAAA;AAC9F,eAAO,MAAM,wBAAwB,QAAS,MAAM,kBAAsC,CAAA;AAC1F,eAAO,MAAM,uBAAuB,QAAS,MAAM,kBAAqC,CAAA;AACxF,eAAO,MAAM,kBAAkB,QAAS,MAAM,kBAAgC,CAAA;AAG9E,eAAO,MAAM,sBAAsB,QAVU,MAAM,kBAUU,CAAA;AAC7D,eAAO,MAAM,WAAW,UA1Fc,SAAS,WAAW,qBAAqB,KAAG,QAAQ,aAAa,EAAE,CA0FhE,CAAA;AACzC,eAAO,MAAM,eAAe,UA7De,SAAS,KAAG,QAAQ,eAAe,GAAG,eAAe,EAAE,CA6DhD,CAAA"}
|
|
@ -3,9 +3,11 @@ import { FaceExpressionNet } from '../faceExpressionNet/FaceExpressionNet';
|
|||
import { FaceLandmark68Net } from '../faceLandmarkNet/FaceLandmark68Net';
|
||||
import { FaceLandmark68TinyNet } from '../faceLandmarkNet/FaceLandmark68TinyNet';
|
||||
import { FaceRecognitionNet } from '../faceRecognitionNet/FaceRecognitionNet';
|
||||
import { SsdMobilenetv1 } from '../ssdMobilenetv1/SsdMobilenetv1';
|
||||
import { TinyFaceDetector } from '../tinyFaceDetector/TinyFaceDetector';
|
||||
import { TinyYolov2 } from '../tinyYolov2';
|
||||
export const nets = {
|
||||
ssdMobilenetv1: new SsdMobilenetv1(),
|
||||
tinyFaceDetector: new TinyFaceDetector(),
|
||||
tinyYolov2: new TinyYolov2(),
|
||||
faceLandmark68Net: new FaceLandmark68Net(),
|
||||
|
@ -14,6 +16,14 @@ export const nets = {
|
|||
faceExpressionNet: new FaceExpressionNet(),
|
||||
ageGenderNet: new AgeGenderNet()
|
||||
};
|
||||
/**
|
||||
* Attempts to detect all faces in an image using SSD Mobilenetv1 Network.
|
||||
*
|
||||
* @param input The input image.
|
||||
* @param options (optional, default: see SsdMobilenetv1Options constructor for default parameters).
|
||||
* @returns Bounding box of each face with score.
|
||||
*/
|
||||
export const ssdMobilenetv1 = (input, options) => nets.ssdMobilenetv1.locateFaces(input, options);
|
||||
/**
|
||||
* Attempts to detect all faces in an image using the Tiny Face Detector.
|
||||
*
|
||||
|
@ -22,6 +32,14 @@ export const nets = {
|
|||
* @returns Bounding box of each face with score.
|
||||
*/
|
||||
export const tinyFaceDetector = (input, options) => nets.tinyFaceDetector.locateFaces(input, options);
|
||||
/**
|
||||
* Attempts to detect all faces in an image using the Tiny Yolov2 Network.
|
||||
*
|
||||
* @param input The input image.
|
||||
* @param options (optional, default: see TinyYolov2Options constructor for default parameters).
|
||||
* @returns Bounding box of each face with score.
|
||||
*/
|
||||
export const tinyYolov2 = (input, options) => nets.tinyYolov2.locateFaces(input, options);
|
||||
/**
|
||||
* Detects the 68 point face landmark positions of the face shown in an image.
|
||||
*
|
||||
|
@ -67,6 +85,7 @@ export const recognizeFaceExpressions = (input) => nets.faceExpressionNet.predic
|
|||
* @returns Predictions with age, gender and gender probability or array thereof in case of batch input.
|
||||
*/
|
||||
export const predictAgeAndGender = (input) => nets.ageGenderNet.predictAgeAndGender(input);
|
||||
export const loadSsdMobilenetv1Model = (url) => nets.ssdMobilenetv1.load(url);
|
||||
export const loadTinyFaceDetectorModel = (url) => nets.tinyFaceDetector.load(url);
|
||||
export const loadTinyYolov2Model = (url) => nets.tinyYolov2.load(url);
|
||||
export const loadFaceLandmarkModel = (url) => nets.faceLandmark68Net.load(url);
|
||||
|
@ -75,7 +94,7 @@ export const loadFaceRecognitionModel = (url) => nets.faceRecognitionNet.load(ur
|
|||
export const loadFaceExpressionModel = (url) => nets.faceExpressionNet.load(url);
|
||||
export const loadAgeGenderModel = (url) => nets.ageGenderNet.load(url);
|
||||
// backward compatibility
|
||||
export const loadFaceDetectionModel = loadTinyFaceDetectorModel;
|
||||
export const locateFaces = TinyFaceDetector;
|
||||
export const loadFaceDetectionModel = loadSsdMobilenetv1Model;
|
||||
export const locateFaces = ssdMobilenetv1;
|
||||
export const detectLandmarks = detectFaceLandmarks;
|
||||
//# sourceMappingURL=nets.js.map
|
|
@ -1 +1 @@
|
|||
{"version":3,"file":"nets.js","sourceRoot":"","sources":["../../src/globalApi/nets.ts"],"names":[],"mappings":"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"}
|
||||
{"version":3,"file":"nets.js","sourceRoot":"","sources":["../../src/globalApi/nets.ts"],"names":[],"mappings":"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"}
|
|
@ -1,6 +1,8 @@
|
|||
import { FaceDetection } from '../classes/FaceDetection';
|
||||
import { TNetInput } from '../dom';
|
||||
import { SsdMobilenetv1Options } from '../ssdMobilenetv1/SsdMobilenetv1Options';
|
||||
import { TinyFaceDetectorOptions } from '../tinyFaceDetector/TinyFaceDetectorOptions';
|
||||
export declare type FaceDetectionOptions = TinyFaceDetectorOptions;
|
||||
import { TinyYolov2Options } from '../tinyYolov2';
|
||||
export declare type FaceDetectionOptions = TinyFaceDetectorOptions | SsdMobilenetv1Options | TinyYolov2Options;
|
||||
export declare type FaceDetectionFunction = (input: TNetInput) => Promise<FaceDetection[]>;
|
||||
//# sourceMappingURL=types.d.ts.map
|
|
@ -1 +1 @@
|
|||
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/globalApi/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACnC,OAAO,EAAE,uBAAuB,EAAE,MAAM,6CAA6C,CAAC;AAEtF,oBAAY,oBAAoB,GAAG,uBAAuB,CAAA;AAE1D,oBAAY,qBAAqB,GAAG,CAAC,KAAK,EAAE,SAAS,KAAK,OAAO,CAAC,aAAa,EAAE,CAAC,CAAA"}
|
||||
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/globalApi/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACnC,OAAO,EAAE,qBAAqB,EAAE,MAAM,yCAAyC,CAAC;AAChF,OAAO,EAAE,uBAAuB,EAAE,MAAM,6CAA6C,CAAC;AACtF,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAElD,oBAAY,oBAAoB,GAAG,uBAAuB,GAAG,qBAAqB,GAAG,iBAAiB,CAAA;AAEtG,oBAAY,qBAAqB,GAAG,CAAC,KAAK,EAAE,SAAS,KAAK,OAAO,CAAC,aAAa,EAAE,CAAC,CAAA"}
|
|
@ -1,4 +1,4 @@
|
|||
import * as tf from '@tensorflow/tfjs';
|
||||
import * as tf from '@tensorflow/tfjs-core';
|
||||
import * as draw from './draw';
|
||||
import * as utils from './utils';
|
||||
export { draw, utils, tf };
|
||||
|
@ -12,6 +12,7 @@ export * from './faceRecognitionNet/index';
|
|||
export * from './factories/index';
|
||||
export * from './globalApi/index';
|
||||
export * from './ops/index';
|
||||
export * from './ssdMobilenetv1/index';
|
||||
export * from './tinyFaceDetector/index';
|
||||
export * from './tinyYolov2/index';
|
||||
export * from './euclideanDistance';
|
||||
|
|
|
@ -1 +1 @@
|
|||
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,QAAQ,CAAC;AAC/B,OAAO,KAAK,KAAK,MAAM,SAAS,CAAC;AAEjC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,CAAA;AAE1B,cAAc,sBAAsB,CAAC;AACrC,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,2BAA2B,CAAC;AAC1C,cAAc,yBAAyB,CAAC;AACxC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC;AAC5B,cAAc,0BAA0B,CAAC;AACzC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC"}
|
||||
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAE5C,OAAO,KAAK,IAAI,MAAM,QAAQ,CAAC;AAC/B,OAAO,KAAK,KAAK,MAAM,SAAS,CAAC;AAEjC,OAAO,EACL,IAAI,EACJ,KAAK,EACL,EAAE,EACH,CAAA;AAED,cAAc,sBAAsB,CAAC;AACrC,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,2BAA2B,CAAC;AAC1C,cAAc,yBAAyB,CAAC;AACxC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC;AAC5B,cAAc,wBAAwB,CAAC;AACvC,cAAc,0BAA0B,CAAC;AACzC,cAAc,oBAAoB,CAAC;AAEnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC"}
|
|
@ -1,4 +1,4 @@
|
|||
import * as tf from '@tensorflow/tfjs';
|
||||
import * as tf from '@tensorflow/tfjs-core';
|
||||
import * as draw from './draw';
|
||||
import * as utils from './utils';
|
||||
export { draw, utils, tf };
|
||||
|
@ -12,6 +12,7 @@ export * from './faceRecognitionNet/index';
|
|||
export * from './factories/index';
|
||||
export * from './globalApi/index';
|
||||
export * from './ops/index';
|
||||
export * from './ssdMobilenetv1/index';
|
||||
export * from './tinyFaceDetector/index';
|
||||
export * from './tinyYolov2/index';
|
||||
export * from './euclideanDistance';
|
||||
|
|
|
@ -1 +1 @@
|
|||
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,QAAQ,CAAC;AAC/B,OAAO,KAAK,KAAK,MAAM,SAAS,CAAC;AAEjC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,CAAA;AAE1B,cAAc,sBAAsB,CAAC;AACrC,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,2BAA2B,CAAC;AAC1C,cAAc,yBAAyB,CAAC;AACxC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC;AAC5B,cAAc,0BAA0B,CAAC;AACzC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC"}
|
||||
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAE5C,OAAO,KAAK,IAAI,MAAM,QAAQ,CAAC;AAC/B,OAAO,KAAK,KAAK,MAAM,SAAS,CAAC;AAEjC,OAAO,EACL,IAAI,EACJ,KAAK,EACL,EAAE,EACH,CAAA;AAED,cAAc,sBAAsB,CAAC;AACrC,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,2BAA2B,CAAC;AAC1C,cAAc,yBAAyB,CAAC;AACxC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC;AAC5B,cAAc,wBAAwB,CAAC;AACvC,cAAc,0BAA0B,CAAC;AACzC,cAAc,oBAAoB,CAAC;AAEnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC"}
|
|
@ -1 +1 @@
|
|||
{"version":3,"file":"resizeResults.d.ts","sourceRoot":"","sources":["../src/resizeResults.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,WAAW,EAAE,MAAM,WAAW,CAAC;AAMpD,wBAAgB,aAAa,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,UAAU,EAAE,WAAW,GAAG,CAAC,CAoBvE"}
|
||||
{"version":3,"file":"resizeResults.d.ts","sourceRoot":"","sources":["../src/resizeResults.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,WAAW,EAAE,MAAM,WAAW,CAAC;AAMpD,wBAAgB,aAAa,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,UAAU,EAAE,WAAW,GAAG,CAAC,CA4BvE"}
|
|
@ -1 +1 @@
|
|||
{"version":3,"file":"resizeResults.js","sourceRoot":"","sources":["../src/resizeResults.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAe,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AAC7F,OAAO,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AAE7F,MAAM,UAAU,aAAa,CAAI,OAAU,EAAE,UAAuB;IAClE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,UAAU,CAAC,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,MAAM,CAAC,CAAA;IAC7E,IAAI,KAAK,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,EAAE;QAC7B,MAAM,IAAI,KAAK,CAAC,uCAAuC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAA;KAC5F;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;QAC1B,OAAO,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,aAAa,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAa,CAAA;KAC7E;IACD,IAAI,mBAAmB,CAAC,OAAO,CAAC,EAAE;QAChC,MAAM,gBAAgB,GAAG,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;QACjE,MAAM,gBAAgB,GAAG,OAAO,CAAC,kBAAkB,CAAC,OAAO,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,EAAE,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QACpH,OAAO,uBAAuB,CAAC,uBAAuB,CAAC,OAAO,EAAE,gBAAgB,CAAC,EAAE,gBAAgB,CAAC,CAAA;KACrG;IACD,IAAI,mBAAmB,CAAC,OAAO,CAAC,EAAE;QAChC,OAAO,uBAAuB,CAAC,OAAO,EAAE,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAA;KAClF;IACD,IAAI,OAAO,YAAY,aAAa,IAAI,OAAO,YAAY,aAAa,EAAE;QACxE,OAAQ,OAAe,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;KAC/C;IACD,OAAO,OAAO,CAAA;AAChB,CAAC"}
|
||||
{"version":3,"file":"resizeResults.js","sourceRoot":"","sources":["../src/resizeResults.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAe,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AAC7F,OAAO,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AAE7F,MAAM,UAAU,aAAa,CAAI,OAAU,EAAE,UAAuB;IAElE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,UAAU,CAAC,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,MAAM,CAAC,CAAA;IAE7E,IAAI,KAAK,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,EAAE;QAC7B,MAAM,IAAI,KAAK,CAAC,uCAAuC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAA;KAC5F;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;QAC1B,OAAO,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,aAAa,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAa,CAAA;KAC7E;IAED,IAAI,mBAAmB,CAAC,OAAO,CAAC,EAAE;QAChC,MAAM,gBAAgB,GAAG,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;QACjE,MAAM,gBAAgB,GAAG,OAAO,CAAC,kBAAkB,CAAC,OAAO,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,EAAE,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QAEpH,OAAO,uBAAuB,CAAC,uBAAuB,CAAC,OAAO,EAAE,gBAAgB,CAAC,EAAE,gBAAgB,CAAC,CAAA;KACrG;IAED,IAAI,mBAAmB,CAAC,OAAO,CAAC,EAAE;QAChC,OAAO,uBAAuB,CAAC,OAAO,EAAE,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAA;KAClF;IAED,IAAI,OAAO,YAAY,aAAa,IAAI,OAAO,YAAY,aAAa,EAAE;QACxE,OAAQ,OAAe,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;KAC/C;IAED,OAAO,OAAO,CAAA;AAChB,CAAC"}
|
|
@ -0,0 +1,28 @@
|
|||
import * as tf from '@tensorflow/tfjs-core';
|
||||
import { FaceDetection } from '../classes/FaceDetection';
|
||||
import { NetInput, TNetInput } from '../dom';
|
||||
import { NeuralNetwork } from '../NeuralNetwork';
|
||||
import { ISsdMobilenetv1Options } from './SsdMobilenetv1Options';
|
||||
import { NetParams } from './types';
|
||||
export declare class SsdMobilenetv1 extends NeuralNetwork<NetParams> {
|
||||
constructor();
|
||||
forwardInput(input: NetInput): {
|
||||
boxes: tf.Tensor2D[];
|
||||
scores: tf.Tensor1D[];
|
||||
};
|
||||
forward(input: TNetInput): Promise<{
|
||||
boxes: tf.Tensor2D[];
|
||||
scores: tf.Tensor1D[];
|
||||
}>;
|
||||
locateFaces(input: TNetInput, options?: ISsdMobilenetv1Options): Promise<FaceDetection[]>;
|
||||
protected getDefaultModelName(): string;
|
||||
protected extractParamsFromWeigthMap(weightMap: tf.NamedTensorMap): {
|
||||
params: NetParams;
|
||||
paramMappings: import("../common").ParamMapping[];
|
||||
};
|
||||
protected extractParams(weights: Float32Array): {
|
||||
params: NetParams;
|
||||
paramMappings: import("../common").ParamMapping[];
|
||||
};
|
||||
}
|
||||
//# sourceMappingURL=SsdMobilenetv1.d.ts.map
|
|
@ -0,0 +1 @@
|
|||
{"version":3,"file":"SsdMobilenetv1.d.ts","sourceRoot":"","sources":["../../src/ssdMobilenetv1/SsdMobilenetv1.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAG5C,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAc,MAAM,QAAQ,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAOjD,OAAO,EAAE,sBAAsB,EAAyB,MAAM,yBAAyB,CAAC;AACxF,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAGpC,qBAAa,cAAe,SAAQ,aAAa,CAAC,SAAS,CAAC;;IAMnD,YAAY,CAAC,KAAK,EAAE,QAAQ;;;;IAuBtB,OAAO,CAAC,KAAK,EAAE,SAAS;;;;IAIxB,WAAW,CACtB,KAAK,EAAE,SAAS,EAChB,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAAC,aAAa,EAAE,CAAC;IAqE3B,SAAS,CAAC,mBAAmB,IAAI,MAAM;IAIvC,SAAS,CAAC,0BAA0B,CAAC,SAAS,EAAE,EAAE,CAAC,cAAc;;;;IAIjE,SAAS,CAAC,aAAa,CAAC,OAAO,EAAE,YAAY;;;;CAG9C"}
|
|
@ -0,0 +1,82 @@
|
|||
import * as tf from '@tensorflow/tfjs-core';
|
||||
import { Rect } from '../classes';
|
||||
import { FaceDetection } from '../classes/FaceDetection';
|
||||
import { toNetInput } from '../dom';
|
||||
import { NeuralNetwork } from '../NeuralNetwork';
|
||||
import { extractParams } from './extractParams';
|
||||
import { extractParamsFromWeigthMap } from './extractParamsFromWeigthMap';
|
||||
import { mobileNetV1 } from './mobileNetV1';
|
||||
import { nonMaxSuppression } from './nonMaxSuppression';
|
||||
import { outputLayer } from './outputLayer';
|
||||
import { predictionLayer } from './predictionLayer';
|
||||
import { SsdMobilenetv1Options } from './SsdMobilenetv1Options';
|
||||
export class SsdMobilenetv1 extends NeuralNetwork {
|
||||
constructor() {
|
||||
super('SsdMobilenetv1');
|
||||
}
|
||||
forwardInput(input) {
|
||||
const { params } = this;
|
||||
if (!params) {
|
||||
throw new Error('SsdMobilenetv1 - load model before inference');
|
||||
}
|
||||
return tf.tidy(() => {
|
||||
const batchTensor = input.toBatchTensor(512, false).toFloat();
|
||||
const x = tf.sub(tf.mul(batchTensor, tf.scalar(0.007843137718737125)), tf.scalar(1));
|
||||
const features = mobileNetV1(x, params.mobilenetv1);
|
||||
const { boxPredictions, classPredictions } = predictionLayer(features.out, features.conv11, params.prediction_layer);
|
||||
return outputLayer(boxPredictions, classPredictions, params.output_layer);
|
||||
});
|
||||
}
|
||||
async forward(input) {
|
||||
return this.forwardInput(await toNetInput(input));
|
||||
}
|
||||
async locateFaces(input, options = {}) {
|
||||
const { maxResults, minConfidence } = new SsdMobilenetv1Options(options);
|
||||
const netInput = await toNetInput(input);
|
||||
const { boxes: _boxes, scores: _scores } = this.forwardInput(netInput);
|
||||
// TODO batches
|
||||
const boxes = _boxes[0];
|
||||
const scores = _scores[0];
|
||||
for (let i = 1; i < _boxes.length; i++) {
|
||||
_boxes[i].dispose();
|
||||
_scores[i].dispose();
|
||||
}
|
||||
// TODO find a better way to filter by minConfidence
|
||||
const scoresData = Array.from(await scores.data());
|
||||
const iouThreshold = 0.5;
|
||||
const indices = nonMaxSuppression(boxes, scoresData, maxResults, iouThreshold, minConfidence);
|
||||
const reshapedDims = netInput.getReshapedInputDimensions(0);
|
||||
const inputSize = netInput.inputSize;
|
||||
const padX = inputSize / reshapedDims.width;
|
||||
const padY = inputSize / reshapedDims.height;
|
||||
const boxesData = boxes.arraySync();
|
||||
const results = indices
|
||||
.map(idx => {
|
||||
const [top, bottom] = [
|
||||
Math.max(0, boxesData[idx][0]),
|
||||
Math.min(1.0, boxesData[idx][2])
|
||||
].map(val => val * padY);
|
||||
const [left, right] = [
|
||||
Math.max(0, boxesData[idx][1]),
|
||||
Math.min(1.0, boxesData[idx][3])
|
||||
].map(val => val * padX);
|
||||
return new FaceDetection(scoresData[idx], new Rect(left, top, right - left, bottom - top), {
|
||||
height: netInput.getInputHeight(0),
|
||||
width: netInput.getInputWidth(0)
|
||||
});
|
||||
});
|
||||
boxes.dispose();
|
||||
scores.dispose();
|
||||
return results;
|
||||
}
|
||||
getDefaultModelName() {
|
||||
return 'ssd_mobilenetv1_model';
|
||||
}
|
||||
extractParamsFromWeigthMap(weightMap) {
|
||||
return extractParamsFromWeigthMap(weightMap);
|
||||
}
|
||||
extractParams(weights) {
|
||||
return extractParams(weights);
|
||||
}
|
||||
}
|
||||
//# sourceMappingURL=SsdMobilenetv1.js.map
|
|
@ -0,0 +1 @@
|
|||
{"version":3,"file":"SsdMobilenetv1.js","sourceRoot":"","sources":["../../src/ssdMobilenetv1/SsdMobilenetv1.ts"],"names":[],"mappings":"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"}
|
|
@ -0,0 +1,13 @@
|
|||
export interface ISsdMobilenetv1Options {
|
||||
minConfidence?: number;
|
||||
maxResults?: number;
|
||||
}
|
||||
export declare class SsdMobilenetv1Options {
|
||||
protected _name: string;
|
||||
private _minConfidence;
|
||||
private _maxResults;
|
||||
constructor({ minConfidence, maxResults }?: ISsdMobilenetv1Options);
|
||||
get minConfidence(): number;
|
||||
get maxResults(): number;
|
||||
}
|
||||
//# sourceMappingURL=SsdMobilenetv1Options.d.ts.map
|
|
@ -0,0 +1 @@
|
|||
{"version":3,"file":"SsdMobilenetv1Options.d.ts","sourceRoot":"","sources":["../../src/ssdMobilenetv1/SsdMobilenetv1Options.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,sBAAsB;IACrC,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,qBAAa,qBAAqB;IAChC,SAAS,CAAC,KAAK,EAAE,MAAM,CAA0B;IAEjD,OAAO,CAAC,cAAc,CAAQ;IAC9B,OAAO,CAAC,WAAW,CAAQ;gBAEf,EAAE,aAAa,EAAE,UAAU,EAAE,GAAE,sBAA2B;IAatE,IAAI,aAAa,IAAI,MAAM,CAA+B;IAC1D,IAAI,UAAU,IAAI,MAAM,CAA4B;CACrD"}
|
|
@ -0,0 +1,16 @@
|
|||
export class SsdMobilenetv1Options {
|
||||
constructor({ minConfidence, maxResults } = {}) {
|
||||
this._name = 'SsdMobilenetv1Options';
|
||||
this._minConfidence = minConfidence || 0.5;
|
||||
this._maxResults = maxResults || 100;
|
||||
if (typeof this._minConfidence !== 'number' || this._minConfidence <= 0 || this._minConfidence >= 1) {
|
||||
throw new Error(`${this._name} - expected minConfidence to be a number between 0 and 1`);
|
||||
}
|
||||
if (typeof this._maxResults !== 'number') {
|
||||
throw new Error(`${this._name} - expected maxResults to be a number`);
|
||||
}
|
||||
}
|
||||
get minConfidence() { return this._minConfidence; }
|
||||
get maxResults() { return this._maxResults; }
|
||||
}
|
||||
//# sourceMappingURL=SsdMobilenetv1Options.js.map
|
|
@ -0,0 +1 @@
|
|||
{"version":3,"file":"SsdMobilenetv1Options.js","sourceRoot":"","sources":["../../src/ssdMobilenetv1/SsdMobilenetv1Options.ts"],"names":[],"mappings":"AAKA,MAAM,OAAO,qBAAqB;IAMhC,YAAY,EAAE,aAAa,EAAE,UAAU,KAA6B,EAAE;QAL5D,UAAK,GAAW,uBAAuB,CAAA;QAM/C,IAAI,CAAC,cAAc,GAAG,aAAa,IAAI,GAAG,CAAA;QAC1C,IAAI,CAAC,WAAW,GAAG,UAAU,IAAI,GAAG,CAAA;QAEpC,IAAI,OAAO,IAAI,CAAC,cAAc,KAAK,QAAQ,IAAI,IAAI,CAAC,cAAc,IAAI,CAAC,IAAI,IAAI,CAAC,cAAc,IAAI,CAAC,EAAE;YACnG,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,CAAC,KAAK,0DAA0D,CAAC,CAAA;SACzF;QAED,IAAI,OAAO,IAAI,CAAC,WAAW,KAAK,QAAQ,EAAE;YACxC,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,CAAC,KAAK,uCAAuC,CAAC,CAAA;SACtE;IACH,CAAC;IAED,IAAI,aAAa,KAAa,OAAO,IAAI,CAAC,cAAc,CAAA,CAAC,CAAC;IAC1D,IAAI,UAAU,KAAa,OAAO,IAAI,CAAC,WAAW,CAAA,CAAC,CAAC;CACrD"}
|
|
@ -0,0 +1,7 @@
|
|||
import * as tf from '@tensorflow/tfjs-core';
|
||||
import { BoxPredictionParams } from './types';
|
||||
export declare function boxPredictionLayer(x: tf.Tensor4D, params: BoxPredictionParams): {
|
||||
boxPredictionEncoding: tf.Tensor<tf.Rank>;
|
||||
classPrediction: tf.Tensor<tf.Rank>;
|
||||
};
|
||||
//# sourceMappingURL=boxPredictionLayer.d.ts.map
|
|
@ -0,0 +1 @@
|
|||
{"version":3,"file":"boxPredictionLayer.d.ts","sourceRoot":"","sources":["../../src/ssdMobilenetv1/boxPredictionLayer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAG5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAG9C,wBAAgB,kBAAkB,CAChC,CAAC,EAAE,EAAE,CAAC,QAAQ,EACd,MAAM,EAAE,mBAAmB;;;EAoB5B"}
|
|
@ -0,0 +1,14 @@
|
|||
import * as tf from '@tensorflow/tfjs-core';
|
||||
import { convLayer } from '../common';
|
||||
export function boxPredictionLayer(x, params) {
|
||||
return tf.tidy(() => {
|
||||
const batchSize = x.shape[0];
|
||||
const boxPredictionEncoding = tf.reshape(convLayer(x, params.box_encoding_predictor), [batchSize, -1, 1, 4]);
|
||||
const classPrediction = tf.reshape(convLayer(x, params.class_predictor), [batchSize, -1, 3]);
|
||||
return {
|
||||
boxPredictionEncoding,
|
||||
classPrediction
|
||||
};
|
||||
});
|
||||
}
|
||||
//# sourceMappingURL=boxPredictionLayer.js.map
|
|
@ -0,0 +1 @@
|
|||
{"version":3,"file":"boxPredictionLayer.js","sourceRoot":"","sources":["../../src/ssdMobilenetv1/boxPredictionLayer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAE5C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAItC,MAAM,UAAU,kBAAkB,CAChC,CAAc,EACd,MAA2B;IAE3B,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;QAElB,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;QAE5B,MAAM,qBAAqB,GAAG,EAAE,CAAC,OAAO,CACtC,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,sBAAsB,CAAC,EAC3C,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CACtB,CAAA;QACD,MAAM,eAAe,GAAG,EAAE,CAAC,OAAO,CAChC,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,eAAe,CAAC,EACpC,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CACnB,CAAA;QAED,OAAO;YACL,qBAAqB;YACrB,eAAe;SAChB,CAAA;IACH,CAAC,CAAC,CAAA;AACJ,CAAC"}
|
|
@ -0,0 +1,7 @@
|
|||
import { ParamMapping } from '../common';
|
||||
import { NetParams } from './types';
|
||||
export declare function extractParams(weights: Float32Array): {
|
||||
params: NetParams;
|
||||
paramMappings: ParamMapping[];
|
||||
};
|
||||
//# sourceMappingURL=extractParams.d.ts.map
|
|
@ -0,0 +1 @@
|
|||
{"version":3,"file":"extractParams.d.ts","sourceRoot":"","sources":["../../src/ssdMobilenetv1/extractParams.ts"],"names":[],"mappings":"AAEA,OAAO,EAA0B,YAAY,EAAqC,MAAM,WAAW,CAAC;AACpG,OAAO,EAAe,SAAS,EAA8C,MAAM,SAAS,CAAC;AA8L7F,wBAAgB,aAAa,CAAC,OAAO,EAAE,YAAY,GAAG;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,aAAa,EAAE,YAAY,EAAE,CAAA;CAAE,CAsCzG"}
|
|
@ -0,0 +1,159 @@
|
|||
import * as tf from '@tensorflow/tfjs-core';
|
||||
import { extractWeightsFactory } from '../common';
|
||||
function extractorsFactory(extractWeights, paramMappings) {
|
||||
function extractDepthwiseConvParams(numChannels, mappedPrefix) {
|
||||
const filters = tf.tensor4d(extractWeights(3 * 3 * numChannels), [3, 3, numChannels, 1]);
|
||||
const batch_norm_scale = tf.tensor1d(extractWeights(numChannels));
|
||||
const batch_norm_offset = tf.tensor1d(extractWeights(numChannels));
|
||||
const batch_norm_mean = tf.tensor1d(extractWeights(numChannels));
|
||||
const batch_norm_variance = tf.tensor1d(extractWeights(numChannels));
|
||||
paramMappings.push({ paramPath: `${mappedPrefix}/filters` }, { paramPath: `${mappedPrefix}/batch_norm_scale` }, { paramPath: `${mappedPrefix}/batch_norm_offset` }, { paramPath: `${mappedPrefix}/batch_norm_mean` }, { paramPath: `${mappedPrefix}/batch_norm_variance` });
|
||||
return {
|
||||
filters,
|
||||
batch_norm_scale,
|
||||
batch_norm_offset,
|
||||
batch_norm_mean,
|
||||
batch_norm_variance
|
||||
};
|
||||
}
|
||||
function extractConvParams(channelsIn, channelsOut, filterSize, mappedPrefix, isPointwiseConv) {
|
||||
const filters = tf.tensor4d(extractWeights(channelsIn * channelsOut * filterSize * filterSize), [filterSize, filterSize, channelsIn, channelsOut]);
|
||||
const bias = tf.tensor1d(extractWeights(channelsOut));
|
||||
paramMappings.push({ paramPath: `${mappedPrefix}/filters` }, { paramPath: `${mappedPrefix}/${isPointwiseConv ? 'batch_norm_offset' : 'bias'}` });
|
||||
return { filters, bias };
|
||||
}
|
||||
function extractPointwiseConvParams(channelsIn, channelsOut, filterSize, mappedPrefix) {
|
||||
const { filters, bias } = extractConvParams(channelsIn, channelsOut, filterSize, mappedPrefix, true);
|
||||
return {
|
||||
filters,
|
||||
batch_norm_offset: bias
|
||||
};
|
||||
}
|
||||
function extractConvPairParams(channelsIn, channelsOut, mappedPrefix) {
|
||||
const depthwise_conv = extractDepthwiseConvParams(channelsIn, `${mappedPrefix}/depthwise_conv`);
|
||||
const pointwise_conv = extractPointwiseConvParams(channelsIn, channelsOut, 1, `${mappedPrefix}/pointwise_conv`);
|
||||
return { depthwise_conv, pointwise_conv };
|
||||
}
|
||||
function extractMobilenetV1Params() {
|
||||
const conv_0 = extractPointwiseConvParams(3, 32, 3, 'mobilenetv1/conv_0');
|
||||
const conv_1 = extractConvPairParams(32, 64, 'mobilenetv1/conv_1');
|
||||
const conv_2 = extractConvPairParams(64, 128, 'mobilenetv1/conv_2');
|
||||
const conv_3 = extractConvPairParams(128, 128, 'mobilenetv1/conv_3');
|
||||
const conv_4 = extractConvPairParams(128, 256, 'mobilenetv1/conv_4');
|
||||
const conv_5 = extractConvPairParams(256, 256, 'mobilenetv1/conv_5');
|
||||
const conv_6 = extractConvPairParams(256, 512, 'mobilenetv1/conv_6');
|
||||
const conv_7 = extractConvPairParams(512, 512, 'mobilenetv1/conv_7');
|
||||
const conv_8 = extractConvPairParams(512, 512, 'mobilenetv1/conv_8');
|
||||
const conv_9 = extractConvPairParams(512, 512, 'mobilenetv1/conv_9');
|
||||
const conv_10 = extractConvPairParams(512, 512, 'mobilenetv1/conv_10');
|
||||
const conv_11 = extractConvPairParams(512, 512, 'mobilenetv1/conv_11');
|
||||
const conv_12 = extractConvPairParams(512, 1024, 'mobilenetv1/conv_12');
|
||||
const conv_13 = extractConvPairParams(1024, 1024, 'mobilenetv1/conv_13');
|
||||
return {
|
||||
conv_0,
|
||||
conv_1,
|
||||
conv_2,
|
||||
conv_3,
|
||||
conv_4,
|
||||
conv_5,
|
||||
conv_6,
|
||||
conv_7,
|
||||
conv_8,
|
||||
conv_9,
|
||||
conv_10,
|
||||
conv_11,
|
||||
conv_12,
|
||||
conv_13
|
||||
};
|
||||
}
|
||||
function extractPredictionLayerParams() {
|
||||
const conv_0 = extractPointwiseConvParams(1024, 256, 1, 'prediction_layer/conv_0');
|
||||
const conv_1 = extractPointwiseConvParams(256, 512, 3, 'prediction_layer/conv_1');
|
||||
const conv_2 = extractPointwiseConvParams(512, 128, 1, 'prediction_layer/conv_2');
|
||||
const conv_3 = extractPointwiseConvParams(128, 256, 3, 'prediction_layer/conv_3');
|
||||
const conv_4 = extractPointwiseConvParams(256, 128, 1, 'prediction_layer/conv_4');
|
||||
const conv_5 = extractPointwiseConvParams(128, 256, 3, 'prediction_layer/conv_5');
|
||||
const conv_6 = extractPointwiseConvParams(256, 64, 1, 'prediction_layer/conv_6');
|
||||
const conv_7 = extractPointwiseConvParams(64, 128, 3, 'prediction_layer/conv_7');
|
||||
const box_encoding_0_predictor = extractConvParams(512, 12, 1, 'prediction_layer/box_predictor_0/box_encoding_predictor');
|
||||
const class_predictor_0 = extractConvParams(512, 9, 1, 'prediction_layer/box_predictor_0/class_predictor');
|
||||
const box_encoding_1_predictor = extractConvParams(1024, 24, 1, 'prediction_layer/box_predictor_1/box_encoding_predictor');
|
||||
const class_predictor_1 = extractConvParams(1024, 18, 1, 'prediction_layer/box_predictor_1/class_predictor');
|
||||
const box_encoding_2_predictor = extractConvParams(512, 24, 1, 'prediction_layer/box_predictor_2/box_encoding_predictor');
|
||||
const class_predictor_2 = extractConvParams(512, 18, 1, 'prediction_layer/box_predictor_2/class_predictor');
|
||||
const box_encoding_3_predictor = extractConvParams(256, 24, 1, 'prediction_layer/box_predictor_3/box_encoding_predictor');
|
||||
const class_predictor_3 = extractConvParams(256, 18, 1, 'prediction_layer/box_predictor_3/class_predictor');
|
||||
const box_encoding_4_predictor = extractConvParams(256, 24, 1, 'prediction_layer/box_predictor_4/box_encoding_predictor');
|
||||
const class_predictor_4 = extractConvParams(256, 18, 1, 'prediction_layer/box_predictor_4/class_predictor');
|
||||
const box_encoding_5_predictor = extractConvParams(128, 24, 1, 'prediction_layer/box_predictor_5/box_encoding_predictor');
|
||||
const class_predictor_5 = extractConvParams(128, 18, 1, 'prediction_layer/box_predictor_5/class_predictor');
|
||||
const box_predictor_0 = {
|
||||
box_encoding_predictor: box_encoding_0_predictor,
|
||||
class_predictor: class_predictor_0
|
||||
};
|
||||
const box_predictor_1 = {
|
||||
box_encoding_predictor: box_encoding_1_predictor,
|
||||
class_predictor: class_predictor_1
|
||||
};
|
||||
const box_predictor_2 = {
|
||||
box_encoding_predictor: box_encoding_2_predictor,
|
||||
class_predictor: class_predictor_2
|
||||
};
|
||||
const box_predictor_3 = {
|
||||
box_encoding_predictor: box_encoding_3_predictor,
|
||||
class_predictor: class_predictor_3
|
||||
};
|
||||
const box_predictor_4 = {
|
||||
box_encoding_predictor: box_encoding_4_predictor,
|
||||
class_predictor: class_predictor_4
|
||||
};
|
||||
const box_predictor_5 = {
|
||||
box_encoding_predictor: box_encoding_5_predictor,
|
||||
class_predictor: class_predictor_5
|
||||
};
|
||||
return {
|
||||
conv_0,
|
||||
conv_1,
|
||||
conv_2,
|
||||
conv_3,
|
||||
conv_4,
|
||||
conv_5,
|
||||
conv_6,
|
||||
conv_7,
|
||||
box_predictor_0,
|
||||
box_predictor_1,
|
||||
box_predictor_2,
|
||||
box_predictor_3,
|
||||
box_predictor_4,
|
||||
box_predictor_5
|
||||
};
|
||||
}
|
||||
return {
|
||||
extractMobilenetV1Params,
|
||||
extractPredictionLayerParams
|
||||
};
|
||||
}
|
||||
export function extractParams(weights) {
|
||||
const paramMappings = [];
|
||||
const { extractWeights, getRemainingWeights } = extractWeightsFactory(weights);
|
||||
const { extractMobilenetV1Params, extractPredictionLayerParams } = extractorsFactory(extractWeights, paramMappings);
|
||||
const mobilenetv1 = extractMobilenetV1Params();
|
||||
const prediction_layer = extractPredictionLayerParams();
|
||||
const extra_dim = tf.tensor3d(extractWeights(5118 * 4), [1, 5118, 4]);
|
||||
const output_layer = {
|
||||
extra_dim
|
||||
};
|
||||
paramMappings.push({ paramPath: 'output_layer/extra_dim' });
|
||||
if (getRemainingWeights().length !== 0) {
|
||||
throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);
|
||||
}
|
||||
return {
|
||||
params: {
|
||||
mobilenetv1,
|
||||
prediction_layer,
|
||||
output_layer
|
||||
},
|
||||
paramMappings
|
||||
};
|
||||
}
|
||||
//# sourceMappingURL=extractParams.js.map
|
File diff suppressed because one or more lines are too long
|
@ -0,0 +1,8 @@
|
|||
import * as tf from '@tensorflow/tfjs-core';
|
||||
import { ParamMapping } from '../common';
|
||||
import { NetParams } from './types';
|
||||
export declare function extractParamsFromWeigthMap(weightMap: tf.NamedTensorMap): {
|
||||
params: NetParams;
|
||||
paramMappings: ParamMapping[];
|
||||
};
|
||||
//# sourceMappingURL=extractParamsFromWeigthMap.d.ts.map
|
|
@ -0,0 +1 @@
|
|||
{"version":3,"file":"extractParamsFromWeigthMap.d.ts","sourceRoot":"","sources":["../../src/ssdMobilenetv1/extractParamsFromWeigthMap.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAE5C,OAAO,EAAqE,YAAY,EAAE,MAAM,WAAW,CAAC;AAE5G,OAAO,EAAoC,SAAS,EAA8C,MAAM,SAAS,CAAC;AAwGlH,wBAAgB,0BAA0B,CACxC,SAAS,EAAE,EAAE,CAAC,cAAc,GAC3B;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,aAAa,EAAE,YAAY,EAAE,CAAA;CAAE,CA2BtD"}
|
|
@ -0,0 +1,100 @@
|
|||
import { disposeUnusedWeightTensors, extractWeightEntryFactory } from '../common';
|
||||
import { isTensor3D } from '../utils';
|
||||
function extractorsFactory(weightMap, paramMappings) {
|
||||
const extractWeightEntry = extractWeightEntryFactory(weightMap, paramMappings);
|
||||
function extractPointwiseConvParams(prefix, idx, mappedPrefix) {
|
||||
const filters = extractWeightEntry(`${prefix}/Conv2d_${idx}_pointwise/weights`, 4, `${mappedPrefix}/filters`);
|
||||
const batch_norm_offset = extractWeightEntry(`${prefix}/Conv2d_${idx}_pointwise/convolution_bn_offset`, 1, `${mappedPrefix}/batch_norm_offset`);
|
||||
return { filters, batch_norm_offset };
|
||||
}
|
||||
function extractConvPairParams(idx) {
|
||||
const mappedPrefix = `mobilenetv1/conv_${idx}`;
|
||||
const prefixDepthwiseConv = `MobilenetV1/Conv2d_${idx}_depthwise`;
|
||||
const mappedPrefixDepthwiseConv = `${mappedPrefix}/depthwise_conv`;
|
||||
const mappedPrefixPointwiseConv = `${mappedPrefix}/pointwise_conv`;
|
||||
const filters = extractWeightEntry(`${prefixDepthwiseConv}/depthwise_weights`, 4, `${mappedPrefixDepthwiseConv}/filters`);
|
||||
const batch_norm_scale = extractWeightEntry(`${prefixDepthwiseConv}/BatchNorm/gamma`, 1, `${mappedPrefixDepthwiseConv}/batch_norm_scale`);
|
||||
const batch_norm_offset = extractWeightEntry(`${prefixDepthwiseConv}/BatchNorm/beta`, 1, `${mappedPrefixDepthwiseConv}/batch_norm_offset`);
|
||||
const batch_norm_mean = extractWeightEntry(`${prefixDepthwiseConv}/BatchNorm/moving_mean`, 1, `${mappedPrefixDepthwiseConv}/batch_norm_mean`);
|
||||
const batch_norm_variance = extractWeightEntry(`${prefixDepthwiseConv}/BatchNorm/moving_variance`, 1, `${mappedPrefixDepthwiseConv}/batch_norm_variance`);
|
||||
return {
|
||||
depthwise_conv: {
|
||||
filters,
|
||||
batch_norm_scale,
|
||||
batch_norm_offset,
|
||||
batch_norm_mean,
|
||||
batch_norm_variance
|
||||
},
|
||||
pointwise_conv: extractPointwiseConvParams('MobilenetV1', idx, mappedPrefixPointwiseConv)
|
||||
};
|
||||
}
|
||||
function extractMobilenetV1Params() {
|
||||
return {
|
||||
conv_0: extractPointwiseConvParams('MobilenetV1', 0, 'mobilenetv1/conv_0'),
|
||||
conv_1: extractConvPairParams(1),
|
||||
conv_2: extractConvPairParams(2),
|
||||
conv_3: extractConvPairParams(3),
|
||||
conv_4: extractConvPairParams(4),
|
||||
conv_5: extractConvPairParams(5),
|
||||
conv_6: extractConvPairParams(6),
|
||||
conv_7: extractConvPairParams(7),
|
||||
conv_8: extractConvPairParams(8),
|
||||
conv_9: extractConvPairParams(9),
|
||||
conv_10: extractConvPairParams(10),
|
||||
conv_11: extractConvPairParams(11),
|
||||
conv_12: extractConvPairParams(12),
|
||||
conv_13: extractConvPairParams(13)
|
||||
};
|
||||
}
|
||||
function extractConvParams(prefix, mappedPrefix) {
|
||||
const filters = extractWeightEntry(`${prefix}/weights`, 4, `${mappedPrefix}/filters`);
|
||||
const bias = extractWeightEntry(`${prefix}/biases`, 1, `${mappedPrefix}/bias`);
|
||||
return { filters, bias };
|
||||
}
|
||||
function extractBoxPredictorParams(idx) {
|
||||
const box_encoding_predictor = extractConvParams(`Prediction/BoxPredictor_${idx}/BoxEncodingPredictor`, `prediction_layer/box_predictor_${idx}/box_encoding_predictor`);
|
||||
const class_predictor = extractConvParams(`Prediction/BoxPredictor_${idx}/ClassPredictor`, `prediction_layer/box_predictor_${idx}/class_predictor`);
|
||||
return { box_encoding_predictor, class_predictor };
|
||||
}
|
||||
function extractPredictionLayerParams() {
|
||||
return {
|
||||
conv_0: extractPointwiseConvParams('Prediction', 0, 'prediction_layer/conv_0'),
|
||||
conv_1: extractPointwiseConvParams('Prediction', 1, 'prediction_layer/conv_1'),
|
||||
conv_2: extractPointwiseConvParams('Prediction', 2, 'prediction_layer/conv_2'),
|
||||
conv_3: extractPointwiseConvParams('Prediction', 3, 'prediction_layer/conv_3'),
|
||||
conv_4: extractPointwiseConvParams('Prediction', 4, 'prediction_layer/conv_4'),
|
||||
conv_5: extractPointwiseConvParams('Prediction', 5, 'prediction_layer/conv_5'),
|
||||
conv_6: extractPointwiseConvParams('Prediction', 6, 'prediction_layer/conv_6'),
|
||||
conv_7: extractPointwiseConvParams('Prediction', 7, 'prediction_layer/conv_7'),
|
||||
box_predictor_0: extractBoxPredictorParams(0),
|
||||
box_predictor_1: extractBoxPredictorParams(1),
|
||||
box_predictor_2: extractBoxPredictorParams(2),
|
||||
box_predictor_3: extractBoxPredictorParams(3),
|
||||
box_predictor_4: extractBoxPredictorParams(4),
|
||||
box_predictor_5: extractBoxPredictorParams(5)
|
||||
};
|
||||
}
|
||||
return {
|
||||
extractMobilenetV1Params,
|
||||
extractPredictionLayerParams
|
||||
};
|
||||
}
|
||||
export function extractParamsFromWeigthMap(weightMap) {
|
||||
const paramMappings = [];
|
||||
const { extractMobilenetV1Params, extractPredictionLayerParams } = extractorsFactory(weightMap, paramMappings);
|
||||
const extra_dim = weightMap['Output/extra_dim'];
|
||||
paramMappings.push({ originalPath: 'Output/extra_dim', paramPath: 'output_layer/extra_dim' });
|
||||
if (!isTensor3D(extra_dim)) {
|
||||
throw new Error(`expected weightMap['Output/extra_dim'] to be a Tensor3D, instead have ${extra_dim}`);
|
||||
}
|
||||
const params = {
|
||||
mobilenetv1: extractMobilenetV1Params(),
|
||||
prediction_layer: extractPredictionLayerParams(),
|
||||
output_layer: {
|
||||
extra_dim
|
||||
}
|
||||
};
|
||||
disposeUnusedWeightTensors(weightMap, paramMappings);
|
||||
return { params, paramMappings };
|
||||
}
|
||||
//# sourceMappingURL=extractParamsFromWeigthMap.js.map
|
|
@ -0,0 +1 @@
|
|||
{"version":3,"file":"extractParamsFromWeigthMap.js","sourceRoot":"","sources":["../../src/ssdMobilenetv1/extractParamsFromWeigthMap.ts"],"names":[],"mappings":"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"}
|
|
@ -0,0 +1,8 @@
|
|||
import { SsdMobilenetv1 } from './SsdMobilenetv1';
|
||||
export * from './SsdMobilenetv1';
|
||||
export * from './SsdMobilenetv1Options';
|
||||
export declare function createSsdMobilenetv1(weights: Float32Array): SsdMobilenetv1;
|
||||
export declare function createFaceDetectionNet(weights: Float32Array): SsdMobilenetv1;
|
||||
export declare class FaceDetectionNet extends SsdMobilenetv1 {
|
||||
}
|
||||
//# sourceMappingURL=index.d.ts.map
|
|
@ -0,0 +1 @@
|
|||
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ssdMobilenetv1/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,cAAc,kBAAkB,CAAC;AACjC,cAAc,yBAAyB,CAAC;AAExC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,YAAY,kBAIzD;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,YAAY,kBAE3D;AAGD,qBAAa,gBAAiB,SAAQ,cAAc;CAAG"}
|
|
@ -0,0 +1,15 @@
|
|||
import { SsdMobilenetv1 } from './SsdMobilenetv1';
|
||||
export * from './SsdMobilenetv1';
|
||||
export * from './SsdMobilenetv1Options';
|
||||
export function createSsdMobilenetv1(weights) {
|
||||
const net = new SsdMobilenetv1();
|
||||
net.extractWeights(weights);
|
||||
return net;
|
||||
}
|
||||
export function createFaceDetectionNet(weights) {
|
||||
return createSsdMobilenetv1(weights);
|
||||
}
|
||||
// alias for backward compatibily
|
||||
export class FaceDetectionNet extends SsdMobilenetv1 {
|
||||
}
|
||||
//# sourceMappingURL=index.js.map
|
|
@ -0,0 +1 @@
|
|||
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ssdMobilenetv1/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,cAAc,kBAAkB,CAAC;AACjC,cAAc,yBAAyB,CAAC;AAExC,MAAM,UAAU,oBAAoB,CAAC,OAAqB;IACxD,MAAM,GAAG,GAAG,IAAI,cAAc,EAAE,CAAA;IAChC,GAAG,CAAC,cAAc,CAAC,OAAO,CAAC,CAAA;IAC3B,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,OAAqB;IAC1D,OAAO,oBAAoB,CAAC,OAAO,CAAC,CAAA;AACtC,CAAC;AAED,iCAAiC;AACjC,MAAM,OAAO,gBAAiB,SAAQ,cAAc;CAAG"}
|
|
@ -0,0 +1,7 @@
|
|||
import * as tf from '@tensorflow/tfjs-core';
|
||||
import { MobileNetV1 } from './types';
|
||||
export declare function mobileNetV1(x: tf.Tensor4D, params: MobileNetV1.Params): {
|
||||
out: tf.Tensor4D;
|
||||
conv11: any;
|
||||
};
|
||||
//# sourceMappingURL=mobileNetV1.d.ts.map
|
|
@ -0,0 +1 @@
|
|||
{"version":3,"file":"mobileNetV1.d.ts","sourceRoot":"","sources":["../../src/ssdMobilenetv1/mobileNetV1.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAG5C,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AA6BtC,wBAAgB,WAAW,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,CAAC,MAAM;;;EA0CrE"}
|
|
@ -0,0 +1,51 @@
|
|||
import * as tf from '@tensorflow/tfjs-core';
|
||||
import { pointwiseConvLayer } from './pointwiseConvLayer';
|
||||
const epsilon = 0.0010000000474974513;
|
||||
function depthwiseConvLayer(x, params, strides) {
|
||||
return tf.tidy(() => {
|
||||
let out = tf.depthwiseConv2d(x, params.filters, strides, 'same');
|
||||
out = tf.batchNorm(out, params.batch_norm_mean, params.batch_norm_variance, params.batch_norm_offset, params.batch_norm_scale, epsilon);
|
||||
return tf.clipByValue(out, 0, 6);
|
||||
});
|
||||
}
|
||||
function getStridesForLayerIdx(layerIdx) {
|
||||
return [2, 4, 6, 12].some(idx => idx === layerIdx) ? [2, 2] : [1, 1];
|
||||
}
|
||||
export function mobileNetV1(x, params) {
|
||||
return tf.tidy(() => {
|
||||
let conv11 = null;
|
||||
let out = pointwiseConvLayer(x, params.conv_0, [2, 2]);
|
||||
const convPairParams = [
|
||||
params.conv_1,
|
||||
params.conv_2,
|
||||
params.conv_3,
|
||||
params.conv_4,
|
||||
params.conv_5,
|
||||
params.conv_6,
|
||||
params.conv_7,
|
||||
params.conv_8,
|
||||
params.conv_9,
|
||||
params.conv_10,
|
||||
params.conv_11,
|
||||
params.conv_12,
|
||||
params.conv_13
|
||||
];
|
||||
convPairParams.forEach((param, i) => {
|
||||
const layerIdx = i + 1;
|
||||
const depthwiseConvStrides = getStridesForLayerIdx(layerIdx);
|
||||
out = depthwiseConvLayer(out, param.depthwise_conv, depthwiseConvStrides);
|
||||
out = pointwiseConvLayer(out, param.pointwise_conv, [1, 1]);
|
||||
if (layerIdx === 11) {
|
||||
conv11 = out;
|
||||
}
|
||||
});
|
||||
if (conv11 === null) {
|
||||
throw new Error('mobileNetV1 - output of conv layer 11 is null');
|
||||
}
|
||||
return {
|
||||
out,
|
||||
conv11: conv11
|
||||
};
|
||||
});
|
||||
}
|
||||
//# sourceMappingURL=mobileNetV1.js.map
|
|
@ -0,0 +1 @@
|
|||
{"version":3,"file":"mobileNetV1.js","sourceRoot":"","sources":["../../src/ssdMobilenetv1/mobileNetV1.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAE5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAG1D,MAAM,OAAO,GAAG,qBAAqB,CAAA;AAErC,SAAS,kBAAkB,CACzB,CAAc,EACd,MAAuC,EACvC,OAAyB;IAEzB,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;QAElB,IAAI,GAAG,GAAG,EAAE,CAAC,eAAe,CAAC,CAAC,EAAE,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,CAAA;QAChE,GAAG,GAAG,EAAE,CAAC,SAAS,CAChB,GAAG,EACH,MAAM,CAAC,eAAe,EACtB,MAAM,CAAC,mBAAmB,EAC1B,MAAM,CAAC,iBAAiB,EACxB,MAAM,CAAC,gBAAgB,EACvB,OAAO,CACR,CAAA;QACD,OAAO,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IAElC,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,SAAS,qBAAqB,CAAC,QAAgB;IAC7C,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;AACtE,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,CAAc,EAAE,MAA0B;IACpE,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;QAElB,IAAI,MAAM,GAAG,IAAI,CAAA;QACjB,IAAI,GAAG,GAAG,kBAAkB,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QAEtD,MAAM,cAAc,GAAG;YACrB,MAAM,CAAC,MAAM;YACb,MAAM,CAAC,MAAM;YACb,MAAM,CAAC,MAAM;YACb,MAAM,CAAC,MAAM;YACb,MAAM,CAAC,MAAM;YACb,MAAM,CAAC,MAAM;YACb,MAAM,CAAC,MAAM;YACb,MAAM,CAAC,MAAM;YACb,MAAM,CAAC,MAAM;YACb,MAAM,CAAC,OAAO;YACd,MAAM,CAAC,OAAO;YACd,MAAM,CAAC,OAAO;YACd,MAAM,CAAC,OAAO;SACf,CAAA;QAED,cAAc,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;YAClC,MAAM,QAAQ,GAAG,CAAC,GAAG,CAAC,CAAA;YACtB,MAAM,oBAAoB,GAAG,qBAAqB,CAAC,QAAQ,CAAC,CAAA;YAC5D,GAAG,GAAG,kBAAkB,CAAC,GAAG,EAAE,KAAK,CAAC,cAAc,EAAE,oBAAoB,CAAC,CAAA;YACzE,GAAG,GAAG,kBAAkB,CAAC,GAAG,EAAE,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;YAC3D,IAAI,QAAQ,KAAK,EAAE,EAAE;gBACnB,MAAM,GAAG,GAAG,CAAA;aACb;QACH,CAAC,CAAC,CAAA;QAEF,IAAI,MAAM,KAAK,IAAI,EAAE;YACnB,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAA;SACjE;QAED,OAAO;YACL,GAAG;YACH,MAAM,EAAE,MAAa;SACtB,CAAA;IAEH,CAAC,CAAC,CAAA;AACJ,CAAC"}
|
|
@ -0,0 +1,3 @@
|
|||
import * as tf from '@tensorflow/tfjs-core';
|
||||
export declare function nonMaxSuppression(boxes: tf.Tensor2D, scores: number[], maxOutputSize: number, iouThreshold: number, scoreThreshold: number): number[];
|
||||
//# sourceMappingURL=nonMaxSuppression.d.ts.map
|
|
@ -0,0 +1 @@
|
|||
{"version":3,"file":"nonMaxSuppression.d.ts","sourceRoot":"","sources":["../../src/ssdMobilenetv1/nonMaxSuppression.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,uBAAuB,CAAA;AAE3C,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,EAAE,CAAC,QAAQ,EAClB,MAAM,EAAE,MAAM,EAAE,EAChB,aAAa,EAAE,MAAM,EACrB,YAAY,EAAE,MAAM,EACpB,cAAc,EAAE,MAAM,GACrB,MAAM,EAAE,CAwCV"}
|
|
@ -0,0 +1,54 @@
|
|||
export function nonMaxSuppression(boxes, scores, maxOutputSize, iouThreshold, scoreThreshold) {
|
||||
const numBoxes = boxes.shape[0];
|
||||
const outputSize = Math.min(maxOutputSize, numBoxes);
|
||||
const candidates = scores
|
||||
.map((score, boxIndex) => ({ score, boxIndex }))
|
||||
.filter(c => c.score > scoreThreshold)
|
||||
.sort((c1, c2) => c2.score - c1.score);
|
||||
const suppressFunc = (x) => x <= iouThreshold ? 1 : 0;
|
||||
const selected = [];
|
||||
candidates.forEach(c => {
|
||||
if (selected.length >= outputSize) {
|
||||
return;
|
||||
}
|
||||
const originalScore = c.score;
|
||||
for (let j = selected.length - 1; j >= 0; --j) {
|
||||
const iou = IOU(boxes, c.boxIndex, selected[j]);
|
||||
if (iou === 0.0) {
|
||||
continue;
|
||||
}
|
||||
c.score *= suppressFunc(iou);
|
||||
if (c.score <= scoreThreshold) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (originalScore === c.score) {
|
||||
selected.push(c.boxIndex);
|
||||
}
|
||||
});
|
||||
return selected;
|
||||
}
|
||||
function IOU(boxes, i, j) {
|
||||
const boxesData = boxes.arraySync();
|
||||
const yminI = Math.min(boxesData[i][0], boxesData[i][2]);
|
||||
const xminI = Math.min(boxesData[i][1], boxesData[i][3]);
|
||||
const ymaxI = Math.max(boxesData[i][0], boxesData[i][2]);
|
||||
const xmaxI = Math.max(boxesData[i][1], boxesData[i][3]);
|
||||
const yminJ = Math.min(boxesData[j][0], boxesData[j][2]);
|
||||
const xminJ = Math.min(boxesData[j][1], boxesData[j][3]);
|
||||
const ymaxJ = Math.max(boxesData[j][0], boxesData[j][2]);
|
||||
const xmaxJ = Math.max(boxesData[j][1], boxesData[j][3]);
|
||||
const areaI = (ymaxI - yminI) * (xmaxI - xminI);
|
||||
const areaJ = (ymaxJ - yminJ) * (xmaxJ - xminJ);
|
||||
if (areaI <= 0 || areaJ <= 0) {
|
||||
return 0.0;
|
||||
}
|
||||
const intersectionYmin = Math.max(yminI, yminJ);
|
||||
const intersectionXmin = Math.max(xminI, xminJ);
|
||||
const intersectionYmax = Math.min(ymaxI, ymaxJ);
|
||||
const intersectionXmax = Math.min(xmaxI, xmaxJ);
|
||||
const intersectionArea = Math.max(intersectionYmax - intersectionYmin, 0.0) *
|
||||
Math.max(intersectionXmax - intersectionXmin, 0.0);
|
||||
return intersectionArea / (areaI + areaJ - intersectionArea);
|
||||
}
|
||||
//# sourceMappingURL=nonMaxSuppression.js.map
|
|
@ -0,0 +1 @@
|
|||
{"version":3,"file":"nonMaxSuppression.js","sourceRoot":"","sources":["../../src/ssdMobilenetv1/nonMaxSuppression.ts"],"names":[],"mappings":"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"}
|
|
@ -0,0 +1,7 @@
|
|||
import * as tf from '@tensorflow/tfjs-core';
|
||||
import { OutputLayerParams } from './types';
|
||||
export declare function outputLayer(boxPredictions: tf.Tensor4D, classPredictions: tf.Tensor4D, params: OutputLayerParams): {
|
||||
boxes: tf.Tensor2D[];
|
||||
scores: tf.Tensor1D[];
|
||||
};
|
||||
//# sourceMappingURL=outputLayer.d.ts.map
|
|
@ -0,0 +1 @@
|
|||
{"version":3,"file":"outputLayer.d.ts","sourceRoot":"","sources":["../../src/ssdMobilenetv1/outputLayer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAE5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AA+C5C,wBAAgB,WAAW,CACzB,cAAc,EAAE,EAAE,CAAC,QAAQ,EAC3B,gBAAgB,EAAE,EAAE,CAAC,QAAQ,EAC7B,MAAM,EAAE,iBAAiB;;;EAgC1B"}
|
|
@ -0,0 +1,47 @@
|
|||
import * as tf from '@tensorflow/tfjs-core';
|
||||
function getCenterCoordinatesAndSizesLayer(x) {
|
||||
const vec = tf.unstack(tf.transpose(x, [1, 0]));
|
||||
const sizes = [
|
||||
tf.sub(vec[2], vec[0]),
|
||||
tf.sub(vec[3], vec[1])
|
||||
];
|
||||
const centers = [
|
||||
tf.add(vec[0], tf.div(sizes[0], tf.scalar(2))),
|
||||
tf.add(vec[1], tf.div(sizes[1], tf.scalar(2)))
|
||||
];
|
||||
return {
|
||||
sizes,
|
||||
centers
|
||||
};
|
||||
}
|
||||
function decodeBoxesLayer(x0, x1) {
|
||||
const { sizes, centers } = getCenterCoordinatesAndSizesLayer(x0);
|
||||
const vec = tf.unstack(tf.transpose(x1, [1, 0]));
|
||||
const div0_out = tf.div(tf.mul(tf.exp(tf.div(vec[2], tf.scalar(5))), sizes[0]), tf.scalar(2));
|
||||
const add0_out = tf.add(tf.mul(tf.div(vec[0], tf.scalar(10)), sizes[0]), centers[0]);
|
||||
const div1_out = tf.div(tf.mul(tf.exp(tf.div(vec[3], tf.scalar(5))), sizes[1]), tf.scalar(2));
|
||||
const add1_out = tf.add(tf.mul(tf.div(vec[1], tf.scalar(10)), sizes[1]), centers[1]);
|
||||
return tf.transpose(tf.stack([
|
||||
tf.sub(add0_out, div0_out),
|
||||
tf.sub(add1_out, div1_out),
|
||||
tf.add(add0_out, div0_out),
|
||||
tf.add(add1_out, div1_out)
|
||||
]), [1, 0]);
|
||||
}
|
||||
export function outputLayer(boxPredictions, classPredictions, params) {
|
||||
return tf.tidy(() => {
|
||||
const batchSize = boxPredictions.shape[0];
|
||||
let boxes = decodeBoxesLayer(tf.reshape(tf.tile(params.extra_dim, [batchSize, 1, 1]), [-1, 4]), tf.reshape(boxPredictions, [-1, 4]));
|
||||
boxes = tf.reshape(boxes, [batchSize, (boxes.shape[0] / batchSize), 4]);
|
||||
const scoresAndClasses = tf.sigmoid(tf.slice(classPredictions, [0, 0, 1], [-1, -1, -1]));
|
||||
let scores = tf.slice(scoresAndClasses, [0, 0, 0], [-1, -1, 1]);
|
||||
scores = tf.reshape(scores, [batchSize, scores.shape[1]]);
|
||||
const boxesByBatch = tf.unstack(boxes);
|
||||
const scoresByBatch = tf.unstack(scores);
|
||||
return {
|
||||
boxes: boxesByBatch,
|
||||
scores: scoresByBatch
|
||||
};
|
||||
});
|
||||
}
|
||||
//# sourceMappingURL=outputLayer.js.map
|
|
@ -0,0 +1 @@
|
|||
{"version":3,"file":"outputLayer.js","sourceRoot":"","sources":["../../src/ssdMobilenetv1/outputLayer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAK5C,SAAS,iCAAiC,CAAC,CAAc;IACvD,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;IAE/C,MAAM,KAAK,GAAG;QACZ,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;QACtB,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;KACvB,CAAA;IAED,MAAM,OAAO,GAAG;QACd,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9C,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;KAC/C,CAAA;IAED,OAAO;QACL,KAAK;QACL,OAAO;KACR,CAAA;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,EAAe,EAAE,EAAe;IACxD,MAAM,EACJ,KAAK,EACL,OAAO,EACR,GAAG,iCAAiC,CAAC,EAAE,CAAC,CAAA;IAEzC,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;IAEhD,MAAM,QAAQ,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;IAC7F,MAAM,QAAQ,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAA;IAEpF,MAAM,QAAQ,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;IAC7F,MAAM,QAAQ,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAA;IAEpF,OAAO,EAAE,CAAC,SAAS,CACjB,EAAE,CAAC,KAAK,CAAC;QACP,EAAE,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC;QAC1B,EAAE,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC;QAC1B,EAAE,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC;QAC1B,EAAE,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC;KAC3B,CAAC,EACF,CAAC,CAAC,EAAE,CAAC,CAAC,CACP,CAAA;AACH,CAAC;AAED,MAAM,UAAU,WAAW,CACzB,cAA2B,EAC3B,gBAA6B,EAC7B,MAAyB;IAEzB,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;QAElB,MAAM,SAAS,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;QAEzC,IAAI,KAAK,GAAG,gBAAgB,CAC1B,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAgB,EAChF,EAAE,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAgB,CACnD,CAAA;QACD,KAAK,GAAG,EAAE,CAAC,OAAO,CAChB,KAAK,EACL,CAAC,SAAS,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC,CAC7C,CAAA;QAED,MAAM,gBAAgB,GAAG,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,gBAAgB,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QACxF,IAAI,MAAM,GAAG,EAAE,CAAC,KAAK,CAAC,gBAAgB,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAc,CAAA;QAE5E,MAAM,GAAG,EAAE,CAAC,OAAO,CACjB,MAAM,EACN,CAAC,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAW,CAAC,CACvC,CAAA;QAED,MAAM,YAAY,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAkB,CAAA;QACvD,MAAM,aAAa,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAkB,CAAA;QAEzD,OAAO;YACL,KAAK,EAAE,YAAY;YACnB,MAAM,EAAE,aAAa;SACtB,CAAA;IAEH,CAAC,CAAC,CAAA;AACJ,CAAC"}
|
|
@ -0,0 +1,4 @@
|
|||
import * as tf from '@tensorflow/tfjs-core';
|
||||
import { PointwiseConvParams } from './types';
|
||||
export declare function pointwiseConvLayer(x: tf.Tensor4D, params: PointwiseConvParams, strides: [number, number]): tf.Tensor4D;
|
||||
//# sourceMappingURL=pointwiseConvLayer.d.ts.map
|
|
@ -0,0 +1 @@
|
|||
{"version":3,"file":"pointwiseConvLayer.d.ts","sourceRoot":"","sources":["../../src/ssdMobilenetv1/pointwiseConvLayer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAE5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAE9C,wBAAgB,kBAAkB,CAChC,CAAC,EAAE,EAAE,CAAC,QAAQ,EACd,MAAM,EAAE,mBAAmB,EAC3B,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,eAS1B"}
|
|
@ -0,0 +1,9 @@
|
|||
import * as tf from '@tensorflow/tfjs-core';
|
||||
export function pointwiseConvLayer(x, params, strides) {
|
||||
return tf.tidy(() => {
|
||||
let out = tf.conv2d(x, params.filters, strides, 'same');
|
||||
out = tf.add(out, params.batch_norm_offset);
|
||||
return tf.clipByValue(out, 0, 6);
|
||||
});
|
||||
}
|
||||
//# sourceMappingURL=pointwiseConvLayer.js.map
|
|
@ -0,0 +1 @@
|
|||
{"version":3,"file":"pointwiseConvLayer.js","sourceRoot":"","sources":["../../src/ssdMobilenetv1/pointwiseConvLayer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAI5C,MAAM,UAAU,kBAAkB,CAChC,CAAc,EACd,MAA2B,EAC3B,OAAyB;IAEzB,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;QAElB,IAAI,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,CAAA;QACvD,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,iBAAiB,CAAC,CAAA;QAC3C,OAAO,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IAElC,CAAC,CAAC,CAAA;AACJ,CAAC"}
|
|
@ -0,0 +1,7 @@
|
|||
import * as tf from '@tensorflow/tfjs-core';
|
||||
import { PredictionLayerParams } from './types';
|
||||
export declare function predictionLayer(x: tf.Tensor4D, conv11: tf.Tensor4D, params: PredictionLayerParams): {
|
||||
boxPredictions: tf.Tensor4D;
|
||||
classPredictions: tf.Tensor4D;
|
||||
};
|
||||
//# sourceMappingURL=predictionLayer.d.ts.map
|
|
@ -0,0 +1 @@
|
|||
{"version":3,"file":"predictionLayer.d.ts","sourceRoot":"","sources":["../../src/ssdMobilenetv1/predictionLayer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAI5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAEhD,wBAAgB,eAAe,CAC7B,CAAC,EAAE,EAAE,CAAC,QAAQ,EACd,MAAM,EAAE,EAAE,CAAC,QAAQ,EACnB,MAAM,EAAE,qBAAqB;;;EA2C9B"}
|
|
@ -0,0 +1,42 @@
|
|||
import * as tf from '@tensorflow/tfjs-core';
|
||||
import { boxPredictionLayer } from './boxPredictionLayer';
|
||||
import { pointwiseConvLayer } from './pointwiseConvLayer';
|
||||
export function predictionLayer(x, conv11, params) {
|
||||
return tf.tidy(() => {
|
||||
const conv0 = pointwiseConvLayer(x, params.conv_0, [1, 1]);
|
||||
const conv1 = pointwiseConvLayer(conv0, params.conv_1, [2, 2]);
|
||||
const conv2 = pointwiseConvLayer(conv1, params.conv_2, [1, 1]);
|
||||
const conv3 = pointwiseConvLayer(conv2, params.conv_3, [2, 2]);
|
||||
const conv4 = pointwiseConvLayer(conv3, params.conv_4, [1, 1]);
|
||||
const conv5 = pointwiseConvLayer(conv4, params.conv_5, [2, 2]);
|
||||
const conv6 = pointwiseConvLayer(conv5, params.conv_6, [1, 1]);
|
||||
const conv7 = pointwiseConvLayer(conv6, params.conv_7, [2, 2]);
|
||||
const boxPrediction0 = boxPredictionLayer(conv11, params.box_predictor_0);
|
||||
const boxPrediction1 = boxPredictionLayer(x, params.box_predictor_1);
|
||||
const boxPrediction2 = boxPredictionLayer(conv1, params.box_predictor_2);
|
||||
const boxPrediction3 = boxPredictionLayer(conv3, params.box_predictor_3);
|
||||
const boxPrediction4 = boxPredictionLayer(conv5, params.box_predictor_4);
|
||||
const boxPrediction5 = boxPredictionLayer(conv7, params.box_predictor_5);
|
||||
const boxPredictions = tf.concat([
|
||||
boxPrediction0.boxPredictionEncoding,
|
||||
boxPrediction1.boxPredictionEncoding,
|
||||
boxPrediction2.boxPredictionEncoding,
|
||||
boxPrediction3.boxPredictionEncoding,
|
||||
boxPrediction4.boxPredictionEncoding,
|
||||
boxPrediction5.boxPredictionEncoding
|
||||
], 1);
|
||||
const classPredictions = tf.concat([
|
||||
boxPrediction0.classPrediction,
|
||||
boxPrediction1.classPrediction,
|
||||
boxPrediction2.classPrediction,
|
||||
boxPrediction3.classPrediction,
|
||||
boxPrediction4.classPrediction,
|
||||
boxPrediction5.classPrediction
|
||||
], 1);
|
||||
return {
|
||||
boxPredictions,
|
||||
classPredictions
|
||||
};
|
||||
});
|
||||
}
|
||||
//# sourceMappingURL=predictionLayer.js.map
|
|
@ -0,0 +1 @@
|
|||
{"version":3,"file":"predictionLayer.js","sourceRoot":"","sources":["../../src/ssdMobilenetv1/predictionLayer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAE5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAG1D,MAAM,UAAU,eAAe,CAC7B,CAAc,EACd,MAAmB,EACnB,MAA6B;IAE7B,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;QAElB,MAAM,KAAK,GAAG,kBAAkB,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QAC1D,MAAM,KAAK,GAAG,kBAAkB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QAC9D,MAAM,KAAK,GAAG,kBAAkB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QAC9D,MAAM,KAAK,GAAG,kBAAkB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QAC9D,MAAM,KAAK,GAAG,kBAAkB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QAC9D,MAAM,KAAK,GAAG,kBAAkB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QAC9D,MAAM,KAAK,GAAG,kBAAkB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QAC9D,MAAM,KAAK,GAAG,kBAAkB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QAE9D,MAAM,cAAc,GAAG,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,eAAe,CAAC,CAAA;QACzE,MAAM,cAAc,GAAG,kBAAkB,CAAC,CAAC,EAAE,MAAM,CAAC,eAAe,CAAC,CAAA;QACpE,MAAM,cAAc,GAAG,kBAAkB,CAAC,KAAK,EAAE,MAAM,CAAC,eAAe,CAAC,CAAA;QACxE,MAAM,cAAc,GAAG,kBAAkB,CAAC,KAAK,EAAE,MAAM,CAAC,eAAe,CAAC,CAAA;QACxE,MAAM,cAAc,GAAG,kBAAkB,CAAC,KAAK,EAAE,MAAM,CAAC,eAAe,CAAC,CAAA;QACxE,MAAM,cAAc,GAAG,kBAAkB,CAAC,KAAK,EAAE,MAAM,CAAC,eAAe,CAAC,CAAA;QAExE,MAAM,cAAc,GAAG,EAAE,CAAC,MAAM,CAAC;YAC/B,cAAc,CAAC,qBAAqB;YACpC,cAAc,CAAC,qBAAqB;YACpC,cAAc,CAAC,qBAAqB;YACpC,cAAc,CAAC,qBAAqB;YACpC,cAAc,CAAC,qBAAqB;YACpC,cAAc,CAAC,qBAAqB;SACrC,EAAE,CAAC,CAAgB,CAAA;QAEpB,MAAM,gBAAgB,GAAG,EAAE,CAAC,MAAM,CAAC;YACjC,cAAc,CAAC,eAAe;YAC9B,cAAc,CAAC,eAAe;YAC9B,cAAc,CAAC,eAAe;YAC9B,cAAc,CAAC,eAAe;YAC9B,cAAc,CAAC,eAAe;YAC9B,cAAc,CAAC,eAAe;SAC/B,EAAE,CAAC,CAAgB,CAAA;QAEpB,OAAO;YACL,cAAc;YACd,gBAAgB;SACjB,CAAA;IACH,CAAC,CAAC,CAAA;AACJ,CAAC"}
|
|
@ -0,0 +1,64 @@
|
|||
import * as tf from '@tensorflow/tfjs-core';
|
||||
import { ConvParams } from '../common';
|
||||
export declare type PointwiseConvParams = {
|
||||
filters: tf.Tensor4D;
|
||||
batch_norm_offset: tf.Tensor1D;
|
||||
};
|
||||
export declare namespace MobileNetV1 {
|
||||
type DepthwiseConvParams = {
|
||||
filters: tf.Tensor4D;
|
||||
batch_norm_scale: tf.Tensor1D;
|
||||
batch_norm_offset: tf.Tensor1D;
|
||||
batch_norm_mean: tf.Tensor1D;
|
||||
batch_norm_variance: tf.Tensor1D;
|
||||
};
|
||||
type ConvPairParams = {
|
||||
depthwise_conv: DepthwiseConvParams;
|
||||
pointwise_conv: PointwiseConvParams;
|
||||
};
|
||||
type Params = {
|
||||
conv_0: PointwiseConvParams;
|
||||
conv_1: ConvPairParams;
|
||||
conv_2: ConvPairParams;
|
||||
conv_3: ConvPairParams;
|
||||
conv_4: ConvPairParams;
|
||||
conv_5: ConvPairParams;
|
||||
conv_6: ConvPairParams;
|
||||
conv_7: ConvPairParams;
|
||||
conv_8: ConvPairParams;
|
||||
conv_9: ConvPairParams;
|
||||
conv_10: ConvPairParams;
|
||||
conv_11: ConvPairParams;
|
||||
conv_12: ConvPairParams;
|
||||
conv_13: ConvPairParams;
|
||||
};
|
||||
}
|
||||
export declare type BoxPredictionParams = {
|
||||
box_encoding_predictor: ConvParams;
|
||||
class_predictor: ConvParams;
|
||||
};
|
||||
export declare type PredictionLayerParams = {
|
||||
conv_0: PointwiseConvParams;
|
||||
conv_1: PointwiseConvParams;
|
||||
conv_2: PointwiseConvParams;
|
||||
conv_3: PointwiseConvParams;
|
||||
conv_4: PointwiseConvParams;
|
||||
conv_5: PointwiseConvParams;
|
||||
conv_6: PointwiseConvParams;
|
||||
conv_7: PointwiseConvParams;
|
||||
box_predictor_0: BoxPredictionParams;
|
||||
box_predictor_1: BoxPredictionParams;
|
||||
box_predictor_2: BoxPredictionParams;
|
||||
box_predictor_3: BoxPredictionParams;
|
||||
box_predictor_4: BoxPredictionParams;
|
||||
box_predictor_5: BoxPredictionParams;
|
||||
};
|
||||
export declare type OutputLayerParams = {
|
||||
extra_dim: tf.Tensor3D;
|
||||
};
|
||||
export declare type NetParams = {
|
||||
mobilenetv1: MobileNetV1.Params;
|
||||
prediction_layer: PredictionLayerParams;
|
||||
output_layer: OutputLayerParams;
|
||||
};
|
||||
//# sourceMappingURL=types.d.ts.map
|
|
@ -0,0 +1 @@
|
|||
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/ssdMobilenetv1/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAE5C,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAEvC,oBAAY,mBAAmB,GAAG;IAChC,OAAO,EAAE,EAAE,CAAC,QAAQ,CAAA;IACpB,iBAAiB,EAAE,EAAE,CAAC,QAAQ,CAAA;CAC/B,CAAA;AAED,yBAAiB,WAAW,CAAC;IAE3B,KAAY,mBAAmB,GAAG;QAChC,OAAO,EAAE,EAAE,CAAC,QAAQ,CAAA;QACpB,gBAAgB,EAAE,EAAE,CAAC,QAAQ,CAAA;QAC7B,iBAAiB,EAAE,EAAE,CAAC,QAAQ,CAAA;QAC9B,eAAe,EAAE,EAAE,CAAC,QAAQ,CAAA;QAC5B,mBAAmB,EAAE,EAAE,CAAC,QAAQ,CAAA;KACjC,CAAA;IAED,KAAY,cAAc,GAAG;QAC3B,cAAc,EAAE,mBAAmB,CAAA;QACnC,cAAc,EAAE,mBAAmB,CAAA;KACpC,CAAA;IAED,KAAY,MAAM,GAAG;QACnB,MAAM,EAAE,mBAAmB,CAAA;QAC3B,MAAM,EAAE,cAAc,CAAA;QACtB,MAAM,EAAE,cAAc,CAAA;QACtB,MAAM,EAAE,cAAc,CAAA;QACtB,MAAM,EAAE,cAAc,CAAA;QACtB,MAAM,EAAE,cAAc,CAAA;QACtB,MAAM,EAAE,cAAc,CAAA;QACtB,MAAM,EAAE,cAAc,CAAA;QACtB,MAAM,EAAE,cAAc,CAAA;QACtB,MAAM,EAAE,cAAc,CAAA;QACtB,OAAO,EAAE,cAAc,CAAA;QACvB,OAAO,EAAE,cAAc,CAAA;QACvB,OAAO,EAAE,cAAc,CAAA;QACvB,OAAO,EAAE,cAAc,CAAA;KACxB,CAAA;CAEF;AAED,oBAAY,mBAAmB,GAAG;IAChC,sBAAsB,EAAE,UAAU,CAAA;IAClC,eAAe,EAAE,UAAU,CAAA;CAC5B,CAAA;AAED,oBAAY,qBAAqB,GAAG;IAClC,MAAM,EAAE,mBAAmB,CAAA;IAC3B,MAAM,EAAE,mBAAmB,CAAA;IAC3B,MAAM,EAAE,mBAAmB,CAAA;IAC3B,MAAM,EAAE,mBAAmB,CAAA;IAC3B,MAAM,EAAE,mBAAmB,CAAA;IAC3B,MAAM,EAAE,mBAAmB,CAAA;IAC3B,MAAM,EAAE,mBAAmB,CAAA;IAC3B,MAAM,EAAE,mBAAmB,CAAA;IAC3B,eAAe,EAAE,mBAAmB,CAAA;IACpC,eAAe,EAAE,mBAAmB,CAAA;IACpC,eAAe,EAAE,mBAAmB,CAAA;IACpC,eAAe,EAAE,mBAAmB,CAAA;IACpC,eAAe,EAAE,mBAAmB,CAAA;IACpC,eAAe,EAAE,mBAAmB,CAAA;CACrC,CAAA;AAED,oBAAY,iBAAiB,GAAG;IAC9B,SAAS,EAAE,EAAE,CAAC,QAAQ,CAAA;CACvB,CAAA;AAED,oBAAY,SAAS,GAAG;IACtB,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC;IAChC,gBAAgB,EAAE,qBAAqB,CAAC;IACxC,YAAY,EAAE,iBAAiB,CAAA;CAChC,CAAA"}
|
|
@ -0,0 +1,2 @@
|
|||
export {};
|
||||
//# sourceMappingURL=types.js.map
|
|
@ -0,0 +1 @@
|
|||
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/ssdMobilenetv1/types.ts"],"names":[],"mappings":""}
|
File diff suppressed because it is too large
Load Diff
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
|
@ -6,38 +6,48 @@ import { loadWeightMap } from './dom';
|
|||
import { env } from './env';
|
||||
|
||||
export abstract class NeuralNetwork<TNetParams> {
|
||||
|
||||
protected _params: TNetParams | undefined = undefined
|
||||
protected _paramMappings: ParamMapping[] = []
|
||||
|
||||
constructor(protected _name: string) {}
|
||||
|
||||
public get params(): TNetParams | undefined { return this._params }
|
||||
public get paramMappings(): ParamMapping[] { return this._paramMappings }
|
||||
public get isLoaded(): boolean { return !!this.params }
|
||||
|
||||
public getParamFromPath(paramPath: string): tf.Tensor {
|
||||
const { obj, objProp } = this.traversePropertyPath(paramPath)
|
||||
return obj[objProp]
|
||||
}
|
||||
|
||||
public reassignParamFromPath(paramPath: string, tensor: tf.Tensor) {
|
||||
const { obj, objProp } = this.traversePropertyPath(paramPath)
|
||||
obj[objProp].dispose()
|
||||
obj[objProp] = tensor
|
||||
}
|
||||
|
||||
public getParamList() {
|
||||
return this._paramMappings.map(({ paramPath }) => ({
|
||||
path: paramPath,
|
||||
tensor: this.getParamFromPath(paramPath)
|
||||
}))
|
||||
}
|
||||
|
||||
public getTrainableParams() {
|
||||
return this.getParamList().filter(param => param.tensor instanceof tf.Variable)
|
||||
}
|
||||
|
||||
public getFrozenParams() {
|
||||
return this.getParamList().filter(param => !(param.tensor instanceof tf.Variable))
|
||||
}
|
||||
|
||||
public variable() {
|
||||
this.getFrozenParams().forEach(({ path, tensor }) => {
|
||||
this.reassignParamFromPath(path, tensor.variable())
|
||||
})
|
||||
}
|
||||
|
||||
public freeze() {
|
||||
this.getTrainableParams().forEach(({ path, tensor: variable }) => {
|
||||
const tensor = tf.tensor(variable.dataSync())
|
||||
|
@ -45,6 +55,7 @@ export abstract class NeuralNetwork<TNetParams> {
|
|||
this.reassignParamFromPath(path, tensor)
|
||||
})
|
||||
}
|
||||
|
||||
public dispose(throwOnRedispose: boolean = true) {
|
||||
this.getParamList().forEach(param => {
|
||||
if (throwOnRedispose && param.tensor.isDisposed) {
|
||||
|
@ -54,6 +65,7 @@ export abstract class NeuralNetwork<TNetParams> {
|
|||
})
|
||||
this._params = undefined
|
||||
}
|
||||
|
||||
public serializeParams(): Float32Array {
|
||||
return new Float32Array(
|
||||
this.getParamList()
|
||||
|
@ -61,64 +73,83 @@ export abstract class NeuralNetwork<TNetParams> {
|
|||
.reduce((flat, arr) => flat.concat(arr))
|
||||
)
|
||||
}
|
||||
|
||||
public async load(weightsOrUrl: Float32Array | string | undefined): Promise<void> {
|
||||
if (weightsOrUrl instanceof Float32Array) {
|
||||
this.extractWeights(weightsOrUrl)
|
||||
return
|
||||
}
|
||||
|
||||
await this.loadFromUri(weightsOrUrl)
|
||||
}
|
||||
|
||||
public async loadFromUri(uri: string | undefined) {
|
||||
if (uri && typeof uri !== 'string') {
|
||||
throw new Error(`${this._name}.loadFromUri - expected model uri`)
|
||||
}
|
||||
|
||||
const weightMap = await loadWeightMap(uri, this.getDefaultModelName())
|
||||
this.loadFromWeightMap(weightMap)
|
||||
}
|
||||
|
||||
public async loadFromDisk(filePath: string | undefined) {
|
||||
if (filePath && typeof filePath !== 'string') {
|
||||
throw new Error(`${this._name}.loadFromDisk - expected model file path`)
|
||||
}
|
||||
|
||||
const { readFile } = env.getEnv()
|
||||
|
||||
const { manifestUri, modelBaseUri } = getModelUris(filePath, this.getDefaultModelName())
|
||||
|
||||
const fetchWeightsFromDisk = (filePaths: string[]) => Promise.all(
|
||||
filePaths.map(filePath => readFile(filePath).then(buf => buf.buffer))
|
||||
)
|
||||
const loadWeights = tf.io.weightsLoaderFactory(fetchWeightsFromDisk)
|
||||
|
||||
const manifest = JSON.parse((await readFile(manifestUri)).toString())
|
||||
const weightMap = await loadWeights(manifest, modelBaseUri)
|
||||
|
||||
this.loadFromWeightMap(weightMap)
|
||||
}
|
||||
|
||||
public loadFromWeightMap(weightMap: tf.NamedTensorMap) {
|
||||
const {
|
||||
paramMappings,
|
||||
params
|
||||
} = this.extractParamsFromWeigthMap(weightMap)
|
||||
|
||||
this._paramMappings = paramMappings
|
||||
this._params = params
|
||||
}
|
||||
|
||||
public extractWeights(weights: Float32Array) {
|
||||
const {
|
||||
paramMappings,
|
||||
params
|
||||
} = this.extractParams(weights)
|
||||
|
||||
this._paramMappings = paramMappings
|
||||
this._params = params
|
||||
}
|
||||
|
||||
private traversePropertyPath(paramPath: string) {
|
||||
if (!this.params) {
|
||||
throw new Error(`traversePropertyPath - model has no loaded params`)
|
||||
}
|
||||
|
||||
const result = paramPath.split('/').reduce((res: { nextObj: any, obj?: any, objProp?: string }, objProp) => {
|
||||
if (!res.nextObj.hasOwnProperty(objProp)) {
|
||||
throw new Error(`traversePropertyPath - object does not have property ${objProp}, for path ${paramPath}`)
|
||||
}
|
||||
|
||||
return { obj: res.nextObj, objProp, nextObj: res.nextObj[objProp] }
|
||||
}, { nextObj: this.params })
|
||||
|
||||
const { obj, objProp } = result
|
||||
if (!obj || !objProp || !(obj[objProp] instanceof tf.Tensor)) {
|
||||
throw new Error(`traversePropertyPath - parameter is not a tensor, for path ${paramPath}`)
|
||||
}
|
||||
|
||||
return { obj, objProp }
|
||||
}
|
||||
|
||||
|
|
|
@ -8,8 +8,6 @@ export async function loadWeightMap(
|
|||
defaultModelName: string,
|
||||
): Promise<tf.NamedTensorMap> {
|
||||
const { manifestUri, modelBaseUri } = getModelUris(uri, defaultModelName)
|
||||
|
||||
const manifest = await fetchJson<tf.io.WeightsManifestConfig>(manifestUri)
|
||||
|
||||
return tf.io.loadWeights(manifest, modelBaseUri)
|
||||
}
|
|
@ -1,12 +1,13 @@
|
|||
export function euclideanDistance(arr1: number[] | Float32Array, arr2: number[] | Float32Array) {
|
||||
if (arr1.length !== arr2.length) {
|
||||
if (arr1.length !== arr2.length)
|
||||
throw new Error('euclideanDistance: arr1.length !== arr2.length')
|
||||
}
|
||||
|
||||
const desc1 = Array.from(arr1)
|
||||
const desc2 = Array.from(arr2)
|
||||
|
||||
return Math.sqrt(
|
||||
desc1
|
||||
.map((val, i) => val - desc2[i])
|
||||
.reduce((res, diff) => res + Math.pow(diff, 2), 0)
|
||||
)
|
||||
}
|
||||
}
|
|
@ -1,7 +1,9 @@
|
|||
import { FaceDetection } from '../classes/FaceDetection';
|
||||
import { TNetInput } from '../dom';
|
||||
import { extendWithFaceDetection, WithFaceDetection } from '../factories/WithFaceDetection';
|
||||
import { SsdMobilenetv1Options } from '../ssdMobilenetv1/SsdMobilenetv1Options';
|
||||
import { TinyFaceDetectorOptions } from '../tinyFaceDetector/TinyFaceDetectorOptions';
|
||||
import { TinyYolov2Options } from '../tinyYolov2';
|
||||
import { ComposableTask } from './ComposableTask';
|
||||
import { DetectAllFaceLandmarksTask, DetectSingleFaceLandmarksTask } from './DetectFaceLandmarksTasks';
|
||||
import { nets } from './nets';
|
||||
|
@ -12,7 +14,7 @@ import { FaceDetectionOptions } from './types';
|
|||
export class DetectFacesTaskBase<TReturn> extends ComposableTask<TReturn> {
|
||||
constructor(
|
||||
protected input: TNetInput,
|
||||
protected options: FaceDetectionOptions = new TinyFaceDetectorOptions()
|
||||
protected options: FaceDetectionOptions = new SsdMobilenetv1Options()
|
||||
) {
|
||||
super()
|
||||
}
|
||||
|
@ -24,10 +26,17 @@ export class DetectAllFacesTask extends DetectFacesTaskBase<FaceDetection[]> {
|
|||
|
||||
const { input, options } = this
|
||||
|
||||
|
||||
const faceDetectionFunction = options instanceof TinyFaceDetectorOptions
|
||||
? (input: TNetInput) => nets.tinyFaceDetector.locateFaces(input, options)
|
||||
: null
|
||||
: (
|
||||
options instanceof SsdMobilenetv1Options
|
||||
? (input: TNetInput) => nets.ssdMobilenetv1.locateFaces(input, options)
|
||||
: (
|
||||
options instanceof TinyYolov2Options
|
||||
? (input: TNetInput) => nets.tinyYolov2.locateFaces(input, options)
|
||||
: null
|
||||
)
|
||||
)
|
||||
|
||||
if (!faceDetectionFunction) {
|
||||
throw new Error('detectFaces - expected options to be instance of TinyFaceDetectorOptions | SsdMobilenetv1Options | MtcnnOptions | TinyYolov2Options')
|
||||
|
|
|
@ -0,0 +1,29 @@
|
|||
import { TNetInput } from '../dom';
|
||||
import { WithFaceDescriptor, WithFaceDetection, WithFaceLandmarks } from '../factories';
|
||||
import { SsdMobilenetv1Options } from '../ssdMobilenetv1';
|
||||
import { ITinyYolov2Options, TinyYolov2Options } from '../tinyYolov2';
|
||||
import { detectAllFaces } from './detectFaces';
|
||||
|
||||
// export allFaces API for backward compatibility
|
||||
|
||||
export async function allFacesSsdMobilenetv1(
|
||||
input: TNetInput,
|
||||
minConfidence?: number
|
||||
): Promise<WithFaceDescriptor<WithFaceLandmarks<WithFaceDetection<{}>>>[]> {
|
||||
console.warn('allFacesSsdMobilenetv1 is deprecated and will be removed soon, use the high level api instead')
|
||||
return await detectAllFaces(input, new SsdMobilenetv1Options(minConfidence ? { minConfidence } : {}))
|
||||
.withFaceLandmarks()
|
||||
.withFaceDescriptors()
|
||||
}
|
||||
|
||||
export async function allFacesTinyYolov2(
|
||||
input: TNetInput,
|
||||
forwardParams: ITinyYolov2Options = {}
|
||||
): Promise<WithFaceDescriptor<WithFaceLandmarks<WithFaceDetection<{}>>>[]> {
|
||||
console.warn('allFacesTinyYolov2 is deprecated and will be removed soon, use the high level api instead')
|
||||
return await detectAllFaces(input, new TinyYolov2Options(forwardParams))
|
||||
.withFaceLandmarks()
|
||||
.withFaceDescriptors()
|
||||
}
|
||||
|
||||
export const allFaces = allFacesSsdMobilenetv1
|
|
@ -1,19 +1,18 @@
|
|||
import { TNetInput } from '../dom';
|
||||
import { SsdMobilenetv1Options } from '../ssdMobilenetv1/SsdMobilenetv1Options';
|
||||
import { DetectAllFacesTask, DetectSingleFaceTask } from './DetectFacesTasks';
|
||||
import { FaceDetectionOptions } from './types';
|
||||
import { TinyFaceDetectorOptions } from '../tinyFaceDetector/TinyFaceDetectorOptions';
|
||||
|
||||
|
||||
export function detectSingleFace(
|
||||
input: TNetInput,
|
||||
options: FaceDetectionOptions = new TinyFaceDetectorOptions()
|
||||
options: FaceDetectionOptions = new SsdMobilenetv1Options()
|
||||
): DetectSingleFaceTask {
|
||||
return new DetectSingleFaceTask(input, options)
|
||||
}
|
||||
|
||||
export function detectAllFaces(
|
||||
input: TNetInput,
|
||||
options: FaceDetectionOptions = new TinyFaceDetectorOptions()
|
||||
options: FaceDetectionOptions = new SsdMobilenetv1Options()
|
||||
): DetectAllFacesTask {
|
||||
return new DetectAllFacesTask(input, options)
|
||||
}
|
|
@ -1,3 +1,4 @@
|
|||
export * from './allFaces'
|
||||
export * from './ComposableTask'
|
||||
export * from './ComputeFaceDescriptorsTasks'
|
||||
export * from './detectFaces'
|
||||
|
|
|
@ -11,11 +11,14 @@ import { FaceLandmark68TinyNet } from '../faceLandmarkNet/FaceLandmark68TinyNet'
|
|||
import { FaceRecognitionNet } from '../faceRecognitionNet/FaceRecognitionNet';
|
||||
import { WithFaceDetection } from '../factories/WithFaceDetection';
|
||||
import { WithFaceLandmarks } from '../factories/WithFaceLandmarks';
|
||||
import { SsdMobilenetv1 } from '../ssdMobilenetv1/SsdMobilenetv1';
|
||||
import { SsdMobilenetv1Options } from '../ssdMobilenetv1/SsdMobilenetv1Options';
|
||||
import { TinyFaceDetector } from '../tinyFaceDetector/TinyFaceDetector';
|
||||
import { TinyFaceDetectorOptions } from '../tinyFaceDetector/TinyFaceDetectorOptions';
|
||||
import { ITinyYolov2Options, TinyYolov2 } from '../tinyYolov2';
|
||||
|
||||
export const nets = {
|
||||
ssdMobilenetv1: new SsdMobilenetv1(),
|
||||
tinyFaceDetector: new TinyFaceDetector(),
|
||||
tinyYolov2: new TinyYolov2(),
|
||||
faceLandmark68Net: new FaceLandmark68Net(),
|
||||
|
@ -25,6 +28,16 @@ export const nets = {
|
|||
ageGenderNet: new AgeGenderNet()
|
||||
}
|
||||
|
||||
/**
|
||||
* Attempts to detect all faces in an image using SSD Mobilenetv1 Network.
|
||||
*
|
||||
* @param input The input image.
|
||||
* @param options (optional, default: see SsdMobilenetv1Options constructor for default parameters).
|
||||
* @returns Bounding box of each face with score.
|
||||
*/
|
||||
export const ssdMobilenetv1 = (input: TNetInput, options: SsdMobilenetv1Options): Promise<FaceDetection[]> =>
|
||||
nets.ssdMobilenetv1.locateFaces(input, options)
|
||||
|
||||
/**
|
||||
* Attempts to detect all faces in an image using the Tiny Face Detector.
|
||||
*
|
||||
|
@ -35,6 +48,16 @@ export const nets = {
|
|||
export const tinyFaceDetector = (input: TNetInput, options: TinyFaceDetectorOptions): Promise<FaceDetection[]> =>
|
||||
nets.tinyFaceDetector.locateFaces(input, options)
|
||||
|
||||
/**
|
||||
* Attempts to detect all faces in an image using the Tiny Yolov2 Network.
|
||||
*
|
||||
* @param input The input image.
|
||||
* @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[]> =>
|
||||
nets.tinyYolov2.locateFaces(input, options)
|
||||
|
||||
/**
|
||||
* Detects the 68 point face landmark positions of the face shown in an image.
|
||||
*
|
||||
|
@ -91,6 +114,7 @@ export const recognizeFaceExpressions = (input: TNetInput): Promise<FaceExpressi
|
|||
export const predictAgeAndGender = (input: TNetInput): Promise<AgeAndGenderPrediction | AgeAndGenderPrediction[]> =>
|
||||
nets.ageGenderNet.predictAgeAndGender(input)
|
||||
|
||||
export const loadSsdMobilenetv1Model = (url: string) => nets.ssdMobilenetv1.load(url)
|
||||
export const loadTinyFaceDetectorModel = (url: string) => nets.tinyFaceDetector.load(url)
|
||||
export const loadTinyYolov2Model = (url: string) => nets.tinyYolov2.load(url)
|
||||
export const loadFaceLandmarkModel = (url: string) => nets.faceLandmark68Net.load(url)
|
||||
|
@ -100,6 +124,6 @@ export const loadFaceExpressionModel = (url: string) => nets.faceExpressionNet.l
|
|||
export const loadAgeGenderModel = (url: string) => nets.ageGenderNet.load(url)
|
||||
|
||||
// backward compatibility
|
||||
export const loadFaceDetectionModel = loadTinyFaceDetectorModel
|
||||
export const locateFaces = TinyFaceDetector
|
||||
export const loadFaceDetectionModel = loadSsdMobilenetv1Model
|
||||
export const locateFaces = ssdMobilenetv1
|
||||
export const detectLandmarks = detectFaceLandmarks
|
|
@ -1,7 +1,9 @@
|
|||
import { FaceDetection } from '../classes/FaceDetection';
|
||||
import { TNetInput } from '../dom';
|
||||
import { SsdMobilenetv1Options } from '../ssdMobilenetv1/SsdMobilenetv1Options';
|
||||
import { TinyFaceDetectorOptions } from '../tinyFaceDetector/TinyFaceDetectorOptions';
|
||||
import { TinyYolov2Options } from '../tinyYolov2';
|
||||
|
||||
export type FaceDetectionOptions = TinyFaceDetectorOptions
|
||||
export type FaceDetectionOptions = TinyFaceDetectorOptions | SsdMobilenetv1Options | TinyYolov2Options
|
||||
|
||||
export type FaceDetectionFunction = (input: TNetInput) => Promise<FaceDetection[]>
|
13
src/index.ts
13
src/index.ts
|
@ -1,8 +1,13 @@
|
|||
import * as tf from '@tensorflow/tfjs';
|
||||
import * as tf from '@tensorflow/tfjs-core';
|
||||
|
||||
import * as draw from './draw';
|
||||
import * as utils from './utils';
|
||||
|
||||
export { draw, utils, tf }
|
||||
export {
|
||||
draw,
|
||||
utils,
|
||||
tf
|
||||
}
|
||||
|
||||
export * from './ageGenderNet/index';
|
||||
export * from './classes/index';
|
||||
|
@ -14,8 +19,10 @@ export * from './faceRecognitionNet/index';
|
|||
export * from './factories/index';
|
||||
export * from './globalApi/index';
|
||||
export * from './ops/index';
|
||||
export * from './ssdMobilenetv1/index';
|
||||
export * from './tinyFaceDetector/index';
|
||||
export * from './tinyYolov2/index';
|
||||
|
||||
export * from './euclideanDistance';
|
||||
export * from './NeuralNetwork';
|
||||
export * from './resizeResults';
|
||||
export * from './resizeResults';
|
|
@ -5,23 +5,31 @@ import { extendWithFaceDetection, isWithFaceDetection } from './factories/WithFa
|
|||
import { extendWithFaceLandmarks, isWithFaceLandmarks } from './factories/WithFaceLandmarks';
|
||||
|
||||
export function resizeResults<T>(results: T, dimensions: IDimensions): T {
|
||||
|
||||
const { width, height } = new Dimensions(dimensions.width, dimensions.height)
|
||||
|
||||
if (width <= 0 || height <= 0) {
|
||||
throw new Error(`resizeResults - invalid dimensions: ${JSON.stringify({ width, height })}`)
|
||||
}
|
||||
|
||||
if (Array.isArray(results)) {
|
||||
return results.map(obj => resizeResults(obj, { width, height })) as any as T
|
||||
}
|
||||
|
||||
if (isWithFaceLandmarks(results)) {
|
||||
const resizedDetection = results.detection.forSize(width, height)
|
||||
const resizedLandmarks = results.unshiftedLandmarks.forSize(resizedDetection.box.width, resizedDetection.box.height)
|
||||
|
||||
return extendWithFaceLandmarks(extendWithFaceDetection(results, resizedDetection), resizedLandmarks)
|
||||
}
|
||||
|
||||
if (isWithFaceDetection(results)) {
|
||||
return extendWithFaceDetection(results, results.detection.forSize(width, height))
|
||||
}
|
||||
|
||||
if (results instanceof FaceLandmarks || results instanceof FaceDetection) {
|
||||
return (results as any).forSize(width, height)
|
||||
}
|
||||
|
||||
return results
|
||||
}
|
|
@ -0,0 +1,133 @@
|
|||
import * as tf from '@tensorflow/tfjs-core';
|
||||
|
||||
import { Rect } from '../classes';
|
||||
import { FaceDetection } from '../classes/FaceDetection';
|
||||
import { NetInput, TNetInput, toNetInput } from '../dom';
|
||||
import { NeuralNetwork } from '../NeuralNetwork';
|
||||
import { extractParams } from './extractParams';
|
||||
import { extractParamsFromWeigthMap } from './extractParamsFromWeigthMap';
|
||||
import { mobileNetV1 } from './mobileNetV1';
|
||||
import { nonMaxSuppression } from './nonMaxSuppression';
|
||||
import { outputLayer } from './outputLayer';
|
||||
import { predictionLayer } from './predictionLayer';
|
||||
import { ISsdMobilenetv1Options, SsdMobilenetv1Options } from './SsdMobilenetv1Options';
|
||||
import { NetParams } from './types';
|
||||
|
||||
|
||||
export class SsdMobilenetv1 extends NeuralNetwork<NetParams> {
|
||||
|
||||
constructor() {
|
||||
super('SsdMobilenetv1')
|
||||
}
|
||||
|
||||
public forwardInput(input: NetInput) {
|
||||
|
||||
const { params } = this
|
||||
|
||||
if (!params) {
|
||||
throw new Error('SsdMobilenetv1 - load model before inference')
|
||||
}
|
||||
|
||||
return tf.tidy(() => {
|
||||
const batchTensor = input.toBatchTensor(512, false).toFloat()
|
||||
|
||||
const x = tf.sub(tf.mul(batchTensor, tf.scalar(0.007843137718737125)), tf.scalar(1)) as tf.Tensor4D
|
||||
const features = mobileNetV1(x, params.mobilenetv1)
|
||||
|
||||
const {
|
||||
boxPredictions,
|
||||
classPredictions
|
||||
} = predictionLayer(features.out, features.conv11, params.prediction_layer)
|
||||
|
||||
return outputLayer(boxPredictions, classPredictions, params.output_layer)
|
||||
})
|
||||
}
|
||||
|
||||
public async forward(input: TNetInput) {
|
||||
return this.forwardInput(await toNetInput(input))
|
||||
}
|
||||
|
||||
public async locateFaces(
|
||||
input: TNetInput,
|
||||
options: ISsdMobilenetv1Options = {}
|
||||
): Promise<FaceDetection[]> {
|
||||
|
||||
const { maxResults, minConfidence } = new SsdMobilenetv1Options(options)
|
||||
|
||||
const netInput = await toNetInput(input)
|
||||
|
||||
const {
|
||||
boxes: _boxes,
|
||||
scores: _scores
|
||||
} = this.forwardInput(netInput)
|
||||
|
||||
|
||||
// TODO batches
|
||||
const boxes = _boxes[0]
|
||||
const scores = _scores[0]
|
||||
for (let i = 1; i < _boxes.length; i++) {
|
||||
_boxes[i].dispose()
|
||||
_scores[i].dispose()
|
||||
}
|
||||
|
||||
// TODO find a better way to filter by minConfidence
|
||||
const scoresData = Array.from(await scores.data())
|
||||
|
||||
const iouThreshold = 0.5
|
||||
const indices = nonMaxSuppression(
|
||||
boxes,
|
||||
scoresData,
|
||||
maxResults,
|
||||
iouThreshold,
|
||||
minConfidence
|
||||
)
|
||||
|
||||
const reshapedDims = netInput.getReshapedInputDimensions(0)
|
||||
const inputSize = netInput.inputSize as number
|
||||
const padX = inputSize / reshapedDims.width
|
||||
const padY = inputSize / reshapedDims.height
|
||||
|
||||
const boxesData = boxes.arraySync()
|
||||
const results = indices
|
||||
.map(idx => {
|
||||
const [top, bottom] = [
|
||||
Math.max(0, boxesData[idx][0]),
|
||||
Math.min(1.0, boxesData[idx][2])
|
||||
].map(val => val * padY)
|
||||
const [left, right] = [
|
||||
Math.max(0, boxesData[idx][1]),
|
||||
Math.min(1.0, boxesData[idx][3])
|
||||
].map(val => val * padX)
|
||||
return new FaceDetection(
|
||||
scoresData[idx],
|
||||
new Rect(
|
||||
left,
|
||||
top,
|
||||
right - left,
|
||||
bottom - top
|
||||
),
|
||||
{
|
||||
height: netInput.getInputHeight(0),
|
||||
width: netInput.getInputWidth(0)
|
||||
}
|
||||
)
|
||||
})
|
||||
|
||||
boxes.dispose()
|
||||
scores.dispose()
|
||||
|
||||
return results
|
||||
}
|
||||
|
||||
protected getDefaultModelName(): string {
|
||||
return 'ssd_mobilenetv1_model'
|
||||
}
|
||||
|
||||
protected extractParamsFromWeigthMap(weightMap: tf.NamedTensorMap) {
|
||||
return extractParamsFromWeigthMap(weightMap)
|
||||
}
|
||||
|
||||
protected extractParams(weights: Float32Array) {
|
||||
return extractParams(weights)
|
||||
}
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue