Skip to content

Commit b47a81f

Browse files
Daniel LlewellynDani Llewellyn
authored andcommitted
Add experimental CoreML delegate
* Update TensorFlowLiteC to TensorFlowLiteC/Core (version 2.4.0) * Add TensorFlowLiteC/Metal to restore Metal delegate after v2.4.0 moved it to a separate pod. * Add TensorflowLiteC/CoreML to add experimental CoreML delegate. * Add documentation of option. Signed-off-by: Daniel Llewellyn <[email protected]>
1 parent ce8075a commit b47a81f

File tree

8 files changed

+47
-11
lines changed

8 files changed

+47
-11
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ String res = await Tflite.loadModel(
8686
numThreads: 1, // defaults to 1
8787
isAsset: true, // defaults to true, set to false to load resources outside assets
8888
useGpuDelegate: false // defaults to false, set to true to use GPU delegate
89+
useCoreMLDelegate: false // defaults to false, set to true to use CoreML delegate on iOS devices - has no effect on Android
8990
);
9091
```
9192

example/ios/Flutter/Debug.xcconfig

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
1+
#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"
12
#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"
23
#include "Generated.xcconfig"
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
1+
#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"
12
#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"
23
#include "Generated.xcconfig"

example/ios/Podfile.lock

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,16 @@ PODS:
33
- image_picker (0.0.1):
44
- Flutter
55
- TensorFlowLiteC (2.2.0)
6-
- tflite (1.1.2):
6+
- TensorFlowLiteC/Core (2.4.0)
7+
- TensorFlowLiteC/CoreML (2.4.0):
8+
- TensorFlowLiteC/Core
9+
- TensorFlowLiteC/Metal (2.4.0):
10+
- TensorFlowLiteC/Core
11+
- tflite (1.1.1):
712
- Flutter
8-
- TensorFlowLiteC
13+
- TensorFlowLiteC/Core
14+
- TensorFlowLiteC/CoreML
15+
- TensorFlowLiteC/Metal
916

1017
DEPENDENCIES:
1118
- Flutter (from `Flutter`)
@@ -27,8 +34,8 @@ EXTERNAL SOURCES:
2734
SPEC CHECKSUMS:
2835
Flutter: 434fef37c0980e73bb6479ef766c45957d4b510c
2936
image_picker: a211f28b95a560433c00f5cd3773f4710a20404d
30-
TensorFlowLiteC: b3ab9e867b0b71052ca102a32a786555b330b02e
31-
tflite: f0403a894740019d63ab5662253bba5b2dd37296
37+
TensorFlowLiteC: 09f8ac75a76caeadb19bcfa694e97454cc1ecf87
38+
tflite: d701e08676abd255d3340a79bb8cb4ba1594723c
3239

3340
PODFILE CHECKSUM: 8e679eca47255a8ca8067c4c67aab20e64cb974d
3441

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3+
<plist version="1.0">
4+
<dict>
5+
<key>IDEDidComputeMac32BitWarning</key>
6+
<true/>
7+
</dict>
8+
</plist>

ios/Classes/TflitePlugin.mm

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#elif defined TFLITE2
2020
#import "TensorFlowLiteC.h"
2121
#import "metal_delegate.h"
22+
#import "coreml_delegate.h"
2223
#else
2324
#include "tensorflow/lite/kernels/register.h"
2425
#include "tensorflow/lite/model.h"
@@ -118,6 +119,7 @@ - (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result {
118119
TfLiteInterpreter *interpreter = nullptr;
119120
TfLiteModel *model = nullptr;
120121
TfLiteDelegate *delegate = nullptr;
122+
bool isCoreMLDelegate = false;
121123
#else
122124
std::unique_ptr<tflite::FlatBufferModel> model;
123125
std::unique_ptr<tflite::Interpreter> interpreter;
@@ -160,10 +162,19 @@ static void LoadLabels(NSString* labels_path,
160162
}
161163
options = TfLiteInterpreterOptionsCreate();
162164
TfLiteInterpreterOptionsSetNumThreads(options, num_threads);
163-
165+
164166
bool useGpuDelegate = [args[@"useGpuDelegate"] boolValue];
165-
if (useGpuDelegate) {
167+
bool useCoreMLDelegate = [args[@"useCoreMLDelegate"] boolValue];
168+
if (useCoreMLDelegate) {
169+
delegate = TfLiteCoreMlDelegateCreate(nullptr);
170+
if (delegate != NULL) {
171+
isCoreMLDelegate = true;
172+
}
173+
}
174+
if (delegate == NULL && useGpuDelegate) {
166175
delegate = TFLGpuDelegateCreate(nullptr);
176+
}
177+
if (delegate != NULL) {
167178
TfLiteInterpreterOptionsAddDelegate(options, delegate);
168179
}
169180
#else
@@ -1488,8 +1499,11 @@ void runPoseNetOnFrame(NSDictionary* args, FlutterResult result) {
14881499
void close() {
14891500
#ifdef TFLITE2
14901501
interpreter = nullptr;
1491-
if (delegate != nullptr)
1502+
if (isCoreMLDelegate && delegate != nullptr) {
1503+
TfLiteCoreMlDelegateDelete(delegate);
1504+
} else if (delegate != nullptr) {
14921505
TFLGpuDelegateDelete(delegate);
1506+
}
14931507
delegate = nullptr;
14941508
#else
14951509
interpreter.release();

ios/tflite.podspec

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,10 @@ A Flutter plugin for accessing TensorFlow Lite. Supports both iOS and Android.
1515
s.source_files = 'Classes/**/*'
1616
s.public_header_files = 'Classes/**/*.h'
1717
s.dependency 'Flutter'
18-
s.dependency 'TensorFlowLiteC'
19-
s.xcconfig = { 'USER_HEADER_SEARCH_PATHS' => '$(inherited) "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/tflite" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/Flutter" "${PODS_ROOT}/Headers/Public/TensorFlowLite/tensorflow_lite" "${PODS_ROOT}/Headers/Public/tflite" "${PODS_ROOT}/TensorFlowLite/Frameworks/tensorflow_lite.framework/Headers" "${PODS_ROOT}/TensorFlowLiteC/Frameworks/TensorFlowLiteC.framework/Headers"' }
18+
s.dependency 'TensorFlowLiteC/Core'
19+
s.dependency 'TensorFlowLiteC/Metal'
20+
s.dependency 'TensorFlowLiteC/CoreML'
21+
s.xcconfig = { 'USER_HEADER_SEARCH_PATHS' => '$(inherited) "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/tflite" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/Flutter" "${PODS_ROOT}/Headers/Public/TensorFlowLite/tensorflow_lite" "${PODS_ROOT}/Headers/Public/tflite" "${PODS_ROOT}/TensorFlowLite/Frameworks/tensorflow_lite.framework/Headers" "${PODS_ROOT}/TensorFlowLiteC/Frameworks/TensorFlowLiteC.framework/Headers" "${PODS_ROOT}/TensorFlowLiteC/Frameworks/TensorFlowLiteCMetal.framework/Headers" "${PODS_ROOT}/TensorFlowLiteC/Frameworks/TensorFlowLiteCCoreML.framework/Headers"' }
2022

2123
s.ios.deployment_target = '9.0'
2224
s.static_framework = true

lib/tflite.dart

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,17 @@ class Tflite {
1111
String labels = "",
1212
int numThreads = 1,
1313
bool isAsset = true,
14-
bool useGpuDelegate = false}) async {
14+
bool useGpuDelegate = false,
15+
bool useCoreMLDelegate = false}) async {
1516
return await _channel.invokeMethod(
1617
'loadModel',
1718
{
1819
"model": model,
1920
"labels": labels,
2021
"numThreads": numThreads,
2122
"isAsset": isAsset,
22-
'useGpuDelegate': useGpuDelegate
23+
"useGpuDelegate": useGpuDelegate,
24+
"useCoreMLDelegate": useCoreMLDelegate
2325
},
2426
);
2527
}

0 commit comments

Comments
 (0)