【自由研究】#4 Yoloをカスタマイズしてみた①

こんにちは!

最近、ランニングのスピードが頭打ちになってしまったので、習慣に2つ変化をつけることにしました!1つはインターバルトレーニングといって速く走る・遅く走るを交互に行うことで速く走ることに慣れ、心肺機能をさらに強化していきます。もう1つは上半身のトレーニングを取り入れて、上半身の捻りの強化を目指します。これによって、強く地面を蹴れるようになり、タイムも上がるはずです。

 さて、前回のYoloの続きをやっていこうと思います。引き続きRIGHTCODEさんの以下の記事にお世話になります。

 といっても、エラーで苦戦してしまったので、その様子を書き記したいと思います。

エラーにつまったのでメモ

>python train.py

上記を実行してみると、下記のようなエラーが出てしまった。。

AttributeError: module 'keras.backend' has no attribute 'control_flow_ops'

調べてみたところ、どうやらKerasのバージョンが最新すぎて'control_flow_ops'というモジュールが見つからないよ、と怒っていらっしゃるようです。さらに調べたところ、バージョンはv2.2.4にした方がよさそうです。

github.com

自分の環境を確認したところv2.3.1でした。。

 

さて、バージョンを指定してKerasを再インストールしようと思います。コマンドは以下のようになります。

conda install -c conda-forge keras=2.2.4

実行後、環境を確認したら、ちゃんとv2.2.4になっていることを確認できました。

もう一度train.pyを実行したところ、先ほどの”AttributeError: module 'keras.backend' has no attribute 'control_flow_ops'”はでなくなったのですが、今度はtrain.txtが見つからないと怒っているようです。

Traceback (most recent call last):
  File "train.py", line 190, in <module>
    _main()
  File "train.py", line 42, in _main
    with open(annotation_path) as f:
FileNotFoundError: [Errno 2] No such file or directory: 'train.txt'

train.txtは用意しているはずなのですが、、置いている場所が良くないようです。エラーメッセージに従って原因を特定していきます。

確認したところannotation_pathが原因のようです。Webからダウンロードしたコードは以下のようになっていたのですが、

annotation_path = 'train.txt'

自分の環境にある、それらしきファイルは'2007_train.txt'でした。変更が入ったかもと予想し、ここのコードを'2007_train.txt'に書き換えます。

annotation_path = '2007_train.txt'

そして実行!

すると、またエラー。。しかも、エラーの行数が何百行と、大激怒のようですねw

2022-06-26 00:41:32.544499: I tensorflow/core/common_runtime/bfc_allocator.cc:812] 1 Chunks of size 387645440 totalling 369.69MiB
2022-06-26 00:41:32.544532: I tensorflow/core/common_runtime/bfc_allocator.cc:816] Sum Total of in-use chunks: 6.42GiB
2022-06-26 00:41:32.544567: I tensorflow/core/common_runtime/bfc_allocator.cc:818] total_region_allocated_bytes_: 7139698176 memory_limit_: 7139698279 available bytes: 103 curr_region_allocation_bytes_: 14279396864
2022-06-26 00:41:32.544609: I tensorflow/core/common_runtime/bfc_allocator.cc:824] Stats:
Limit: 7139698279
InUse: 6894054144
MaxInUse: 6895232768
NumAllocs: 276990
MaxAllocSize: 2495635456

2022-06-26 00:41:32.544789: W tensorflow/core/common_runtime/bfc_allocator.cc:319] ****************************************************************************************************
2022-06-26 00:41:32.544843: W tensorflow/core/framework/op_kernel.cc:1502] OP_REQUIRES failed at fused_batch_norm_op.cc:487 : Resource exhausted: OOM when allocating tensor with shape[16,256,52,52] and type float on /job:localhost/replica:0/task:0/device:GPU:0 by allocator GPU_0_bfc
Traceback (most recent call last):
File "train.py", line 195, in <module>
_main()
File "train.py", line 89, in _main
callbacks=[logging, checkpoint, reduce_lr, early_stopping])
File "C:\Users\MIYA Ren\Anaconda3\envs\Yolo\lib\site-packages\keras\legacy\interfaces.py", line 91, in wrapper
return func(*args, **kwargs)
File "C:\Users\MIYA Ren\Anaconda3\envs\Yolo\lib\site-packages\keras\engine\training.py", line 1418, in fit_generator
initial_epoch=initial_epoch)
File "C:\Users\MIYA Ren\Anaconda3\envs\Yolo\lib\site-packages\keras\engine\training_generator.py", line 217, in fit_generator
class_weight=class_weight)
File "C:\Users\MIYA Ren\Anaconda3\envs\Yolo\lib\site-packages\keras\engine\training.py", line 1217, in train_on_batch
outputs = self.train_function(ins)
File "C:\Users\MIYA Ren\Anaconda3\envs\Yolo\lib\site-packages\keras\backend\tensorflow_backend.py", line 2715, in __call__
return self._call(inputs)
File "C:\Users\MIYA Ren\Anaconda3\envs\Yolo\lib\site-packages\keras\backend\tensorflow_backend.py", line 2675, in _call
fetched = self._callable_fn(*array_vals)
File "C:\Users\MIYA Ren\Anaconda3\envs\Yolo\lib\site-packages\tensorflow\python\client\session.py", line 1458, in __call__
run_metadata_ptr)
tensorflow.python.framework.errors_impl.ResourceExhaustedError: 2 root error(s) found.
(0) Resource exhausted: OOM when allocating tensor with shape[16,256,52,52] and type float on /job:localhost/replica:0/task:0/device:GPU:0 by allocator GPU_0_bfc
{{node batch_normalization_14/FusedBatchNorm}}
Hint: If you want to see a list of allocated tensors when OOM happens, add report_tensor_allocations_upon_oom to RunOptions for current allocation info.

loss_1/add_74/_5299
Hint: If you want to see a list of allocated tensors when OOM happens, add report_tensor_allocations_upon_oom to RunOptions for current allocation info.

(1) Resource exhausted: OOM when allocating tensor with shape[16,256,52,52] and type float on /job:localhost/replica:0/task:0/device:GPU:0 by allocator GPU_0_bfc
{{node batch_normalization_14/FusedBatchNorm}}
Hint: If you want to see a list of allocated tensors when OOM happens, add report_tensor_allocations_upon_oom to RunOptions for current allocation info.

0 successful operations.
0 derived errors ignored.

この中を見ていて、それっぽいエラーを見つけました。

tensorflow.python.framework.errors_impl.ResourceExhaustedError: 2 root error(s) found.

上記をググったところ、見事にヒット(笑)

qiita.com

原因はGPUのメモリ不足によるキャパオーバーでした。。

対処法は機械学習をする際のパラメータの1つ、バッチサイズの値を小さくすることでGPUに対する負荷を小さくすることで解決できるようです。

batch_size = 4 # note that more GPU memory is required after unfreezing the body

数回検証したところバッチサイズを32から4に変更したら学習がすべて完了しました!

 

が、しかし、、

学習結果を実行してみたところ、

デフォルトのままで、学習したオブジェクト(Womanと表示されるはず)が反映されてませんでした。。なぜ、、

眠くなったので、寝ます。