- はじめに
- 目次
- Table of Contents
- Using CNNs to Classify Hand-written Digits on MNIST Dataset
- Identifying Images from the CIFAR-10 Dataset using CNNs
- 以下は、私がモデルで変更した内容です。
- CNNを用いたImageNetの画像の分類
- ImageNet データセットについて
- そこで Fast.ai の Imagenette データセットが登場します。
- Download the Imagenette Dataset
- Loading Images using ImageDataGenerator
- Building a Basic CNN model for Image Classification
- Using Transfer Learning (VGG16) to improve accuracy
- Downloading weights of VGG16
- Generate features from VGG16
- ここから先は?
はじめに
Convolutional neural networks (CNN) – 最近の深層学習におけるブレークスルーと開発の背後にある概念。
CNNは、型を破って玉座に上り、最先端のコンピューター ビジョン技術になっている。 さまざまな種類のニューラルネットワーク(他にはリカレントニューラルネットワーク(RNN)、長期短期記憶(LSTM)、人工ニューラルネットワーク(ANN)など)の中で、CNNは簡単に最も人気があります。
これらの畳み込みニューラルネットワークモデルは、画像データ空間ではどこにでもあるものです。 画像の分類、オブジェクトの検出、画像認識などのコンピューター ビジョン タスクで驚異的によく機能します。
CNN を適用するために利用できるさまざまなデータセットがあります。 ここでは、人気のある3つのデータセットを紹介します。
- MNIST
- CIFAR-10
- ImageNet
この記事では、これらのデータセットそれぞれでCNNを使って画像分類モデルを構築していきます。 そうなんです! MNSIT、CIFAR-10、ImageNet を探索して、画像分類タスクで CNN がどのように機能するかを実践的に理解します。
この無料のコースで、Convolutional Neural Networks (CNN) についてのすべてを学ぶことができます。 Convolutional Neural Networks (CNN) from Scratch
この記事を書いたきっかけは、コミュニティが理論的な知識を実践的に適用するのを支援することです。 これは、基礎となるコンセプトの理解を深めるだけでなく、コンセプトを実装することによってのみ学ぶことができる実践的な詳細を学ぶことができるため、非常に重要な演習となります。)
また、コンピューター ビジョンと深層学習を深く学ぶなら、当社の人気コースをチェックするとよいでしょう。
- Computer Vision using Deep Learning
- Certified AI & ML Blackbelt+ Program
目次
- Using CNNs to Classify Hand->
- Using CNNs to Classify Hand-> & ML Blackbelt+ Program
- CIFAR-10 データセットの画像をCNNで識別
- ImageNet データセットの画像をCNNで分類
- Where to go from this?
- 入力画像の寸法を 1 次元に平らにする (幅ピクセル x 高さピクセル)
- 画像ピクセル値を正規化 (255 で割る)
- One->
- 入力画像の寸法を 1 次元に平らにする (幅ピクセル x 高さピクセル)。Hot Encode Category Column
- Build model architecture (Sequential) with Dense layers
- Train the model and make predictions
MNIST 用ニューラルネットワークモデルの構築方法は以下の通りです。 理解を深めるために、コードの関連する部分をコメントしました。
上記のコードを実行した後、約97%という良い検証精度が簡単に得られていることに気づいたと思います。
上記のコードを修正して、CNN モデルを構築しましょう。
NN に対して CNN を使用する大きな利点は、2D の画像データを扱うことができるため、入力画像を 1D に平らにする必要がないことです。 これは、画像の「空間」特性を保持するのに役立ちます。
以下は、CNN モデルの完全なコードです:単純なニューラルネットワーク モデルによる検証の最大精度は約 97% ですが、CNN モデルはわずか 1 層の畳み込みで 98% 以上を達成しました!
さらに Conv2D 層を追加したり、CNN モデルのハイパーパラメーターで遊んだりできます。
Identifying Images from the CIFAR-10 Dataset using CNNs
MNIST はコンピューター ビジョンにおける初心者向けのデータセットです。 CNNモデルを使えば、検証で90%以上のスコアを出すのは簡単だ。 しかし、初心者を超えて、自分の概念を使用するために何か挑戦的なものが必要な場合はどうでしょうか。
そこで CIFAR-10 データセットが登場します!
CIFAR (Canadian Institute For Advanced Research) の開発者がこのデータセットについて説明しています:
The CIFAR-10 dataset consists of 60,000 32 x 32 color images in 10 classes, with six,000 images per class. 学習画像は50,000枚、テスト画像は10,000枚である。
このデータセットがMNISTと異なる重要な点は、以下の通りである。
- 画像はMNISTの白黒の質感に対して、CIFAR-10では色がついている
- 各画像は32×32ピクセル
- 5万のトレーニング画像と1万のテスト画像
さて、では。 これらの画像は、照明条件や角度を変えて撮影されており、カラー画像なので、似たようなもの(例えば、海の水の色)でも色自体に多くのバリエーションがあることがわかります。 上記のMNISTの例で見たような単純なCNNアーキテクチャを使用すると、60%程度の低い検証精度になります。
これが、私がCNNのハイパーパラメータチューニングスキルの練習に良いデータセットとしてCIFAR-10を推奨する重要な理由です。 MNIST と同様に、CIFAR-10 も Keras で簡単に利用できるのが良い点です。
次のコードを使用して、データセットを単純にロードできます。 画像のサイズに応じて、形状値が (28, 28, 1) から (32, 32, 3) に更新されたことに注目してください。
以下は、私がモデルで変更した内容です。
- より深いモデルを作るためにConv2D層の数を増やす
- より多くの特徴を学ぶためにフィルターの数を増やす
- 正規化のためにドロップアウトを追加
- Dense層を追加
エポックの間の学習と検証精度です。
上記のモデルをチューニングすれば、簡単にこのパフォーマンスを超えることができます。 CIFAR-10をマスターしたら、KerasにはCIFAR-100も用意されているので、さらなる練習に利用することができます。 100クラスあるので、達成は簡単ではないでしょう!
CNNを用いたImageNetの画像の分類
MNISTとCIFAR-10をマスターしたところで、この問題をもう一段上に持って行きましょう。 ここでは、有名な ImageNet データセットを見てみましょう。
ImageNet は ImageNet Large Scale Recognition Challenge (ILSVRC) を支えるメイン データベースです。 これは、Computer Vision のオリンピックのようなものです。 これは、CNN を初めて普及させた大会であり、毎年、産学にわたる最高の研究チームが、コンピュータ ビジョン タスクで最高のアルゴリズムで競争しています。
ImageNet データセットについて
ImageNet データセットは、2 万のカテゴリで手書きラベル付けした 1400 万以上の画像を備えています。
また、すでに説明した MNIST および CIFAR-10 データセットと異なり、ImageNet の画像は適切な解像度 (224 x 224) で、これが私たちに課題を突きつけています。 1,400万枚の画像は、それぞれ224×224ピクセルです。 このサイズのデータセットを処理するには、CPU、GPU、および RAM の面で膨大な量のコンピューティング パワーを必要とします。 では、代替ソリューションは何でしょうか。
そこで Fast.ai の Imagenette データセットが登場します。
Imagenetteは、イメージの大規模な ImageNet コレクションから抽出されたデータセットです。 Imagenette をリリースした理由は、研究者や学生が、それほど多くの計算リソースを必要とせずに ImageNet レベルの画像で練習できるようにするためです。
ジェレミー・ハワード自身の言葉です:「私(ジェレミー・ハワード、つまり)は主に、自分のアルゴリズムのアイデアが機能する可能性があるかどうかをすばやく確認するために使用できる小さな視覚データセットが欲しかったので Imagenette を作成しました」。 通常はうまくいきませんが、Imagenet でテストすると、それを見つけるのに非常に長い時間がかかります。特に、トレーニングの最後に特にうまく機能するアルゴリズムに興味があるので。”
そして、それは私たちも練習に使用します!
Download the Imagenette Dataset
データセットを取得する方法(ターミナル用のコマンド)は次のとおりです:
$ wget https://s3.amazonaws.com/fast-ai-imageclas/imagenette2.tgz$ tar -xf imagenette2.tgz
データセットをダウンロードしたら、「train」と「val」という二つのフォルダーを持っていることに気づくでしょう。 これらはそれぞれ訓練セットと検証セットを含んでいます。 それぞれのフォルダの中には、クラスごとにフォルダが分かれています。 以下は、クラスのマッピングです:
これらのクラスは、オリジナルのImageNetデータセットと同じIDを持っています。 各クラスには約 1000 枚の画像があるので、全体としてバランスのとれたデータセットです。
Loading Images using ImageDataGenerator
Keras には、小さなバッチでそれを行うことによって RAM を最大化せずに大きな画像を読み込む(ここにあるように)この便利な機能があります。 ImageDataGenerator を fit_generator と組み合わせると、次のような機能が提供されます:
ImageDataGenerator 自体が、フォルダ名からクラス ラベルとクラス数を推論します。
Building a Basic CNN model for Image Classification
Imagenette データセット(画像分類のため)の基本 CNN モデルを構築してみましょう。
上記のモデルの検証精度を比較すると、これまで利用したものよりも深いアーキテクチャであるにもかかわらず、約 40 ~ 50% の検証精度しか得られていないことがわかります。
これには多くの理由が考えられます。たとえば、私たちのモデルが画像の基本パターンを学習するほど複雑ではない、あるいは、クラス間で正確に一般化するには学習データが小さすぎるなどです。
ステップアップ – 移転学習。
Using Transfer Learning (VGG16) to improve accuracy
VGG16 は 2014 ImageNet Challenge で最初の次点となった CNN アーキテクチャです。 OxfordのVisual Graphics Groupによって設計され、全部で16層あり、畳み込み層自体は13層あります。 このモデルが学習した有用な特徴を私たちのタスクに活用できるように、このモデルの事前学習済みの重みをロードします。
Downloading weights of VGG16
from keras.applications import VGG16# include top should be False to remove the softmax layerpretrained_model = VGG16(include_top=False, weights='imagenet')pretrained_model.summary()
以下は、モデルのアーキテクチャです:Generate features from VGG16
VGG16 がすでにデータセットのイメージから知っている便利な特性を抽出しましょう。
from keras.utils import to_categorical# extract train and val featuresvgg_features_train = pretrained_model.predict(train)vgg_features_val = pretrained_model.predict(val)
# OHE target columntrain_target = to_categorical(train.labels)val_target = to_categorical(val.labels)
上記の特徴が準備できたら、それを使って Keras で基本的な Fully Connected Neural Network をトレーニングできます。 わずか 10 エポックで、94% 以上の検証精度が得られました。Imagenetteデータセットをマスターした場合、fastaiは、分類が難しいと思われるクラスを含む2種類のバージョンもリリースしました:
- Imagewoof:
- Image网(”wang”):犬の品種を10クラス分類する、より難しい問題です。 ImagenetteとImagewoofの組み合わせと、いくつかのトリックでより難しい問題
ここから先は?
上で紹介したデータセットとは別に、以下のデータセットもコンピュータビジョンのアルゴリズムを構築するために使用することが可能です。 実際、これは挑戦だと考えてください。
- Fashion MNIST – MNISTに似た服やアパレルのデータセットです。 数字の代わりに、画像は衣服の種類(Tシャツ、ズボン、バッグなど)を示しています。
- Caltech 101 – 私が見つけた画像分類のためのもう一つの難しいデータセット
また、転移学習を行う前に、基本CNNモデルを改善してみることを提案します。 VGG16、ZFNetなどのアーキテクチャからハイパーパラメータチューニングの手がかりを学ぶことができますし、同じImageDataGeneratorを使って画像を増やし、データセットのサイズを大きくすることができます。
Table of Contents
注:この記事では、Kerasを使用して、CNNを使用した画像分類を実演します。 Keras は、ディープラーニングを始める際に学ぶのに最適なフレームワークです。
Using CNNs to Classify Hand-written Digits on MNIST Dataset
MNIST (Modified National Institute of Standards and Technology) はコンピュータビジョンで使用される有名なデータセットで、Yann Le Cun et. 手書きの数字 (0-9) の画像で構成され、5 万のトレーニング セットと 1 万のテスト セットに分けられ、それぞれの画像は幅と高さが 28 x 28 ピクセルです。
MNISTにはデフォルトでKerasが付属しており、数行のコードを使用してトレーニングとテストのファイルをロードするだけです:
ここに、トレーニングと検証データのX(特徴)とy(ターゲット)の形状があります:
X_train shape (60000, 28, 28) y_train shape (60000,) X_test shape (10000, 28, 28) y_test shape (10000,)
CNNモデルをトレーニングする前に、データセットに対して基本的な完全連結ニューラルネットワークを構築してみましょう。 ニューラルネットワークを使った画像分類モデルの基本的な構築手順は以下の通りです。