LoginSignup
43

More than 5 years have passed since last update.

画像等の配列を扱うときの操作方法

Last updated at Posted at 2018-10-14

pythonの配列の操作の仕方は記事が多数ありますが

画像とかkerasに特化した
作業に対してどう記述すればいいのかをまとめてみました

ええ、自分用メモです

画像を1枚だけNumpy配列にする(3次元)

(224,224,3)で入力
リサイズの時はtarget_size=(224,224)を変更
jpg,bmpは読込確認済み
裏でPILが動いているらしいのでおそらくpngも平気なはず

※2018.10.23 pngも読み書きOKでした

from keras.preprocessing.image import load_img, img_to_array

img_path = ('./' + ファイル名 + '.jpg')
img_3 = img_to_array(load_img(img_path, target_size=(224,224)))

3次元のNumpy配列をベクトル化する

3次元(224,224,3)をベクトル(1次元)化(150528)

import numpy as np

img_1 = np.ravel(img_3)

3次元のNumpy配列を4次元にする

Kerasで使用する、最初にサンプル数のついた4次元配列にする(1,224,224,3)

img_4 = img_3[None, ...]

4次元のNumpy配列を3次元にする

4次元配列(1,224,224,3)からサンプル数の位置を指定して3次元配列に(224,224,3)


#iはサンプル数の指定、0から始まるので注意
i=0
img_3 = img_4[i,:,:,]

フォルダ内の画像を全部まとめて4次元のNumpy配列にする【ex.(10,224,224,3)】

import glob
import numpy as np
from keras.preprocessing.image import load_img,img_to_array

#image  array size
img_size = (224,224)
#load images Folder
dir_name = 'test1'
#File type
file_type  = 'jpg'

#load images and image to array
img_list = glob.glob('./' + dir_name + '/*.' + file_type)

temp_img_array_list = []

for img in img_list:
    temp_img = load_img(img,grayscale=False,target_size=(img_size))
    temp_img_array = img_to_array(temp_img) /255
    temp_img_array_list.append(temp_img_array)

temp_img_array_list = np.array(temp_img_array_list)

細かい話は下記参照
https://qiita.com/tom_eng_ltd/items/286a8012527a3dd3c542

4次元のNumpy配列を2次元にする

4次元配列【ex.(10,224,224,3)】から2次元配列に【ex.(10,150528)】
SVMへの入力とかに使用できます

#保存先の配列を確保
temp_img_array_list = []

for i in range(10):
    #4次元データから3次元データを取り出し
    temp_img = img_4[i,:,:,]
    #3次元をベクトル(1次元)化
    temp_img = np.ravel(temp_img)
    #変換したNumpy配列を末尾に追加
    temp_img_array_list.append(temp_img)

#Numpy配列をリスト化
img_list = np.array(temp_img_array_list)

フォルダ内の画像を全部まとめて2次元配列化【ex.(10,150528)】

import glob
import numpy as np
from keras.preprocessing.image import load_img,img_to_array

#image  array size
img_size = (224,224)
#load images Folder
dir_name = 'test1'
#File type
file_type  = 'jpg'

#load images and image to array
img_list = glob.glob('./' + dir_name + '/*.' + file_type)

temp_img_array_list = []

for img in img_list:
    temp_img = load_img(img,grayscale=False,target_size=(img_size))
    temp_img_array = img_to_array(temp_img) /255
    temp_img_array = np.ravel(temp_img_array)
    temp_img_array_list.append(temp_img_array)

temp_img_array_list = np.array(temp_img_array_list)

Conv2Dの特長量から1ch抜き出す

特長量マップの4次元配列は「layer_output」とする(ex.1,14,14,512)
そこから2次元(14,14)を抽出

#iはチャンネル数で、この場合0-511
img_res = layer_output[0,:,:,i]

Conv2Dの特長量からマップの行列サイズとチャンネル数を取得する

特長量マップの4次元配列は「layer_output」とする(ex.1,14,14,512)

#G:行 R:列 ch:チャンネル数
G, R, ch = layer_output.shape[1:]

#G = 14
#R = 14
#ch = 512

4次元の画像配列から一部分を取り出し

cifar10とかのデータセットから必要数だけ取り出したい時とかに
x_train(50000,32,32,3)からx_train(1000,32,32,3)へ

#1000枚目まで
x_train = x_train[:1000]

#49000枚目以降の1000枚
x_train = x_train[49000:]

#1000-2000枚目の1000枚
x_train = x_train[1000:2000]

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
43