物体検出コードといえば、Faster-RCNN、SSD、そしてYOLOが有名ですが、そのYOLOの最新版である”YOLO v3”のKeras+TensorFlow版を使って、独自データにて学習できるところまで持っていきましたので、ここに手順を書きます。
まず、YOLO v3の威力をご覧ください。
YOLO: Real-Time Object Detection
最近出たアルゴリズムなので、SSDよりも高速&正確であるというのが謳い文句です。ごらんのとおり、物体検出数も精度のなかなかです。
制度と速度を他の物体検出コードと比較したグラフです。わざとグラフの横軸からはみ出すように作ってますが・・・実際動かしてみると、確かに以前試したTensorFlow+Keras版SSDよりも速く動作します。
基本的には、READMEを読めば分かるように作られている・・・はずですが、クイックスタートでさえちょっとてこずりました。ましてや深層学習して学習モデル適用は、READMEだけではわかりません。
このAI民主化時代(誰でもAIを使える時代)に、これではいただけません。
ということで、以下、Windows版Anaconda 3(我が家はVer.4.4.0)にTensorFlow 1.8.0+Keras 2.2.0をインストールして、クイックスタートから独自データによる学習、および推論コード実行まで実施いたしましたので、紹介します。
準備 & クイックスタート
最初に、準備がてら動かしてみましょう。
※ Windows版Anaconda 3のインストール方法、TensorFlow 1.8.0+Keras 2.2.0のインストールについては省略します。以下のサイトなどを参考に、あらかじめ導入をお願いします。
Windows10にKeras(+TensorFlow)をインストールしてAnaconda+Jupyterで動かしてみる
まず、”YOLO v3”のコードを、以下から入手します。
https://github.com/qqwweee/keras-yolo3
Windowsの場合は「Clone or Download」を押して「Download ZIP」をクリックしてダウンロード。ファイルを解凍します。
学習済みデータを入手します。YOLO: Real-Time Object Detectionのページの中ほど、「Detection Using A Pre-Trained Model」のところに”here (237 MB)”というのがあるので、これをクリックします。
すると、”yolov3.weights”というファイルが得られます。これを、先ほど解凍したフォルダに入れます。
ここでAnaconda 3のプロンプトを開き、TensorFlow実行環境に変えて(activate tensorenv 等)、上の解凍フォルダに入ります。
まず、入手した学習済みデータをKeras用に変換します。以下のコマンドを入力します。
$ python convert.py yolov3.cfg yolov3.weights model_data/yolo.h5
これで、Keras用の学習済みデータが「model_data」フォルダに入ります(yolo.h5)。
ここで、とりあえず動かしてみます。
静止画を認識させたい場合は、YOLO v3のフォルダに検出させたい画像ファイルを入れておきます。
と入力。
「Input image filename:」と出てくるので、あらかじめYOLO v3の入ったフォルダに入れた画像ファイルのファイル名をコロンの後ろに入力します。
こんな画像が出れば、成功です。
動画を使いたい場合は、同様にYOLO v3のフォルダに動画を入れて、
$ python yolo_video.py (動画ファイル名) [出力ファイル名]
と実行します。動かすだけなら、出力ファイル名のところは何も入れなくても動作します。
独自データでの準備
以降は、VOC2007形式でのデータセットを作って、これを学習させるまでの手順を書きます。
※以下、TensorFlow+KerasでSSDを独自データで使えるようにしてみた: EeePCの軌跡の記事と同じです。
まずは、独自データとなる画像を集めます。これは必須。
続いて、「AnnotationTool.exe」のリンクをクリックして、アノテーションツールをダウンロードします。
私がとりあえず作ったWindows上で動かすアノテーションデータ作成ソフトです。
使い方は以下を参照。
-----------------------------------------------------------------------
① まずアノテーションファイル(*.xmlと”trainval.txt”)を保存するフォルダ(作業フォルダ)を作りドラッグ&ドロップ
② アノテーションを作成したい画像ファイルをドラッグ&ドロップ
③ 画像ファイルが出てくるので、物体をマウスで囲みます
④ ”ラベル名”のテキストボックスに物体の名前を書きます(半角英数)
⑤ ”ラベル作成”をクリックすると登録
同一画像内で認識させたい物体の数だけ③~⑤を繰り返します。
⑥ 一通り終わったら「Annotation追加」をクリック
次の画像ファイルを読み込むため、再び②で別の画像を読み込み、⑥までを繰り返します。
すべての画像ファイルのアノテーション登録が終わったら
⑦ ”終了”をクリック
-----------------------------------------------------------------------
これを実行すると、画像ファイル分の「~.xml」ファイルと、「trainval.txt」ができているはずです。
これを、以下のように「VOCdevkit/VOC2007」に反映。
・ 「Annotations」フォルダには作成されたxmlファイルを全部入れます。
・ 「ImageSets/Main」にある「trainval.txt」に、上で作られた「trainval.txt」の中身を追記します。
・ 「JPEGImages」フォルダに、独自データの画像ファイルをすべて入れます。
これで、データセットの準備は完了です。
独自データによる学習実行
いよいよ学習ですが、いくつか下準備が必要です。
まず、YOLO v3フォルダの直下に、上で作った「VOCdevkit」フォルダをそのまま置きます。
VOCdevkitの中の「VOC2007/ImageSets/Main」の中にある「trainval.txt」をコピーして、「train.txt」、「val.txt」、「test.txt」の3つのファイルを作っておきます。
続いて、「model_data」フォルダにある「yolo.h5」をコピーして「yolo_weights.h5」というファイル名に変えます。
また、「model_data」フォルダにある「voc_classes.txt」のラベル名を書き換えます。
この中にはaeroplane、bicycle、bird、boat・・・という20のラベル名が書かれているはずです。これを、上から順に独自データ用のラベル名に書き換えておきます。
「voc_annotation.py」の6行目も同様に書き換えます。
ここまで出来たら、以下のコマンドを実行。
$ python voc_annotation.py
すると、YOLO v3フォルダに「2007_val.txt」、「2007_train.txt」、「2007_test.txt」が生成されます。このうち「2007_train.txt」のみを「train.txt」とファイル名を変更しておきます(後の2つは使いません。消してもOK)。
これで学習実行準備完了。
あとは、
と実行するだけ。
こんな感じに、学習が実行されます。
---------------------------------------
さて、デフォルトでは50エポックほど実行されますが、学習途上で終わった(loss値がまだ減少しそう)ならば、「logs/000」フォルダ内にある学習済みデータ(~.h5)を「model_data」フォルダに移します。
最後まで実行していたら「trained_weights_stage_1.h5」というファイルがあるはず。途中でも「ep~-loss~-val_loss~.h5」というファイルができているので、これの一番新しいのを用いてもいいです。
学習済みファイルを移したら、「train.py」の中の33行目の「freeze_body=2, weights_path='model_data/yolo_weights.h5')」のyolo_weights.h5の部分を書き換えます。
エポック数を増やす場合は、「train.py」の63行目にある「epochs=50,」の数字を変えます。
独自データによる学習済みデータを使った推論
いよいよ独自データの学習モデルで推論を実行します。
コマンドはクイックスタートと同じですが、「yolo.py」を以下のように書き換える必要があります。
22行目:「self.model_path = 'model_data/yolo.h5'」 ⇒ 「yolo.h5」のところを、新しい学習モデル(logs/000/~.h5)名に書き換え。
24行目:「self.classes_path = 'model_data/coco_classes.txt'」 ⇒ 「coco_classes.txt」を「voc_classes.txt」に変更。
あとは、クイックスタートと同じです。
静止画は
静止画を認識させたい場合は、YOLO v3のフォルダに検出させたい画像ファイルを入れておきます。
とコマンド入力。動画は
動画を使いたい場合は、同様にYOLO v3のフォルダに動画を入れて、
$ python yolo_video.py (動画ファイル名) [出力ファイル名]
と実行。
所感とまとめ
SSDに対抗意識を燃やして作っているだけあって、SSDよりもちょっと速くて検出数も多いです。
ただ、どっちの精度が高いかはよくわからないので、TensorFlow+KerasでSSDを独自データで使えるようにしてみた: EeePCの軌跡の記事を参考に、SSDと共に検討してみるのがよろしいかと思われますね。
幸い、どちらも同じデータセットが使えます。
それにしても、物体検出コードも随分と身近になりました。
物体検出手法を独自データで試してみたい方は、先のSSDの記事とこのYOLO v3を参考にお試しください。
最近のコメント