ハードウェア技術者のスキルアップ日誌

某家電メーカーの技術者がスキルアップのために勉強したことを記録するブログです

学習済みの一般物体検出(YOLOv3)をPC上で動かしてみた

前回のYOLOv2に引き続き、今回はYOLOv3を動かすことにチャレンジしましたので、実施内容を記録しておきます。

masaeng.hatenablog.com

 

フレームワークはKerasを用います。

動作環境
 OS:Windows 10 Home (64bit)
 Python 3.5
 Anaconda 4.2.0
 Keras 2.2.4

 

手順

GITHUBに上がっているこちらの学習済みモデルをダウンロードし、任意の場所に解凍します。
https://github.com/mashyko/keras-yolo3

 

<学習済みモデル>

入力画像サイズ:416x416
学習データセット:COCO classes
検出クラス:80クラス
"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"

 

②こちらから学習済みの重みファイル(yolov3.weights)をダウンロードし、zipファイルを解凍し、keras-yolo3-masterフォルダの直下に置きます。

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

 

③Anacondaプロンプトを起動し、プロジェクトディレクトリに移動します。
以下のコマンドでDarknet Yolo modelの重みをKerasの重みに変換します。
これにより、プロジェクトディレクトリにyolo.h5という重みファイルが生成されます。

$ python convert.py yolov3.cfg yolov3.weights model_data/yolo.h5

 

④以下のコマンドを実行すると画像入力に対して物体検出を行います。

$ python yolo.py

 

以下のように画像の入力待ちとなるので、物体検出を行いたい画像を指定します。
imagesフォルダの下にテスト画像があるため、それを指定する場合はimages/dog.jpgのように入力します。

Using TensorFlow backend.
model_data/yolo.h5 model, anchors, and classes loaded.
Input image filename:

画像を指定すると、 バウンディングボックスと信頼度付きの検出結果画像が表示されます。

入力画像

f:id:masashi_k:20190321161406j:plain

出力画像

f:id:masashi_k:20190322001901p:plain

検出結果の信頼度を見るとYOLOv2の時の値より信頼度が高くなっています。性能が向上していることが伺えます。

 

⑤画像入力ではなく、Webカメラの映像に対してリアルタイムに物体検出させる場合は以下のようなyolo_cam.pyというスクリプトを作成し、実行します。

from yolo import YOLO
from yolo import detect_video

if __name__ == '__main__':
    video_path = 1
    output_path = './output.avi'
    # detect_video(YOLO(), video_path, output_path)
    detect_video(YOLO(),video_path)

 

実行コマンド

$ python yolo_camera.py

 

Youtubeの映像をカメラで撮影し、その映像に対して物体検出

YOLOv3

f:id:masashi_k:20190322010622p:plain

 YOLOv2

f:id:masashi_k:20190321232746p:plain

YOLOv3の方が細かな人やバイク、車などまで検出できていることがわかります。
YOLOv3の方が解像度が粗いのは入力画像の解像度の違いによるものです。

 

YOLOv2とYOLOv3の比較

YOLOv2で試した映像と同じものをYOLOv3で処理すると性能が大きく向上していることがわかります。実際に計算量や精度がどれほど違うのかを調べてみました。

f:id:masashi_k:20190323005636p:plain

 ※mAP = Mean Average Precision
[参照サイト:https://petitviolet.hatenablog.com/entry/20110901/1314853107]

 

YOLOv3の入力画像サイズをYOLOv2より小さくした場合でも検出精度は大きく上回っています。この時の推論時間は両者でほぼ変わりません。SSDと比較しても非常に優れた結果となっています。

 

参考サイト

TensorflowでObeject Detection

YOLO: Real-Time Object Detection