AIで日本は救えるか?Pythonを使って赤ちゃんを増やしてみた!【動画あり】

4 min 187 views

はじめに

ちょっと大げさなタイトルとしましたが、今回は、私がディープラーニング(AI)の資格の中でも有名なE資格の勉強する中で、面白いプログラムがあったので、そちらを紹介したいと思います。

今回紹介する内容は、シンプルにいうと画像を増やすということです。

ディープラーニングでは、多くのデータを使って学習させて、そのデータから人間でもよくわからない特徴をつかみ、最も正解率が高い予測モデルを構築し、そのモデルで未知なるデータを予測するということも一つの特徴としてあります。

ただ、データが現場に豊富にないケースもあるため、そんな時、便利なものがデータ拡張という考え方で、少ないデータからランダムに少しずつ変化させたデータを水増するという手段があります。

今回は、その水増しする方法を紹介します。

準備

私自身が完全にプログラミング初心者なので、今回も全く素人の方でも楽しんでいただけるように、Googleアカウントさえあれば誰でも実行可能な汎用性が高いプログラム実行環境のGoogle Colaboratoryを使って、実装したいと思います。

使い方は、「Colaboratory 使い方」などでググってみてください。

さて、まずは、画像を準備して、Googleドライブに適当なフォルダを作って保存します。
以下は、例で、今回はマイドライブ内に、ディープラーニングというフォルダを作ってその中に画像を入れています。
ついでに、同じフォルダ内に今回増やした画像を保存するフォルダ(今回はdata)を作成します。

フォルダ構成
赤ちゃん画像

今回はいらすとやさんの画像を使わせていただきます。

続いて、左上の新規ボタンから、その他の中にあるGoogle Colaboratoryを選択して、同じフォルダ内にnotebookを保存します。

Google Colaboratoryのアプリ作成

実装

ここからは、プログラムコードになります。
基本的にはコピペで問題ないと思いますが、適宜、設定を変更してみてください。

いったん、最終系をご覧ください。

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)

それでは、簡単にプログラムについて解説します。

  1. STEP

    ライブラリのインポート

    まずは、必要なライブラリをインポートします。
    今回特に重要なものが、ImageDataGeneratorというメソッドになります。

    import numpy as np
    from PIL import Image
    from tensorflow import keras
    from tensorflow.keras.preprocessing.image import ImageDataGenerator

    詳しい説明は割愛いたします。気になる方はググってみてください。

  2. STEP

    画像ファイルの指定

    続いて、先ほど保存した画像のフォルダとpixelを指定します。

    fname = "/content/drive/MyDrive/ディープラーニング/akachan_mokuyoku.png"
    pixel = 400

    MyDriveの先は、自分で入れたフォルダ名や画像のファイル名を入れてください。
    pixelは、400×400の画像を使っています。

  3. STEP

    画像の変換

    画像を数値、配列として変換します。

    num_image = 1
    channel = 4
    data = np.empty((num_image, pixel, pixel, channel))

    対象画像枚数は、今回1枚なので、num_image = 1としています。
    カラー画像なので、channel = 4としています。

  4. STEP

    画像の読み込み

    対象画像を読み込みます

    img = Image.open(fname)
    img = np.array(img).astype(np.float32)
    data[0,:] = img
  5. STEP

    データの拡張設定

    画像をランダムに変化させる設定です。

    datagen = ImageDataGenerator(
            rotation_range=180,
            rescale=1./255,
            shear_range=0.1,
            zoom_range=[0.5, 1.0],
            horizontal_flip=True)

    今回は、画像をランダムに回転、ねじれ、拡大縮小、水平方向に反転などをしながら画像を水増しする試みです。

    rescaleというのは特に今回なんの役にも立っていませんが、学習させる前処理としては比較的重要なものになりますので、追加してあります。

    ここのコードをいろいろいじると様々な変化がある画像を作れるので、とても面白いです

    ImageDataGeneratorのメソッドの詳しい設定については以下サイトを参照ください。

  6. 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)

    今回は、画像を10枚作りたいので、num_image = 10としています。

上記を実行すると、画像の枚数にもよると思いますが、すぐに下図のようにデータが生成されます。

赤ちゃん画像拡張後

さいごに

いかがでしょうか。日本はものすごい勢いで少子化になっていますが、将来、子どもが増えていくことを願って、締めさせていただければと思います。

関連記事