Flickr APIで取得した画像データをNumpy形式に変換してファイルに保存

Flickr APIで取得した画像データから関係のない画像を削除してクリーニングしたデータをnumpy形式のデータに変換してファイルに保存していく。

Flickr APIを使用して画像の取得に関しては下記の記事で取得している。

hanamichi-sukusuku.hatenablog.com

 

f:id:hanamichi_sukusuku:20210225150004p:plain

実行結果

imageディレクトリにphotos.npというファイル名でNumpy形式の画像データが格納される。

 

必要な変数の定義

outfile = "image/photos.npz" # 保存ファイル名
max_photo = 100 # 利用する写真の枚数
photo_size = 32 # 画像サイズ
x = # 画像データ
y = # ラベルデータ

 

main()関数の実行

if __name__ == '__main__':
  main()

 

main()関数、各フォルダの画像データを読み込み、glob_files()関数を呼び出しnumpy形式に変換してファイルに保存

f:id:hanamichi_sukusuku:20210225151606p:plain

glob_files()関数にファイルのパスとラベルデータを渡してx,yデータを生成。

np.savez()で複数のnumpy配列を保存。(ファイルパス, xデータ, yデータ)。

一つのnumpy配列の場合はnp.save()。

 

glob_files()関数、引数で受け取ったファイルパスの画像データをnumy形式に変換してx(画像データ),y(ラベルデータ)を作成

f:id:hanamichi_sukusuku:20210225152008p:plain

glob.glob()で引数で受け取ったパスの.jpgを含むファイル名を全て取得。

random.shuffle()でリストをランダムに並べ替える。

for文の中では100枚のデータを使用するのでif文で100枚を超えた時処理を止めるようにしている。

Pillowは画像処理ライブラリ。ここではPillowライブラリのImage関数を使用して画像の読み込みや色空間の変換を行っているがopencvのような高度な画像処理はできない。ただ、リサイズやトリミングなど簡単な処理はopencvを使用するよりも簡単に実装できるため状況によって使い分けるといい。

 

Image.open(読み込みたい画像のパス)

img.convert(変換したい色空間の指定)

img.resize*1でサイズ指定

np.asarray()で変換したいオブジェクトを指定。np.array()でもnp.asarray()でもnumpy形式への変換はできる。違いとしては引数に指定したオブジェクトが変更された時それを反映されるかされないか。

例(np.asarrayの引数がnp.ndarrayの時でないと下記の違い発生しない)

np.asarray

neko = [0,1,2,3]

neko = np.array(neko)

n = np.asarray(neko)

neko[0] = 100

print(neko)

print(n)

>>[100,1,2,3]

>>[100,1,2,3]

同期的に元のデータが変更すればasarrayで変換したデータも更新される。

np.array

neko = [0,1,2,3]

neko = np.array(neko)

n = np.array(neko)

neko[0] = 100

print(neko)

print(n)

>>[100,1,2,3]

>>[0,1,2,3]

np.arrayで変換したデータと元データは別物として扱われる。

 

*1:width, height