diff --git a/src/Models/ObjectDetector.ts b/src/UseCases/ObjectDetector.ts similarity index 56% rename from src/Models/ObjectDetector.ts rename to src/UseCases/ObjectDetector.ts index 54eff60..f16b989 100644 --- a/src/Models/ObjectDetector.ts +++ b/src/UseCases/ObjectDetector.ts @@ -1,5 +1,6 @@ import * as tf from '@tensorflow/tfjs' import * as cocossd from '@tensorflow-models/coco-ssd' +import PredictedObject from '../Models/PredictedObject' let instance: ObjectDetector | null = null @@ -16,7 +17,19 @@ class ObjectDetector { return instance } - private doesPredictionPassFilterPredicates (prediction: cocossd.DetectedObject): boolean { + private convertDetectedToPredictedObjects = (detectedObjects: cocossd.DetectedObject[]) => { + const predictedObjects: PredictedObject[] = detectedObjects.map(p => new PredictedObject({ + xOrigin: p.bbox[0], + yOrigin: p.bbox[1], + width: p.bbox[2], + height: p.bbox[3], + class: p.class + })) + + return predictedObjects + } + + private doesDetectionPassFilterPredicates (prediction: cocossd.DetectedObject): boolean { let failedPredictions = [] this.filterPredicates.forEach(filter => { if (!filter(prediction)) failedPredictions.push(filter) @@ -28,10 +41,11 @@ class ObjectDetector { public predictImageStream = async (videoImage: ImageData) => { const mlModel = await this.loadMlModel() - const predictions = await mlModel.detect(videoImage) - const filteredPredictions = predictions.filter(p => this.doesPredictionPassFilterPredicates(p)) + const detectedObjects = await mlModel.detect(videoImage) + const filteredDetections = detectedObjects.filter(p => this.doesDetectionPassFilterPredicates(p)) + const predictions = this.convertDetectedToPredictedObjects(filteredDetections) - return filteredPredictions + return predictions } public async loadMlModel (): Promise { diff --git a/src/UseCases/convertDetectedToPredictedObjects.ts b/src/UseCases/convertDetectedToPredictedObjects.ts deleted file mode 100644 index a9c44c1..0000000 --- a/src/UseCases/convertDetectedToPredictedObjects.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { DetectedObject } from "@tensorflow-models/coco-ssd" -import PredictedObject from '../Models/PredictedObject' - -const convertDetectedToPredictedObjects = (detectedObjects: DetectedObject[]) => { - const predictedObjects: PredictedObject[] = detectedObjects.map(p => new PredictedObject({ - xOrigin: p.bbox[0], - yOrigin: p.bbox[1], - width: p.bbox[2], - height: p.bbox[3], - class: p.class - })) - - return predictedObjects -} - -export default convertDetectedToPredictedObjects diff --git a/src/app.ts b/src/app.ts index 26ab2b6..4035665 100644 --- a/src/app.ts +++ b/src/app.ts @@ -1,8 +1,7 @@ import { DetectedObject } from "@tensorflow-models/coco-ssd" import PredictedObjectCollectionController from "./Controllers/PredictedObjectCollectionController" import VideoController from './Controllers/VideoController' -import ObjectDetector from './Models/ObjectDetector' -import convertDetectedtoPredictedObject from './UseCases/convertDetectedToPredictedObjects' +import ObjectDetector from './UseCases/ObjectDetector' const defaultPredictions = [ (prediction: DetectedObject) => prediction.score > 0.6, @@ -29,8 +28,7 @@ class App { return } - const detectedObjects: DetectedObject[] = await this.objectDetector.predictImageStream(imageData) - const predictedObjects = convertDetectedtoPredictedObject(detectedObjects) + const predictedObjects = await this.objectDetector.predictImageStream(imageData) this.predictedObjectCollectionController.predictedObjects = predictedObjects window.requestAnimationFrame(this.predictImage)