深層学習において、分類問題でなく画像を出力とした場合を想定している。画像を出力にした場合にはそのままではOpenCVで可視化できない。
動作環境
- Ubuntu 16.04
- Python 3.5.2
- Chainer 3.2
- numpy 1.13.3
- opencv-python 3.2
画像をChainerの入力にするために変換する
OpenCVで画像を読み込むと縦、横、色数の順で構成された行列となっているが、Chainerで利用する時は色数、縦、横に変換する必要がある。さらに形式をuint8からfloat32にする必要がある。
def img2arr(imgs, norm=255, dtype=np.float32, gpu=-1):
"""
入力画像リストをChainerで利用するために変換する
[in] imgs: 入力画像リスト
[in] norm: 正規化する値(255であれば、0-255を0-1に正規化する)
[in] dtype: 変換するデータタイプ
[in] gpu: GPUを使用する場合はGPUIDを入力する
[out] 生成された行列
"""
shape = imgs[0].shape
w, h = shape[:2]
if(len(shape) == 2):
ch = 1
else:
ch = shape[2]
if(gpu >= 0):
return xp.array(imgs, dtype=dtype).reshape((-1, ch, w, h)) / norm
else:
return np.array(imgs, dtype=dtype).reshape((-1, ch, w, h)) / norm
Chainerの出力を表示するために変換する
先ほどとやっていることは同じだが、dtypeをuint8にするタイミングに注意が必要。1行で同時に処理しようとすると0と255のみで構成される画像として変換されてしまうため注意が必要。
def arr2img(arr, ch, size, norm=255, dtype=np.uint8):
"""
Chainerの出力をOpenCVで可視化するために変換する
[in] arr: Chainerから出力された行列
[in] ch: 画像に変換する際のチャンネル数
[in] size: 画像に変換する際の画像サイズ
[in] norm: 正規化をもとに戻す数(255であれば、0-1を0-255に変換する)
[in] dtype: 変換するデータタイプ
[out] OpenCV形式の画像に変換された行列
"""
y = np.array(arr).reshape((-1, size, size, ch)) * 255
return np.array(y, dtype=np.uint8)
もっといい方法があればコメントください。