今回は、画像をNumPy形式に変換する方法について最近勉強したことをまとめます。
そもそもNumPyとは何か?
NumPyとは、Pythonにおいて数値計算を効率的に行うための拡張モジュールのことです。
NumPyの内部はC言語で実装されているため、Pythonのみで行うと時間のかかる数値計算を、大幅に短縮できます。
行列演算を高速化するため、機械学習と非常に相性のいいライブラリであり、多様されているようです。
私も今回画像識別アプリを作成するにあたって、NumPyを利用します。
画像データをそのままでは扱えないため、NumPy形式に変換する必要があるためです。
最近私が作った画像判別AIで使ったコードをもとに、変換の方法をまとめようと思います。
画像をNumPy形式に変換するまでの流れ
まずは必要なライブラリのインポートを行います。
ちなみにPillow,NumPy,Sciketlearnは標準ライブラリではないので、インポートのためには各ライブラリの環境へのインストールが必要なので注意してくださいね。
#必要なライブラリのインポート from PIL import Image import os, glob import numpy as np from sklearn import cross_validation
必要なライブラリのインポートが終わったら、次にクラスタリングの定義と変数宣言などを行います。
#クラスタリングの定義 classes=['itemA','itemB','itemC'] #len関数でクラスの数を判別 num_classes = len(classes) #画像処理の時間短縮のため、全ての画像を50×50のサイズに変換 image_size = 50 #空の配列をつくり。保存した画像とラベルデータを格納していく image_boxes = [] image_labels = []
そして、それぞれのディレクトリから画像を取り出してRGB形式に変換し、配列に代入。
#classesの中身をインデックス付きでitem_classに代入する for i , item_class in enumerate(classes): #各クラスの画像の入っているディレクトリパスを取得 image_dir = "./" + item_class #globにより、パターン一致したファイルをまとめて取得し、.jpgファイルのみ保存する files = glob.glob(image_dir + "*.jpg") #インデック付きで、filesをfileに取り出していく for ii , file in enumerate(files): #100項目を超えたらループを抜ける if ii >= 100: break #PillowのImageメソッドを用いて、画像ファイルを開き、RGB変換とリサイズを行い、配列形式でdataに格納 image = Image.open(file) image = image.convert("RGB") image = image.resize((image_size,image_size)) data = np.asarray(image) #dataの値とインデックスを、配列の末尾に追加していく image_boxes.append(data) image_labels.append(i)
最後に、配列に代入された値をNumpy形式にして配列に格納し、画像ファイルのNumpy形式への変換が完了しました!
#iamge_boxとimage_labelの値を、Numpy形式に変換して代入 image_boxes = np.array(image_boxes) image_labels = np.array(image_labels)
これで、画像判別AIのために、画像ファイルをNumpy形式に変換してPythonで扱いやすくする作業の完了です!