12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 |
- import 'dart:isolate';
- import "dart:typed_data";
- import 'package:image/image.dart' as imgLib;
- import "package:photos/services/object_detection/models/predictions.dart";
- import "package:photos/services/object_detection/tflite/classifier.dart";
- import 'package:photos/services/object_detection/tflite/cocossd_classifier.dart';
- import "package:photos/services/object_detection/tflite/mobilenet_classifier.dart";
- import "package:photos/services/object_detection/tflite/scene_classifier.dart";
- import 'package:tflite_flutter/tflite_flutter.dart';
- /// Manages separate Isolate instance for inference
- class IsolateUtils {
- static const String debugName = "InferenceIsolate";
- late SendPort _sendPort;
- final _receivePort = ReceivePort();
- SendPort get sendPort => _sendPort;
- Future<void> start() async {
- await Isolate.spawn<SendPort>(
- entryPoint,
- _receivePort.sendPort,
- debugName: debugName,
- );
- _sendPort = await _receivePort.first;
- }
- static void entryPoint(SendPort sendPort) async {
- final port = ReceivePort();
- sendPort.send(port.sendPort);
- await for (final IsolateData isolateData in port) {
- final classifier = _getClassifier(isolateData);
- final image = imgLib.decodeImage(isolateData.input);
- try {
- final results = classifier.predict(image!);
- isolateData.responsePort.send(results);
- } catch (e) {
- isolateData.responsePort.send(Predictions(null, null, error: e));
- }
- }
- }
- static Classifier _getClassifier(IsolateData isolateData) {
- final interpreter = Interpreter.fromAddress(isolateData.interpreterAddress);
- if (isolateData.type == ClassifierType.cocossd) {
- return CocoSSDClassifier(
- interpreter: interpreter,
- labels: isolateData.labels,
- );
- } else if (isolateData.type == ClassifierType.mobilenet) {
- return MobileNetClassifier(
- interpreter: interpreter,
- labels: isolateData.labels,
- );
- } else {
- return SceneClassifier(
- interpreter: interpreter,
- labels: isolateData.labels,
- );
- }
- }
- }
- /// Bundles data to pass between Isolate
- class IsolateData {
- Uint8List input;
- int interpreterAddress;
- List<String> labels;
- ClassifierType type;
- late SendPort responsePort;
- IsolateData(
- this.input,
- this.interpreterAddress,
- this.labels,
- this.type,
- );
- }
- enum ClassifierType {
- cocossd,
- mobilenet,
- scenes,
- }
|