From 46e7cdbdbbea98a325efea158cfef4cba6165cde Mon Sep 17 00:00:00 2001 From: Ali EP Date: Tue, 14 May 2019 13:07:43 +0430 Subject: [PATCH 01/13] adds contours modified .gitignore to ommit some vscode related directories. added contours to both android and iOS. I'm not sure about sanity of the iOS part. --- .gitignore | 3 + .../firebase_ml_vision/android/build.gradle | 1 + .../firebasemlvision/FaceDetector.java | 47 +++++++++++++++ .../ios/Classes/FaceDetector.m | 52 +++++++++++++++++ .../ios/firebase_ml_vision.podspec | 1 + .../lib/src/face_detector.dart | 57 +++++++++++++++++++ 6 files changed, 161 insertions(+) diff --git a/.gitignore b/.gitignore index e89cf1187f48..0c7c7f9f6f80 100644 --- a/.gitignore +++ b/.gitignore @@ -33,3 +33,6 @@ GeneratedPluginRegistrant.java build/ .flutter-plugins +.project +.classpath +.settings diff --git a/packages/firebase_ml_vision/android/build.gradle b/packages/firebase_ml_vision/android/build.gradle index 92cabac01cd5..3afd8ae41647 100644 --- a/packages/firebase_ml_vision/android/build.gradle +++ b/packages/firebase_ml_vision/android/build.gradle @@ -46,6 +46,7 @@ android { } dependencies { api 'com.google.firebase:firebase-ml-vision:20.0.0' + api 'com.google.firebase:firebase-ml-vision-face-model:17.0.2' implementation 'androidx.annotation:annotation:1.0.0' implementation 'androidx.exifinterface:exifinterface:1.0.0' } diff --git a/packages/firebase_ml_vision/android/src/main/java/io/flutter/plugins/firebasemlvision/FaceDetector.java b/packages/firebase_ml_vision/android/src/main/java/io/flutter/plugins/firebasemlvision/FaceDetector.java index 6360fb1fe3e0..9c9cd1838f50 100644 --- a/packages/firebase_ml_vision/android/src/main/java/io/flutter/plugins/firebasemlvision/FaceDetector.java +++ b/packages/firebase_ml_vision/android/src/main/java/io/flutter/plugins/firebasemlvision/FaceDetector.java @@ -5,10 +5,12 @@ import com.google.android.gms.tasks.OnSuccessListener; import com.google.firebase.ml.vision.FirebaseVision; import com.google.firebase.ml.vision.common.FirebaseVisionImage; +import com.google.firebase.ml.vision.common.FirebaseVisionPoint; import com.google.firebase.ml.vision.face.FirebaseVisionFace; import com.google.firebase.ml.vision.face.FirebaseVisionFaceDetector; import com.google.firebase.ml.vision.face.FirebaseVisionFaceDetectorOptions; import com.google.firebase.ml.vision.face.FirebaseVisionFaceLandmark; +import com.google.firebase.ml.vision.face.FirebaseVisionFaceContour; import io.flutter.plugin.common.MethodChannel; import java.io.IOException; import java.util.ArrayList; @@ -84,6 +86,8 @@ public void onSuccess(List firebaseVisionFaces) { faceData.put("landmarks", getLandmarkData(face)); + faceData.put("contours", getContourData(face)); + faces.add(faceData); } @@ -116,6 +120,27 @@ private Map getLandmarkData(FirebaseVisionFace face) { return landmarks; } + private Map> getContourData(FirebaseVisionFace face) { + Map> contours = new HashMap<>(); + + contours.put("allPoints", contourPosition(face, FirebaseVisionFaceContour.ALL_POINTS)); + contours.put("face", contourPosition(face, FirebaseVisionFaceContour.FACE)); + contours.put("leftEye", contourPosition(face, FirebaseVisionFaceContour.LEFT_EYE)); + contours.put("leftEyebrowBottom", contourPosition(face, FirebaseVisionFaceContour.LEFT_EYEBROW_BOTTOM)); + contours.put("leftEyebrowTop", contourPosition(face, FirebaseVisionFaceContour.LEFT_EYEBROW_TOP)); + contours.put("lowerLipBottom", contourPosition(face, FirebaseVisionFaceContour.LOWER_LIP_BOTTOM)); + contours.put("lowerLipTop", contourPosition(face, FirebaseVisionFaceContour.LOWER_LIP_TOP)); + contours.put("noseBottom", contourPosition(face, FirebaseVisionFaceContour.NOSE_BOTTOM)); + contours.put("noseBridge", contourPosition(face, FirebaseVisionFaceContour.NOSE_BRIDGE)); + contours.put("rightEye", contourPosition(face, FirebaseVisionFaceContour.RIGHT_EYE)); + contours.put("rightEyebrowBottom", contourPosition(face, FirebaseVisionFaceContour.RIGHT_EYEBROW_BOTTOM)); + contours.put("rightEyebrowTop", contourPosition(face, FirebaseVisionFaceContour.RIGHT_EYEBROW_TOP)); + contours.put("upperLipBottom", contourPosition(face, FirebaseVisionFaceContour.UPPER_LIP_BOTTOM)); + contours.put("upperLipTop", contourPosition(face, FirebaseVisionFaceContour.UPPER_LIP_TOP)); + + return contours; + } + private double[] landmarkPosition(FirebaseVisionFace face, int landmarkInt) { FirebaseVisionFaceLandmark landmark = face.getLandmark(landmarkInt); if (landmark != null) { @@ -125,6 +150,22 @@ private double[] landmarkPosition(FirebaseVisionFace face, int landmarkInt) { return null; } + private List contourPosition(FirebaseVisionFace face, int contourInt) { + FirebaseVisionFaceContour contour = face.getContour(contourInt); + if (contour != null) { + List contourPoints = contour.getPoints(); + List result = new ArrayList(); + + for(int i = 0; i < contourPoints.size(); i++) { + result.add(new double[] {contourPoints.get(i).getX(), contourPoints.get(i).getY()}); + } + + return result; + } + + return null; + } + private FirebaseVisionFaceDetectorOptions parseOptions(Map options) { int classification = (boolean) options.get("enableClassification") @@ -135,6 +176,11 @@ private FirebaseVisionFaceDetectorOptions parseOptions(Map optio (boolean) options.get("enableLandmarks") ? FirebaseVisionFaceDetectorOptions.ALL_LANDMARKS : FirebaseVisionFaceDetectorOptions.NO_LANDMARKS; + + int contours = + (boolean) options.get("enableContours") + ? FirebaseVisionFaceDetectorOptions.ALL_CONTOURS + : FirebaseVisionFaceDetectorOptions.NO_CONTOURS; int mode; switch ((String) options.get("mode")) { @@ -152,6 +198,7 @@ private FirebaseVisionFaceDetectorOptions parseOptions(Map optio new FirebaseVisionFaceDetectorOptions.Builder() .setClassificationMode(classification) .setLandmarkMode(landmark) + .setContourMode(contours) .setMinFaceSize((float) ((double) options.get("minFaceSize"))) .setPerformanceMode(mode); diff --git a/packages/firebase_ml_vision/ios/Classes/FaceDetector.m b/packages/firebase_ml_vision/ios/Classes/FaceDetector.m index 790e12b37ac8..8d33a9e8fb75 100644 --- a/packages/firebase_ml_vision/ios/Classes/FaceDetector.m +++ b/packages/firebase_ml_vision/ios/Classes/FaceDetector.m @@ -63,6 +63,36 @@ + (void)handleDetection:(FIRVisionImage *)image @"rightMouth" : [FaceDetector getLandmarkPosition:face landmark:FIRFaceLandmarkTypeMouthRight], }, + @"contours" : @{ + @"allPoints" : [FaceDetector getContourPoints:face + contour:FIRFaceContourTypeAll], + @"face" : [FaceDetector getContourPoints:face + contour:FIRFaceContourTypeFace], + @"leftEye" : [FaceDetector getContourPoints:face + contour:FIRFaceContourTypeLeftEye], + @"leftEyebrowBottom" : [FaceDetector getContourPoints:face + contour:FIRFaceContourTypeLeftEyebrowBottom], + @"leftEyebrowTop" : [FaceDetector getContourPoints:face + contour:FIRFaceContourTypeLeftEyebrowTop], + @"lowerLipBottom" : [FaceDetector getContourPoints:face + contour:FIRFaceContourTypeLowerLipBottom], + @"lowerLipTop" : [FaceDetector getContourPoints:face + contour:FIRFaceContourTypeLowerLipTop], + @"noseBottom" : [FaceDetector getContourPoints:face + contour:FIRFaceContourTypeNoseBottom], + @"noseBridge" : [FaceDetector getContourPoints:face + contour:FIRFaceContourTypeNoseBridge], + @"rightEye" : [FaceDetector getContourPoints:face + contour:FIRFaceContourTypeRightEye], + @"rightEyebrowBottom" : [FaceDetector getContourPoints:face + contour:FIRFaceContourTypeRightEyebrowBottom], + @"rightEyebrowTop" : [FaceDetector getContourPoints:face + contour:FIRFaceContourTypeRightEyebrowTop], + @"upperLipBottom" : [FaceDetector getContourPoints:face + contour:FIRFaceContourTypeUpperLipBottom], + @"upperLipTop" : [FaceDetector getContourPoints:face + contour:FIRFaceContourTypeUpperLipTop], + } }; [faceData addObject:data]; @@ -81,6 +111,21 @@ + (id)getLandmarkPosition:(FIRVisionFace *)face landmark:(FIRFaceLandmarkType)la return [NSNull null]; } ++ (id)getContourPoints:(FIRVisionFace *)face contour:(FIRFaceContourType)contourType { + FIRVisionFaceContour *contour = [face contourOfType:contourType]; + if (contour) { + NSArray *contourPoints = contour.points; + NSMutableArray *result = [[NSMutableArray alloc] initWithCapacity: [contourPoints count]]; + for (int i = 0; i < [contourPoints count]; i++) { + FIRVisionPoint *point = [contourPoints objectAtIndex:i]; + [result insertObject:@[ point.x, point.y ] atIndex:i]; + } + return [result copy]; + } + + return [NSNull null]; +} + + (FIRVisionFaceDetectorOptions *)parseOptions:(NSDictionary *)optionsData { FIRVisionFaceDetectorOptions *options = [[FIRVisionFaceDetectorOptions alloc] init]; @@ -98,6 +143,13 @@ + (FIRVisionFaceDetectorOptions *)parseOptions:(NSDictionary *)optionsData { options.landmarkMode = FIRVisionFaceDetectorLandmarkModeNone; } + NSNumber *enableContours = optionsData[@"enableContours"]; + if (enableContours.boolValue) { + options.contourMode = FIRVisionFaceDetectorContourModeAll; + } else { + options.contourMode = FIRVisionFaceDetectorContourModeNone; + } + NSNumber *enableTracking = optionsData[@"enableTracking"]; options.trackingEnabled = enableTracking.boolValue; diff --git a/packages/firebase_ml_vision/ios/firebase_ml_vision.podspec b/packages/firebase_ml_vision/ios/firebase_ml_vision.podspec index a25eef4a3fa1..63d5d2ecdae6 100644 --- a/packages/firebase_ml_vision/ios/firebase_ml_vision.podspec +++ b/packages/firebase_ml_vision/ios/firebase_ml_vision.podspec @@ -18,6 +18,7 @@ An SDK that brings Google's machine learning expertise to Android and iOS apps i s.dependency 'Flutter' s.dependency 'Firebase/Core' s.dependency 'Firebase/MLVision' + s.dependency 'Firebase/MLVisionFaceModel' s.ios.deployment_target = '9.0' s.static_framework = true end diff --git a/packages/firebase_ml_vision/lib/src/face_detector.dart b/packages/firebase_ml_vision/lib/src/face_detector.dart index ad451ba0a104..66d5485cad17 100644 --- a/packages/firebase_ml_vision/lib/src/face_detector.dart +++ b/packages/firebase_ml_vision/lib/src/face_detector.dart @@ -24,6 +24,24 @@ enum FaceLandmarkType { rightMouth, } +/// Available face contour types detected by [FaceDetector]. +enum FaceContourType { + allPoints, + face, + leftEye, + leftEyebrowBottom, + leftEyebrowTop, + lowerLipBottom, + lowerLipTop, + noseBottom, + noseBridge, + rightEye, + rightEyebrowBottom, + rightEyebrowTop, + upperLipBottom, + upperLipTop +} + /// Detector for detecting faces in an input image. /// /// A face detector is created via @@ -54,6 +72,7 @@ class FaceDetector { 'options': { 'enableClassification': options.enableClassification, 'enableLandmarks': options.enableLandmarks, + 'enableContours': options.enableContours, 'enableTracking': options.enableTracking, 'minFaceSize': options.minFaceSize, 'mode': _enumToString(options.mode), @@ -81,6 +100,7 @@ class FaceDetectorOptions { const FaceDetectorOptions({ this.enableClassification = false, this.enableLandmarks = false, + this.enableContours = false, this.enableTracking = false, this.minFaceSize = 0.1, this.mode = FaceDetectorMode.fast, @@ -95,6 +115,9 @@ class FaceDetectorOptions { /// Whether to detect [FaceLandmark]s. final bool enableLandmarks; + /// Whether to detect [FaceContour]s. + final bool enableContours; + /// Whether to enable face tracking. /// /// If enabled, the detector will maintain a consistent ID for each face when @@ -137,9 +160,23 @@ class Face { type, Offset(pos[0], pos[1]), ); + })), + _contours = Map.fromIterables( + FaceContourType.values, + FaceContourType.values.map((FaceContourType type) { + final List arr = data['contours'][_enumToString(type)]; + return (arr == null) + ? null + : FaceContour._( + type, + arr + .map((dynamic pos) => Offset(pos.first, pos.last)) + .toList(), + ); })); final Map _landmarks; + final Map _contours; /// The axis-aligned bounding rectangle of the detected face. /// @@ -195,6 +232,11 @@ class Face { /// /// Null if landmark was not detected. FaceLandmark getLandmark(FaceLandmarkType landmark) => _landmarks[landmark]; + + /// Gets the contour based on the provided [FaceContourType]. + /// + /// Null if contour was not detected. + FaceContour getContour(FaceContourType contour) => _contours[contour]; } /// Represent a face landmark. @@ -211,3 +253,18 @@ class FaceLandmark { /// The point (0, 0) is defined as the upper-left corner of the image. final Offset position; } + +/// Represent a face contour. +/// +/// Contours of facial features. +class FaceContour { + FaceContour._(this.type, this.positionsList); + + /// The [FaceContourType] of this contour. + final FaceContourType type; + + /// Gets a 2D point [List] for contour positions. + /// + /// The point (0, 0) is defined as the upper-left corner of the image. + final List positionsList; +} From 66060e11f04080c42ad2368de58950278019cc0e Mon Sep 17 00:00:00 2001 From: Ali EP Date: Tue, 14 May 2019 14:11:53 +0430 Subject: [PATCH 02/13] formatted FaceDetector.java formatted using vscode --- .../firebasemlvision/FaceDetector.java | 168 ++++++++---------- 1 file changed, 77 insertions(+), 91 deletions(-) diff --git a/packages/firebase_ml_vision/android/src/main/java/io/flutter/plugins/firebasemlvision/FaceDetector.java b/packages/firebase_ml_vision/android/src/main/java/io/flutter/plugins/firebasemlvision/FaceDetector.java index 9c9cd1838f50..18bba6fecc79 100644 --- a/packages/firebase_ml_vision/android/src/main/java/io/flutter/plugins/firebasemlvision/FaceDetector.java +++ b/packages/firebase_ml_vision/android/src/main/java/io/flutter/plugins/firebasemlvision/FaceDetector.java @@ -21,16 +21,18 @@ class FaceDetector implements Detector { static final FaceDetector instance = new FaceDetector(); - private FaceDetector() {} + private FaceDetector() { + } private FirebaseVisionFaceDetector detector; private Map lastOptions; @Override - public void handleDetection( - FirebaseVisionImage image, Map options, final MethodChannel.Result result) { + public void handleDetection(FirebaseVisionImage image, Map options, + final MethodChannel.Result result) { - // Use instantiated detector if the options are the same. Otherwise, close and instantiate new + // Use instantiated detector if the options are the same. Otherwise, close and + // instantiate new // options. if (detector == null) { @@ -48,59 +50,52 @@ public void handleDetection( detector = FirebaseVision.getInstance().getVisionFaceDetector(parseOptions(lastOptions)); } - detector - .detectInImage(image) - .addOnSuccessListener( - new OnSuccessListener>() { - @Override - public void onSuccess(List firebaseVisionFaces) { - List> faces = new ArrayList<>(firebaseVisionFaces.size()); - for (FirebaseVisionFace face : firebaseVisionFaces) { - Map faceData = new HashMap<>(); - - faceData.put("left", (double) face.getBoundingBox().left); - faceData.put("top", (double) face.getBoundingBox().top); - faceData.put("width", (double) face.getBoundingBox().width()); - faceData.put("height", (double) face.getBoundingBox().height()); - - faceData.put("headEulerAngleY", face.getHeadEulerAngleY()); - faceData.put("headEulerAngleZ", face.getHeadEulerAngleZ()); - - if (face.getSmilingProbability() != FirebaseVisionFace.UNCOMPUTED_PROBABILITY) { - faceData.put("smilingProbability", face.getSmilingProbability()); - } - - if (face.getLeftEyeOpenProbability() - != FirebaseVisionFace.UNCOMPUTED_PROBABILITY) { - faceData.put("leftEyeOpenProbability", face.getLeftEyeOpenProbability()); - } - - if (face.getRightEyeOpenProbability() - != FirebaseVisionFace.UNCOMPUTED_PROBABILITY) { - faceData.put("rightEyeOpenProbability", face.getRightEyeOpenProbability()); - } - - if (face.getTrackingId() != FirebaseVisionFace.INVALID_ID) { - faceData.put("trackingId", face.getTrackingId()); - } - - faceData.put("landmarks", getLandmarkData(face)); - - faceData.put("contours", getContourData(face)); - - faces.add(faceData); - } - - result.success(faces); - } - }) - .addOnFailureListener( - new OnFailureListener() { - @Override - public void onFailure(@NonNull Exception exception) { - result.error("faceDetectorError", exception.getLocalizedMessage(), null); - } - }); + detector.detectInImage(image).addOnSuccessListener(new OnSuccessListener>() { + @Override + public void onSuccess(List firebaseVisionFaces) { + List> faces = new ArrayList<>(firebaseVisionFaces.size()); + for (FirebaseVisionFace face : firebaseVisionFaces) { + Map faceData = new HashMap<>(); + + faceData.put("left", (double) face.getBoundingBox().left); + faceData.put("top", (double) face.getBoundingBox().top); + faceData.put("width", (double) face.getBoundingBox().width()); + faceData.put("height", (double) face.getBoundingBox().height()); + + faceData.put("headEulerAngleY", face.getHeadEulerAngleY()); + faceData.put("headEulerAngleZ", face.getHeadEulerAngleZ()); + + if (face.getSmilingProbability() != FirebaseVisionFace.UNCOMPUTED_PROBABILITY) { + faceData.put("smilingProbability", face.getSmilingProbability()); + } + + if (face.getLeftEyeOpenProbability() != FirebaseVisionFace.UNCOMPUTED_PROBABILITY) { + faceData.put("leftEyeOpenProbability", face.getLeftEyeOpenProbability()); + } + + if (face.getRightEyeOpenProbability() != FirebaseVisionFace.UNCOMPUTED_PROBABILITY) { + faceData.put("rightEyeOpenProbability", face.getRightEyeOpenProbability()); + } + + if (face.getTrackingId() != FirebaseVisionFace.INVALID_ID) { + faceData.put("trackingId", face.getTrackingId()); + } + + faceData.put("landmarks", getLandmarkData(face)); + + faceData.put("contours", getContourData(face)); + + faces.add(faceData); + } + + result.success(faces); + } + }).addOnFailureListener(new OnFailureListener() { + @Override + public void onFailure(@NonNull Exception exception) { + result.error("faceDetectorError", exception.getLocalizedMessage(), null); + } + }); } private Map getLandmarkData(FirebaseVisionFace face) { @@ -144,7 +139,7 @@ private Map> getContourData(FirebaseVisionFace face) { private double[] landmarkPosition(FirebaseVisionFace face, int landmarkInt) { FirebaseVisionFaceLandmark landmark = face.getLandmark(landmarkInt); if (landmark != null) { - return new double[] {landmark.getPosition().getX(), landmark.getPosition().getY()}; + return new double[] { landmark.getPosition().getX(), landmark.getPosition().getY() }; } return null; @@ -155,11 +150,11 @@ private List contourPosition(FirebaseVisionFace face, int contourInt) if (contour != null) { List contourPoints = contour.getPoints(); List result = new ArrayList(); - - for(int i = 0; i < contourPoints.size(); i++) { - result.add(new double[] {contourPoints.get(i).getX(), contourPoints.get(i).getY()}); + + for (int i = 0; i < contourPoints.size(); i++) { + result.add(new double[] { contourPoints.get(i).getX(), contourPoints.get(i).getY() }); } - + return result; } @@ -167,40 +162,31 @@ private List contourPosition(FirebaseVisionFace face, int contourInt) } private FirebaseVisionFaceDetectorOptions parseOptions(Map options) { - int classification = - (boolean) options.get("enableClassification") - ? FirebaseVisionFaceDetectorOptions.ALL_CLASSIFICATIONS - : FirebaseVisionFaceDetectorOptions.NO_CLASSIFICATIONS; - - int landmark = - (boolean) options.get("enableLandmarks") - ? FirebaseVisionFaceDetectorOptions.ALL_LANDMARKS - : FirebaseVisionFaceDetectorOptions.NO_LANDMARKS; - - int contours = - (boolean) options.get("enableContours") - ? FirebaseVisionFaceDetectorOptions.ALL_CONTOURS - : FirebaseVisionFaceDetectorOptions.NO_CONTOURS; + int classification = (boolean) options.get("enableClassification") + ? FirebaseVisionFaceDetectorOptions.ALL_CLASSIFICATIONS + : FirebaseVisionFaceDetectorOptions.NO_CLASSIFICATIONS; + + int landmark = (boolean) options.get("enableLandmarks") ? FirebaseVisionFaceDetectorOptions.ALL_LANDMARKS + : FirebaseVisionFaceDetectorOptions.NO_LANDMARKS; + + int contours = (boolean) options.get("enableContours") ? FirebaseVisionFaceDetectorOptions.ALL_CONTOURS + : FirebaseVisionFaceDetectorOptions.NO_CONTOURS; int mode; switch ((String) options.get("mode")) { - case "accurate": - mode = FirebaseVisionFaceDetectorOptions.ACCURATE; - break; - case "fast": - mode = FirebaseVisionFaceDetectorOptions.FAST; - break; - default: - throw new IllegalArgumentException("Not a mode:" + options.get("mode")); + case "accurate": + mode = FirebaseVisionFaceDetectorOptions.ACCURATE; + break; + case "fast": + mode = FirebaseVisionFaceDetectorOptions.FAST; + break; + default: + throw new IllegalArgumentException("Not a mode:" + options.get("mode")); } - FirebaseVisionFaceDetectorOptions.Builder builder = - new FirebaseVisionFaceDetectorOptions.Builder() - .setClassificationMode(classification) - .setLandmarkMode(landmark) - .setContourMode(contours) - .setMinFaceSize((float) ((double) options.get("minFaceSize"))) - .setPerformanceMode(mode); + FirebaseVisionFaceDetectorOptions.Builder builder = new FirebaseVisionFaceDetectorOptions.Builder() + .setClassificationMode(classification).setLandmarkMode(landmark).setContourMode(contours) + .setMinFaceSize((float) ((double) options.get("minFaceSize"))).setPerformanceMode(mode); if ((boolean) options.get("enableTracking")) { builder.enableTracking(); From 99e64a69806e2831685a61e46fab64deb96fbe68 Mon Sep 17 00:00:00 2001 From: Ali EP Date: Tue, 14 May 2019 14:47:32 +0430 Subject: [PATCH 03/13] manual formatting --- .../firebasemlvision/FaceDetector.java | 176 ++++++++++-------- .../ios/Classes/FaceDetector.m | 47 +++-- 2 files changed, 122 insertions(+), 101 deletions(-) diff --git a/packages/firebase_ml_vision/android/src/main/java/io/flutter/plugins/firebasemlvision/FaceDetector.java b/packages/firebase_ml_vision/android/src/main/java/io/flutter/plugins/firebasemlvision/FaceDetector.java index 18bba6fecc79..602ae5a845f1 100644 --- a/packages/firebase_ml_vision/android/src/main/java/io/flutter/plugins/firebasemlvision/FaceDetector.java +++ b/packages/firebase_ml_vision/android/src/main/java/io/flutter/plugins/firebasemlvision/FaceDetector.java @@ -7,10 +7,10 @@ import com.google.firebase.ml.vision.common.FirebaseVisionImage; import com.google.firebase.ml.vision.common.FirebaseVisionPoint; import com.google.firebase.ml.vision.face.FirebaseVisionFace; +import com.google.firebase.ml.vision.face.FirebaseVisionFaceContour; import com.google.firebase.ml.vision.face.FirebaseVisionFaceDetector; import com.google.firebase.ml.vision.face.FirebaseVisionFaceDetectorOptions; import com.google.firebase.ml.vision.face.FirebaseVisionFaceLandmark; -import com.google.firebase.ml.vision.face.FirebaseVisionFaceContour; import io.flutter.plugin.common.MethodChannel; import java.io.IOException; import java.util.ArrayList; @@ -21,15 +21,14 @@ class FaceDetector implements Detector { static final FaceDetector instance = new FaceDetector(); - private FaceDetector() { - } + private FaceDetector() {} private FirebaseVisionFaceDetector detector; private Map lastOptions; @Override - public void handleDetection(FirebaseVisionImage image, Map options, - final MethodChannel.Result result) { + public void handleDetection( + FirebaseVisionImage image, Map options, final MethodChannel.Result result) { // Use instantiated detector if the options are the same. Otherwise, close and // instantiate new @@ -50,52 +49,59 @@ public void handleDetection(FirebaseVisionImage image, Map optio detector = FirebaseVision.getInstance().getVisionFaceDetector(parseOptions(lastOptions)); } - detector.detectInImage(image).addOnSuccessListener(new OnSuccessListener>() { - @Override - public void onSuccess(List firebaseVisionFaces) { - List> faces = new ArrayList<>(firebaseVisionFaces.size()); - for (FirebaseVisionFace face : firebaseVisionFaces) { - Map faceData = new HashMap<>(); - - faceData.put("left", (double) face.getBoundingBox().left); - faceData.put("top", (double) face.getBoundingBox().top); - faceData.put("width", (double) face.getBoundingBox().width()); - faceData.put("height", (double) face.getBoundingBox().height()); - - faceData.put("headEulerAngleY", face.getHeadEulerAngleY()); - faceData.put("headEulerAngleZ", face.getHeadEulerAngleZ()); - - if (face.getSmilingProbability() != FirebaseVisionFace.UNCOMPUTED_PROBABILITY) { - faceData.put("smilingProbability", face.getSmilingProbability()); - } - - if (face.getLeftEyeOpenProbability() != FirebaseVisionFace.UNCOMPUTED_PROBABILITY) { - faceData.put("leftEyeOpenProbability", face.getLeftEyeOpenProbability()); - } - - if (face.getRightEyeOpenProbability() != FirebaseVisionFace.UNCOMPUTED_PROBABILITY) { - faceData.put("rightEyeOpenProbability", face.getRightEyeOpenProbability()); - } - - if (face.getTrackingId() != FirebaseVisionFace.INVALID_ID) { - faceData.put("trackingId", face.getTrackingId()); - } - - faceData.put("landmarks", getLandmarkData(face)); - - faceData.put("contours", getContourData(face)); - - faces.add(faceData); - } - - result.success(faces); - } - }).addOnFailureListener(new OnFailureListener() { - @Override - public void onFailure(@NonNull Exception exception) { - result.error("faceDetectorError", exception.getLocalizedMessage(), null); - } - }); + detector + .detectInImage(image) + .addOnSuccessListener( + new OnSuccessListener>() { + @Override + public void onSuccess(List firebaseVisionFaces) { + List> faces = new ArrayList<>(firebaseVisionFaces.size()); + for (FirebaseVisionFace face : firebaseVisionFaces) { + Map faceData = new HashMap<>(); + + faceData.put("left", (double) face.getBoundingBox().left); + faceData.put("top", (double) face.getBoundingBox().top); + faceData.put("width", (double) face.getBoundingBox().width()); + faceData.put("height", (double) face.getBoundingBox().height()); + + faceData.put("headEulerAngleY", face.getHeadEulerAngleY()); + faceData.put("headEulerAngleZ", face.getHeadEulerAngleZ()); + + if (face.getSmilingProbability() != FirebaseVisionFace.UNCOMPUTED_PROBABILITY) { + faceData.put("smilingProbability", face.getSmilingProbability()); + } + + if (face.getLeftEyeOpenProbability() + != FirebaseVisionFace.UNCOMPUTED_PROBABILITY) { + faceData.put("leftEyeOpenProbability", face.getLeftEyeOpenProbability()); + } + + if (face.getRightEyeOpenProbability() + != FirebaseVisionFace.UNCOMPUTED_PROBABILITY) { + faceData.put("rightEyeOpenProbability", face.getRightEyeOpenProbability()); + } + + if (face.getTrackingId() != FirebaseVisionFace.INVALID_ID) { + faceData.put("trackingId", face.getTrackingId()); + } + + faceData.put("landmarks", getLandmarkData(face)); + + faceData.put("contours", getContourData(face)); + + faces.add(faceData); + } + + result.success(faces); + } + }) + .addOnFailureListener( + new OnFailureListener() { + @Override + public void onFailure(@NonNull Exception exception) { + result.error("faceDetectorError", exception.getLocalizedMessage(), null); + } + }); } private Map getLandmarkData(FirebaseVisionFace face) { @@ -121,16 +127,23 @@ private Map> getContourData(FirebaseVisionFace face) { contours.put("allPoints", contourPosition(face, FirebaseVisionFaceContour.ALL_POINTS)); contours.put("face", contourPosition(face, FirebaseVisionFaceContour.FACE)); contours.put("leftEye", contourPosition(face, FirebaseVisionFaceContour.LEFT_EYE)); - contours.put("leftEyebrowBottom", contourPosition(face, FirebaseVisionFaceContour.LEFT_EYEBROW_BOTTOM)); - contours.put("leftEyebrowTop", contourPosition(face, FirebaseVisionFaceContour.LEFT_EYEBROW_TOP)); - contours.put("lowerLipBottom", contourPosition(face, FirebaseVisionFaceContour.LOWER_LIP_BOTTOM)); + contours.put( + "leftEyebrowBottom", contourPosition(face, FirebaseVisionFaceContour.LEFT_EYEBROW_BOTTOM)); + contours.put( + "leftEyebrowTop", contourPosition(face, FirebaseVisionFaceContour.LEFT_EYEBROW_TOP)); + contours.put( + "lowerLipBottom", contourPosition(face, FirebaseVisionFaceContour.LOWER_LIP_BOTTOM)); contours.put("lowerLipTop", contourPosition(face, FirebaseVisionFaceContour.LOWER_LIP_TOP)); contours.put("noseBottom", contourPosition(face, FirebaseVisionFaceContour.NOSE_BOTTOM)); contours.put("noseBridge", contourPosition(face, FirebaseVisionFaceContour.NOSE_BRIDGE)); contours.put("rightEye", contourPosition(face, FirebaseVisionFaceContour.RIGHT_EYE)); - contours.put("rightEyebrowBottom", contourPosition(face, FirebaseVisionFaceContour.RIGHT_EYEBROW_BOTTOM)); - contours.put("rightEyebrowTop", contourPosition(face, FirebaseVisionFaceContour.RIGHT_EYEBROW_TOP)); - contours.put("upperLipBottom", contourPosition(face, FirebaseVisionFaceContour.UPPER_LIP_BOTTOM)); + contours.put( + "rightEyebrowBottom", + contourPosition(face, FirebaseVisionFaceContour.RIGHT_EYEBROW_BOTTOM)); + contours.put( + "rightEyebrowTop", contourPosition(face, FirebaseVisionFaceContour.RIGHT_EYEBROW_TOP)); + contours.put( + "upperLipBottom", contourPosition(face, FirebaseVisionFaceContour.UPPER_LIP_BOTTOM)); contours.put("upperLipTop", contourPosition(face, FirebaseVisionFaceContour.UPPER_LIP_TOP)); return contours; @@ -139,7 +152,7 @@ private Map> getContourData(FirebaseVisionFace face) { private double[] landmarkPosition(FirebaseVisionFace face, int landmarkInt) { FirebaseVisionFaceLandmark landmark = face.getLandmark(landmarkInt); if (landmark != null) { - return new double[] { landmark.getPosition().getX(), landmark.getPosition().getY() }; + return new double[] {landmark.getPosition().getX(), landmark.getPosition().getY()}; } return null; @@ -152,7 +165,7 @@ private List contourPosition(FirebaseVisionFace face, int contourInt) List result = new ArrayList(); for (int i = 0; i < contourPoints.size(); i++) { - result.add(new double[] { contourPoints.get(i).getX(), contourPoints.get(i).getY() }); + result.add(new double[] {contourPoints.get(i).getX(), contourPoints.get(i).getY()}); } return result; @@ -162,31 +175,40 @@ private List contourPosition(FirebaseVisionFace face, int contourInt) } private FirebaseVisionFaceDetectorOptions parseOptions(Map options) { - int classification = (boolean) options.get("enableClassification") - ? FirebaseVisionFaceDetectorOptions.ALL_CLASSIFICATIONS - : FirebaseVisionFaceDetectorOptions.NO_CLASSIFICATIONS; + int classification = + (boolean) options.get("enableClassification") + ? FirebaseVisionFaceDetectorOptions.ALL_CLASSIFICATIONS + : FirebaseVisionFaceDetectorOptions.NO_CLASSIFICATIONS; - int landmark = (boolean) options.get("enableLandmarks") ? FirebaseVisionFaceDetectorOptions.ALL_LANDMARKS - : FirebaseVisionFaceDetectorOptions.NO_LANDMARKS; + int landmark = + (boolean) options.get("enableLandmarks") + ? FirebaseVisionFaceDetectorOptions.ALL_LANDMARKS + : FirebaseVisionFaceDetectorOptions.NO_LANDMARKS; - int contours = (boolean) options.get("enableContours") ? FirebaseVisionFaceDetectorOptions.ALL_CONTOURS - : FirebaseVisionFaceDetectorOptions.NO_CONTOURS; + int contours = + (boolean) options.get("enableContours") + ? FirebaseVisionFaceDetectorOptions.ALL_CONTOURS + : FirebaseVisionFaceDetectorOptions.NO_CONTOURS; int mode; switch ((String) options.get("mode")) { - case "accurate": - mode = FirebaseVisionFaceDetectorOptions.ACCURATE; - break; - case "fast": - mode = FirebaseVisionFaceDetectorOptions.FAST; - break; - default: - throw new IllegalArgumentException("Not a mode:" + options.get("mode")); + case "accurate": + mode = FirebaseVisionFaceDetectorOptions.ACCURATE; + break; + case "fast": + mode = FirebaseVisionFaceDetectorOptions.FAST; + break; + default: + throw new IllegalArgumentException("Not a mode:" + options.get("mode")); } - FirebaseVisionFaceDetectorOptions.Builder builder = new FirebaseVisionFaceDetectorOptions.Builder() - .setClassificationMode(classification).setLandmarkMode(landmark).setContourMode(contours) - .setMinFaceSize((float) ((double) options.get("minFaceSize"))).setPerformanceMode(mode); + FirebaseVisionFaceDetectorOptions.Builder builder = + new FirebaseVisionFaceDetectorOptions.Builder() + .setClassificationMode(classification) + .setLandmarkMode(landmark) + .setContourMode(contours) + .setMinFaceSize((float) ((double) options.get("minFaceSize"))) + .setPerformanceMode(mode); if ((boolean) options.get("enableTracking")) { builder.enableTracking(); diff --git a/packages/firebase_ml_vision/ios/Classes/FaceDetector.m b/packages/firebase_ml_vision/ios/Classes/FaceDetector.m index 8d33a9e8fb75..14cc26d58fac 100644 --- a/packages/firebase_ml_vision/ios/Classes/FaceDetector.m +++ b/packages/firebase_ml_vision/ios/Classes/FaceDetector.m @@ -64,34 +64,33 @@ + (void)handleDetection:(FIRVisionImage *)image landmark:FIRFaceLandmarkTypeMouthRight], }, @"contours" : @{ - @"allPoints" : [FaceDetector getContourPoints:face - contour:FIRFaceContourTypeAll], - @"face" : [FaceDetector getContourPoints:face - contour:FIRFaceContourTypeFace], - @"leftEye" : [FaceDetector getContourPoints:face - contour:FIRFaceContourTypeLeftEye], - @"leftEyebrowBottom" : [FaceDetector getContourPoints:face - contour:FIRFaceContourTypeLeftEyebrowBottom], - @"leftEyebrowTop" : [FaceDetector getContourPoints:face - contour:FIRFaceContourTypeLeftEyebrowTop], - @"lowerLipBottom" : [FaceDetector getContourPoints:face - contour:FIRFaceContourTypeLowerLipBottom], + @"allPoints" : [FaceDetector getContourPoints:face contour:FIRFaceContourTypeAll], + @"face" : [FaceDetector getContourPoints:face contour:FIRFaceContourTypeFace], + @"leftEye" : [FaceDetector getContourPoints:face contour:FIRFaceContourTypeLeftEye], + @"leftEyebrowBottom" : + [FaceDetector getContourPoints:face + contour:FIRFaceContourTypeLeftEyebrowBottom], + @"leftEyebrowTop" : + [FaceDetector getContourPoints:face contour:FIRFaceContourTypeLeftEyebrowTop], + @"lowerLipBottom" : + [FaceDetector getContourPoints:face contour:FIRFaceContourTypeLowerLipBottom], @"lowerLipTop" : [FaceDetector getContourPoints:face - contour:FIRFaceContourTypeLowerLipTop], + contour:FIRFaceContourTypeLowerLipTop], @"noseBottom" : [FaceDetector getContourPoints:face - contour:FIRFaceContourTypeNoseBottom], + contour:FIRFaceContourTypeNoseBottom], @"noseBridge" : [FaceDetector getContourPoints:face - contour:FIRFaceContourTypeNoseBridge], + contour:FIRFaceContourTypeNoseBridge], @"rightEye" : [FaceDetector getContourPoints:face - contour:FIRFaceContourTypeRightEye], - @"rightEyebrowBottom" : [FaceDetector getContourPoints:face - contour:FIRFaceContourTypeRightEyebrowBottom], - @"rightEyebrowTop" : [FaceDetector getContourPoints:face - contour:FIRFaceContourTypeRightEyebrowTop], - @"upperLipBottom" : [FaceDetector getContourPoints:face - contour:FIRFaceContourTypeUpperLipBottom], + contour:FIRFaceContourTypeRightEye], + @"rightEyebrowBottom" : + [FaceDetector getContourPoints:face + contour:FIRFaceContourTypeRightEyebrowBottom], + @"rightEyebrowTop" : + [FaceDetector getContourPoints:face contour:FIRFaceContourTypeRightEyebrowTop], + @"upperLipBottom" : + [FaceDetector getContourPoints:face contour:FIRFaceContourTypeUpperLipBottom], @"upperLipTop" : [FaceDetector getContourPoints:face - contour:FIRFaceContourTypeUpperLipTop], + contour:FIRFaceContourTypeUpperLipTop], } }; @@ -115,7 +114,7 @@ + (id)getContourPoints:(FIRVisionFace *)face contour:(FIRFaceContourType)contour FIRVisionFaceContour *contour = [face contourOfType:contourType]; if (contour) { NSArray *contourPoints = contour.points; - NSMutableArray *result = [[NSMutableArray alloc] initWithCapacity: [contourPoints count]]; + NSMutableArray *result = [[NSMutableArray alloc] initWithCapacity:[contourPoints count]]; for (int i = 0; i < [contourPoints count]; i++) { FIRVisionPoint *point = [contourPoints objectAtIndex:i]; [result insertObject:@[ point.x, point.y ] atIndex:i]; From a972bad9fc018e75325143a8c18612f8b45a2668 Mon Sep 17 00:00:00 2001 From: Ali EP Date: Tue, 14 May 2019 15:13:09 +0430 Subject: [PATCH 04/13] contours null --- packages/firebase_ml_vision/lib/src/face_detector.dart | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/firebase_ml_vision/lib/src/face_detector.dart b/packages/firebase_ml_vision/lib/src/face_detector.dart index 66d5485cad17..ca7570fe618c 100644 --- a/packages/firebase_ml_vision/lib/src/face_detector.dart +++ b/packages/firebase_ml_vision/lib/src/face_detector.dart @@ -164,13 +164,15 @@ class Face { _contours = Map.fromIterables( FaceContourType.values, FaceContourType.values.map((FaceContourType type) { - final List arr = data['contours'][_enumToString(type)]; + /// added {} to pass the tests + final List arr = (data['contours'] ?? + >{})[_enumToString(type)]; return (arr == null) ? null : FaceContour._( type, arr - .map((dynamic pos) => Offset(pos.first, pos.last)) + .map((dynamic pos) => Offset(pos[0], pos[1])) .toList(), ); })); From af88d5b612c9bbaeea85072c12abf155b0f55e86 Mon Sep 17 00:00:00 2001 From: Ali EP Date: Tue, 14 May 2019 15:29:29 +0430 Subject: [PATCH 05/13] contours null --- packages/firebase_ml_vision/lib/src/face_detector.dart | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/firebase_ml_vision/lib/src/face_detector.dart b/packages/firebase_ml_vision/lib/src/face_detector.dart index ca7570fe618c..ca4592429f83 100644 --- a/packages/firebase_ml_vision/lib/src/face_detector.dart +++ b/packages/firebase_ml_vision/lib/src/face_detector.dart @@ -164,9 +164,9 @@ class Face { _contours = Map.fromIterables( FaceContourType.values, FaceContourType.values.map((FaceContourType type) { - /// added {} to pass the tests - final List arr = (data['contours'] ?? - >{})[_enumToString(type)]; + /// added empty map to pass the tests + final List arr = + (data['contours'] ?? Map())[_enumToString(type)]; return (arr == null) ? null : FaceContour._( From f5807f20e37c2ab6640eda86f128e24061bd0804 Mon Sep 17 00:00:00 2001 From: Ali EP Date: Tue, 14 May 2019 16:05:57 +0430 Subject: [PATCH 06/13] [test] enableContours: false --- packages/firebase_ml_vision/test/firebase_ml_vision_test.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/firebase_ml_vision/test/firebase_ml_vision_test.dart b/packages/firebase_ml_vision/test/firebase_ml_vision_test.dart index 8eb34dab42c4..d3678d148271 100644 --- a/packages/firebase_ml_vision/test/firebase_ml_vision_test.dart +++ b/packages/firebase_ml_vision/test/firebase_ml_vision_test.dart @@ -555,6 +555,7 @@ void main() { 'options': { 'enableClassification': true, 'enableLandmarks': true, + 'enableContours': false, 'enableTracking': false, 'minFaceSize': 0.5, 'mode': 'accurate', From 1301f7b3598a091162ecf83e74a56dc92260063f Mon Sep 17 00:00:00 2001 From: Ali EP Date: Wed, 15 May 2019 14:05:32 +0430 Subject: [PATCH 07/13] updated dependencies --- packages/firebase_ml_vision/README.md | 13 +++++++++++++ packages/firebase_ml_vision/android/build.gradle | 1 - .../ios/firebase_ml_vision.podspec | 1 - 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/packages/firebase_ml_vision/README.md b/packages/firebase_ml_vision/README.md index 466b24e06062..71a4f1cbdcd0 100644 --- a/packages/firebase_ml_vision/README.md +++ b/packages/firebase_ml_vision/README.md @@ -25,6 +25,19 @@ android { } ``` +### Android +If you're using the on-device `Face Contour Detection`, include the latest matching [ML Kit: Face Detection Model](https://firebase.google.com/support/release-notes/android) dependency in your app-level build.gradle file. + +``` +android { + dependencies { + // ... + + api 'com.google.firebase:firebase-ml-vision-face-model:17.0.2' + } +} +``` + If you receive compilation errors, try an earlier version of [ML Kit: Image Labeling](https://firebase.google.com/support/release-notes/android). Optional but recommended: If you use the on-device API, configure your app to automatically download the ML model to the device after your app is installed from the Play Store. To do so, add the following declaration to your app's AndroidManifest.xml file: diff --git a/packages/firebase_ml_vision/android/build.gradle b/packages/firebase_ml_vision/android/build.gradle index 3afd8ae41647..92cabac01cd5 100644 --- a/packages/firebase_ml_vision/android/build.gradle +++ b/packages/firebase_ml_vision/android/build.gradle @@ -46,7 +46,6 @@ android { } dependencies { api 'com.google.firebase:firebase-ml-vision:20.0.0' - api 'com.google.firebase:firebase-ml-vision-face-model:17.0.2' implementation 'androidx.annotation:annotation:1.0.0' implementation 'androidx.exifinterface:exifinterface:1.0.0' } diff --git a/packages/firebase_ml_vision/ios/firebase_ml_vision.podspec b/packages/firebase_ml_vision/ios/firebase_ml_vision.podspec index 63d5d2ecdae6..a25eef4a3fa1 100644 --- a/packages/firebase_ml_vision/ios/firebase_ml_vision.podspec +++ b/packages/firebase_ml_vision/ios/firebase_ml_vision.podspec @@ -18,7 +18,6 @@ An SDK that brings Google's machine learning expertise to Android and iOS apps i s.dependency 'Flutter' s.dependency 'Firebase/Core' s.dependency 'Firebase/MLVision' - s.dependency 'Firebase/MLVisionFaceModel' s.ios.deployment_target = '9.0' s.static_framework = true end From 6b020db23380660f19ce86f388b7300df3a71a91 Mon Sep 17 00:00:00 2001 From: Ali EP Date: Wed, 15 May 2019 18:12:41 +0430 Subject: [PATCH 08/13] syntax --- packages/firebase_ml_vision/lib/src/face_detector.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/firebase_ml_vision/lib/src/face_detector.dart b/packages/firebase_ml_vision/lib/src/face_detector.dart index ca4592429f83..e543576beb45 100644 --- a/packages/firebase_ml_vision/lib/src/face_detector.dart +++ b/packages/firebase_ml_vision/lib/src/face_detector.dart @@ -166,7 +166,7 @@ class Face { FaceContourType.values.map((FaceContourType type) { /// added empty map to pass the tests final List arr = - (data['contours'] ?? Map())[_enumToString(type)]; + (data['contours'] ?? {})[_enumToString(type)]; return (arr == null) ? null : FaceContour._( From 41c7907cb8978cbdf991c2a71d47cb1bcc19335c Mon Sep 17 00:00:00 2001 From: Ali EP Date: Fri, 19 Jul 2019 07:09:56 +0430 Subject: [PATCH 09/13] unnecessary label --- packages/firebase_ml_vision/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/firebase_ml_vision/README.md b/packages/firebase_ml_vision/README.md index 89c44fb0871e..be7e6578f3ab 100644 --- a/packages/firebase_ml_vision/README.md +++ b/packages/firebase_ml_vision/README.md @@ -25,7 +25,6 @@ android { } ``` -### Android If you're using the on-device `Face Contour Detection`, include the latest matching [ML Kit: Face Detection Model](https://firebase.google.com/support/release-notes/android) dependency in your app-level build.gradle file. ``` From 004749aeb7657ce846cc9327e9864802167c9ede Mon Sep 17 00:00:00 2001 From: Maurice Parrish Date: Fri, 19 Jul 2019 15:05:00 -0700 Subject: [PATCH 10/13] Update version --- .gitignore | 2 -- packages/firebase_ml_vision/CHANGELOG.md | 4 ++++ packages/firebase_ml_vision/pubspec.yaml | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index 8c164bf0d87c..625ff5896c3b 100644 --- a/.gitignore +++ b/.gitignore @@ -36,8 +36,6 @@ GeneratedPluginRegistrant.java build/ .flutter-plugins - .project .classpath .settings - diff --git a/packages/firebase_ml_vision/CHANGELOG.md b/packages/firebase_ml_vision/CHANGELOG.md index f25d393d393f..2d24105b5897 100644 --- a/packages/firebase_ml_vision/CHANGELOG.md +++ b/packages/firebase_ml_vision/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.9.2 + +* Add detection of `FaceContour`s when using the `FaceDetector`. See `README.md` for more information. + ## 0.9.1 * Add support for cloud text recognizer. diff --git a/packages/firebase_ml_vision/pubspec.yaml b/packages/firebase_ml_vision/pubspec.yaml index c2138b1866d0..05bdfe95d299 100644 --- a/packages/firebase_ml_vision/pubspec.yaml +++ b/packages/firebase_ml_vision/pubspec.yaml @@ -2,7 +2,7 @@ name: firebase_ml_vision description: Flutter plugin for Firebase machine learning vision services. author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/firebase_ml_vision -version: 0.9.1 +version: 0.9.2 dependencies: flutter: From b71bb0b26cff775368a2edfd0f3d27fd11cfdd0f Mon Sep 17 00:00:00 2001 From: Maurice Parrish Date: Fri, 19 Jul 2019 15:45:15 -0700 Subject: [PATCH 11/13] Add unit test --- .../test/firebase_ml_vision_test.dart | 136 +++++++++++++++++- 1 file changed, 135 insertions(+), 1 deletion(-) diff --git a/packages/firebase_ml_vision/test/firebase_ml_vision_test.dart b/packages/firebase_ml_vision/test/firebase_ml_vision_test.dart index 7ab7070579ae..59dea115f83f 100644 --- a/packages/firebase_ml_vision/test/firebase_ml_vision_test.dart +++ b/packages/firebase_ml_vision/test/firebase_ml_vision_test.dart @@ -526,6 +526,64 @@ void main() { 'rightEye': [16.1, 17.1], 'rightMouth': [18.1, 19.1], }, + 'contours': { + 'allPoints': [ + [1.1, 2.2], + [3.3, 4.4], + ], + 'face': [ + [1.1, 2.2], + [3.3, 4.4], + ], + 'leftEye': [ + [1.1, 2.2], + [3.3, 4.4], + ], + 'leftEyebrowBottom': [ + [1.1, 2.2], + [3.3, 4.4], + ], + 'leftEyebrowTop': [ + [1.1, 2.2], + [3.3, 4.4], + ], + 'lowerLipBottom': [ + [1.1, 2.2], + [3.3, 4.4], + ], + 'lowerLipTop': [ + [1.1, 2.2], + [3.3, 4.4], + ], + 'noseBottom': [ + [1.1, 2.2], + [3.3, 4.4], + ], + 'noseBridge': [ + [1.1, 2.2], + [3.3, 4.4], + ], + 'rightEye': [ + [1.1, 2.2], + [3.3, 4.4], + ], + 'rightEyebrowBottom': [ + [1.1, 2.2], + [3.3, 4.4], + ], + 'rightEyebrowTop': [ + [1.1, 2.2], + [3.3, 4.4], + ], + 'upperLipBottom': [ + [1.1, 2.2], + [3.3, 4.4], + ], + 'upperLipTop': [ + [1.1, 2.2], + [3.3, 4.4], + ], + }, }, ]; }); @@ -538,6 +596,7 @@ void main() { enableClassification: true, enableLandmarks: true, enableTracking: false, + enableContours: true, minFaceSize: 0.5, mode: FaceDetectorMode.accurate, ), @@ -561,7 +620,7 @@ void main() { 'options': { 'enableClassification': true, 'enableLandmarks': true, - 'enableContours': false, + 'enableContours': true, 'enableTracking': false, 'minFaceSize': 0.5, 'mode': 'accurate', @@ -599,6 +658,81 @@ void main() { expect(p(FaceLandmarkType.rightEar), const Offset(14.1, 15.1)); expect(p(FaceLandmarkType.rightEye), const Offset(16.1, 17.1)); expect(p(FaceLandmarkType.rightMouth), const Offset(18.1, 19.1)); + + List c(FaceContourType type) { + return face.getContour(type).positionsList; + } + + expect( + c(FaceContourType.allPoints), + containsAllInOrder( + [const Offset(1.1, 2.2), const Offset(3.3, 4.4)]), + ); + expect( + c(FaceContourType.face), + containsAllInOrder( + [const Offset(1.1, 2.2), const Offset(3.3, 4.4)]), + ); + expect( + c(FaceContourType.leftEye), + containsAllInOrder( + [const Offset(1.1, 2.2), const Offset(3.3, 4.4)]), + ); + expect( + c(FaceContourType.leftEyebrowBottom), + containsAllInOrder( + [const Offset(1.1, 2.2), const Offset(3.3, 4.4)]), + ); + expect( + c(FaceContourType.leftEyebrowTop), + containsAllInOrder( + [const Offset(1.1, 2.2), const Offset(3.3, 4.4)]), + ); + expect( + c(FaceContourType.lowerLipBottom), + containsAllInOrder( + [const Offset(1.1, 2.2), const Offset(3.3, 4.4)]), + ); + expect( + c(FaceContourType.lowerLipTop), + containsAllInOrder( + [const Offset(1.1, 2.2), const Offset(3.3, 4.4)]), + ); + expect( + c(FaceContourType.noseBottom), + containsAllInOrder( + [const Offset(1.1, 2.2), const Offset(3.3, 4.4)]), + ); + expect( + c(FaceContourType.noseBridge), + containsAllInOrder( + [const Offset(1.1, 2.2), const Offset(3.3, 4.4)]), + ); + expect( + c(FaceContourType.rightEye), + containsAllInOrder( + [const Offset(1.1, 2.2), const Offset(3.3, 4.4)]), + ); + expect( + c(FaceContourType.rightEyebrowBottom), + containsAllInOrder( + [const Offset(1.1, 2.2), const Offset(3.3, 4.4)]), + ); + expect( + c(FaceContourType.rightEyebrowTop), + containsAllInOrder( + [const Offset(1.1, 2.2), const Offset(3.3, 4.4)]), + ); + expect( + c(FaceContourType.upperLipBottom), + containsAllInOrder( + [const Offset(1.1, 2.2), const Offset(3.3, 4.4)]), + ); + expect( + c(FaceContourType.upperLipTop), + containsAllInOrder( + [const Offset(1.1, 2.2), const Offset(3.3, 4.4)]), + ); }); test('processImage with null landmark', () async { From 757393448088674d937e1839cef7a2553be4280b Mon Sep 17 00:00:00 2001 From: Maurice Parrish Date: Fri, 19 Jul 2019 16:39:29 -0700 Subject: [PATCH 12/13] Add integration tests --- .../firebase_ml_vision/example/android/app/build.gradle | 1 + .../example/test_driver/face_detector.dart | 9 ++++++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/packages/firebase_ml_vision/example/android/app/build.gradle b/packages/firebase_ml_vision/example/android/app/build.gradle index 96c685ea27a2..edd72b27f848 100644 --- a/packages/firebase_ml_vision/example/android/app/build.gradle +++ b/packages/firebase_ml_vision/example/android/app/build.gradle @@ -48,6 +48,7 @@ android { dependencies { api 'com.google.firebase:firebase-ml-vision-image-label-model:17.0.2' + api 'com.google.firebase:firebase-ml-vision-face-model:17.0.2' } } diff --git a/packages/firebase_ml_vision/example/test_driver/face_detector.dart b/packages/firebase_ml_vision/example/test_driver/face_detector.dart index 1f94b4061cae..666b200e301c 100644 --- a/packages/firebase_ml_vision/example/test_driver/face_detector.dart +++ b/packages/firebase_ml_vision/example/test_driver/face_detector.dart @@ -6,7 +6,10 @@ part of 'firebase_ml_vision.dart'; void faceDetectorTests() { group('$FaceDetector', () { - final FaceDetector detector = FirebaseVision.instance.faceDetector(); + final FaceDetector detector = FirebaseVision.instance.faceDetector( + FaceDetectorOptions( + enableContours: true, mode: FaceDetectorMode.accurate), + ); test('processImage', () async { final String tmpFilename = await _loadImage('assets/test_face.jpg'); @@ -16,6 +19,10 @@ void faceDetectorTests() { final List faces = await detector.processImage(visionImage); expect(faces.length, 1); + expect( + faces[0].getContour(FaceContourType.allPoints).positionsList, + isNotEmpty, + ); }); test('close', () { From 8d4e0e641af5577ac64a7b011c907f398d242b45 Mon Sep 17 00:00:00 2001 From: Maurice Parrish Date: Mon, 22 Jul 2019 17:04:15 -0700 Subject: [PATCH 13/13] Use a single face in test image --- .../example/assets/test_face.jpg | Bin 78450 -> 35944 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/packages/firebase_ml_vision/example/assets/test_face.jpg b/packages/firebase_ml_vision/example/assets/test_face.jpg index f87458b4db81e33e1b32e68accf5cd1da3d54912..a384f3c243b690f8591f6f3ddbe403e411fe1e9b 100644 GIT binary patch literal 35944 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 mKIFZuMGky;Qd*$N$;<;WBgp literal 78450 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⪻A^I&_P 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�L<(7)pjYSKO2I32jH27s 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
q+6Bq5;tq+UTQiq^FC}O?YaZkw4o-Xh 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 UkoZ-8tfsLL=H?aV)&I@@AK&o?>;M1&