【自由研究】#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と表示されるはず)が反映されてませんでした。。なぜ、、

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

【メモ】楽天銀行口座を使いこなすまでの調査 #1 用語を理解する

自分の理解を整理するためのメモなので、参考にはならないと思いますが、せっかくなのでブログに書きながら理解していきます。

 

メモ

証券…

お金と同様にモノやサービスと交換することのできる資産。しかし、証券を使用する場合、証券取引が可能なところでしか使うことができない。

 

証券口座…

証券の資産を持っておくための口座。NISAやiDecoなどもこれにあたる(?)

楽天にも楽天証券の口座が用意されている。

 

 

【自由研究】#3 Yoloを使ってみた

こんにちは!

すいません、前回から大分期間が開いてしまいました。5月は本業が忙しく、ブログを書く体力がありませんでした。今回は予告通りYoloを使ってみましたので、その結果を記述したいと思います!

 

Yoloとは?

オブジェクト(人とか物)を画像や動画から検出して、それが何のオブジェクトかをも推定してくれるアルゴリズムです。

以下にYoloについて詳しく説明した記事を載せます。物体検出についてのロジックについても記載してましたが、すいません、まだ理解できてません。。

次回までの宿題とします。

https://www.renom.jp/ja/notebooks/tutorial/image_processing/yolo/notebook.html

 

環境を構築する

 Yoloに関しては初心者中の初心者でしたので、「Yolo Python」とググって、先人の方々が記したブログをめぐりめぐり、たどり着いたのがRIGHTCODEさんの以下の記事です。

rightcode.co.jp

環境構築についてはこちらの記事以上に手順をまとめられそうになかったので参考にしてみてください。おそらく、そんなに苦労することなく構築できるはずです。

私はその代わりに、構築後のコードを何とか読み取りましたので、そちらを書かせていただきます。GitHubにも上げる予定ですので是非、これをお読みになっている方も挑戦してみてください!

物体検出できました!

先に結果をお披露目したいと思います!

構築したYoloはコマンドから操作するタイプのようです。

Terminalを開き、画像や動画に対して物体検出を行ってくれます。

画像は以下のコマンドを打ちます。

python yolo_video.py --image

実行後、以下のような入力欄が表示され、対象の画像ファイル名を入力します。

 

今回は3匹の子犬の写真を用意しました。


出力された画像が以下です。3匹の子犬に対して青い枠がぴったりと囲われてますね!また、推定したオブジェクトもdogと出てますね。冒頭で言ってなかったのですが、オブジェクト名だけでなく、そのオブジェクトである確率も出力されます。今回の場合、3匹とも99%以上でdogと推定されてますね。うん、ばっちりです。

 

そして動画も解析することができるようです。コマンドは以下のようになります。

python yolo_video.py --input kokoronotizu.mp4 --output kokoronotizu_output.mp4

--inputのあとにオリジナルの動画、--outputの後に出力先のファイル名を入力します。

動画を載せられなかったので1フレームだけ載せますね。

動画を解析する上での注意ですが、動画は大量の画像の集まりですので、通常のパソコンで解析しようものなら4分ほどの動画でも数時間かかってしまうでしょう。できればグラフィックボードを搭載しているパソコンで解析することをお勧めします。

コードの構成

コード自体は私も少しコメントを書きながら理解しましたので、そちらをGitHubに共有したいと思います。

github.com

現状ではほとんどカスタマイズはしていないですが、徐々に自分用の仕様にしていきたいなと思っています。

 

さて、本題のコードの構成について説明したいと思います。ただ、ほんの一部しか解読していないので、取り敢えずはそれを説明します。

環境構築後に、私たちが気にした方が良いコードは主に以下の2つで良さそうです。

  • yolo_video.py
  • yolo.py

この2つを図であらわすと以下のようなイメージになります。

正直、大層な解読はしていません笑

ただ、注目してほしいのはあくまでYolo本体はyolo_video.pyではなくyolo.pyの方にあり、カスタマイズするのであればyolo.pyに注目した方がよさそうです。

 

次回はYoloをカスタマイズしてオリジナルの物体検出をしてみたいと思います。

 

【自由研究】#2 食事モニタリングの構想

こんにちは!

前回の予告でYoloを使ってみるとは言ったものの、どんなものを開発するのかをもう少し伝えるべきかなと思いました!

すいませんが、次回こそ「Yoloを使ってみた」みたいな投稿をすると思います。

 

食事モニタリングの構想

 それで、まずは「食事モニタリングの構想」という奇抜なタイトルを回収したいと思います。食事モニタリングとは私が勝手に呼称しているだけで、そんな言葉があるかは分かりません。言葉の通り、「食事」を「モニタリング」するという意味で、主に3つのステップになるんじゃないかなと思ってます。

 

  1.  インスタみたいな感じで写メをとる
  2.  Yoloで解析する
  3.  「見える化」する

 

 図にするとこんな感じです↓

 

 理想を書いてみましたが、かなりガバガバ構想です(笑)

 ただ、インスタで自分の食べているものをストーリーズに載せている人は結構いますし、敷居は低いんじゃないかなと思います。

 それでもって、YoloもしくはYoloみたいな技術で何を食べたのかを分析します。

 最後にグラフ化します。写メすれば時刻も勝手に取れるので、食べた「量」と「時間」の2次元グラフができそうな気がしますね♪

 

 本当はもう少し踏み込んだ構想があるのですが、次回以降の投稿で書きたいと思います!

次の投稿

次回は「Yoloを使ってみた」を投稿しようと思います。

ですが、最終的にはYoloをカスタマイズしないと使い勝手悪そうです。

そこは追々ですね!ここまで読んでいただきありがとうございます。

ついで

最近、日本円が暴れてますね。。皆さん、お気を付けて!

 

 

 

【自由研究】#1 ランニング × IT技術

 

始めの一歩

こんにちは!

いきなり話それるんですが最近、オリジナルの飲み物を開発しまして、、

1.水(200~300ml)

2.レモン汁(適量)

3.白ワイン(適量)

4.砂糖(大さじ3杯くらい)

5.塩(少々)

こんな感じで調合したら案外旨かったので共有しますね!

こういう飲み物、もしかしたらあるかもしれないです笑

 

 さて、私、新卒2年目の駆け出しエンジニアなのですが、仕事柄リモートワークが多くて家にこもりっきりなんですよね。。これでは寿命が縮んでしまうと思い去年の夏あたりから意識的にランニングをすることにしました。通勤がない分、終業後すぐにランニングできるという意味ではリモートワーク悪くないです。今では月100kmを目安にランニングしてます。

 

 なんにでも通じるかもですが、ランニングを続けていると今よりも速く走りたいという欲望が出てくるものです。それもあって最初キロ6分くらいだったのがキロ4分半を切れるところまで来ました(それでも長距離走得意な人には頭が上がらないですが。。)。最終的にはキロ3分を目指したいですね。

 

 半年以上継続したことで身をもって感じたことがあります。それは、日によって「タイム」と「疲労」にばらつきがあることです。単に速く走れば疲れるというわけでもないようで、昨日と同じペースで走っているのに「ここで息が切れるのか(怒)」というのが良くあります。逆にいつもより速いペースなのに軽やかなときもあります。「なるほど、面白い」と思うと同時に、「何で?」ともなりました。

 

 ググったり、考えあぐねたりした結果、色々な因子があることが分かりました。人間の体は複雑にできているようで、ランニングのフォーム・筋肉疲労・赤血球の数・食事・外気温・湿度etc、、様々な因子というか条件の変動で「タイム」と「疲労」にばらつきがでているようです。特に身をもって感じた因子があります。それは食事なんですが、米を食べるとすこぶる調子がいいんですよね。人によると思いますが食事はなかなか良い線言ってると思うんです(論文とか全く読んでないが)。

 

 ということで前置きが長くなってしまいました。なぜ「ランニング×IT技術」なのか、これは面白そうだからですね。IT技術をもってして、先の「タイム」と「疲労」のばらつきを暴いてみようというのをやってみたいのです。その足掛かりとして「食事」をモニタリングするのは面白そうということで、これに注目したいと思います。どうするかというと、「タイム」、「疲労」、「食事」、これらをデータ化して分析してしまおうというものです。具体的な説明は省きますが、要するに、朝ごはんとかを写メを取ることで、何を摂取したか自動記録してくれて、それをランニングアプリとコンビネーションしたら行けそう、と思ったわけです。「朝ごはんとかを写メを取ることで、何を摂取したか自動記録してくれて、なんてことできるの?」と思った方もいるでしょう。これは画像認識のYOLOという技術を使ったら行けるのでは?と思ってます。

 

 一部の人はこういうかもしれない。「それやって何になるの?」とか。「ビジネス的な目線は?」とか。「それやるんだったらもっと小さいスケールからじゃないと」とかとか。うん、わかってる。。けど、これは私の自由研究。ランニングをIT技術で分析したいのです。YOLOを使ってみたいのです。

 

 そんな感じで進めていこうと思います。最終的には無理くりビジネス的な方向にもっていったりしたい、みたいな笑。最後まで読んでいただき、ありがとうございます。次の投稿では早速YOLOに触れてみたいですね。もしよかったら読んでやってください。