ChainerCVで画像を出力する方法

ChainerCVで画像を出力する手順です。

目次

  1. 画像を出力する
  2. matplotlibを通じて出力する
  3. ダイレクトに出力する

画像を出力する

Chainerで画像を分類するような学習をさせているときに、ときどき画像を出力したくなることがあります。例えば、テストデータで不正解になったときの画像がどういうものだったのか見たいというような場合ですね。

学習用のデータがndarrayで出来ているので、ndarrayを操作すればいかようにもなります。

でもChainerCVに便利機能がありますので、そちらを使った方が楽です。

ChainerCVのバージョンは、0.13です。

matplotlibを通じて出力する

ChainerCVのVisualizationクラスのvis_imageを使うと、matplotlibでプロットができるようになります。つまり、matplotlibで表示したりファイル出力ができるということです。

chainercv.visualzations.vis_image(img, [ax])

変数

内容

img

ndarray

Chainerの様式の画像を表すndarrayオブジェクト。

ax

Axis

省略可。既定値はNone。matplotlibのaxisオブジェクト。

axを指定しない(Noneにする)と、新しく描画されます。

このメソッドを実行してからplt.show()すると、画像が表示されるわけです。

試してみましょう。

プロ生ちゃんの画像をデータセットとして読み込んで、それをmatplotlibで表示してみます。

元画像はこれです。 プロ生ちゃんのサイト からダウンロードしたイラストをクロップしてリサイズして背景色を付けました。この画像をkei.pngという名前で保存して、同じフォルダにkei.txtというラベルデータのテキストファイルを置いておきます。

元画像

コードはこういう感じです。

from matplotlib import pyplot as plt
from chainer.datasets import LabeledImageDataset
from chainercv.visualizations import vis_image

dataset_object = LabeledImageDataset('kei.txt')
image_data, label_index = dataset_object[0]

vis_image(image_data)
plt.show()

データセットといいながら、画像は1枚だけですけどね。

データセットとして画像を読み込むと、データセットはタプルのリストになります。タプルはイメージデータのndarrayとそのラベルインデックスの対になっています。

ですから、データセットのインデックス0を2つの変数に代入すると、画像部分とラベル部分に分けられます。

画像部分を取り出したら、それをvis_imageメソッドに入れて、plt.showします。

そうすると、こんな感じで表示されます。

matplotlibで表示

matplotlibが描画しているので、もちろんファイルに保存もできます。

ダイレクトに出力する

matplotlibを通さずファイルに出力したい場合は、ChainerCVのUtilsクラスのwrite_imageメソッドが使えます。

chainercv.utils.write_image(img, file, [format])

変数

内容

img

ndarray

Chainerの様式の画像を表すndarrayオブジェクト。

file

str, file

ファイル名。またはファイルオブジェクト。

format

str

省略可。既定値はNone。ファイルフォーマット。

formatは、file引数がファイル名でなくファイルオブジェクトのときだけ指定できます。bmpかjpegかpngのいずれかです。

では試してみましょう。

from chainer.datasets import LabeledImageDataset
from chainercv.utils import write_image

dataset_object = LabeledImageDataset('kei.txt')
image_data, label_index = dataset_object[0]

write_image(image_data, 'out.png')

データセットの読み込みは、前と同じです。

出力される画像はこうなります。

ファイル出力

軸とか余白とかを考えなくて良いので、こちらの方が好きです。

公開日

広告