Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Few steps to make your app smarter with TensorF...
Search
Volodia Chornenkyi
January 30, 2019
Programming
89
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Few steps to make your app smarter with TensorFlow Lite
Volodia Chornenkyi
January 30, 2019
More Decks by Volodia Chornenkyi
See All by Volodia Chornenkyi
Android Studio 👀 Flamingo 🦩 Giraffe 🦒
chornenky_volodia
1
480
Let's add AR to your Android app
chornenky_volodia
0
160
Android Architecture Components. Do you really need them?
chornenky_volodia
1
140
Other Decks in Programming
See All in Programming
エンジニアと一緒にテストコードの設計と実装を改善した話
mototakatsu
0
230
Language Server 使ってる? 〜VSCode と Zed の場合〜 / Are you using a Language Server? ~For VS Code and Zed~
handlename
0
810
1B+ /day規模のログを管理する技術
broadleaf
0
120
不変条件と整合性境界—ビジネスが決める設計判断と実現パターン / Invariants and Consistency Boundaries
nrslib
14
5.9k
例外の正しい扱い方 そのエラー try-catchして大丈夫?
jinwatanabe
0
290
作って学ぶ、 JSX (TSX) ランタイムの基本
syumai
7
1.7k
Vite+ Unified Toolchain for the Web
naokihaba
0
360
ランチタイムLT会3周年!ランチタイムLT会を3年間続けられたお話
y0hgi
1
110
dRuby over BLE
makicamel
2
390
The NotImplementedError Problem in Ruby
koic
1
970
はてなアカウント基盤 State of the Union
cockscomb
1
1k
これからAgentCoreを触る方へトレンドはGatewayです
har1101
4
390
Featured
See All Featured
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
3.6k
The innovator’s Mindset - Leading Through an Era of Exponential Change - McGill University 2025
jdejongh
PRO
1
210
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
1
300
KATA
mclloyd
PRO
35
15k
The Spectacular Lies of Maps
axbom
PRO
1
830
YesSQL, Process and Tooling at Scale
rocio
174
15k
How Software Deployment tools have changed in the past 20 years
geshan
0
34k
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
1
3.6k
The SEO Collaboration Effect
kristinabergwall1
1
490
Rails Girls Zürich Keynote
gr2m
96
14k
Large-scale JavaScript Application Architecture
addyosmani
515
110k
The AI Search Optimization Roadmap by Aleyda Solis
aleyda
1
5.9k
Transcript
Few steps to make your app smarter with TensorFlow Lite
Volodia Chornenkyi Android Software Engineer @TechMagic @GoodCo
What is TFLite? Framework for running machine learning models on
mobile and embedded devices.
What is TFLite? Framework for running machine learning models on
mobile and embedded devices.
Lite Two brothers
• Lightweight • Limited set of op • Custom op
support • Optimized work with models • Hardware acceleration • No Swift support Lite • Training support • Java&Swift APIs are not up to date • Android NDK • Bazel • Higher accuracy
TensorFlow Mobile?
TensorFlow Mobile? https://www.tensorflow.org/lite/tfmobile/
MLKit vs Tensor Flow https://developers.google.com/ml-kit/
How it works inside Architecture of a CNN. — Source: https://www.mathworks.com/videos/introduction-to-deep-learning-wh at-are-convolutional-neural-networks--1489512765771.html
https://society6.com/product/get-shit-done--get-shit-done_print
Step 1. Model cp tf_files/optimized_graph.lite ios/tflite/data/graph.lite cp tf_files/retrained_labels.txt ios/tflite/data/labels.txt cp
tf_files/optimized_graph.lite android/tflite/app/src/main/ass ets/graph.lite cp tf_files/retrained_labels.txt android/tflite/app/src/main/ass ets/labels.txt iOS Android https://www.tensorflow.org/lite/
Step 2.1. Setup platform :ios, '8.0' inhibit_all_warnings! target 'tflite_photos_example' pod
'TensorFlowLite' repositories { maven { url 'https://google.bintray.com/tensorflo w' } } dependencies { implementation 'org.tensorflow:tensorflow-lite:+' } iOS Android https://www.tensorflow.org/lite/
Step 2.2. Setup android { aaptOptions { noCompress "tflite" noCompress
"lite" } } Android https://www.tensorflow.org/lite/
NSString* graph_path = [[NSBundle mainBundle] pathForResource:name ofType:extension]; std::unique_ptr<tflite::FlatBufferModel> model =
tflite::FlatBufferModel::BuildFromFile([graph_path UTF8String]); iOS Android Step 3. Model AssetFileDescriptor fileDescriptor = activity.getAssets().openFd(MODEL_PATH); FileInputStream inputStream = new FileInputStream(fileDescriptor.getFileDescriptor()); FileChannel fileChannel = inputStream.getChannel(); long startOffset = fileDescriptor.getStartOffset(); long declaredLength = fileDescriptor.getDeclaredLength(); MappedByteBuffer model = fileChannel.map(FileChannel.MapMode.READ_ONLY, startOffset, declaredLength); Android https://www.tensorflow.org/lite/
std::vector<std::string> labels; NSString* labels_path = [[NSBundle mainBundle] pathForResource:name ofType:extension]; std::ifstream
t; t.open([labels_path UTF8String]); std::string line; while (t) { std::getline(t, line); if (line.length()){ labels->push_back(line); } } t.close(); Android Step 4. Labels on iOS https://www.tensorflow.org/lite/
Android Step 4. Labels on Android List<String> labelList = new
ArrayList<String>(); BufferedReader reader = new BufferedReader(new InputStreamReader(activity.getAssets().open(LABEL_PATH))); String line; while ((line = reader.readLine()) != null) { labelList.add(line); } reader.close(); https://www.tensorflow.org/lite/
Step 5. Interpreter std::unique_ptr<tflite::Interpreter> interpreter; tflite::InterpreterBuilder(*model, opResolver)(&interpreter); Interpreter tflite =
new Interpreter(model); iOS Android https://www.tensorflow.org/lite/
float* out = interpreter->typed_input_tensor<float>(0); uint8_t* in = image.data.data(); for (int
y = 0; y < wanted_input_height; ++y) { const int in_y = (y * image.height) / wanted_input_height; uint8_t* in_row = in + (in_y * image.width * image.channels); float* out_row = out + (y * wanted_input_width * wanted_input_channels); for (int x = 0; x < wanted_input_width; ++x) { const int in_x = (x * image.width) / wanted_input_width; uint8_t* in_pixel = in_row + (in_x * image.channels); float* out_pixel = out_row + (x * wanted_input_channels); for (int c = 0; c < wanted_input_channels; ++c) { out_pixel[c] = (in_pixel[c] - input_mean) / input_std; } } } Android Step 6. Convert image on iOS https://www.tensorflow.org/lite/
// ByteBuffer imgData bitmap.getPixels(intValues, 0, bitmap.getWidth(), 0, 0, bitmap.getWidth(), bitmap.getHeight());
int pixel = 0; for (int i = 0; i < DIM_IMG_SIZE_X; ++i) { for (int j = 0; j < DIM_IMG_SIZE_Y; ++j) { final int val = intValues[pixel++]; imgData.putFloat((((val >> 16) & 0xFF)-IMAGE_MEAN)/IMAGE_STD); imgData.putFloat((((val >> 8) & 0xFF)-IMAGE_MEAN)/IMAGE_STD); imgData.putFloat((((val) & 0xFF)-IMAGE_MEAN)/IMAGE_STD); } } Android Step 6. Convert image on Android https://www.tensorflow.org/lite/
Step 7. Run model interpreter->Invoke() float* output = interpreter-> typed_output_tensor<float>(0)
tflite.run(imgData, labelProbArray) iOS Android https://www.tensorflow.org/lite/
Output. Threshold. Results number Step 8. Grand finale
Special slide for QA • unittest.TestCase • Model visualization •
Believe
Use TF Lite if • Weight is important • Limited
set of op is fine • Speed over accuracy • Hardware acceleration as a bonus
None
None
Links General: https://www.tensorflow.org/lite/ https://codelabs.developers.google.com/codelabs/tensorflow-for-poets Android: https://codelabs.developers.google.com/codelabs/tensorflow-for-poets-2-tflite iOS: https://codelabs.developers.google.com/codelabs/tensorflow-for-poets-2-ios QA: https://www.linkedin.com/pulse/tensorflow-dont-forget-unit-test-david-o-neill-1/
https://www.tensorflow.org/api_guides/python/test