Advertisement
Advertisement

More Related Content

Slideshows for you(20)

Similar to TensorFlow Liteを使った組み込みディープラーニング開発(20)

Advertisement

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

  1. TensorFlow Lite #2020/02/29 Pycon mini Shizuoka        「あなたの知らないPython」
  2. ● ● ○ ○ ● ○ 2
  3. ● ○ ● ● 3
  4. ● AIはいってる! AIはいってる! AIはいってる! AIはいってる! AIはいってる! AIはいってる! AIはいってる! AIはいってる! AIはいってる! AIはいってる! AIはいってる! AIはいってる! 脳はいってる! AIはいってる! AIはいってる! AIはいってる! 4
  5. ● 5
  6. ● 計算資源 ● ストレージ ● サービス ● etc... ● 計算資源 ● ストレージ ● サービス ● etc... ネットワーク (インターネット) ネットワーク (インターネット) 端末 端末 6
  7. ● ○ ○ ● ○ ○ ● ○ ○ 7
  8. ● モデル出力 (特徴量) ● 端末さえあれば使える ● モデルの運用やアップデートが難しい ● モデルが盗まれそう ● ネットワークがないと使えない ● モデルの運用やアップデートは可能 ● モデルも盗まれにくい? 8
  9. インストール方法:  $ pip install tensorflow 最新バージョンはv2.1.0. とりあえず直ぐに試してみたい人は,Google Colabをおス スメします! -> “Google Colab”で検索してGO! 9
  10. ● ● ● 10
  11. ● ● ● ● ● ● ● 11
  12. TFLite モデル変換以後は実行環境により異なる 12
  13. ● ● ○ ○ ○ ○ 13
  14. ● 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. ● ○ ○ ○ ○ ● ○ ○ ○ ○ ● ○ ○ 15
  16. 詳しくは →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
  17. 量子化なし 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
  18. 量子化なし 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
  19. ● TensorFlowには,枝切り用のパッケージがあり簡単に試すことが出来る. (Tensorflowとは別途インストールが必要 → https://www.tensorflow.org/model_optimization) 学習時に枝切り対象レイヤーとスケジュールを設定して行なう.学習済みモデル単体 での変換はできない. (現状は)重みを0に置き換えるだけなので,モデルサイズ&推論速度は変わらない. モデルを圧縮した時のサイズが小さく出来る. 19
  20. 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
  21. 枝切り なし 枝切り 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
  22. Device TFLite Runtime ● ● Mobilenet 学習済みモデル (Model Zoo) SSD-Mobilenet Posenet ︙ オリジナルモデル TFLiteConverter model.tflite Quantization 枝切り 蒸留 モデル構造の最適化 22
  23. ● ● ○ ● https://tinymlbook.com/ 23
  24. 24
  25. 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 一般的にカメラにはイメージセンサ制御のための マイコンが搭載されています. 今回は,そのマイコンの上でディープ・ラーニング の推論も動かしてしまおうという試みです.
  26. ● ○ https://github.com/openmv/openmv/releases ● ○ https://openmv.io/pages/download USBでプログラム書き込み 26
  27. ● ○ ○ 😨 ○ ○ ● ○ https://www.st.com/ja/embedded-software/x-cube-ai.html ○ ○ ○ 27
  28. ● ○ https://github.com/workpil es/CUCUMBER-9 ● ● テストデータに対し て82.8%の正答率 28
  29. ● ○ https://github.com/workpil es/CUCUMBER-9 ● ● テストデータに対し て82.8%の正答率 ● ● ● 29
  30. ● 30
  31. ● 31
  32. ● ○ ■ src/stm32cubeai/nn_st.c ○ ■ src/omv/boards/OPENMV4/omv_boardconfig.h ■ 237K -> 230K ○ ■ 静的ライブラリ「libtf_person_detect_model_data.a」の参照箇所を削る 32
  33. ● ○ ■ 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
  34. ● テストデータに対し て72.5%の正答率 34
  35. 35
  36. ● import nn_st net = nn_st.loadnnst(‘network’) out = net.predict(img) 36
  37. ● ● 37
  38. ● ○ ○ https://github.com/sipeed/MaixPy ○ https://maixpy.sipeed.com/en/ ● ○ http://dl.sipeed.com/MAIX/MaixPy/ide/v0.2.4 ○ 38
  39. FlashROMに書き込む場合 SDカードから読み込む場合 39
  40. ● ○ https://github.com/sipeed/Maix_Toolbox ● ○ ○ https://github.com/kendryte/nncase 40
  41. ● ○ ○ ● ○ ○ ■ 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
  42. Flattenの前後でdequantize,quantize が呼ばれている.無駄. DenseはPaddingとConv2dに置き換え られる.無駄. 42
  43. ● ○ ● ○ これ 43
  44. ● 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. ● ● 45
  46. ● ○ ○ ● ○ ● ○ ● ○ ○ 46
  47. 47
  48. モデル出力 (特徴量) 48
  49. ● 試作1号機(2016年2月) 試作2号機(2016年8月) 試作3号機(2017年8月) 49
  50. 50
  51. 51
  52. モデル Ver1.0 モデル Ver1.0 モデル Ver1.1 ネット環境がない場所で, モデルの管理が大変 モデル Ver1.0 LANなど JetsonNano TPU dev board 52
  53. ● ○ ● ○ ● ○ 53
  54. ● ● ○ ● 54
  55. 55
Advertisement