TensorFlow Lite
#2020/02/29 Pycon mini Shizuoka
       「あなたの知らないPython」
●
●
○
○
●
○
2
●
○
●
●
3
●
AIはいってる!
AIはいってる!
AIはいってる!
AIはいってる!
AIはいってる!
AIはいってる!
AIはいってる!
AIはいってる! AIはいってる!
AIはいってる!
AIはいってる!
AIはいってる!
脳はいってる!
AIはいってる!
AIはいってる!
AIはいってる!
4
●
5
● 計算資源
● ストレージ
● サービス
● etc...
● 計算資源
● ストレージ
● サービス
● etc...
ネットワーク
(インターネット)
ネットワーク
(インターネット)
端末 端末 6
●
○
○
●
○
○
●
○
○
7
●
モデル出力
(特徴量)
● 端末さえあれば使える
● モデルの運用やアップデートが難しい
● モデルが盗まれそう
● ネットワークがないと使えない
● モデルの運用やアップデートは可能
● モデルも盗まれにくい?
8
インストール方法:
 $ pip install tensorflow
最新バージョンはv2.1.0.
とりあえず直ぐに試してみたい人は,Google Colabをおス
スメします! -> “Google Colab”で検索してGO!
9
●
●
●
10
●
●
●
●
●
●
●
11
TFLite
モデル変換以後は実行環境により異なる
12
●
●
○
○
○
○
13
●
from tensorflow.lite import TFLiteConverter
#SavedModelからの変換
converter = TFLiteConverter.from_saved_model(model_dir)
tflite_model = converter.convert()
#KerasModelからの変換
converter = TFLiteConverter.from_keras_model(model)
tflite_model = converter.convert()
14
●
○
○
○
○
●
○
○
○
○
●
○
○ 15
詳しくは
→https://www.tensorflow.org/lite/performance/post_training_quantization
from tensorflow.lite import TFLiteConverter, Optimize
#KerasModelからの変換 + Weight Quantization
converter = TFLiteConverter.from_keras_model(model)
converter.optimizations = [Optimize.OPTIMIZE_FOR_SIZE] #これ
tflite_model = converter.convert()
16
量子化なし Weight
Quantization
Full Integer
Quantization
mobilenet Size[MB] 17.0 4.1 4.5
Speed[ms] 285.7 555.5 263.2
mnist
※Dense2層
※極小NN
Size[MB] 0.4 0.1 0.1
Speed[ms] 0.83 0.12 0.14
モデル量子化によるモデルサイズと平均推論速度
17
量子化なし Weight
Quantization
Full Integer
Quantization
mobilenet Size[MB] 17.0 4.1 4.5
Speed[ms] 285.7 555.5 263.2
mnist Size[MB] 0.4 0.1 0.1
Speed[ms] 0.83 0.12 0.14
モデル量子化によるモデルサイズと平均推論速度
● モデルサイズ縮小に効果大
● 推論速度はよくわからない
○ 実行環境のRAM容量による?
○ モデルのアーキテクチャによる?
● 【補足】Accuracyの低下はほぼ無かった 18
●
TensorFlowには,枝切り用のパッケージがあり簡単に試すことが出来る.
(Tensorflowとは別途インストールが必要 → https://www.tensorflow.org/model_optimization)
学習時に枝切り対象レイヤーとスケジュールを設定して行なう.学習済みモデル単体
での変換はできない.
(現状は)重みを0に置き換えるだけなので,モデルサイズ&推論速度は変わらない.
モデルを圧縮した時のサイズが小さく出来る.
19
import tensorflow_model_optimization as tfmot
params = {
‘pruning_schedule’: #ここでpruning_scheduleを定義
...(略)
}
model = Sequential([ #モデル定義 ...(略)])
model = tfmot.sparsity.keras.prune_low_magnitude(model,
**param)
model.compile(..略..)
callbacks = [ #コールバックに下記を追加
tfmot.sparsity.keras.UpdatePruningStep()
]
model.fit(...(略), callbacks=callbacks)
詳しくは→https://www.tensorflow.org/model_optimization 20
枝切り
なし
枝切り
50%
枝切り
80%
キュウリ
CNN
File Size[MB]
*
(圧縮率)
0.84
(100%)
0.64
(76.2%)
0.35
(41.2%)
Accuracy[%] 82.2 82.0 76.6
Speed[ms] 41.7 40.0 48.7
枝切りによる圧縮ファイルサイズ,正答率,平均推論速度
*:
weight quantization +
zip圧縮したサイズ
通常のtfliteファイルサ
イズは4.8MB 21
Device
TFLite Runtime
●
●
Mobilenet
学習済みモデル
(Model Zoo)
SSD-Mobilenet
Posenet
︙
オリジナルモデル
TFLiteConverter model.tflite
Quantization
枝切り
蒸留
モデル構造の最適化
22
●
●
○
●
https://tinymlbook.com/
23
24
SoC : STM32H743VI
(CPU ARM Cortex M7 32bit 480MHz)
(RAM 1MB , FlashROM 2MB)
カメラ:OV7725 (max 640x480)
SDカード:μSDスロットあり30GBまで
消費電力:110mA〜170mA@3.3V
特徴:
オープンソースのファームウェア上でMicroPythonが動
く.pythonヒープ領域が230KBぐらいしか使えない・・・
SoC : Kendryte K210
(CPU RISC-V 64bit 400-800MHz)
(RAM 8MB, FlashROM 16MB)
(KPU : CNNアクセラレータ)
カメラ:OV2640/OV7740
SDカード:μSDスロットあり
消費電力:>600mA@5V?
特徴:
コスパかなり良い.RISC-Vだからか?
畳み込みや活性化関数などのアルゴリズムがハード実装
されている.ただ,いろいろ制約あり.
https://openmv.io/collections/cams/products/openmv-
cam-h7
https://wiki.sipeed.com/en/maix/board/bit.html
25
一般的にカメラにはイメージセンサ制御のための
マイコンが搭載されています.
今回は,そのマイコンの上でディープ・ラーニング
の推論も動かしてしまおうという試みです.
●
○ https://github.com/openmv/openmv/releases
●
○ https://openmv.io/pages/download
USBでプログラム書き込み
26
●
○
○ 😨
○
○
●
○ https://www.st.com/ja/embedded-software/x-cube-ai.html
○
○
○
27
●
○ https://github.com/workpil
es/CUCUMBER-9
●
●
テストデータに対し
て82.8%の正答率
28
●
○ https://github.com/workpil
es/CUCUMBER-9
●
●
テストデータに対し
て82.8%の正答率
●
●
●
29
●
30
●
31
●
○
■ src/stm32cubeai/nn_st.c
○
■ src/omv/boards/OPENMV4/omv_boardconfig.h
■ 237K -> 230K
○
■ 静的ライブラリ「libtf_person_detect_model_data.a」の参照箇所を削る
32
●
○
■ src/stm32cubeai/nn_st.c
○
■ src/omv/boards/OPENMV4/omv_boardconfig.h
■ 237K -> 230K
○
■ 静的ライブラリ「libtf_person_detect_model_data.a」の参照箇所を削る
○
■ おそらくファームウェアで使ってる STマイコンのライブラリが古い?
■ じゃあ,Weight量子化を・・・なぜかツールで Float32へ戻される
■ じゃあ,Float16量子化を・・・なぜかツールで Float32へ戻される
■ 結局,量子化なしで<200KBのモデルを作る羽目に・・・
33
●
テストデータに対し
て72.5%の正答率
34
35
●
import nn_st
net = nn_st.loadnnst(‘network’)
out = net.predict(img)
36
●
●
37
●
○
○ https://github.com/sipeed/MaixPy
○ https://maixpy.sipeed.com/en/
●
○ http://dl.sipeed.com/MAIX/MaixPy/ide/v0.2.4
○
38
FlashROMに書き込む場合 SDカードから読み込む場合
39
●
○ https://github.com/sipeed/Maix_Toolbox
●
○
○ https://github.com/kendryte/nncase
40
●
○
○
●
○
○
■ https://github.com/kendryte/nncase/blob/master/docs/tflite_ops.md
■ (v0.1.0-rc5)https://github.com/kendryte/nncase/tree/v0.1.0-rc5
Maix_Toolbox(nncase v0.1.0-rc5)の場合
[Maix Toolbox使用]
nncase v0.1.0-rc5 nncase v0.2.0 Beta2
量子化なし 8bit量子化 量子化なし 8bit量子化
[TF2.1]
TFLiteConverter
量子化なしモデル
○:推論実行可能 ✕: MaixPyファームウェアv0.5.0では実行できない
41
Flattenの前後でdequantize,quantize
が呼ばれている.無駄.
DenseはPaddingとConv2dに置き換え
られる.無駄.
42
●
○
●
○
これ
43
●
import KPU as kpu
task = kpu.load(0x200000)
img = img.resize(INPUT_SIZE, INPUT_SIZE)
img.pix_to_ai()
fmap = kpu.forward(task, img)
plist = fmap[:]
pred = plist.index(max(plist))
現時点でドキュメントには
載ってないがこれでリサ
イズできる
現時点でドキュメントには
載ってないおまじない.
(RBG565->RBG888に
変換してるぽい)
44
●
●
45
●
○
○
●
○
●
○
●
○
○ 46
47
モデル出力
(特徴量)
48
●
試作1号機(2016年2月) 試作2号機(2016年8月) 試作3号機(2017年8月)
49
50
51
モデル
Ver1.0
モデル
Ver1.0
モデル
Ver1.1
ネット環境がない場所で,
モデルの管理が大変
モデル
Ver1.0
LANなど
JetsonNano
TPU dev board
52
●
○
●
○
●
○
53
●
●
○
●
54
55

TensorFlow Liteを使った組み込みディープラーニング開発