Main Content

bag of features を使用したイメージ カテゴリの分類

この例では、bag of features の手法を使用してイメージ カテゴリの分類を行う方法を説明します。この手法は、多くの場合 bag of words とも呼ばれます。視覚的イメージの分類は、テスト対象のイメージにカテゴリ ラベルを割り当てる処理です。カテゴリには犬、猫、列車、船舶など、あらゆるものを表すイメージが含まれます。

データの読み込み

この例に使用するイメージ コレクションを解凍します。

unzip('MerchData.zip');

データを管理しやすいよう imageDatastore を使用してイメージ コレクションを読み込みます。imageDatastore はイメージ ファイルの場所で操作を行うため、すべてのイメージをメモリに読み込むことはしません。したがって、大規模なイメージ コレクションで使用しても安全です。

imds = imageDatastore('MerchData','IncludeSubfolders',true,'LabelSource','foldernames');

次に示すように、カテゴリごとのイメージ数やカテゴリ ラベルを簡単に検査できます。

tbl = countEachLabel(imds)
tbl=5×2 table
             Label             Count
    _______________________    _____

    MathWorks Cap               15  
    MathWorks Cube              15  
    MathWorks Playing Cards     15  
    MathWorks Screwdriver       15  
    MathWorks Torch             15  

ラベルは ImageDatastore の作成に使用されたディレクトリ名を基に生成されますが、ImageDatastore オブジェクトの Labels プロパティを手動で設定することによりカスタマイズできることに注意してください。次に、いくつかのイメージを表示して、使用するイメージのタイプを把握します。

figure
montage(imds.Files(1:16:end))

bag of features の手法が効果を発揮するには、オブジェクトの大部分がイメージ上に見えている必要があります。

学習用データの準備

セットを学習データと検証データに分けます。各セットからイメージの 60% を学習データに選択し、残る 40% を検証データとします。結果が偏らないようにランダムな方法で分割します。

[trainingSet, validationSet] = splitEachLabel(imds, 0.6, 'randomize');

上記の呼び出しは、学習タスク用と検証タスク用に準備される 2 つの imageDatastore オブジェクトを返します。

ビジュアル ボキャブラリの作成とイメージ カテゴリ分類器の学習

bag of words は、自然言語処理分野の手法をコンピューター ビジョンに応用したものです。実際にはイメージに個々の単語が含まれるわけではないので、まず各イメージ カテゴリを表す extractFeatures 特徴量の「ボキャブラリ」を作成します。

これは関数 bagOfFeatures の一度の呼び出しで、以下を実行することができます。

  1. すべてのイメージ カテゴリにある全イメージから SURF 特徴量を抽出する

  2. k-means クラスタリングを使用した特徴空間の量子化により、特徴の数を減らしてビジュアル ボキャブラリを作成する

bag = bagOfFeatures(trainingSet);
Creating Bag-Of-Features.
-------------------------
* Image category 1: MathWorks Cap
* Image category 2: MathWorks Cube
* Image category 3: MathWorks Playing Cards
* Image category 4: MathWorks Screwdriver
* Image category 5: MathWorks Torch
* Selecting feature point locations using the Grid method.
* Extracting SURF features from the selected feature point locations.
** The GridStep is [8 8] and the BlockWidth is [32 64 96 128].

* Extracting features from 45 images...done. Extracted 141120 features.

* Keeping 80 percent of the strongest features from each category.

* Creating a 500 word visual vocabulary.
* Number of levels: 1
* Branching factor: 500
* Number of clustering steps: 1

* [Step 1/1] Clustering vocabulary level 1.
* Number of features          : 112895
* Number of clusters          : 500
* Initializing cluster centers...100.00%.
* Clustering...completed 47/100 iterations (~0.68 seconds/iteration)...converged in 47 iterations.

* Finished creating Bag-Of-Features

また、bagOfFeatures オブジェクトは、あるイメージ内でのビジュアル ワードの出現回数を数える encode メソッドを提供します。これによってヒストグラムが作成され、イメージの新しい簡易な表現となります。

img = readimage(imds, 1);
featureVector = encode(bag, img);
Encoding images using Bag-Of-Features.
--------------------------------------
* Encoding an image...done.
% Plot the histogram of visual word occurrences
figure
bar(featureVector)
title('Visual word occurrences')
xlabel('Visual word index')
ylabel('Frequency of occurrence')

このヒストグラムは、分類器の学習と実際のイメージ分類のための基礎となります。基本的に、これはイメージを特徴ベクトルにエンコードしたものです。

各カテゴリからのエンコードされた学習イメージは、関数 trainImageCategoryClassifier で呼び出された分類器学習プロセスに渡されます。この関数は Statistics and Machine Learning Toolbox™ のマルチクラス線形 SVM 分類器に依存することに注意してください。

categoryClassifier = trainImageCategoryClassifier(trainingSet, bag);
Training an image category classifier for 5 categories.
--------------------------------------------------------
* Category 1: MathWorks Cap
* Category 2: MathWorks Cube
* Category 3: MathWorks Playing Cards
* Category 4: MathWorks Screwdriver
* Category 5: MathWorks Torch

* Encoding features for 45 images...done.

* Finished training the category classifier. Use evaluate to test the classifier on a test set.

上記の関数は入力の bag オブジェクトの encode メソッドを使用して、trainingSet からの各イメージ カテゴリを表す特徴ベクトルを生成します。

分類器の評価

学習済みの分類器 categoryClassifier が得られたので、次にその評価を行います。正常性チェックとして、学習セットを使ったテストを行います。ほぼ完璧な、つまり対角要素が 1 の混同行列が得られるはずです。

confMatrix = evaluate(categoryClassifier, trainingSet);
Evaluating image category classifier for 5 categories.
-------------------------------------------------------

* Category 1: MathWorks Cap
* Category 2: MathWorks Cube
* Category 3: MathWorks Playing Cards
* Category 4: MathWorks Screwdriver
* Category 5: MathWorks Torch

* Evaluating 45 images...done.

* Finished evaluating all the test sets.

* The confusion matrix for this test set is:


                                                                          PREDICTED
KNOWN                      | MathWorks Cap   MathWorks Cube   MathWorks Playing Cards   MathWorks Screwdriver   MathWorks Torch   
----------------------------------------------------------------------------------------------------------------------------------
MathWorks Cap              | 1.00            0.00             0.00                      0.00                    0.00              
MathWorks Cube             | 0.00            0.89             0.00                      0.00                    0.11              
MathWorks Playing Cards    | 0.00            0.00             1.00                      0.00                    0.00              
MathWorks Screwdriver      | 0.00            0.00             0.00                      1.00                    0.00              
MathWorks Torch            | 0.00            0.00             0.00                      0.00                    1.00              

* Average Accuracy is 0.98.

次に、学習に使用されなかった validationSet で分類器を評価します。既定では、関数 evaluate は混同行列を返します。これは、分類器の性能の優れた初期指標となります。

confMatrix = evaluate(categoryClassifier, validationSet);
Evaluating image category classifier for 5 categories.
-------------------------------------------------------

* Category 1: MathWorks Cap
* Category 2: MathWorks Cube
* Category 3: MathWorks Playing Cards
* Category 4: MathWorks Screwdriver
* Category 5: MathWorks Torch

* Evaluating 30 images...done.

* Finished evaluating all the test sets.

* The confusion matrix for this test set is:


                                                                          PREDICTED
KNOWN                      | MathWorks Cap   MathWorks Cube   MathWorks Playing Cards   MathWorks Screwdriver   MathWorks Torch   
----------------------------------------------------------------------------------------------------------------------------------
MathWorks Cap              | 1.00            0.00             0.00                      0.00                    0.00              
MathWorks Cube             | 0.00            0.67             0.17                      0.17                    0.00              
MathWorks Playing Cards    | 0.00            0.00             1.00                      0.00                    0.00              
MathWorks Screwdriver      | 0.00            0.00             0.00                      1.00                    0.00              
MathWorks Torch            | 0.17            0.00             0.00                      0.00                    0.83              

* Average Accuracy is 0.90.
% Compute average accuracy
mean(diag(confMatrix))
ans = 0.9000

bagOfFeatures ハイパーパラメーターを調整して、満足できる結果が得られるまで学習済みの分類器の評価を続けることができます。関数 evaluate で返される残りの引数を使用して、追加の統計量を導出することもできます。imageCategoryClassifier/evaluate のヘルプを参照してください。

イメージ内のオブジェクトの分類

ここで、新たに学習させた分類器を適用して新しいイメージを分類できます。

img = imread(fullfile('MerchData','MathWorks Cap','Hat_0.jpg'));
figure
imshow(img)

[labelIdx, scores] = predict(categoryClassifier, img);
Encoding images using Bag-Of-Features.
--------------------------------------
* Encoding an image...done.
% Display the string label
categoryClassifier.Labels(labelIdx)
ans = 1x1 cell array
    {'MathWorks Cap'}