Implement ObjectDetectionService

This commit is contained in:
vishnukvmd 2023-02-08 19:10:18 +05:30
parent d9d0ae5994
commit f407c0e899
2 changed files with 59 additions and 0 deletions

View file

@ -24,6 +24,7 @@ import 'package:photos/services/local_file_update_service.dart';
import 'package:photos/services/local_sync_service.dart';
import 'package:photos/services/memories_service.dart';
import 'package:photos/services/notification_service.dart';
import "package:photos/services/object_detection/object_detection_service.dart";
import 'package:photos/services/push_service.dart';
import 'package:photos/services/remote_sync_service.dart';
import 'package:photos/services/search_service.dart';
@ -160,6 +161,7 @@ Future<void> _init(bool isBackground, {String via = ''}) async {
});
}
FeatureFlagService.instance.init();
await ObjectDetectionService.instance.init();
_logger.info("Initialization done");
}

View file

@ -0,0 +1,57 @@
import "dart:isolate";
import "dart:typed_data";
import "package:logging/logging.dart";
import "package:photos/services/object_detection/models/predictions.dart";
import 'package:photos/services/object_detection/models/recognition.dart';
import "package:photos/services/object_detection/tflite/classifier.dart";
import "package:photos/services/object_detection/utils/isolate_utils.dart";
class ObjectDetectionService {
final _logger = Logger("ObjectDetectionService");
/// Instance of [ObjectClassifier]
late ObjectClassifier _classifier;
/// Instance of [IsolateUtils]
late IsolateUtils _isolateUtils;
ObjectDetectionService._privateConstructor();
Future<void> init() async {
_isolateUtils = IsolateUtils();
await _isolateUtils.start();
_classifier = ObjectClassifier();
}
static ObjectDetectionService instance =
ObjectDetectionService._privateConstructor();
Future<List<String>> predict(Uint8List bytes) async {
try {
final isolateData = IsolateData(
bytes,
_classifier.interpreter.address,
_classifier.labels,
);
final predictions = await _inference(isolateData);
final Set<String> results = {};
for (final Recognition result in predictions.recognitions) {
results.add(result.label);
}
return results.toList();
} catch (e, s) {
_logger.severe(e, s);
rethrow;
}
}
/// Runs inference in another isolate
Future<Predictions> _inference(IsolateData isolateData) async {
final responsePort = ReceivePort();
_isolateUtils.sendPort.send(
isolateData..responsePort = responsePort.sendPort,
);
return await responsePort.first;
}
}