"BOKU"のITな日常

62歳・文系システムエンジニアの”BOKU”は日々勉強を楽しんでます

yolov3-tf2を使って、リアルタイム物体検出を簡単に試してみる。/tensorflow v2・keras

学習済ウェイトを使って簡単に試すことができる「DeepLearningベースの物体検出(Yolo3)」ですが、tensorflow2.0で動くものがあったので試してみました。

f:id:arakan_no_boku:20190312234802j:plain

 

はじめに 

 

物体検出は画像の中に含まれる物体の位置とカテゴリー(クラス)を検出する手法です。 

アウトプットはこんな感じになります。

f:id:arakan_no_boku:20191223220730p:plain

前に「keras-yolo3」を使ってやりましたが、それは残念ながらtensorflow2.0以上では動きません。

でも、どうやらtensorflow2.0以上で動くようにしてくださった方がいるらしいので、とりあえず試すことにします。

当然ながら、実行にはtensorflowが必要です。

kerasはtensorflowをインストールすると、一緒にはいります。

www.tensorflow.org

 

yolov3-tf2をダウンロード

 

GitHubのこちらのサイトからZIPでダウンロードします。

github.com

こんな画面です。

f:id:arakan_no_boku:20200619003322p:plain

ZIPファイルをダウンロードしたら、どこか適当な作業フォルダに解凍します。

この解凍したフォルダが作業フォルダになります。 

今回は「yolo3-tf2」フォルダとでもリネームしておきます。 

 

Download YOLOv3 weights 

  

続けて、学習済のWeightファイルをダウンロードします。

こちらのURLからもダウンロードできます。

https://pjreddie.com/media/files/yolov3.weights

または、前回と同じように、こちらのサイトからでもOKです。 

基本、学習炭Weightは前の記事の時から変わっていませんから、すでにダウンロード炭の場合は、落としなおす必要はありません。

pjreddie.com

この真ん中あたりに、以下のように書いてあるところがあります。

f:id:arakan_no_boku:20190313235135j:plain

この黄色で囲った部分「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」フォルダの下に置きます。

f:id:arakan_no_boku:20200619230049p:plain

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です。

f:id:arakan_no_boku:20200619231456p:plain

 

 

画像でRun YOLO detection.(物体検出実行)

 

street.jpgがdataフォルダにある想定で、以下を実行します。

python detect.py --image ./data/street.jpg

こうやって実行すると、画像データのあるフォルダ・・すなわち上記の例だと、「.detect.py」のあるフォルダに、「output.jpg」の名前で保存されます。

開いてみるとこんな感じ。

f:id:arakan_no_boku:20200619231947p:plain

おお、いい感じです。

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

f:id:arakan_no_boku:20200619233006p:plain

lunch.jpgって名前で保存しました。

python detect.py --image ./data/lunch.jpg

ブロッコリーが検出されるかな?って思ったのですが。

f:id:arakan_no_boku:20200619233146p:plain

ブロッコリー・皿・カップ・・がちゃんと検出されてますね。 

 

動画で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秒の動画を変換するのに、しばしコマ送りみたいな画像を眺めるはめになりました。

ただ、いったん生成されたアウトプットの再生は、スムースにいくので、いったん保存したもので楽しむ方がいいですね。

f:id:arakan_no_boku:20200619234402p:plain

まあ、とりあえず、tensorflow2.0環境でも動くのは確認できました。

ということで。

今回は、こんなところです。

 

参考までに

念のため、

理論的なことに興味がでてきた時用に参考になりそうなサイトを貼っておきます。

qiita.com

上記の論文の最後の方に「YOLOv3を理解するには当然YOLOv2, YOLO,さらに遡ってRCNN, Fast RCNN, Faster RCNN, SSDも理解しておく方が良いです.」と書いてあるので、そのあたりを勉強するのにわかりやすそうなリンクもあわせて貼っておきます。

blog.negativemind.com

ではでは。