独習Pythonで自作AI。画像をNumPy形式に変換する方法についてまとめました。

2019-07-11

今回は、画像を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で扱いやすくする作業の完了です!