Keras について調査中


Keras について調査中

(たぶん、いろいろ間違えている。)

Keras関連で利用しているtensorflowはtensoflow1.xのこともあるし、tensoflow2.xのことがある。
tensorflow2.xではtensorflow1.x で動作しないことがある。

Kerasで処理する場合でも、kerasでbackend でtensorflowを使うことによってtensorflowのバージョンの影響を受けるようだ。


そのため、別のバージョンのtensorflow を必要とするときは`python3 -m venv .venv`などとして仮想環境を作り、その中にpip install で目的のバージョンのtensorflow を利用して、作業すること。

tensorflowのバージョンの記述のないある程度古い記事の場合には、tensorflow1.x を使っていることが多い。

tensorflowの場合、

- frozen になっていないモデル：
- frozen になっていないモデル

との両方があって、他のフレームワークで使うための入力としては、frozenになっているのを使う。


わかっていないこと。
なぜ　*.pbファイルだけでは不十分なのか？
それでいて*.pbファイルを読んだあとに、pbtxtファイルを生成しているのがあるのか？



## 第1段階：Kerasで学習、Kerasで推論

[TensorFlow > 学ぶ > TensorFlow Core > チュートリアル > Image classification](https://www.tensorflow.org/tutorials/images/classification)

kerasのモデルのcompileとは

>コンパイル

>モデルの学習を始める前に，compileメソッドを用いどのような学習処理を行なうかを設定する必要があります．compileメソッドは3つの引数を取ります:

>    最適化アルゴリズム: 引数として，定義されている最適化手法の識別子を文字列として与える（rmspropやadagradなど），もしくは Optimizerクラスのインスタンスを与えることができます． 参考: 最適化
    損失関数: モデルが最小化しようとする目的関数です．引数として，定義されている損失関数の識別子を文字列として与える（categorical_crossentropyやmseなど），もしくは目的関数を関数として与えることができます．参考：損失関数
    評価関数のリスト: 分類問題では精度としてmetrics=['accuracy']を指定したくなるでしょう．引数として，定義されている評価関数の識別子を文字列として与える，もしくは自分で定義した関数を関数として与えることができます．

https://keras.io/ja/getting-started/sequential-model-guide/
 

上記の　github 上の ipynb ファイル [classification.ipynb](https://github.com/tensorflow/docs-l10n/blob/master/site/ja/tutorials/images/classification.ipynb)

github [Keras Multi label Image Classification]
(https://github.com/suraj-deshmukh/Keras-Multi-Label-Image-Classification)


[Keras modelを保存するには？
モデル全体の保存/読み込み（アーキテクチャ + 重み + オプティマイザの状態）](https://keras.io/ja/getting-started/faq/#keras-model)

```
model.save('my_model.h5')

from keras.models import load_model
model = load_model('my_model.h5')
```

Kerasで学習のモデルを作る際のネットワークは、drop_outのように推論時には使われない構造が入っている。そのため、Kerasで学習に用いたネットワーク構造では、そのままで、推論を効率的に行うネットワークを与えることが簡単ではない。
(どうやら、それが、Kerasのモデルを直接、他のモデルに変換するのが簡単ではないことにつながっているのだろうか。）

HDF5 ファイル

[Keras - Keras のファイルの形式について](https://www.pynote.info/entry/keras-file-format)

model.to_json()
[[TF]KerasでModelとParameterをLoad/Saveする方法](https://qiita.com/supersaiakujin/items/b9c9da9497c2163d5a74)

to_json()で出力されるファイルは、下にあるkeras to tensorflow のスクリプトの中で使われている。


model.save_weights(filepath): モデルの重みをHDF5形式のファイルに保存します．
https://keras.io/ja/models/about-keras-models/

## 第２段階：Kerasで学習、Tensorflowで推論


[kerasのモデルをデプロイする手順](http://developers.goalist.co.jp/entry/keras-to-production)

[KerasのTensorflow Backendで作ったCNNをTensorflow Graphにして使う](https://qiita.com/cvusk/items/a2a0a11815de491cf3e5)

github [Keras to TensorFlow](https://github.com/amir-abdi/keras_to_tensorflow)

```
python keras_to_tensorflow.py 
    --input_model="path/to/keras/model.h5" 
    --input_model_json="path/to/keras/model.json" 
    --output_model="path/to/save/model.pb"
```

--save_graph_def を有効にするとpbtxt ファイルを出力する

## 第３段階：Kerasで学習、OpenCVで推論

OpenCVで推論するときには
*.pb, *.pbtxt の2つのファイルを必要とする。
*.pbファイルは、Protocol Buffers形式のデータ構造のデータファイルです。

[TensorFlow内部構造解析 (1.1) Protocol Buffers形式のデータ構造](https://qiita.com/nuka137/items/8b6a9d632641fbc787d4)


## 第４段階：Kerasで学習、OpenVinoで推論
[Keras to OpenVINO format conversion](https://software.intel.com/en-us/forums/intel-distribution-of-openvino-toolkit/topic/820599)


## その他：keras からOnnxへの変換

[keras2onnx](https://github.com/onnx/keras-onnx)



--------------
# Tensorflow の場合

## Tensorflow で学習、Tensorflow で推論


## Tensorflow で学習、Tensorflowのfronzenモデルで推論
 [TensorFlow Object Detection API](https://github.com/opencv/opencv/wiki/TensorFlow-Object-Detection-API)


## Tensorflow で学習、OpenCVで推論
この場合には、推論実行時には tensorflow のインストールは不要になる。


[Try to run the model using OpenCV:](https://github.com/opencv/opencv/wiki/TensorFlow-Object-Detection-API)

[readNetFromTensorflow() ](https://docs.opencv.org/4.2.0/d6/d0f/group__dnn.html#gad820b280978d06773234ba6841e77e8d)

```
retval = cv.dnn.readNetFromTensorflow( model[, config]) 
```
model	path to the .pb file with binary protobuf description of the network architecture
config	path to the .pbtxt file that contains text graph definition in protobuf format. Resulting Net object is built by text graph using weights from a binary one that let us make it more flexible. 

*.pb , *.pbtxt の2種類の学習済ファイルが必要になる。


## Tensorflow で推論、OpenVinoで推論
[Converting a TensorFlow* Model](https://docs.openvinotoolkit.org/latest/_docs_MO_DG_prepare_model_convert_model_Convert_Model_From_TensorFlow.html)


-----

pbtxt file
http://docs.fabo.io/tensorflow/building_graph/tensorflow_protocol_buffers_part2.html



 Deep Learningアプリケーション開発 (2) TensorFlow with Python
https://qiita.com/iwatake2222/items/80fc73ff23d8f51650f5
> また、get_model_info 関数を呼ぶことで、変換したTensorFlow用モデルの情報をJSONファイルに保存します。


stack overflow [How to transform keras model to tensorflow .pb and .pbtxt without issues?]
(https://stackoverflow.com/questions/57432615/how-to-transform-keras-model-to-tensorflow-pb-and-pbtxt-without-issues)


https://answers.opencv.org/question/206493/keras-to-tensorflow-to-opencv-dnn/
pbファイルからpbtxtを生成する例。生成後にpb,pbtxt ファイルの両方を用いて
cvNet = cv.dnn.readNetFromTensorflow('lenet.pb', 'lenet2.pbtxt')
でモデルを読み込んでいる。

> your .pbtxt file isn't useful "as is", you have to edit it a bit: 
> then, you have to manually replace all flatten nodes with a single Flatten one,and rewire the inputs. the end of your .pbtxt should look like this:


---
https://github.com/pipidog/keras_to_tensorflow

----

https://medium.com/@pipidog/how-to-convert-your-keras-models-to-tensorflow-e471400b886a

```
    build and train your model in Keras
    Use K.get_session() to get TF session and output the model as .pb file
    Load .pb file using tf.GraphDef()
    Get the interface to tensors in the graph using their names
    Predict the results as usual tensorflow problem
```
----
https://github.com/ohisama/keras_to_tensorflow


---
https://www.tensorflow.org/lite/convert/python_api?hl=ja

https://www.tensorflow.org/lite/guide/inference


https://www.tensorflow.org/lite/guide/python