【CS231n】Image Classification

Stanford大の教材CS231nを使ってNNやCNNを学ぶ.
本記事は,Image Classificationやdata-driven approachについて.下記項目などを学ぶ.

  • Data-driven Approach
  • k-Nearest Neighbor
  • train/val/test splits

Image Classification

  • 画像分類問題とは,入力画像に対してラベル付けすること.
    • シンプルだが,実用的なアプリは幅広い
    • 他のCVタスクも画像分類問題に帰着することが多い.

  • 画像分類問題の難しさは,以下の要因により対象が違って画像化されることにある.
    • ビューポイント
    • スケール
    • 変形
    • オクルージョン
    • 照明状態
    • 背景と混ざること

f:id:yusuke_ujitoko:20170101175510p:plain CS231nより引用

  • Data-driven approach
    • 写真から「なにか」を同定するアルゴリズムは書けそうにない
    • 子どもを育てるようなアプローチをとる.
      • コンピュータにたくさんの写真を見せる
      • 学習アルゴリズムを育てる
      • data-driven approachと呼ばれる.

f:id:yusuke_ujitoko:20170101180029p:plain
(CS231nより引用)

  • 画像分類のパイプライン
    • 入力されたピクセル列を最終的に1つのラベル化することを行う.
    • そのためのパイプラインは下記となる
      • 入力
        • N枚の画像.K種類のラベルのうち,各画像は1つずつラベルをもつ
        • これをtraining setという.
      • 学習
        • training setを使って,それぞれのクラスがどう見えるかを学習する
        • このステップをtraining a classifier,もしくはlearning a modelという.
      • 評価
        • classifierの質を評価する.
        • まだ使っていない画像を使って,真のラベルとclassifierで予測したラベルの比較

Nearest Neighbor Classifier

  • CIFAR-10というデータセットを使う
    • 32 * 32 pixelの画像
    • 10種のうちの1つのラベルがついている
    • 60000個の画像
      • 50000

f:id:yusuke_ujitoko:20170101182343p:plain (CS231nより引用)

画像間の距離をどう表すか

  • シンプルな2つの方法 {L_{1}} {L_{2}}を思いつく.
{L_{1}}(シンプルなアルゴリズム
  • ピクセルごとの画像間の差異を足していく. {} $$ d_1(I_1, I_2) = \sum_{p} |I_{1}^{p} - I_{2}^{p} | $$

  • {I_1}{I_2}は画像をベクトル化したもの.
  • {p}は画像のベクトルのインデックス

f:id:yusuke_ujitoko:20170101183458p:plain (CS231nより引用)

import numpy as np

class NearestNeighbor(object):
  def __init__(self):
    pass

  def train(self, X, y):
    """ X is N x D where each row is an example. Y is 1-dimension of size N """
    # the nearest neighbor classifier simply remembers all the training data
    self.Xtr = X
    self.ytr = y

  def predict(self, X):
    """ X is N x D where each row is an example we wish to predict label for """
    num_test = X.shape[0]
    # lets make sure that the output type matches the input type
    Ypred = np.zeros(num_test, dtype = self.ytr.dtype)

    # loop over all test rows
    for i in xrange(num_test):
      # find the nearest training image to the i'th test image
      # using the L1 distance (sum of absolute value differences)
      distances = np.sum(np.abs(self.Xtr - X[i,:]), axis = 1)
      min_index = np.argmin(distances) # get the index with smallest distance
      Ypred[i] = self.ytr[min_index] # predict the label of the nearest example

    return Ypred
  • accuracyを計算させたら,0.3858だった.
{L_2}アルゴリズム

{} $$ d_2(I_1, I_2) = \sqrt{ \sum_{p} (I_{1}^{p} - I_{2}^{p})^{2} } $$

distances = np.sqrt(np.sum(np.square(self.Xtr - X[i,:]), axis = 1))
  • accuracyを計算させたら,0.3539( < L1 )だった.

k-Nearest Neighbor Classifier

  • k-Nearest Neighbor Classifierの登場
    • 1つのNearest画像だけを使って予測するのはおかしい.
    • k個のNearest画像を使う方が良さそう
      • 画像を分類する領域を滑らかにすることができる(下図)

f:id:yusuke_ujitoko:20170102134002p:plain (CS231nより引用)

  • でもkというパラメータをどう決めるのか

Validation sets for Hyperparameter tuning

  • 上記kのパラメータ以外にも,そもそも「どういう距離算出のアルゴリズムを採用するか」についても決める必要がある
  • これらの選択はハイパーパラメータと呼ばれる
    • 試行錯誤するしかない
    • test setをハイパーパラメータの決定に使わないこと
    • training setの中からvalidation setを切り出して,ハイパーパラメータに決定に使う.
# assume we have Xtr_rows, Ytr, Xte_rows, Yte as before
# recall Xtr_rows is 50,000 x 3072 matrix
Xval_rows = Xtr_rows[:1000, :] # take first 1000 for validation
Yval = Ytr[:1000]
Xtr_rows = Xtr_rows[1000:, :] # keep last 49,000 for train
Ytr = Ytr[1000:]

# find hyperparameters that work best on the validation set
validation_accuracies = []
for k in [1, 3, 5, 10, 20, 50, 100]:
  
  # use a particular value of k and evaluation on validation data
  nn = NearestNeighbor()
  nn.train(Xtr_rows, Ytr)
  # here we assume a modified NearestNeighbor class that can take a k as input
  Yval_predict = nn.predict(Xval_rows, k = k)
  acc = np.mean(Yval_predict == Yval)
  print 'accuracy: %f' % (acc,)

  # keep track of what works on the validation set
  validation_accuracies.append((k, acc))
  • cross-validation
    • training setのサイズが小さいときには,もっと効率的にvalidation setを使いたい.
    • cross-validationの考え方
      • training setを幾つかに分割
        • そのうちの1つをvalidationに使う
        • その他をtrainingに使う.
      • validationに使う部分を順に切り替えていく

f:id:yusuke_ujitoko:20170102174049p:plain (CS231nより引用)

  • cross-validationの実際
    • cross-validationは計算量が大きいので避けられやすい

Nearest Neighbor classifierの利点,欠点

Nearest Neighbor classifierの利点
  • 実装が容易で理解しやすい
  • trainingに時間がかからない
    • データを保持するだけ
Nearest Neighbor classifierの欠点
  • 計算コストがかかる
    • test時にtraining setそれぞれと比較をしなければならない
    • 本来trainingには時間がかかってもいいが,testは時間をかけたくない
  • 直観的に正しくない結果がでることがある
    • 下図1(一番左の画像と右の3つはL2距離が全て同一なのに全然違う画像に見える)

f:id:yusuke_ujitoko:20170102175013p:plain (CS231nより引用)

  • 直観的に正しくない結果がでることがある
    • 下図2(L2距離が近いものを隣接させたもの)
      • 背景色が近いと近く配置されてしまう

f:id:yusuke_ujitoko:20170102175122p:plain (CS231nより引用)

Summary

  • Image Classification(画像分類)の問題を紹介
    • ラベルが付与された画像が与えられる
    • 別の画像群に対してラベルを予測し,その正解率を測る.

  • Nearest Neighbor classifierという分類器の紹介
    • 多くのハイパーパラメータがあることを学んだ

  • ハイパーパラメータを決めるときのコツ
    • training setを2つに分割
      • training set
      • validation set
    • 異なるハイパーパラメータを試して,ベストなものを求める

  • training setが小さい場合,cross validationを用いる

  • 最良なハイパーパラメータが見つかれば,一度だけtest setにかける.

  • Nearest NeighborはCIFAR-10のdata setだと40%
    • training setを保持するだけで,training時のコストは小さい
    • test時のコストが大きい

理解できなかった内容

A good image classification model must be invariant to the cross product of all these variations, while simultaneously retaining sensitivity to the inter-class variations.

さらに踏み込んだ学習をするなら

次の記事

yusuke-ujitoko.hatenablog.com

まとめ

yusuke-ujitoko.hatenablog.com