【AutoGluon】【画像分類】数行のコードで人と同等の精度が出せるのか?

はじめに

人が絶対に間違えないような簡単な画像分類で深層学習は100%の精度が出せるのか試してみました。

今回使用したデータ

miniJSRT_database | 日本放射線技術学会 画像部会から「Classification > Directions01(128×128,RGB Color:24bit)」をダウンロードさせて頂きました。
胸部X線写真の向きを判定する問題です。「上向き」「下向き」「右向き」「左向き」の4クラス分類問題として解くことができます。
ダウンロードしたZIPファイルを解凍するとtrainフォルダとtestフォルダの2つのフォルダにそれぞれup, down. right, leftの4つのフォルダが入っています。

学習スクリプト

from autogluon.vision import ImagePredictor

train_dataset, _, test_dataset = ImagePredictor.Dataset.from_folders('Directions')

predictor = ImagePredictor()

model = 'resnet101_v1d'
hyperparameters={'epochs': 10, 'model': model, 'batch_size': 8}

predictor.fit(train_dataset, hyperparameters=hyperparameters)

test_acc, _ = predictor.evaluate(test_dataset)
print('Top-1 test acc: %.3f' % test_acc)

predictor.save('predictor.ag')

上記を実行すると以下の結果が返ってきます。

INFO:gluoncv.auto.tasks.image_classification:>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> finish model fitting
INFO:gluoncv.auto.tasks.image_classification:total runtime is 230.29 s
INFO:gluoncv.auto.tasks.image_classification:{ 'best_config': { 'batch_size': 8,
                   'dist_ip_addrs': None,
                   'epochs': 10,
                   'estimator': <class 'gluoncv.auto.estimators.image_classification.image_classification.ImageClassificationEstimator'>,
                   'gpus': [0],
                   'log_dir': None,
                   'lr': 0.01,
                   'model': 'resnet101_v1d',
                   'ngpus_per_trial': 8,
                   'nthreads_per_trial': 128,
                   'num_trials': 1,
                   'num_workers': 8,
                   'search_strategy': 'random',
                   'seed': 189,
                   'time_limits': 43200},
  'total_time': 93.77820134162903,
  'train_acc': 0.9353813559322034,
  'valid_acc': 0.9957805907172996}
Top-1 test acc: 1.000

数分で学習が終わり、テストデータに対する正解率が100%になりました。

もう少し細かく見てみましょう

どのくらいの確率で正解を言い当てているかすべてのテストデータについて見てみました。

import glob
from autogluon.vision import ImagePredictor

predictor = ImagePredictor.load('predictor.ag')

folder_names = ['down', 'left', 'right', 'up']

for i in range(4):
    print(folder_names[i], 'images:')
    all_files = glob.glob('./Directions/test/' + folder_names[i] + '/*.png')

    for img_file in all_files:

        result = predictor.predict_proba(img_file)
        print(result.head(1).to_string(index=False, header=False))

down images:
 down  0.999652  0
 down  0.999059  0
 down  0.999666  0
 down  0.999527  0
 down  0.999523  0
 down  0.999278  0
 down  0.99827  0
 down  0.979979  0
 down  0.999766  0
 down  0.999634  0
left images:
 left  0.997134  1
 left  0.997658  1
 left  0.998348  1
 left  0.990252  1
 left  0.98779  1
 left  0.99943  1
 left  0.997446  1
 left  0.994375  1
 left  0.999636  1
 left  0.996034  1
right images:
 right  0.998382  2
 right  0.999338  2
 right  0.999656  2
 right  0.99916  2
 right  0.99935  2
 right  0.999371  2
 right  0.997335  2
 right  0.996024  2
 right  0.997877  2
 right  0.941485  2
up images:
 up  0.999808  3
 up  0.999207  3
 up  0.999937  3
 up  0.999823  3
 up  0.998842  3
 up  0.998434  3
 up  0.999951  3
 up  0.99989  3
 up  0.999996  3
 up  0.996188  3

すべての画像に対して90%以上(ほとんどは99%以上)で正解にたどり着いていることがわかります。

補足

AutoGluonのデフォルトで使用される「resnet50_v1b」モデルでは10epochで100%にたどり着きませんでした。その結果をふまえて上記スクリプトでは「resnet101_v1d」モデルを使用しています。

このエントリーをはてなブックマークに追加