物理の駅 Physics station by 現役研究者

テクノロジーは共有されてこそ栄える

Pythonの機械学習のための画像の前処理と後処理

  • 画像の読み込み(今回はグレー画像)
  • ROI (今回の画像は300×300pixel、中央56×56 pixelを使う)
  • リサイズ(伝統的なサンプルにならって28×28 pixelにするため0.5倍)
  • フリップ・回転(サンプル画像を8倍に増やすため)
  • revel() で1次元化
import cv2
import numpy as np
import matplotlib.pyplot as plt

def get_image_data(filename):
    img = cv2.imread(filename, cv2.IMREAD_GRAYSCALE).astype(np.float32)
    height = img.shape[0]//2
    width = img.shape[1]//2
    width2 = 28
    img1 = cv2.resize(img[height-width2:height+width2,width-width2:width+width2],None,fx=0.5,fy=0.5)
    img2 = cv2.flip(img1,0)
    img3 = cv2.flip(img1,1)
    img4 = cv2.flip(img1,-1)
    vimg=[]
    vimg=[img1,img2,img3,img4,np.rot90(img1),np.rot90(img2),np.rot90(img3),np.rot90(img4)]
    if False: # for debug
        for img in vimg:
            plt.imshow(img)
            plt.show()
    return [img.ravel() for img in vimg]
  • フォルダから画像ファイル一覧を作成、 extend で配列に詰めていく。
  • 同時に、判定結果である Y0 も作成する。
  • 最後に、np.array に変換し、再利用するために pickle で保存しておく。
import glob
import pickle

gomi_dir = r"./Gomi/*.png"
nonv_dir = r"./NonVertex/*.png"

gomi_files = glob.glob(gomi_dir)
nonv_files = glob.glob(nonv_dir)

X0 = []
Y0 = []

for file in gomi_files:
    X0.extend(get_image_data(file))
    Y0.extend([0.0 for _ in range(8)])
for file in nonv_files:
    X0.extend(get_image_data(file))
    Y0.extend([1.0 for _ in range(8)])

X = np.array(X0)
Y = np.array(Y0)

pickle.dump((X, Y), open("mydata.pickle",'wb'))

print("Data size:",len(X))