Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

4,992 views

Published on

PyCon mini Shizuoka2020

Published in: Engineering

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

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

×