【物体検出】(GPU版)YOLO独自モデル簡単学習方法

【物体検出】YOLO独自モデル簡単作成方法

こんばんはエンジニアの眠れない夜です。

前回はkeras−yolo3の独自モデルの学習方法を紹介しました。

【物体検出】keras−yolo3の学習方法

手順が多くてハマりそうなポイントもちょいちょいあって、手間はかかりますが物体検出の独自モデルの学習ができるようになりましたね。

今回はGoogleColabを使ってGPU環境でYOLOの独自モデルを作ってみようと思います。

keras-yolo3で手作業で設定が必要な部分をどんどん置き換えていったらアノテーションファイルを作成してアップロードするだけで独自モデルの学習ができるようになりました\(^o^)/

もはやハマるところなし!!

ノンプログラマーでも物体検出の独自モデルが作れそうな勢いです。Python初心者でも十分できます。

それでは一緒に手順を確認していきましょう。

【YOLO v3】独自モデルを学習させるまでの流れ

  1. 教師画像をダウンロード
  2. 教師画像をリサイズ
  3. VOTTでアノテーションを作成
  4. GoogleColabにアノテーションファイルをアップロード
  5. GoogleColabで学習

アノテーションファイルを作るところまではだいたい前回と同じ手順です。

後半がローカル環境でいろいろやっていたのをGoogleColabでサクッと終わらせます。

設定済みのGoogleColabのファイルを用意しているのでそれを使ってもらえばあっという間です。

ここからは前回の繰り返しになるので細かい説明は省きつつ進めます。

ちょっとわからないなと思ったら前回の記事を見てください。

【物体検出】keras−yolo3の学習方法

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というフォルダが作成されています。

その中のファイルを全て選択して、圧縮します。

VoTT物体検出教師データ

この圧縮ファイルをGoogleColabにアプロードします。この後の作業をスムーズにするためにファイル名は「Archive.zip」に変更してください。

物体検出教師データ圧縮

YOLOの独自モデルの学習が簡単にできるようにしたGoogleColabです。

読み込み専用なので「ファイル→Google Driveにコピーを作成」をして実行できるようにしてください。

上から順番に実行Shift+Enterしていきます。

ColabでYOLO学習4

Upload VoTT export file and directory (.zip) を実行するとファイルのアップロードを求められるのでArchive.zipをアップロードします。

ColabでYOLO学習 アップロード

次のセルはZipファイルを解凍して学習用のファイルを作成しています。実行するだけ大丈夫です。

ColabでYOLO学習 学習ファイル作成

Convert annotations for YOLOはクラス名を「半角スペース区切り」で入力していきます。

今回は1クラスなのでitemとだけ入力しています。
アノテーションファイル変換

GoogleColabで学習

ここまでで独自モデルの学習をする準備ができました。

後はこの3つのセルを実行するとYOLOのモデルをKeras用に変換して、学習が始まります。

ColabでYOLO学習 Train

学習が終わったらtrained_weights_final.h5voc_classes.txtをダウンロードし始めます。

約200MBくらいのファイルになります。ネット回線が遅いとダウンロードの途中でエラーが出る事があります。

画面左側からファイルマネージャーを開けます。ここからダウンロードすれば大きなファイルでもダウンロードエラーになりません。

logs/000の一番下の方にtrained_weights_final.h5があるので右クリックでメニューが開きます。

学習済みモデルダウンロード

画像のサイズを変更したい場合

標準で画像のサイズは320pxの正方形ですが、他のサイズに変更している場合は第1引数で 指定できるようにしました。

 !python train.py 160

バッチサイズを変更したい場合

標準でバッチサイズは32です。バッチサイズを小さくしたい場合は第2引数で指定してください。

 !python train.py 320 8

メモリーが足りないと言われたら…

メモリーが足りないよって言われる可能性が90%くらいであります。

あくまで警告なので IGNORE(無視)してもなんとか学習できなくはないですが途中で落ちるかもしれません。

Colabメモリー不足

MANAGE SESSIONS(セッション管理)を開くと実行中のColabファイルが確認できます。下の画像のように1つしか無い場合はどうしようもありません。

複数ファイル開いている場合はTERMINATE(終了)します。

Colabファイル管理

それでもだめな場合はバッチサイズを下げてください。

 !python train.py 320 8

学習済みの独自モデルを動かす

GoogleColabで独自の学習モデルを動かす場合

このセルを実行します。

run Predict by new model

Input image filename: と表示されたら画面左のファイルマネージャーから画像のファイルパスをコピーして入力します。

Colabで画像のパスをコピー

コピーされるパスはルートからの”相対パス”が取得されるので、先頭に/(スラッシュ)を入れてパスをペーストします。

実行すると予測結果が確認できます。

ただし、残念がら動作確認はできてもColabで画像は表示されないのでどんな範囲が指定されているかを確認するにはローカル環境での確認が必要です。

ローカル環境で独自の学習モデルを動かす方法

sleepless-se/keras-yolo3をクローンします。

git clone git@github.com:sleepless-se/keras-yolo3.git

 

Colabからダウンロードしてきたtrained_weights_final.h5keras-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゜;

  1. 画像集め
  2. リサイズ
  3. アノテーション
  4. Colabにアップして学習
  5. 学習済みのモデルをAPI化してデプロイ

この一連の作業に慣れれば物体検出のプロダクツを量産できそうですね!

今回作成した学習済みモデルのAPI化はこちらの記事を参考にしてみてください。

【物体検出】1行で学習済みのYOLO独自モデルをAPI化する方法

 

21 Comments

おでこ

train.pyの実行段階で
module ‘keras.backend’ has no attribute ‘control_flow_ops’
のエラーが出てしまいます...アドバイスが欲しいです><

返信する
西嶋惟旺

アドバイスをお願いいたします。
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

よろしくお願いいたします

返信する
アバター画像 sleepless-se

西嶋惟旺さん

質問ありがとうございます。

下記、グーグル翻訳ですが問題解決の参考になるかと思います。

抽出:pascal_label_map.pbtxt
[Errno 2]そのようなファイルまたはディレクトリはありません:「/ content / keras-yolo3 /」
/コンテンツ
python3:ファイル「make_train_files.py」を開けません:[Errno 2]そのようなファイルまたはディレクトリはありません

返信する
buna

!pip install tensorflow==1.6.0
!pip install keras==2.1.5

をtrain.pyの前に実行し、ダウングレードすると学習ができますよ。

返信する
AKIWT

!pip install tensorflow==1.6.0
!pip install keras==2.1.5

をtrain.pyの前に実行したら、学習できるようになりました。
ただ、学習速度がMacbookproとほんんど変わらない状況でした。
ランタイムのタイム設定で、ちゃんとGPUとしています。
何か、GPU設定で留意する点はありますか?

返信する
アバター画像 sleepless-se

AKIWTさん
無事に動いてよかったです^^
ランタイムを再起動してもう一度実行してみるといかがでしょうか?

返信する
AKIWT

ご助言ありがとうございます。ランタイムを再起動してもう一度実行しましたが、変わりませんでした。何度も再接続・再起動を繰り返しましたが、変わらずです。苦労しています。

返信する
アバター画像 sleepless-se

ランタイムを再起動してもだめでしたか。
例えばMNISTのソースコードを引っ張ってきて、GPUが動いているかを確認してみてはいかがでしょうか?

返信する
AKIWT

アドバイスありがとうございます。
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

返信する
アバター画像 sleepless-se

AKIWTさん

CPU/GPUは切り替わっているのですね。ますます謎ですね…
こちらでも試してみて何か分かりましたら再度コメント致します。

返信する
ぶち

AKIWTさん

!pip install tensorflow==1.6.0 をコメントアウトしてみてはいかがでしょうか。

返信する
YN

アドバイスをお願いします。
学習終了後に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

返信する
アバター画像 sleepless-se

YNさん
ご質問ありがとうございます。
私は同じエラーが出たことがないのでわからないのですが、他にも同じエラーで悩んでいる方が他にもいらっしゃるようです。
https://teratail.com/questions/229843

tiitoiさんの回答の引用です。

バッチサイズが8から32に変更して学習しようとしたタイミングで止まってしまうということは、もしかしたらメモリ不足等の可能性もあるので、以下の train.py 76行目の32となっているバッチサイズを16や8など小さい値にしてみてはどうでしょうか。

ご参考になれば幸いです。

返信する
YN

ご返信いただきましてありがとうございます。
試してみます。別件ですが、他のかたも記載していますが1エポックの処理時間がGPU使用で140secくらいかかっています。なかなか厳しいですね。

返信する
アバター画像 sleepless-se

shさん
コメントありがとうございます。
すみません。mAPを確認する方法は分かりません。

返信する
YN

sleepless-se さま

trained_weights_final.h5ができずに止まってしまう件、アドバイスいただいたようにバッチサイズをとりあえず8にすることで、正常動作しました。ありがとうござます。

返信する

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください