こんばんはエンジニアの眠れない夜です。
前回はkeras−yolo3の独自モデルの学習方法を紹介しました。
手順が多くてハマりそうなポイントもちょいちょいあって、手間はかかりますが物体検出の独自モデルの学習ができるようになりましたね。
今回はGoogleColabを使ってGPU環境でYOLOの独自モデルを作ってみようと思います。
keras-yolo3で手作業で設定が必要な部分をどんどん置き換えていったらアノテーションファイルを作成してアップロードするだけで独自モデルの学習ができるようになりました\(^o^)/
もはやハマるところなし!!
ノンプログラマーでも物体検出の独自モデルが作れそうな勢いです。Python初心者でも十分できます。
それでは一緒に手順を確認していきましょう。
【YOLO v3】独自モデルを学習させるまでの流れ
- 教師画像をダウンロード
- 教師画像をリサイズ
- VOTTでアノテーションを作成
- GoogleColabにアノテーションファイルをアップロード
- GoogleColabで学習
アノテーションファイルを作るところまではだいたい前回と同じ手順です。
後半がローカル環境でいろいろやっていたのをGoogleColabでサクッと終わらせます。
設定済みのGoogleColabのファイルを用意しているのでそれを使ってもらえばあっという間です。
ここからは前回の繰り返しになるので細かい説明は省きつつ進めます。
ちょっとわからないなと思ったら前回の記事を見てください。
iCrawlerで教師画像をダウンロード
機械学習の画像収集ならiCrawlerを使うと1回の実行で100枚の画像を集められます。
GoogleColabを使うので画像の枚数は1000枚とか用意しても大丈夫ですが、それは2回目以降にして今回も20枚程度でいいと思います。
まずは動作確認を!
教師画像をリサイズ
iCrawlerで一通り画像のダウンロードができたらkeras-yolo3のimage
直下に画像を全て移動させます。
keras-yolo3ディレクトリで下記のコードを実行します。
python resize_images.py
このコードを実行するとimageに保存されている画像ファイルのアスペクト比を維持しながら 320px × 320px の画像にリサイズします。画像が正方形ではない場合は背景が白で塗り足されます。
教師画像のサイズは32pxの倍数である必要があります。第1引数でサイズを指定しない場合は320pxに設定しています。32の倍数であれば128pxや352pxなどでも大丈夫です。
リサイズしたい大きさは引数で指定できます。
python resize_images.py 128px
※ 正方形なので引数は1つだけです。
あまり画像が大きすぎると学習時にメモリに乗り切らずクラッシュするため小さめのサイズが無難です。
ここの例では320pxで進めていきます。
アノテーションツールVOTT
画像のここに対象物がありますよ。と教えてあげるアノテーションツール。
ここではVoTTというアプリケーションを使います。
VoTTの使い方は別の記事にまとめたのでこちらをご覧ください。
GoogleColabにアノテーションファイルをアップロード
アノテーションファイルを書き出すとresize_imageの中にxxx-PascalVOC-export
というフォルダが作成されています。
その中のファイルを全て選択して、圧縮します。
この圧縮ファイルをGoogleColabにアプロードします。この後の作業をスムーズにするためにファイル名は「Archive.zip」に変更してください。
YOLOの独自モデルの学習が簡単にできるようにしたGoogleColabです。
読み込み専用なので「ファイル→Google Driveにコピーを作成」をして実行できるようにしてください。
上から順番に実行Shift+Enter
していきます。
Upload VoTT export file and directory (.zip) を実行するとファイルのアップロードを求められるのでArchive.zip
をアップロードします。
次のセルはZipファイルを解凍して学習用のファイルを作成しています。実行するだけ大丈夫です。
Convert annotations for YOLOはクラス名を「半角スペース区切り」で入力していきます。
今回は1クラスなのでitem
とだけ入力しています。
GoogleColabで学習
ここまでで独自モデルの学習をする準備ができました。
後はこの3つのセルを実行するとYOLOのモデルをKeras用に変換して、学習が始まります。
学習が終わったらtrained_weights_final.h5
とvoc_classes.txt
をダウンロードし始めます。
約200MBくらいのファイルになります。ネット回線が遅いとダウンロードの途中でエラーが出る事があります。
画面左側からファイルマネージャーを開けます。ここからダウンロードすれば大きなファイルでもダウンロードエラーになりません。
logs/000の一番下の方にtrained_weights_final.h5
があるので右クリックでメニューが開きます。
画像のサイズを変更したい場合
標準で画像のサイズは320pxの正方形ですが、他のサイズに変更している場合は第1引数で 指定できるようにしました。
!python train.py 160
バッチサイズを変更したい場合
標準でバッチサイズは32です。バッチサイズを小さくしたい場合は第2引数で指定してください。
!python train.py 320 8
メモリーが足りないと言われたら…
メモリーが足りないよって言われる可能性が90%くらいであります。
あくまで警告なので IGNORE(無視)してもなんとか学習できなくはないですが途中で落ちるかもしれません。
MANAGE SESSIONS(セッション管理)を開くと実行中のColabファイルが確認できます。下の画像のように1つしか無い場合はどうしようもありません。
複数ファイル開いている場合はTERMINATE(終了)します。
それでもだめな場合はバッチサイズを下げてください。
!python train.py 320 8
学習済みの独自モデルを動かす
GoogleColabで独自の学習モデルを動かす場合
このセルを実行します。
Input image filename:
と表示されたら画面左のファイルマネージャーから画像のファイルパスをコピーして入力します。
コピーされるパスはルートからの”相対パス”が取得されるので、先頭に/
(スラッシュ)を入れてパスをペーストします。
実行すると予測結果が確認できます。
ただし、残念がら動作確認はできてもColabで画像は表示されないのでどんな範囲が指定されているかを確認するにはローカル環境での確認が必要です。
ローカル環境で独自の学習モデルを動かす方法
sleepless-se/keras-yolo3をクローンします。
git clone git@github.com:sleepless-se/keras-yolo3.git
Colabからダウンロードしてきたtrained_weights_final.h5
をkeras-yolo3/logs/000
に保存します。
Colabからダウンロードしてきたvoc_classes.txt
を<code>keras-yolo3/model_data</code>
に保存します。
準備ができたのでYOLOを動かしてみます。
画像の場合は
python yolo_video.py --image
の後に画像のファイル名、もしくは絶対パスを入力。
動画の場合は
python yolo_video.py --input ファイル名.mp4
もしくは動画の絶対パスを入力します。
前回より精度が落ちているような気がしますが…
そこはアノテーションとラベルの問題なのかなと思います。
アクセサリや雑貨、人物を全部含めて、十把一絡げにitemにしてしまっているので学習し辛いのだと思います(^_^;)
もう少し狭い意味でそれぞれラベル付けしたほうが精度が良くなりそうです。
まとめ
前回の記事で紹介したときよりファイルを操作する回数が減ってハマりづらくなりました。
アノテーションファイルをアップロードしてColabを実行するだけですからね…(^_^;)
何よりテキストファイルやプログラを開いて編集することがなくなりました。
ここまで書いたプログラムは0行です!(実行コマンドは除いて)
これで誰も簡単にYOLOの独自モデルを使った物体検出ができるようになりましたね!
ローカル環境で実行した時は学習に1日かかる勢いでしたが、Colabを使うと10分程度で終わりました。
衝撃の速さ!(゜o゜;
- 画像集め
- リサイズ
- アノテーション
- Colabにアップして学習
- 学習済みのモデルをAPI化してデプロイ
この一連の作業に慣れれば物体検出のプロダクツを量産できそうですね!
今回作成した学習済みモデルのAPI化はこちらの記事を参考にしてみてください。
[…] 【物体検出】YOLO独自モデル簡単作成方法 […]
[…] 【物体検出】YOLO独自モデル簡単作成方法 […]
train.pyの実行段階で
module ‘keras.backend’ has no attribute ‘control_flow_ops’
のエラーが出てしまいます...アドバイスが欲しいです><
おでこさん
見たこと無いエラーですね。
ググった感じこの辺りでしょうか…?
https://github.com/keras-team/keras/issues/3857#issuecomment-251385542
これで解決すれば良いのですが…(^_^;)
おでこさん
Jetson nanoで動かした時に同じエラーが出ました。
以下のサイトを参考に他所からインポートすることでとりあえず動くようにはなります。
↓参考元
https://qiita.com/sino20023/items/cdb8857badb4aac4d3e0
アドバイスをお願いいたします。
Unzip and make train filesを実行後、最後にこのエラーが出てきました。
extracting: pascal_label_map.pbtxt
[Errno 2] No such file or directory: '/content/keras-yolo3/'
/content
python3: can't open file 'make_train_files.py': [Errno 2] No such file or directory
よろしくお願いいたします
西嶋惟旺さん
質問ありがとうございます。
下記、グーグル翻訳ですが問題解決の参考になるかと思います。
!pip install tensorflow==1.6.0
!pip install keras==2.1.5
をtrain.pyの前に実行し、ダウングレードすると学習ができますよ。
!pip install tensorflow==1.6.0
!pip install keras==2.1.5
をtrain.pyの前に実行したら、学習できるようになりました。
ただ、学習速度がMacbookproとほんんど変わらない状況でした。
ランタイムのタイム設定で、ちゃんとGPUとしています。
何か、GPU設定で留意する点はありますか?
AKIWTさん
無事に動いてよかったです^^
ランタイムを再起動してもう一度実行してみるといかがでしょうか?
ご助言ありがとうございます。ランタイムを再起動してもう一度実行しましたが、変わりませんでした。何度も再接続・再起動を繰り返しましたが、変わらずです。苦労しています。
ランタイムを再起動してもだめでしたか。
例えばMNISTのソースコードを引っ張ってきて、GPUが動いているかを確認してみてはいかがでしょうか?
アドバイスありがとうございます。
CPU/GPUのパフォーマンスを比較する例題を試したところ、下記のように、ちゃんとスピードが出ていました。その同じノートブックで、Keras-Yoloの学習をさせたのですが、その時はスピードが出ません。よくわかりません。
Time (s) to convolve 32x7x7x3 filter over random 100x100x100x3 images (batch x height x width x channel). Sum of ten runs.
CPU (s):
2.836163771999992
GPU (s):
0.04278829000000428
GPU speedup over CPU: 66x
AKIWTさん
CPU/GPUは切り替わっているのですね。ますます謎ですね…
こちらでも試してみて何か分かりましたら再度コメント致します。
AKIWTさん
!pip install tensorflow==1.6.0 をコメントアウトしてみてはいかがでしょうか。
アドバイスをお願いします。
学習終了後にtrained_weights_final.h5ができません。trained_weights_stage_1.h5しかできていないのはやはり異常でしょうか?
また、学習終了後と記載しましたが以下で終了しています。これは異常終了でしょうか?
1/1 [==============================] – 140s 140s/step – loss: 116.3860 – val_loss: 103.6484
Epoch 50/50
1/1 [==============================] – 142s 142s/step – loss: 123.5140 – val_loss: 106.6472
Unfreeze all of the layers.
Train on 11 samples, val on 1 samples, with batch size 32.
Epoch 51/100
^C
YNさん
ご質問ありがとうございます。
私は同じエラーが出たことがないのでわからないのですが、他にも同じエラーで悩んでいる方が他にもいらっしゃるようです。
https://teratail.com/questions/229843
tiitoiさんの回答の引用です。
ご参考になれば幸いです。
ご返信いただきましてありがとうございます。
試してみます。別件ですが、他のかたも記載していますが1エポックの処理時間がGPU使用で140secくらいかかっています。なかなか厳しいですね。
mAPを確認する方法はありますか?
shさん
コメントありがとうございます。
すみません。mAPを確認する方法は分かりません。
sleepless-se さま
trained_weights_final.h5ができずに止まってしまう件、アドバイスいただいたようにバッチサイズをとりあえず8にすることで、正常動作しました。ありがとうござます。