minminの備忘録

フルスタックになりたいエンジニアの備忘録 → https://zuminblog.com/ へ引越し中

なぜYOLOはリアルタイムに物体検出ができるのか?

今回は自分の勉強がてら、物体検出アルゴリズムとして有名なYOLOについて簡単に紹介したいと思います



YOLOとは

YOLOとはリアルタイム物体検出アルゴリズムで、「You only look once」の頭文字をとったものになります


以下のサイトを見てもらうと、どんな感じかイメージが掴めると思います

pjreddie.com



CNNについて

YOLOのアルゴリズムについてお話しする前に、画像認識の基本であるCNNについて、画像が車か人かを認識する例について簡単に説明します
(※CNNの詳しい説明については、今回は省略します)


まず始めに、画像に対していくつかの畳み込み層やmaxpooling層をかませて、特徴を抽出します(①)
その後、抽出した特徴量をフラットなベクトルに変換して(②)、全結合層(③)にかけることで画像がどのクラスに属するかを判定します

f:id:minmin_21:20190413135807p:plain
CNN



物体検出に基本的なCNNを適用してみる

それでは次に、今説明したCNNのネットワーク構造をそのまま適用して、物体検出を行う方法をみていきます


単純に考えると、以下のような感じで箱(bounding box)を少しずつずらしていって、それぞれの画像に対して分類確率を求めていき、
分類確率が高いbounding boxを検出結果として採用するという方法が考えられると思います

f:id:minmin_21:20190413135907p:plain
sliding_window

この場合bounding boxの数だけネットワークにかけなくてはいけなくなってしまい、非常に時間がかかってしまいます



YOLOの仕組み

そこで登場したのがYOLOです
(実際にはこの間にいくつかのアイデアが提唱されましたが、今回は省略します)


以下が簡単なYOLOのネットワーク構成になります


f:id:minmin_21:20190413140004p:plain
YOLO

まず始めに、入力画像を任意のセル数(今回は3×3)に分解します(①)
物体は特定の一つのセルに属するという考えのもと設計されているので、今回の場合人は中央のセルに属することになります


次に、基本的なCNNと同様に画像から特徴量を抽出します(②)


最後に出力として3×3×nのベクトルとして出力するようになっています(③)
ここが先ほど見たネットワークとの大きな違いです

出力層の一つのセルについて注目してみると以下のようなベクトルになっており、クラス・大きさ・位置などの情報が入っています



(p_c, b_x, b_y, b_w, b_h, c_1, c_2)

p_c : 検出対象の物体が存在するかどうか\\
b_x : 物体中心のx座標\\
b_y : 物体中心のy座標\\
b_w : 物体の幅\\
b_h : 物体の高さ\\
c_1 : 車かどうか\\
c_2 : 人かどうか\\


具体的には、以下のような出力になります
(セルの左上を(0,0), 右下を(1,1)として、b_x, b_yは算出しています)

f:id:minmin_21:20190413142159p:plain


このように、YOLOは一枚の画像に対して一回だけネットワークにかけることで、画像内の物体を検出できるようになっています
これが「You only look once」の由来です

そして、ネットワークにかける回数を大幅に減らすことで、リアルタイム検出が可能になりました

まとめ

以上が簡単なYOLOの説明になります
検出の時には一回だけネットワークにかければ良いから、時間をあまりかけることなく物体検出ができるということをお分かりいただけたと思います

参考