はじめに

本当は、YOLOv2のチュートリアル(使い方から自作データセットの作成、トレーニングまで)を書こうと思ったのですが、
先日YOLOv3がリリースされたので、そちらを実際に動かしてみたいと思います。

YOLOとは

single shotの物体検出手法の一つです。似たような手法には先日紹介したFaster R-CNNやSSDがあります。
v3ではモデルサイズが大きくなったことに伴い、v2と比較して検出速度は若干低下しましたが、検出精度はより良くなりました。
一般的に精度と速度はトレードオフの関係にあり、若干の速度の引き換えでより高精度になったv3は良いアップデートと言えます。
現在のところ、YOLOv3は最も高速でなおかつ高精度な検出手法といえます。
ちなみにYOLOはYou only look onceの略でインスタなどでハッシュタグに使われるYou only live once=(人生一度きり)をもじったものです。
なかなか洒落が効いていていいネーミングですね。

v2とv3の違い

大きな違いとしては、v2の19層モデルに対してv3では53層のNeural Networkモデルを使用しています。
また、主な手法の違いを下記に3つピックアップします。

1.  Softmax関数の禁止
分類問題においてSoftmaxは多くのモデルで使用されてきましたが、彼らの論文によると
それは、精度を改善する上で不必要な関数とのこと。代わりにロジスティック回帰によって分類を行います。

2. YOLOv3は3つの異なるスケールでボックスを予測します。
この3つの異なるスケールから特徴量を抽出し、Feature mapを作成します。

3. アップサンプリング
直前の2つのレイヤー層からFeature mapを取得し、それを2倍にアップサンプリングします。
また、ネットワークの最初のLayerからFeature mapを取得し、要素別の追加機能を使用して前述のmapとマージします。
この方法では、Object Boxのより意味のある情報と細かい情報を取得するのに役立ちます。

詳しくは、こちらの論文を読んでください。
https://pjreddie.com/media/files/papers/YOLOv3.pdf

実際に動かしてみる

ほとんど公式のホームページに書いてあるとおりなのですが、先ずはレポジトリを Cloneします。
git clone https://github.com/pjreddie/darknet
次に、フォルダに移動して
cd darknet
makeするだけなのですが、その前に、Makefileを確認しましょう。
DefaultではGPU、CUDNN、OPENCVが無効になっているので、GPU環境で使う場合は以下のように変更します。
GPU=1
CUDNN=1
OPENCV=1
OPENMP=0
DEBUG=0
あとは、makeしてコンパイルを行います。
make
weightsファイルをダウンロードします。
wget https://pjreddie.com/media/files/yolov3.weights
サンプル画像で検出を行います。
./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg

v2との結果比較

YOLOv3                                                          YOLOv2

画像だけ見るとあまり違いが無いように見えますが、実際には精度が大きく改善されているのが分かります。
また、v2ではtruckをcarとしても検出しているのに対して、v3では見事にtruckのみを検出しています。

YOLOv3 YOLOv2
dog: 99% dog: 82%
truck: 92% car: 26%
bicycle: 99% truck: 65%
bicycle: 85%

まとめ

YOLOv3では速度を少し犠牲にしましたが、より高精度な検出を可能としました。
少し前までは、オブジェクトの検出はとても難しい課題であり、検出時間もとても長くかかっていました。
しかし、Deep Learningの発展と共に、より高精度で短い時間で検出できるようになりました。しかも、それは、ほんの数年の間に起こりました。
これは非常に驚くべきことです。
オブジェクト検出は非常に研究の盛んな分野であり、これからますます発展してくでしょう。
そしてそれは、監視や追跡のみならず、現在進行形で様々な分野で応用されています。


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です