目次
はじめに
ちょっと大げさなタイトルとしましたが、今回は、私がディープラーニング(AI)の資格の中でも有名なE資格の勉強する中で、面白いプログラムがあったので、そちらを紹介したいと思います。
今回紹介する内容は、シンプルにいうと画像を増やすということです。
ディープラーニングでは、多くのデータを使って学習させて、そのデータから人間でもよくわからない特徴をつかみ、最も正解率が高い予測モデルを構築し、そのモデルで未知なるデータを予測するということも一つの特徴としてあります。
ただ、データが現場に豊富にないケースもあるため、そんな時、便利なものがデータ拡張という考え方で、少ないデータからランダムに少しずつ変化させたデータを水増するという手段があります。
今回は、その水増しする方法を紹介します。
準備
私自身が完全にプログラミング初心者なので、今回も全く素人の方でも楽しんでいただけるように、Googleアカウントさえあれば誰でも実行可能な汎用性が高いプログラム実行環境のGoogle Colaboratoryを使って、実装したいと思います。
さて、まずは、画像を準備して、Googleドライブに適当なフォルダを作って保存します。
以下は、例で、今回はマイドライブ内に、ディープラーニングというフォルダを作ってその中に画像を入れています。
ついでに、同じフォルダ内に今回増やした画像を保存するフォルダ(今回はdata)を作成します。
続いて、左上の新規ボタンから、その他の中にあるGoogle Colaboratoryを選択して、同じフォルダ内にnotebookを保存します。
実装
ここからは、プログラムコードになります。
基本的にはコピペで問題ないと思いますが、適宜、設定を変更してみてください。
いったん、最終系をご覧ください。
import numpy as np
from PIL import Image
from tensorflow import keras
from tensorflow.keras.preprocessing.image import ImageDataGenerator
fname = "/content/drive/MyDrive/ディープラーニング/akachan_mokuyoku.png" #フォルダ先、画像ファイルの指定
pixel = 400 #ピクセル数を指定
num_image = 1 # 画像枚数を指定
channel = 4 # カラー画像
data = np.empty((num_image, pixel, pixel, channel))
img = Image.open(fname)
img = np.array(img).astype(np.float32)
data[0,:] = img
datagen = ImageDataGenerator(
rotation_range=180,
rescale=1./255,
shear_range=0.1,
zoom_range=[0.5, 1.0],
horizontal_flip=True)
num_image = 10 #生成する枚数を指定
g = datagen.flow(data, batch_size=1, save_to_dir="/content/drive/MyDrive/ディープラーニング/data/", save_format='png', save_prefix='out_') #生成後の保存先を指定
for i in range(num_image):
batches = g.next()
print(batches.shape)
それでは、簡単にプログラムについて解説します。
- STEP
ライブラリのインポート
まずは、必要なライブラリをインポートします。
今回特に重要なものが、ImageDataGeneratorというメソッドになります。import numpy as np from PIL import Image from tensorflow import keras from tensorflow.keras.preprocessing.image import ImageDataGenerator
- STEP
画像ファイルの指定
続いて、先ほど保存した画像のフォルダとpixelを指定します。
fname = "/content/drive/MyDrive/ディープラーニング/akachan_mokuyoku.png" pixel = 400
- STEP
画像の変換
画像を数値、配列として変換します。
num_image = 1 channel = 4 data = np.empty((num_image, pixel, pixel, channel))
- STEP
画像の読み込み
対象画像を読み込みます
img = Image.open(fname) img = np.array(img).astype(np.float32) data[0,:] = img
- STEP
データの拡張設定
画像をランダムに変化させる設定です。
datagen = ImageDataGenerator( rotation_range=180, rescale=1./255, shear_range=0.1, zoom_range=[0.5, 1.0], horizontal_flip=True)
- STEP
データ生成
データを水増しする設定です。
num_image = 10 g = datagen.flow(data, batch_size=1, save_to_dir="/content/drive/MyDrive/ディープラーニング/data/", save_format='png', save_prefix='out_') for i in range(num_image): batches = g.next() print(batches.shape)
上記を実行すると、画像の枚数にもよると思いますが、すぐに下図のようにデータが生成されます。
さいごに
いかがでしょうか。日本はものすごい勢いで少子化になっていますが、将来、子どもが増えていくことを願って、締めさせていただければと思います。