tensorflow 2.9で画像認識をしてみた

# 目的
下記サイトを参考に画像認識を試してみました。

[YOLOをpythonで動かして画像認識をしてみた](https://qiita.com/daiarg/items/a922c242af9bb76eb470)

私のPC環境では、いくつかエラーが発生しました。発生したエラーの回避方法をまとめ、画像認識の動作確認をします。

# 開発環境
Python version:3.9.7
OS: windows 10.0
Tensorflow:2.9

# 環境構築
まず、必要なライブラリをインストールと、gitからデータと学習の重みファイルをダウンロードします。
[こちら](https://qiita.com/daiarg/items/a922c242af9bb76eb470)の環境構築と同じようにして設定してください。

# 動作確認
上記リンクを使って、下記ファイルの動作を検証してみます。

```test.py
from darkflow.net.build import TFNet
import cv2

options = {"model": "cfg/yolo.cfg", "load": "bin/yolo.weights", "threshold": 0.1}

tfnet = TFNet(options)

imgcv = cv2.imread("./sample_img/sample_dog.jpg")
result = tfnet.return_predict(imgcv)
print(result)
```

実行すると、tensorflowでエラーが発生しました。

## tensorflowのエラー調査(windows10 インストール不具合)
```
ModuleNotFoundError: No module named 'tensorflow'
```

環境構築時にtensorflowをインストールしていますが、なぜかエラーが出てしまいます。
pipでtensorflowを再度入れなおしてみましたが、下記のようなエラーが発生しました。
```
ERROR: Could not install packages due to an OSError: [Errno 2] No such file or directory: xxxxxxxx
```

このエラーについて調べてみると、window10の初期設定が原因で発生するそうです。

tensorflowのインストール中に、実行するプログラムの一部のpathが長すぎるため、途中で止まってしまいます。
デフォルトでは、260文字の制限があります。

[こちら](https://qiita.com/y-shoji/items/19def45edf582646f584)を参考にすると、回避できます。

## cv2のエラー調査(open cv不具合)
tensorflowを修復後、test.pyを実行してみましたが、下記のようにエラーが出てしました。
```
ModuleNotFoundError: No module named 'cv2'
```
[こちら](https://qiita.com/hiro_o_tama/items/b6a0bc9d86994af837c2)を参考にインストールすると回避できました。

## エラー調査(tensorflowの1.xから2.xでの不具合)
cv2を修復後、test.pyを実行してみましたが、エラーが出てしました。

ここからのエラーは、tensorflowの1.xから2.xに変更になったときにライブラリの一部のコマンドが違うAPIに移ったことにより、記述を変更する必要があります。そのため、cloneで取得したgitのファイル情報```https://github.com/thtrieu/darkflow.git```の一部を変更する必要があります。

エラーと対処方法を簡単にまとめ、修正したものをgitにあげておくので、参考にしてください。

### No module named 'tensorflow.contrib'

**エラー**
[こちら](https://www.codeleading.com/article/89815369131/)を参考に修正しました。
```
ModuleNotFoundError: No module named 'tensorflow.contrib'
```

**修正**
```
#　変更前
# import tensorflow.contrib.slim as slim
#　変更後
import tf_slim as slim
```

### Attribute Error: module 'tensorflow_core._api.v2.train' has no attribute 'RMSProp Optimizer'

**エラー**
[こちら](https://stackoverflow.com/questions/68640222/attributeerror-module-tensorflow-api-v2-train-has-no-attribute-rmspropoptim)を参考に修正しました。
```
Attribute Error: module 'tensorflow_core._api.v2.train' has no attribute 'RMSProp Optimizer'
```

**修正**

trainをkerasにOptimizerの配置を変更。
また、[Available optimizers](https://keras.io/api/optimizers/)に記述されてていないものは、コメントアウトしています。

```build.py
#　変更前
	_TRAINER = dict({
		'rmsprop': tf.train.RMSPropOptimizer,
		'adadelta': tf.train.AdadeltaOptimizer,
		'adagrad': tf.train.AdagradOptimizer,
		'adagradDA': tf.train.AdagradDAOptimizer,
		'momentum': tf.train.MomentumOptimizer,
		'adam': tf.train.AdamOptimizer,
		'ftrl': tf.train.FtrlOptimizer,
		'sgd': tf.train.GradientDescentOptimizer
	})
#　変更後
	_TRAINER = dict({
  		'rmsprop': tf.keras.optimizers.RMSprop,
		'adadelta': tf.keras.optimizers.Adadelta,
		'adagrad': tf.keras.optimizers.Adagrad,
#		'adagradDA': tf.train.AdagradDAOptimizer,
#		'momentum': tf.keras.optimizers.Momentum,
		'adam': tf.keras.optimizers.Adam,
		'ftrl': tf.keras.optimizers.Ftrl,
#		'sgd': tf.keras.optimizers.GradientDescent
	})
```

### AttributeError: module 'tensorflow' has no attribute 'placeholder'

**エラー**
[こちら](https://qiita.com/h398qy988q5/items/79dc6517215f27838622)を参考に修正しました。
```
AttributeError: module 'tensorflow' has no attribute 'placeholder'
```

**修正**

```.compat.v1.```を付け加える

```build.py
#　変更前
tf.placeholder(tf.float32, inp_size, 'input')
#　変更後
tf.compat.v1.placeholder(tf.float32, inp_size, 'input')
```

## darkflow内の修正ファイルまとめ

tensorflowの1.xから2.xでの不具合で修正したdarkflow内のファイルは、下記のとおりです。
```
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   darkflow/net/build.py
        modified:   darkflow/net/ops/baseop.py
        modified:   darkflow/net/ops/convolution.py
        modified:   darkflow/net/ops/simple.py
        modified:   darkflow/net/yolo/train.py
        modified:   darkflow/net/yolov2/train.py
```

## 画像認識の確認
修正後、test2.pyを実行し、画像認識できることを確認できました。

実行前
![sample_dog.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176158/fd6086c9-9be8-1564-8972-bf8cc3c203e5.jpeg)

実行後
![sample_dog2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176158/8932e1b0-e045-73b9-6ec7-d31bf65757df.jpeg)

## 追記
darkflowについて、調べたことをまとめました。ご参考になれば、幸いです。

[darkflowについて調べてみた](https://qiita.com/yutaka_m/items/f71ba80a9be87d6966c3)