しばらくお休みしている間にfast.aiもバージョン2となり、今まで通り初心者はバカチョンで、中級者や上級者はそれなりにキメ細かく出来るようになったみたいです。
Ver2になると今まで使っていたプログラムもおそらく動かなくなるでしょう。また、プログラムの実行環境はGoogle Colaboratoryがイチ推しのようです。そこでチュートリアルを参考にCIFAR10を使ってImage Classificationを行ってみます。
まずは、fast.aiをインストール
! [ -e /content ] && pip install -Uqq fastai # upgrade fastai on colab
from fastai.vision.all import *
▼データセットのダウンロード・解凍
fast.aiに組込まれているCIRA10のデータセットをダウンロード・解凍する。path = untar_data(URLs.CIFAR)内容の確認
path.ls()(#3) [Path('/root/.fastai/data/cifar10/train'),Path('/root/.fastai/data/cifar10/test'),Path('/root/.fastai/data/cifar10/labels.txt')]
ダウンロードしたdatasetにはtest,trainのフォルダーとladel.txtIがあるようです。
trainの中は、truck、airplain、cat・・・とクラスごとに分かれているようです。
(path/"train").ls()(#10) [Path('/root/.fastai/data/cifar10/train/truck'),Path('/root/.fastai/data/cifar10/train/airplane'),Path('/root/.fastai/data/cifar10/train/cat'),Path('/root/.fastai/data/cifar10/train/deer'),Path('/root/.fastai/data/cifar10/train/horse'),Path('/root/.fastai/data/cifar10/train/automobile'),Path('/root/.fastai/data/cifar10/train/dog'),Path('/root/.fastai/data/cifar10/train/frog'),Path('/root/.fastai/data/cifar10/train/ship'),Path('/root/.fastai/data/cifar10/train/bird')]
len((path/"train").ls())10
クラスのクラス名を取得します。
traningの結果を分析するのに、ClassificationInterpretationクラスを使用します。from_learnerメソッドを使って、次のように作成します。
for i in range(len((path/"train").ls())): fname = (path/"train").ls()[i] print(fname.name)truck
airplane
cat
deer
horse
automobile
dog
frog
ship
bird
問題に適したImageDataLoaderのfactory methodsは他にもあるので、vision.dataでそれらすべてを確認してください。
モデル用にデータを準備するには、データをDataLoadersオブジェクトに配置する必要があります。 ここにフォルダー名を使用してラベルを付ける関数があるので、ImageDataLoaders.from_folderを使用します。
問題に適したImageDataLoaderのfactory methodsは他にもあるので、vision.dataでそれらすべてを確認してください。
dls = ImageDataLoaders.from_folder(path, valid_pct=0.2)pathを使っているので、trainとtestフォルダーの合計6000個のimageを使うことになる。 もしtrain内のimageのみで行うのであればpath_d = path/"train" とする必要がある。 幾つかを確認する。
dls.valid_ds.items[:4][Path('/root/.fastai/data/cifar10/train/ship/40435_ship.png'), Path('/root/.fastai/data/cifar10/train/horse/40005_horse.png'), Path('/root/.fastai/data/cifar10/train/frog/31706_frog.png'), Path('/root/.fastai/data/cifar10/train/ship/38138_ship.png')]
show_batchメソッドを呼び出すことにより、これらの画像を確認できます。
dls.valid.show_batch(max_n=4, nrows=1)
モデルトレーニングに適した形式でデータを組み立てたので、次はそれを使用して画像分類器をトレーニングしましょう。
▼Learnerの作成
転移学習を使用して、事前にトレーニングされたモデルをわずか2行のコードでfine tuneします。
learn = cnn_learner(dls, resnet34, metrics=error_rate) learn.fine_tune(5)
▼training結果の分析
interp = ClassificationInterpretation.from_learner(learn)
confusion_matrix
confusion_matrixを使ってtrainingの全体像を俯瞰する事ができます。interp.plot_confusion_matrix(figsize=(12,12), dpi=60)縦軸のクラス名の画像を予測すると、横軸のクラス名の通りになったということです。 例えばairplaneの1184枚の画像を予測すると、1047枚は正解のairplaneに9枚はautomobile、36枚はbirdと判別されたということです。
損失関数でみた損失上位の画像をplotすることが出来ます。
画像の上の4つの項目はそれぞれ、予測、実際、損失、実際のクラスの確率を示しています。interp.plot_top_losses(16, figsize=(15,11))
▼検証データのクラス毎のaccuracy
import numpy as np res_corr=interp.confusion_matrix() #classの数 class_num=dls.c #class毎のデータ総数 class_sum=np.sum(res_corr, axis=1) for i in range(class_num): #print(data.classes[i],':',res_corr[i,i]/class_sum[i]) print(interp.vocab[i],':','{:.4f}'.format(res_corr[i,i]/class_sum[i]))airplane : 0.8843 automobile : 0.8847 bird : 0.7886 cat : 0.6706 deer : 0.7851 dog : 0.6906 frog : 0.8956 horse : 0.8709 ship : 0.9161 truck : 0.8863
▼おわりに
・一番シンプルな型で行いました。DataLoadersオブジェクトを作るとき、前回2020/5/9の投稿時のように、RsizeやNormalizeなどを全く行っていません。
そのため、精度も期待したほどではなく、悪い結果となっています。
・DataLoadersオブジェクトを作るとき、trainとtestの両方のデータ60000個を使ってしまったので、trainデータだけにすればよかった。
次はRsizeやNormalizeを加えて、精度を上げたいと思います。
0 件のコメント:
コメントを投稿