diff --git a/mobile/lib/utils/face/face_box_crop.dart b/mobile/lib/utils/face/face_box_crop.dart index 7d032998a..bbdd40e59 100644 --- a/mobile/lib/utils/face/face_box_crop.dart +++ b/mobile/lib/utils/face/face_box_crop.dart @@ -5,8 +5,9 @@ import "package:photos/core/cache/lru_map.dart"; import "package:photos/face/model/box.dart"; import "package:photos/models/file/file.dart"; import "package:photos/models/file/file_type.dart"; -import "package:photos/utils/face/face_util.dart"; +// import "package:photos/utils/face/face_util.dart"; import "package:photos/utils/file_util.dart"; +import "package:photos/utils/image_ml_isolate.dart"; import "package:photos/utils/thumbnail_util.dart"; import "package:pool/pool.dart"; @@ -37,8 +38,8 @@ Future?> getFaceCrops( faceBoxes.add(e.value); } final List faceCrop = - // await ImageMlIsolate.instance.generateFaceThumbnailsForImage( - await generateJpgFaceThumbnails( + await ImageMlIsolate.instance.generateFaceThumbnailsForImageUsingCanvas( + // await generateJpgFaceThumbnails( imagePath, faceBoxes, ); diff --git a/mobile/lib/utils/image_ml_isolate.dart b/mobile/lib/utils/image_ml_isolate.dart index 0e4983689..66de0c255 100644 --- a/mobile/lib/utils/image_ml_isolate.dart +++ b/mobile/lib/utils/image_ml_isolate.dart @@ -22,6 +22,7 @@ enum ImageOperation { preprocessMobileFaceNet, preprocessMobileFaceNetOnnx, generateFaceThumbnails, + generateFaceThumbnailsUsingCanvas, cropAndPadFace, } @@ -226,6 +227,19 @@ class ImageMlIsolate { faceBoxes, ); sendPort.send(List.from(results)); + case ImageOperation.generateFaceThumbnailsUsingCanvas: + final imagePath = args['imagePath'] as String; + final Uint8List imageData = await File(imagePath).readAsBytes(); + final faceBoxesJson = + args['faceBoxesList'] as List>; + final List faceBoxes = + faceBoxesJson.map((json) => FaceBox.fromJson(json)).toList(); + final List results = + await generateFaceThumbnailsUsingCanvas( + imageData, + faceBoxes, + ); + sendPort.send(List.from(results)); case ImageOperation.cropAndPadFace: final imageData = args['imageData'] as Uint8List; final faceBox = args['faceBox'] as List; @@ -366,7 +380,7 @@ class ImageMlIsolate { ); final inputs = results['inputs'] as Float32List; final originalSize = Dimensions( - width:results['originalWidth'] as int, + width: results['originalWidth'] as int, height: results['originalHeight'] as int, ); final newSize = Dimensions( @@ -501,6 +515,26 @@ class ImageMlIsolate { ).then((value) => value.cast()); } + /// Generates face thumbnails for all [faceBoxes] in [imageData]. + /// + /// Uses [generateFaceThumbnailsUsingCanvas] inside the isolate. + Future> generateFaceThumbnailsForImageUsingCanvas( + String imagePath, + List faceBoxes, + ) async { + final List> faceBoxesJson = + faceBoxes.map((box) => box.toJson()).toList(); + return await _runInIsolate( + ( + ImageOperation.generateFaceThumbnailsUsingCanvas, + { + 'imagePath': imagePath, + 'faceBoxesList': faceBoxesJson, + }, + ), + ).then((value) => value.cast()); + } + @Deprecated('For second pass of BlazeFace, no longer used') /// Generates cropped and padded image data from [imageData] and a [faceBox]. diff --git a/mobile/lib/utils/image_ml_util.dart b/mobile/lib/utils/image_ml_util.dart index 7ce10e306..5d479d151 100644 --- a/mobile/lib/utils/image_ml_util.dart +++ b/mobile/lib/utils/image_ml_util.dart @@ -1272,12 +1272,10 @@ Future> generateFaceThumbnails( } } -@Deprecated("Old method using canvas, replaced by `generateFaceThumbnails`") - /// Generates a face thumbnail from [imageData] and a [faceDetection]. /// /// Returns a [Uint8List] image, in png format. -Future> generateFaceThumbnailsFromDataAndDetections( +Future> generateFaceThumbnailsUsingCanvas( Uint8List imageData, List faceBoxes, ) async {