[mob][photos] Use canvas again for generating face thumbnail

This commit is contained in:
laurenspriem 2024-04-29 16:28:19 +05:30
parent aad1327705
commit 8b1545239c
3 changed files with 40 additions and 7 deletions

View file

@ -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<Map<String, Uint8List>?> getFaceCrops(
faceBoxes.add(e.value);
}
final List<Uint8List> faceCrop =
// await ImageMlIsolate.instance.generateFaceThumbnailsForImage(
await generateJpgFaceThumbnails(
await ImageMlIsolate.instance.generateFaceThumbnailsForImageUsingCanvas(
// await generateJpgFaceThumbnails(
imagePath,
faceBoxes,
);

View file

@ -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<Map<String, dynamic>>;
final List<FaceBox> faceBoxes =
faceBoxesJson.map((json) => FaceBox.fromJson(json)).toList();
final List<Uint8List> 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<double>;
@ -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<Uint8List>());
}
/// Generates face thumbnails for all [faceBoxes] in [imageData].
///
/// Uses [generateFaceThumbnailsUsingCanvas] inside the isolate.
Future<List<Uint8List>> generateFaceThumbnailsForImageUsingCanvas(
String imagePath,
List<FaceBox> faceBoxes,
) async {
final List<Map<String, dynamic>> faceBoxesJson =
faceBoxes.map((box) => box.toJson()).toList();
return await _runInIsolate(
(
ImageOperation.generateFaceThumbnailsUsingCanvas,
{
'imagePath': imagePath,
'faceBoxesList': faceBoxesJson,
},
),
).then((value) => value.cast<Uint8List>());
}
@Deprecated('For second pass of BlazeFace, no longer used')
/// Generates cropped and padded image data from [imageData] and a [faceBox].

View file

@ -1272,12 +1272,10 @@ Future<List<Uint8List>> 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<List<Uint8List>> generateFaceThumbnailsFromDataAndDetections(
Future<List<Uint8List>> generateFaceThumbnailsUsingCanvas(
Uint8List imageData,
List<FaceBox> faceBoxes,
) async {