どうもエンジニアのirohasです。
先日、kerasを使用して虹ヶ咲学園のキャラクターを画像認識させてみたの記事において、データ数の少なさから精度があまり芳しくなく、データを増やそうと思い、Data Augmentation(データ拡張)をしたので、
今回は機械学習ライブラリの一つであるkerasを用いた、Data Augmentation(データ拡張)を紹介します。
目次
1.環境
2.使用ライブラリ
3.データ拡張って何?
4.ソースコード
5.まとめ
1. 環境
vscode
Python 3.9.0
2. 使用ライブラリ
・標準ライブラリ
os : ローカルフォルダ用ライブラリ
glob : フォルダ一括取得用ライブラリ
・外部ライブラリ
numpy 1.21.4 : 数値計算ライブラリ
matplotlib 3.5.1 : グラフ描写用ライブラリ
Keras 2.8.0 : ディープラーニング用ライブラリ
3. データ拡張って何?
Data Augmentation(データ拡張)とは、学習用の画像データに対して「変換」を施すことでデータを水増しする手法です。
機械学習、特にディープラーニングによる画像認識では大量の画像データを必要とする場合が多いです。
時にその量は数万枚や数十万枚(またはそれ以上)に登る場合もあるので、人間の手でデータを集めたり、スクレイピングで集めるのも至難の業となってきます。
そこで活躍するのが上記のData Augmentation(データ拡張)という技術です。
Data Augmentation(データ拡張)では、一枚の画像を回転させたり、反転させたり、明るさを調整したりしてデータを増やすことができます。
詳しくはこちら↓
Keras ImageDataGenerator
4. ソースコード
作成したソースコードは以下になります。
from keras.preprocessing.image import load_img, img_to_array
from keras.preprocessing.image import ImageDataGenerator
import matplotlib.pyplot as plt
import numpy as np
import os
import glob
n = 20 #一枚あたりの拡張数
# 入力画像の保存先
input_path = "./dataset/train/sizuku"
files = glob.glob(input_path + '/*.jpg')
# 出力画像の保存先
output_path = "./dataset/train/sizuku"
if os.path.isdir(output_path) == False:
os.mkdir(output_path)
for i, f in enumerate(files):
img = load_img(f)
x = img_to_array(img)
x = np.expand_dims(x, axis=0)
# ImageDataGeneratorの生成
datagen = ImageDataGenerator(
zca_epsilon=1e-06, # 白色化のイプシロン
rotation_range=10.0, # ランダムに回転させる範囲
width_shift_range=0.0, # ランダムに幅をシフトさせる範囲
height_shift_range=0.0, # ランダムに高さをシフトさせる範囲
brightness_range=None, # ランダムに明るさを変化させる範囲
zoom_range=0.0, # ランダムにズームさせる範囲
horizontal_flip=True, # ランダムに水平方向に反転させる
vertical_flip=True, # ランダムに垂直方向に反転させる
)
# 1枚あたりn枚の画像を水増し生成
dg = datagen.flow(x, batch_size=1, save_to_dir=output_path, save_prefix='img', save_format='jpg')
for i in range(n):
batch = dg.next()
5. まとめ
Data Augmentation(データ拡張)を使えば、100枚のデータを1000枚、10000枚などまで増やすことができます!
Data Augmentation(データ拡張)をすることで、過学習の抑制であったり、精度の向上につながります。
ぜひ、Data Augmentation(データ拡張)の技術も極めて快適なAI開発ライフをお過ごしください!!