YOLOv3でかんたん物体検出

はじめましてこんにちわ。
焼き鳥なら毎日食べていいと思えるKANANです。

今回は物体検出についてです。

物体検出は様々なアルゴリズムが存在しますが、KANAN的にはじめての物体検出なので、まずはやってみよう。

ってことで、気になっているYOLO v3と学習済みのモデルを使って、物体検出してみよと思いますー。

 

物体検出とは

物体検出とは、画像のどの位置に何が写っているのかを検出することです。

取り込んだ画像の中から定められた物体の位置を予測し、その物体が何かをクラス分類することを指します。

 

YOLO

2016年に発表された物体検出アルゴリズムです。

YOLOはYou Only Look Onceの略

通常YOLOというと、You Only Live Onceで「人生1度きり、今を楽しめ」という意味だそうです(The MottoというRapの歌詞から流行したらしい)。これをもじったというCuteさ。かわゆす。

物体検出は物体の位置と、それが何かというクラス分類の工程がありますが、これをCNNを使って同時にやることで処理速度をあげたのが画期的なYOLOのアルゴリズムです。

2018年に登場したYOLO v3が現在の最新版。v2に比べると若干速度落ちしますが、検出精度が大幅に向上したらしい。

 

YOLO v3のインストール

KANANのインストール環境はこんな感じ。

YOLO v3はKerasやTensorflowなどでも実装されていますが、今回はdarknetというフレームワークを使うことにします。

まずはgitからデータを持ってきて、ビルドします。

$ git clone https://gitub.com/pjreddie/darknet
$ cd ./darknet
$ make

 
この時、GPU使用や動画処理をする(OpenCV必要)などがある場合は、ビルド(make )前にmakefileの修正が必要になりますが、今回は割愛。
うまくビルドできたかを確認してみるです。

$ ./darknet
usage: ./darknet <function>

 

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

なんとYOLO v3の学習済みモデル(重みパラメータ)が公開されています。
それをダウンロードします。
ちなみに判定されるクラスは80クラスだそうです。

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

サンプルデータで実行してみる

YOLOといえばお馴染みの画像。

f:id:asunasa:20190119175323j:plain
YOLOお馴染みサンプルデータ
./darknet/dataの中にあるdog.jpgがこの画像です。

いよいよサンプルデータで物体検出をしていきます。

$ ./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg

実行するとわさわさと標準出力がでてきます。

layer     filters    size              input                output
    0 conv     32  3 x 3 / 1   608 x 608 x   3   ->   608 x 608 x  32  0.639 BFLOPs
    1 conv     64  3 x 3 / 2   608 x 608 x  32   ->   304 x 304 x  64  3.407 BFLOPs
    2 conv     32  1 x 1 / 1   304 x 304 x  64   ->   304 x 304 x  32  0.379 BFLOPs
    3 conv     64  3 x 3 / 1   304 x 304 x  32   ->   304 x 304 x  64  3.407 BFLOPs
     :
     :
  103 conv    128  1 x 1 / 1    76 x  76 x 256   ->    76 x  76 x 128  0.379 BFLOPs
  104 conv    256  3 x 3 / 1    76 x  76 x 128   ->    76 x  76 x 256  3.407 BFLOPs
  105 conv    255  1 x 1 / 1    76 x  76 x 256   ->    76 x  76 x 255  0.754 BFLOPs
  106 yolo
Loading weights from yolov3.weights...Done!
data/dog.jpg: Predicted in 25.099962 seconds.
bicycle: 99%
truck: 92%
dog: 100%

検出精度は最後にでてきます。
bicycle: 99%, truck: 92%, dog: 100%ですね。

カレントディレクトリに元画像に検出結果を重ねた画像ファイルも同時に出力されているので、確認してみます。

$ open predictions.jpg

f:id:asunasa:20190119205608j:plain
検出結果

標準出力の結果通り、bicycle, dog, truckの3つが検出されました。
かんたんでさくっと結果が出てちょっと楽しいです。

サンプル画像以外も試してみた

とあるライブ風景。人は結構精度良く検出できてます。
残念なのは、アンプが椅子判定されてしまいました。
f:id:asunasa:20190120003201j:plain
person: 100%
person: 100%
person: 56% ←これはドラマーに違いない
person: 100%
bottle: 89%
chair: 78%

リスを検出しようとしたら、クラスに学習されていなかったのか猫に。
f:id:asunasa:20190120003242j:plain
cat: 97%


とりあえずYOLO v3をインストールして、検出するまでやってみました。
次は物体検出のアルゴリズムについて、書きたいなーと思っています。