Neural Network Libraryで遊んでみる

SONYのNeural Network Libraryを使ってみてのメモとか。

NNLで画像を読み込みたい場合

モデルに画像を読み込ませるには、nnabla.utils.data_source_loaderモジュールで読み込ませる事が出来ます。

# -*- coding: utf-8 -*-
import PIL.Image
import nnabla.utils.data_source_loader as nn_dsl

X_SIZE = 28
Y_SIZE = 28

# shapeに指定したサイズにリサイズされて読み込まれます。
# paddingはされません。
np_img = nn_dsl.load_image(
    "testdata0.png",
    shape=(3, X_SIZE, Y_SIZE),
    normalize=False
)

# 読み込んだ画像のshapeのままだと、Pillowで利用出来ませんので
# Pillowで活用したい場合は以下のようにします。

np_pil = np_img.transpose(1, 2, 0)
imp_pil = PIL.Image.fromarray(np_pil)
img_pil.save("testdata1.png")

Pillowで読み込んだ画像をNNLで扱える構造にしたい場合

numpyモジュールを使います。

# -*- coding: utf-8 -*-

import numpy as np
import PIL.Image

X_SIZE = 28
Y_SIZE = 28

img_pil = PIL.Image.open(pathname)
img_pil.thumbnail((X_SIZE, Y_SIZE))

img_target = PIL.Image.new("RGB", (X_SIZE, Y_SIZE))

x_src, y_src = o_image.size
x_pos = (X_SIZE - x_src) >> 1
y_pos = (Y_SIZE - y_src) >> 1

img_target.paste(img_pil, (x_pos, y_pos))

data = img_target.getdata()

np_img = np.array(data, dtype=np.float32)
np_img = np_img.reshape((X_SIZE, Y_SIZE, 3))
np_img = np_img.transpose(2, 0, 1)

# normalizeする場合は、 np_img /= 255.0