この記事の目的
fast.aiコースという、機械学習を学べる無料のコースをご存知でしょうか?
fast.aiコース
このコースの受講記録を残す目的で、この記事を書いています。この記事では02.Productionの一部を整理しています。
画像判別モデル作成の全体フロー
今回は犬の画像を渡すと犬種を判別するモデルを作成します。以下の流れで進めていきます。
ライブラリのインポート
学習用データの準備
準備したデータの整備
モデル学習の実行
モデル学習結果の確認
環境
Google Cloabで作業しています。
ライブラリのインポート
画像判別モデル作成に必要なライブラリをインポートします。
! [ -e /content ] && pip install -Uqq fastbook
#[ -e /content ]:contentというパスがあるかを判断する条件文。google colab環境にはcontentというパスがデフォルトであるため、google colab環境の場合に実行されるコマンド
#-U:パッケージをアップデート
#qq:ログの出力をError,Criticalレベルに限定
from fastbook import *
from fastai.vision.widgets import *
学習用データの準備
画像判別モデル作成には、学習元用のデータが必要です。今回は画像を検索し、それを学習用のデータとします。
学習用データを格納するパスを定義する
path = Path('dogs')
path.mkdir()
ここで使用しているPathはパスを文字列ではなく、パスとして使うことができるオブジェクトです。詳細はこちらをご参照ください。
Pathオブジェクト
画像を検索し、結果を格納する
# 今回は3種類の犬種を判別するモデルを作る
dog_types = 'ShibaInu','Kooikerhondje','LabradorRetriever'
# 犬種毎に検索した画像をパスに格納する
for o in dog_types:
dest = (path/o)
dest.mkdir(exist_ok=True,parents=True)
results = search_images_ddg(f'dog {o}')
download_images(dest,urls=results)
path.mkdir
exist_ok:作成しようとしているパスが存在している場合の挙動を定義
parents:親ディレクトリが存在している場合の挙動を定義
search_images_ddg
DuckDuckGoの画像検索結果のURLを文字列で返す
download_images
urlsで指定されたURLの画像をdestで定義されたパスにダウンロードする
表示できない画像は削除する
# dogs配下の画像ファイルのパスを文字列で取得
fns = get_image_files(path)
# 表示できない画像を抽出
failed = verify_images(fns)
# 表示できない画像はdogs配下から削除
failed.map(Path.unlink)
get_image_files
パス内の画像を再帰的に取得する
veriry_images
開けない画像を返す
path.unlink
ファイルを削除する
準備したデータの整備
fastaiでは学習用のデータをDataBlockというオブジェクトで定義します。
DataBlockを定義する
dogs = DataBlock(
blocks=(ImageBlock,CategoryBlock),
get_items=get_image_files,
splitter=RandomSplitter(valid_pct=0.2, seed=42),
get_y=parent_label,
item_tfms=Resize(128)
)
datablock
モデル学習に使用するデータの定義
datablock tutorial
Datablockの定義にあたっては以下のことを検討します。
インプット、アウトプットデータのタイプ:画像データがインプット、画像のカテゴリがアウトプット
データはどこにあるか:指定されたパス配下get_image_files
インプットデータに何かを適用する必要があるか:無し
アウトプットデータに何かを適用する必要があるか:親ディレクトリの名前をつけるparent_label
データをどのように分割するか:ランダム
バッチ形成前に何かを適用する必要があるか:サイズ変更
バッチ形成後に何かを適用する必要があるか:無し
画像データを読みこませる
dls = dogs.dataloaders(path)
dataloaders
定義したDabaBlockに画像が格納されたパスを渡すことで、学習用のデータとする
学習データを拡張する
dogs = dogs.new(item_tfms=Resize(128), batch_tfms=aug_transforms(mult=2))
dls = dogs.dataloaders(path)
dls.train.show_batch(max_n=8, nrows=2, unique=True)
aug_transforms
反転、回転、ズーム、明るさの変換などをランダムで行い、学習用のデータを拡張する
モデル学習の実行
学習用のデータの定義が完了したので、そのデータを用いて、モデルを学習させます。
モデルを定義する
learn = vision_learner(dls, resnet18, metrics=error_rate)
vision_learner
学習用データ、モデルアーキテクチャ、メトリックを指定して、モデルを定義する
metrics
メトリックとして定義できる関数
モデル学習を実行する
learn.fine_tune(4)
fine_tune
事前学習されたモデルを使う
モデル学習結果の確認
モデルの学習結果を確認します。
混同行列を表示する
interp = ClassificationInterpretation.from_learner(learn)
interp.plot_confusion_matrix()
interp
モデルの予測結果を把握するために使用するオブジェクト
損失が大きいものを表示する
interp.plot_top_losses(3, nrows=3)
まとめ
簡易的な画像判別モデルの作成ができました。今後モデルの精度向上方法等について整理していきます。