
目次
物体検出(Yolo3) をやってみる
DeepLearningベースの物体検出(Yolo3)で、tensorflow2.0で動くものがあろました。
物体検出は画像の中に含まれる物体の位置とカテゴリー(クラス)を検出する手法です。
アウトプットはこんな感じになります。

実行にはtensorflowが必要です。
kerasはtensorflowをインストールすると、一緒にはいります。
yolov3-tf2をダウンロード
GitHubのこちらのサイトからZIPでダウンロードします。
こんな画面です。

ZIPファイルをダウンロードしたら、どこか適当な作業フォルダに解凍します。
この解凍したフォルダが作業フォルダになります。
今回は「yolo3-tf2」フォルダとでもリネームしておきます。
Download YOLOv3 weights
続けて、学習済のWeightファイルをダウンロードします。
こちらのURLからもダウンロードできます。
https://pjreddie.com/media/files/yolov3.weights
または、前回と同じように、こちらのサイトからでもOKです。
基本、学習炭Weightは前の記事の時から変わっていませんから、すでにダウンロード炭の場合は、落としなおす必要はありません。
この真ん中あたりに、以下のように書いてあるところがあります。

この黄色で囲った部分「here(237MB)」をクリックすると、「yolov3.weights」ファイルをダウンロードしておきます。
Convert the Darknet YOLO model to a Keras model.
ダウンロードした「yolov3.weights」は、そのままではkerasで使えません。
kerasモデルにコンバートします。
コマンドプロンプトを立ち上げて、「yolo3-tf2」フォルダをカレントフォルダにして、tensorflowが動く仮想環境をActivateします。
ここでポイントです。
ダウンロードした「yolov3.weights」は、「yolov3-tf2」フォルダの「data」フォルダの下に置きます。

convert.pyからみて、相対パスで「data/yolov3.weights」になる位置です。
こうしておかないと、エラーになります。
準備ができたら、以下のコマンドを実行します。
python convert.py --weights ./data/yolov3.weights --output ./checkpoints/yolov3.tf
ファイル名等は絶対に変更しないで、このまま動かしてください。
物体検出する画像か動画を用意する
適当に画像・動画を用意します。
この「keras-yolo3」の学習済ウェイトを使うと以下の物体検出が可能です。
| 英語名 | 日本語名 |
|---|---|
| person | 人 |
| bicycle | 自転車 |
| car | 車 |
| motorbike | バイク |
| aeroplane | 飛行機 |
| bus | バス |
| train | 列車 |
| truck | トラック |
| boat | ボート |
| traffic light | 信号機 |
| fire hydrant | 消火栓 |
| stop sign | 一時停止標識 |
| parking meter | パーキングメーター |
| bench | ベンチ |
| bird | 鳥 |
| cat | ネコ |
| dog | 犬 |
| horse | うま |
| sheep | 羊 |
| cow | 牛 |
| elephant | 象 |
| bear | くま |
| zebra | シマウマ |
| giraffe | キリン |
| backpack | バックパック |
| umbrella | 傘 |
| handbag | ハンドバッグ |
| tie | ネクタイ |
| suitcase | スーツケース |
| frisbee | フリスビー |
| skis | スキー |
| snowboard | スノーボード |
| sports ball | スポーツボール |
| kite | 凧 |
| baseball bat | 野球用バット |
| baseball glove | 野球グローブ |
| skateboard | スケートボード |
| surfboard | サーフボード |
| tennis racket | テニスラケット |
| bottle | ボトル |
| wine glass | ワイングラス |
| cup | カップ |
| fork | フォーク |
| knife | ナイフ |
| spoon | スプーン |
| bowl | ボウル |
| banana | バナナ |
| apple | 林檎 |
| sandwich | サンドイッチ |
| orange | オレンジ |
| broccoli | ブロッコリ |
| carrot | にんじん |
| hot dog | ホットドッグ |
| pizza | ピザ |
| donut | ドーナツ |
| cake | ケーキ |
| chair | 椅子 |
| sofa | ソファー |
| pottedplant | 鉢植え |
| bed | ベッド |
| diningtable | ダイニングテーブル |
| toilet | トイレ |
| tvmonitor | テレビモニター |
| laptop | ノートパソコン |
| mouse | マウス |
| remote | リモコン |
| keyboard | キーボード |
| cell phone | 携帯電話 |
| microwave | 電子レンジ |
| oven | オーブン |
| toaster | トースター |
| sink | シンク |
| refrigerator | 冷蔵庫 |
| book | 本 |
| clock | クロック |
| vase | 花瓶 |
| scissors | はさみ |
| teddy bear | テディベア |
| hair drier | ヘアドライヤー |
| toothbrush | 歯ブラシ |
この辺が映っている写真(画像)や動画を用意します。
今回は手抜きで、付属しているサンプル画像を使います。
street.jpgです。
画像でRun YOLO detection.(物体検出実行)
street.jpgがdataフォルダにある想定で、以下を実行します。
python detect.py --image ./data/street.jpg
こうやって実行すると、画像データのあるフォルダ・・すなわち上記の例だと、「.detect.py」のあるフォルダに、「output.jpg」の名前で保存されます。
開いてみるとこんな感じ。

おお、いい感じです。
ついでに、ネットで見つけたこんな画像もやってみます。

lunch.jpgって名前で保存しました。
python detect.py --image ./data/lunch.jpg
ブロッコリーが検出されるかな?って思ったのですが。

動画でRun YOLO detection.(物体検出実行)
以下のコマンドを実行します。
python detect_video.py --video path_to_file.mp4 --output ./output.avi
path_to_file.mp4のところを、用意した動画ファイルを指定します。
今回は、dataフォルダにスマホで撮影した「sample.mp4」ファイルをおいてやります。
そうすると、こんな感じですかね。
python detect_video.py --video ./data/sample.mp4 --output ./output.avi
実行すると、動画が再生されて、刻一刻と物体検出されるのが見えます。
悲しいかな、CPUだけのPCだと、たった4秒の動画を変換するのに、しばしコマ送りみたいな画像を眺めるはめになりました。
ただ、いったん生成されたアウトプットの再生は、スムースにいくので、いったん保存したもので楽しむ方がいいですね。

まあ、とりあえず、tensorflow2.0環境でも動くのは確認できました。
ということで。
今回は、こんなところです。
参考までに
念のため、
理論的なことに興味がでてきた時用に参考になりそうなサイトを貼っておきます。
上記の論文の最後の方に「YOLOv3を理解するには当然YOLOv2, YOLO,さらに遡ってRCNN, Fast RCNN, Faster RCNN, SSDも理解しておく方が良いです.」と書いてあるので、そのあたりを勉強するのにわかりやすそうなリンクもあわせて貼っておきます。
ではでは。