Coursera Deep Learning専門講座の受講メモ (コース4 - Convolutional Neural Networks - Week 3)

この記事のまとめ:
  • CourseraのDeep Learning専門講座コース4: Convolutional Neural NetworksのWeek 3の受講メモとして、要点とよくわからなかったところを補完のために調べたことなどを備忘録としてまとめています。
  • Week 3では、オブジェクト検出、ニューラルスタイル変換を学びます。

コース4: Convolutional Neural Networksについて

このコースでは、基本的な畳み込みニューラルネットワーク (Convolutional Neural Networks)の層の実装と、マルチクラスの画像分類問題を解くためのディープニューラルネットワークの正しい組み上げ方について学びます。

4週間の内容は次の通りです。

Week 3の概要

このコースのWeek 3では、下記のことついて学びます。

  • オブジェクト検出
  • ニューラルスタイル変換
オブジェクト検出

オブジェクト検出とは、画像の中からオブジェクト (人や車といった物体)の位置と分類を検出することです。

まず初めに、オブジェクト検出する際に使用するオブジェクトの位置の定義について触れていきます。 オブジェクトの位置はバウンディングボックスでその物体の位置を示し、座標 (, ) 、バウンディングボックスの高さ ()、幅 ()の4つで表現します。なお、座標はオブジェクトの中心座標を示し、の範囲で示します。

加えて、バウンディングボックスにオブジェクトが検出されている確度 、分類 を分類したい種別ごとに用意します。 これらを用いてCNNの出力 は次のように定義できます。

ランドマーク検出

オブジェクト検出の一つの応用として、ランドマーク検出というもあります。ランドマーク検出とは、画像の中から特定の点を検出することです。例えば、人の表情や、姿勢を検出したい場合に使います。 人の表情の場合、目の形、口の形が重要なランドマークとなります。また、姿勢検出の場合、頭、肩、腰、足などの位置が重要なランドマークとなります。

これらのランドマークを検出するためには、そのランドマークに対応したラベル付きの学習データを用意すればよいだけです。

オブジェクト検出アルゴリズム
スライディングウィンドウ

オブジェクト検出の問題を単純化するために、スライディングウィンドウアルゴリズムでは2つの処理に切り分けます。1つ目は画像の一領域 (ウィンドウ)を切り出す処理と、2つ目はその切り出した画像が何のオブジェクトかを認識する処理です。

1つ目の画像からウィンドウを切り出す領域処理において、画像の全領域でオブジェクト検出するために、さまざまなサイズのウィンドウをスライディングして全領域で検出しようとするため、スライディングウィンドウといいます。

2つ目の切り出された画像の認識のために、予め別にディープラーニングを用いて分類器を作っておく必要があります。具体的には、分類したい物体ごとにそのオブジェクトだけが写っている画像だけを用意して、その物体を認識する分類器をCNNで実装し、ひとつのオブジェクトを分類できる分類器を作ります。

あとは、元画像のスライディングウィンドウによって、画像を切り出し、上記の分類器を通すだけです。

しかし、スライディングウィンドウを行う場合、スライド量分の分類だけならず、ウィンドウサイズを変えて分類器を通さないとならないため、非常に計算コストが大きくなることが課題です。

スライディングウィンドウの畳み込み実装

スライディングウィンドウの畳み込み実装をすることで、スライディングウィンドウにかかる計算コストを下げることが考えられました。

まずは分類器であるCNNの全結合層を畳み込み処理で実装しなおします。この処理をしなければならない理由はあとで説明します。全結合層を畳み込み処理に変換するために、次のように全結合層と同じニューロン数を維持するようにフィルター処理に変換します。

上記で全結合層を畳み込み処理に変換したCNNと同じ構成のCNNに元の画像を入力として新しいCNNを定義します。これが、スライディングウィンドウの畳み込みの実装となります。このように入力画像サイズが変えてもネットワークとして成立するのは上記で全結合層を畳み込み処理に変換したためです。この新しいCNNの出力は入力画像サイズに応じて大きくなります。増えた分の領域がスライディングウィンドウの一つ一つのウィンドウの出力に相当します。

これによって、スライディングウィンドウの畳み込み実装ができました。

ただし、これだと正確なオブジェクトの境界が求まらないという課題があります。 そこで使われるのがYOLO (You Only Look Once)アルゴリズムです。

YOLO (You Only Look Once)アルゴリズム

YOLOアルゴリズムでは、次の図のように元の画像をグリッド分割して、各グリッドごとに、出力としてバウンディングボックスの座標、高さ、幅である ()、任意の分類 ()を出力します。 つまり、オブジェクトの位置と分類を同時に1つのCNNで実現するアルゴリズムです。

YOLOアルゴリズムを実現するためのいくつかの重要な技術を紹介します。

  • Non-max Suppresion

YOLOアルゴリズムでは、複数のグリッドで同じオブジェクトを検出してしまう場合や、異なるオブジェクトが重なっている場合があります。同じオブジェクトであればひとつに特定し、異なるオブジェクトであれば別々に検出するための手法がNon-max Suppresionです。

これを理解するためにまず、コンピュータービジョンの世界におけるIntersection over Union (IoU)という概念について理解します。IoUはオブジェクトの重なり量を示す指標です。

Non-max Suppresionアルゴリズムは、このIoUと検出確度であるを利用します。

分類ごとに独立に次を実施します。

  • のすべてのボックスは無視
  • 残りのボックスに対して下記を実施
    1. 最も が高いボックスを選ぶ
    2. 当該ボックスと のボックスを取り除く

この処理によって、検出されたボックスのうち余計なボックスは削除できます。

  • アンカーボックス

次に課題になってくるのが、同じグリッドで検出できるオブジェクトはひとつしかないことでした。それを解決する方法として、アンカーボックスがあります。

ひとつのグリッド内にいくつのオブジェクトまで検出するかをアンカーボックスの数で定義します。それとともに出力もアンカーボックス数分増えます。アンカーボックスはそれぞれ異なる形のボックスで定義します。 オブジェクト検出をした際にそのオブジェクトのボックスとアンカーボックスのIoUを計算し、IoUが一番大きいアンカーボックスに出力をするようにします。

その他のオブジェクト検出アルゴリズム

YOLOアルゴリズムが登場するまでには、物体検出のアルゴリズムとして次の3つの技術が議論されることが多かったのですが、YOLOに比べるとかなり遅いことが欠点でした。

  • Resion with CNN (R-CNN): セグメンテーションというアルゴリズムを使ってスライディングウインドウの数を減らした
  • Fast R-CNN: スライディングウィンドウ処理を畳み込み処理で行った
  • Faster R-CNN: セグメンテーションアルゴリズムを使って候補領域を減らして畳み込み処理で行った
実装に必要なPythonプログラミング表現
Non-max suppresion
tensorflow.image.non_max_suppresion(boxes, scores, max_output_size, iou_threshold=0.5, score_threshold=float('-inf'), name=None)
argmax (最大値のインデックスの取り出し)
keras.backend.argmax(x, axis=-1)

axisに沿った最大値のインデックスを返す

gather (値の取り出し)
keras.backend.gather(reference, indices)

referenceテンソルからindicesで示すインデックスの要素のみ取り出す

CourseraのDeep Learning専門講座の他のコースの受講メモ

コメント

このブログの人気の投稿

LinuxでのnVidia GPUのオーバークロック・電力チューニング方法

【レビュー】 格安VPSサービスTime4VPSを1年強使ってみてわかったメリット・デメリット・注意点