object_detection_service.dart 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. import "dart:isolate";
  2. import "dart:typed_data";
  3. import "package:logging/logging.dart";
  4. import "package:photos/services/object_detection/models/predictions.dart";
  5. import 'package:photos/services/object_detection/models/recognition.dart';
  6. import "package:photos/services/object_detection/tflite/classifier.dart";
  7. import "package:photos/services/object_detection/utils/isolate_utils.dart";
  8. class ObjectDetectionService {
  9. final _logger = Logger("ObjectDetectionService");
  10. /// Instance of [ObjectClassifier]
  11. late ObjectClassifier _classifier;
  12. /// Instance of [IsolateUtils]
  13. late IsolateUtils _isolateUtils;
  14. ObjectDetectionService._privateConstructor();
  15. Future<void> init() async {
  16. _isolateUtils = IsolateUtils();
  17. await _isolateUtils.start();
  18. _classifier = ObjectClassifier();
  19. }
  20. static ObjectDetectionService instance =
  21. ObjectDetectionService._privateConstructor();
  22. Future<List<String>> predict(Uint8List bytes) async {
  23. try {
  24. final isolateData = IsolateData(
  25. bytes,
  26. _classifier.interpreter.address,
  27. _classifier.labels,
  28. );
  29. final predictions = await _inference(isolateData);
  30. final Set<String> results = {};
  31. for (final Recognition result in predictions.recognitions) {
  32. results.add(result.label);
  33. }
  34. return results.toList();
  35. } catch (e, s) {
  36. _logger.severe(e, s);
  37. rethrow;
  38. }
  39. }
  40. /// Runs inference in another isolate
  41. Future<Predictions> _inference(IsolateData isolateData) async {
  42. final responsePort = ReceivePort();
  43. _isolateUtils.sendPort.send(
  44. isolateData..responsePort = responsePort.sendPort,
  45. );
  46. return await responsePort.first;
  47. }
  48. }