• t.t

AutoGluonで簡単画像分類

ここ数年、AI、機械学習ブームが続いていますが、いざ機械学習を使って何かを作ろうするとハードルの高さを感じる方も少なくないかといます。

そこで今回は、機械学習に関する深い知識、難しいチューニングなしで使える機械学習ライブラリ AutoGluonをご紹介したいと思います。


AutoGluonとは

AutoGluon(https://auto.gluon.ai/)は、数行のコードで簡単に画像分類や物体検出、テキスト分類、表データ分類などを実現できる機械学習ライブラリです。

機械学習モデル選択やハイパーパラメタのチューニングといった難しい部分は、すべてAutoGluonが自動でやってくれるので機械学習に関する知識はほとんどなしで使うことができます。これだけ聞くと、初心者向けのライブラリで大したことができないのではないかと思われるかもしれませんが、細かな部分まで簡単に設定、拡張できるようになっており、機械学習エキスパートをも対象としたライブラリとなっています。


導入の仕方や使い方については、次節でAutoGluonを使って実際に画像分類器を作りつつご紹介したいと思います。


AutoGluonを使った画像分類器の作り方

本節では、AutoGluonを使ってリンゴとバナナを分類する画像分類器を作っていきます。画像分類器作成の流れは次のようになります。

  1. リンゴ、バナナ画像データを収集する

  2. 収集した画像データを訓練データとテストデータに分割する

  3. AutoGluonをインストールする

  4. 訓練データから画像分類器を作成する

なお、2021/8/25現在、AutoGluonはWindowsに対応していないため(今後対応予定とのこと)、以下はUbuntu 20.04上で動作確認を行っています。


1. リンゴ、バナナ画像を収集する

精度の高い画像分類器を作るためには、訓練用の画像データが大量に必要になります。

手動で集めるのは大変ですので、今回はgoogle_images_downloadというツールを使ってGoogle画像検索で画像を収集します。


まずは、google_images_downloadをインストールします。

$ sudo apt update
$ sudo apt install -y git python3-pip chromium-chromedriver
$ pip3 install google_images_download
$ git clone https://github.com/Joeclinton1/google-images-download.git gid-joeclinton
$ pip3 install -e gid-joeclinton
$ source ~/.profile

インストールが終わったら、google_images_downloadを使って、検索ワード「リンゴ」、「バナナ」にマッチする画像データを100件ずつ集めます

$ googleimagesdownload --keywords "リンゴ" -l 100 --chromedriver "/usr/bin/chromedriver"
$ googleimagesdownload --keywords "バナナ" -l 100 --chromedriver "/usr/bin/chromedriver"

収集した画像データは、次のようなフォルダ階層に保存されます。

downloads/
 ├ リンゴ/
 │ ├ リンゴ画像1.jpg
 │ ├ リンゴ画像2.jpg
 │ └  ...
 └ バナナ/
   ├ バナナ画像1.jpg
   ├ バナナ画像2.jpg
   └  ...

リンゴやバナナでない画像データがまぎれていることもあるので、目視で確認して、適切でないデータは削除します。


2. 収集した画像データを訓練データとテストデータに分割する

次に、収集した画像を、画像分類器を作るための訓練データと、画像分類器の精度を測定するためのテストデータに分割します。


まずは、画像データを訓練データとテストデータに分けるスクリプトtrain_test_split.pyを作成します。訓練デートとテストデータは、それぞれ訓練データフォルダとテストデータフォルダの下に配置されるようにしています。

from pathlib import Path
import shutil
import random

# 収取した画像データのフォルダ
DOWNLOAD_DIR = Path('./downloads')
# 訓練フォルダ
TRAIN_DIR = Path('./train')
# テストフォルダ
TEST_DIR = Path('./test')
# 収集した画像データのうち訓練データとして使う割合
TRAIN_RATE = 0.8

labels = [dir.name for dir in DOWNLOAD_DIR.iterdir() if dir.is_dir()]
for label in labels:
    (TRAIN_DIR / label).mkdir(parents=True, exist_ok=True)
    (TEST_DIR / label).mkdir(parents=True, exist_ok=True)
    files = [file.name for file in (DOWNLOAD_DIR / label).iterdir() if file.is_file()]
    random.shuffle(files)
    train_size = int(len(files) * TRAIN_RATE)
    for train_file in files[:train_size]:
        shutil.copy(DOWNLOAD_DIR / label / train_file, TRAIN_DIR / label)
    for test_file in files[train_size:]:
        shutil.copy(DOWNLOAD_DIR / label / test_file, TEST_DIR / label)

スクリプトを実行します。

$ python3 train_test_split.py

訓練データフォルダ、テストデータフォルダは次のようになります。

train/
 ├ リンゴ/
 │ ├ リンゴ訓練画像1.jpg
 │ ├ リンゴ訓練画像2.jpg
 │ └  ...
 └ バナナ/
   ├ バナナ訓練画像1.jpg
   ├ バナナ訓練画像2.jpg
   └  ...
test/
 ├ リンゴ/
 │ ├ リンゴテスト画像1.jpg
 │ ├ リンゴテスト画像2.jpg
 │ └  ...
 └ バナナ/
   ├ バナナテスト画像1.jpg
   ├ バナナテスト画像2.jpg
   └  ...

3. AutoGluonをインストールする

続いて、AutoGluonサイトのInstallationに従い、AutoGluonをインストールします。

以下は、OSがLinux、バックエンドがCPUの場合のインストール方法です。

GPUが活用できるマシンの場合は、バックエンドがGPUの場合のインストール方法に従ってインストールすることで学習・推論を高速化できます。

$ python3 -m pip install -U pip
$ python3 -m pip install -U setuptools wheel
$ python3 -m pip install -U "mxnet<2.0.0"
$ python3 -m pip install autogluon

4. 訓練データから画像分類器を作成する

画像分類器を作成するコードは次のようになります(train.py)。特にややこしい設定もなしで、これだけのコードで画像分類器が作成できるというのはすごいですね。

import autogluon.core as ag
from autogluon.vision import ImagePredictor, ImageDataset

# 訓練データフォルダ
TRAIN_DIR = './train'
# テストデータフォルダ
TEST_DIR = './test'
# 画像分類器保存場所
MODEL_FILE = 'apple-banana.ag'

# 訓練データから画像分類器を作成する
dataset = ImageDataset.from_folder(TRAIN_DIR)
predictor = ImagePredictor()
predictor.fit(dataset)

# テストデータで精度を検証する
test_dataset = ImageDataset.from_folder(TEST_DIR)
test_acc = predictor.evaluate(test_dataset)
print(f'分類精度: {test_acc["top1"]:.3f}')

# 画像分類器を保存する
predictor.save(MODEL_FILE)

スクリプトを実行することで、訓練データをもとに画像分類器を作成し、作成した画像分類器をapple-banana.agという名前でファイルに保存します。実行するマシンの性能にもよりますが、数分程度時間が掛かる場合があります。

$ python3 train.py
分類精度: 0.974


5. 画像分類器で画像を判定する

作成した画像分類器で画像を判定する場合は、先に保存したapple-banana.agファイルから画像分類器をロードし、predict_probaメソッドで推論を実行します(predict.py)。

import autogluon.core as ag
from autogluon.vision import ImagePredictor
from pathlib import Path

# 訓練データフォルダ
TRAIN_DIR = './train'
# 画像分類器保存場所
MODEL_FILE = 'apple-banana.ag'

# ラベル名のリストを取得
labels = sorted([dir.name for dir in Path(TRAIN_DIR).iterdir() if dir.is_dir()])

# 画像分類器をロード
predictor = ImagePredictor.load(MODEL_FILE)

# 画像分類器で画像を推論
result = predictor.predict_proba('./apple.jpg')
label = labels[result.idxmax(axis=1)[0]]
proba = result.max(axis=1)[0]
print(f'結果: {label} (確信度={proba})')

判定する画像apple.jpgをスクリプトと同じフォルダに配置し、スクリプトを実行します。


apple.jpg
$ python3 predict.py
結果: リンゴ (確信度=0.952)

まとめ

ちょっとコードを書くだけで、リンゴ、バナナ画像分類器ができました。

今回ご紹介したのは画像分類器の作り方だけですが、AutoGluonを使えば、物体検出、テキスト分類、表データ分類など、その他様々な学習も簡単に行うことができます。これを機に少し機械学習触ってみませんか?

DX研究開発事業部では、こうした機械学習など先端の技術を活用して今後のプロダクト開発に取り組んでいきたいと考えています。