Techpit:テックピット
  前のパートに戻る 完了して次のパートへ  

  1-3 データをNumPy配列に変換し、npyファイルに保存するプログラムを作成しよう

データをNumPy配列に変換し、npyファイルに保存するプログラムを作成しよう


このレクチャーでは、画像ファイルを数値の列に変換し、機械学習のトレーニングプログラムに投入できる形式に変換し、ファイルに保存するプログラムを作成していきます。


Pillowのインストール


画像ファイルをPythonから読み込むために、Pillowという画像処理パッケージをインストールしましょう。

まずは仮想環境を有効化しましょう。

Windowsでは

$ conda activate tf112cpu

macOSでは

$ source activate tf112cpu

とします。

最後の引数(tf112cpuの部分)はあなたが作成した仮想環境名と合わせましょう。

仮想環境を有効化したら、以下のpipコマンドでPillowをインストールしましょう。

$pip install Pillow

また、データをトレーニング用とテスト用に分ける関数(model_selection)を使用するためにScikit-Learnをインストールしておきます。

Scikit-Learnは機械学習のためのさまざまなアルゴリズムやデータを操作する関数群から構成されるパッケージです。

$pip install sklearn


データを読込んで配列に格納するコードを書こう


新しいファイルを作成し「gen_data.py」という名前で保存しましょう。

以下のコードを「gen_data.py」というファイルに記述していきます。

intro_deep_learning
└── gen_data.py #新規作成

このプログラムでは、以下のような流れで、数字の列に変換されたパラメーターファイルを生成します。

  1. クラスラベルを格納した配列から順にクラスラベルを取り出す
  2. glob関数を使用してディレクトリ内のファイル一覧を取得する
  3. Pillowに含まれるImageクラスを使用してファイルのオープン, RGB変換, サイズ統一
  4. リストに追加する
  5. リストをNumPy配列に変換する
  6. データをtrainとtestに分割する
  7. animal.npyという名前で、数字の並んでいるデータを含むファイルを生成する

まずは必要なライブラリなどのインポートを行います。

# クラス定義やパッケージのインポート
from PIL import Image #PillowからImageクラスをインポート
import os, glob #OSにアクセスする関数をインポート
import numpy as np #NumPyをインポート
from sklearn import model_selection #トレーニングとテストデータを分割する関数

続いてクラスラベルの初期化を行います。

# 変数の初期化(クラスラベルの定義と画像サイズの指定)
classes = ["monkey","boar","crow"] // リスト型変数に入れる
num_classes = len(classes) // リストサイズを取得
image_size = 50 // 画像データの変換サイズ。縦横ピクセル数

次にクラスラベル毎に200枚づつ画像データを取り出して配列に格納していきます。Xには画像データが、Yにはクラスラベル(の番号)が入ります。

imageに入っているリスト型データを, asarray関数でNumPyの配列データ型に変換してdata変数に格納します。

# 画像の読み込み
X = [] #リスト型変数Xを初期化
Y = [] #リスト型変数Yを初期化


for index, classlabel in enumerate(classes): # classesから値を取り出し付番
    # ディレクトリ名を生成
    photos_dir = "./" + classlabel
    
    # ファイル一覧を取得
    files = glob.glob(photos_dir + "/*.jpg")
    
    # 各ファイルをNumPyアレーに変換し、リストに追加
    for i, file in enumerate(files): 
        #filesから1個づつ取り出しfileに入れ付番
        
        if i >= 200: break #200を超えたら次のラベルのループへ
        image = Image.open(file) #Imageクラスのopen関数でファイルをオープン
        image = image.convert("RGB") #配色データをRGBの順に揃える
        image = image.resize((image_size, image_size)) #画像サイズを揃える
        data = np.asarray(image) #NumPyアレーに変換
        X.append(data) #リストXの末尾に追加
        Y.append(index) #リストYの末尾に追加

# リスト型変数X,YをNumPyアレーに変換
X = np.array(X)
Y = np.array(Y)

作成したXとYをトレーニング用と精度テスト用にスプリットします。 特に指定をしなければ、scikit learnのmodel_selection関数は3:1の割合, つまりテストデータを25%としてデータセットを分割します。

# XとYを分割して、トレーニング用とテスト用に格納
X_train, X_test, y_train, y_test = model_selection.train_test_split(X, Y)

# xyという変数にまとめて格納
xy = (X_train, X_test, y_train, y_test)

# NPYフォーマットで保存
np.save("./animal.npy", xy)

コードを実行してみよう


上記で作成したコード(gen_data.py)コマンドラインから実行しましょう。

TensorFlow/Kerasをインストールした仮想環境を有効化してからコマンドを実行しましょう。

$ python animal_cnn.py

同じ階層にanimal.npyというファイルが生成され、サイズがゼロでなければデータファイルの生成に成功しています。

続いてのレクチャーでは、このデータをモデルに投入してトレーニングを実行していきます。


機械学習とデータの数値化

数値に変換することで, 画像ファイル内のデータのパターンや規則性を学習させ, 未知の画像ファイルを投入して分類ラベルを推定できるようになります。

画像ファイルに限らず, 音声, 文章なども同様に数値の並び(シーケンス)に変換することで、コンピューターが処理できるようになります。コンピューターにとってはあらゆるデータは数字の羅列であり、数字の並ぶパターンや特徴を分析して未知のデータに対する分類処理や、推定処理を行う推定式を機械学習で作り出します。

音声ならば周波数と強度、文章ならば単語ベクトル(Word2Vec)や文章ベクトル(Doc2Vec)などを用いて数値化処理を行います。機会があれば、他のアルゴリズムについてもご紹介したいと思います。

続いては今回作成したNumPy配列データをモデルに投入してトレーニング(パラメーターセットの最適化)を実行していきます。

議論
3 質問