61 lines
1.6 KiB
Dart
61 lines
1.6 KiB
Dart
import 'dart:isolate';
|
|
|
|
import 'package:camera/camera.dart';
|
|
import 'package:tensordex_mobile/tflite/classifier.dart';
|
|
import 'package:tflite_flutter/tflite_flutter.dart';
|
|
|
|
import '../utils/image_utils.dart';
|
|
|
|
class IsolateBase {
|
|
final ReceivePort _receivePort = ReceivePort();
|
|
}
|
|
|
|
class MLIsolate extends IsolateBase {
|
|
static const String debugIsolate = 'MLIsolate';
|
|
late SendPort _sendPort;
|
|
|
|
SendPort get sendPort => _sendPort;
|
|
|
|
Future<void> start() async {
|
|
await Isolate.spawn<SendPort>(
|
|
entryPoint,
|
|
_receivePort.sendPort,
|
|
debugName: debugIsolate,
|
|
);
|
|
_sendPort = await _receivePort.first;
|
|
}
|
|
|
|
static void entryPoint(SendPort sendPort) async {
|
|
final port = ReceivePort();
|
|
sendPort.send(port.sendPort);
|
|
|
|
await for (final MLIsolateData mlIsolateData in port) {
|
|
var cameraImage = mlIsolateData.cameraImage;
|
|
var converted = ImageUtils.convertCameraImage(cameraImage);
|
|
if (converted != null) {
|
|
Classifier classifier = Classifier(
|
|
Interpreter.fromAddress(mlIsolateData.interpreterAddress),
|
|
labels: mlIsolateData.labels);
|
|
var result = classifier.predict(converted);
|
|
mlIsolateData.responsePort?.send(result);
|
|
} else {
|
|
mlIsolateData.responsePort?.send({'response': 'not working yet'});
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/// Bundles outputs to pass between Isolate
|
|
class MLIsolateData {
|
|
CameraImage cameraImage;
|
|
int interpreterAddress;
|
|
List<String> labels;
|
|
SendPort? responsePort;
|
|
|
|
MLIsolateData(
|
|
this.cameraImage,
|
|
this.interpreterAddress,
|
|
this.labels,
|
|
);
|
|
}
|