本日は
最近はChainerに関する本がでていたり,ハンズオンがでてきたりとChainerに対する敷居も下がってきているように思えます(主観).
慣れてきたころに改めて
をみるととても分かりやすいし得られることも多いです.この記事の後半でChainerCVでData Augmentationをすることを紹介していたのでChainerCVを触ってみようと思いました.
そこで引っかかったことを紹介します.
install
pip
を使って一発です.
> pip install chainercv
困惑した現象
適用するケースによりますがData Augmentationの手法の一つとして画像の回転,反転をすることがあります.
たとえば上の letterF.png
という名前で保存している画像を読み込んで画像の反転をしたいとします.
>>> from imageio import imread
>>> letter = imread('letterF.png')
Numpy を使う場合は flipud
を使うことで上下反転できます.
>>> import numpy as np
>>> flip_np = np.flipud(letter)
一方 ChainerCV で行う場合は chainercv.transforms.flip
を使います.
>>> img=transforms.flip(letter, y_flip=False, x_flip=True, copy=True)
>>> plt.imshow(img)
ちなみに出力画像は次のようになります.
まっしろ!!!
原因
原因は使い方に問題がありました.
ChainerCVのリポジトリのReadmeには次のようた但し書きが入っていました.
Shape is CHW
という部分が大事でデータを (channel, height, width)
の形に整形しなければいけないようです.
>>> letter = imread('letterF.png')
>>> letter.shape
(256, 256, 4)
ほほー・・・.
こんなときは Numpyの配列を変更する numpy.transpose で軸を変更します.
img=transforms.flip(letter.transpose(2,1,0), y_flip=False, x_flip=True, copy=True)
plt.imshow(img.transpose(2,1,0))
できました. plt.imshow を使うときはまた transpose
で戻さなければいけません.
結論
- 自分の勘違いだった(ChainerCVの仕様です).
- (普段はグレースケールを扱っているため)カラー画像のハンドリングにはデータの構造に注意が向いていなかった.
- ドキュメントは読もう・・・.
ちなみに
Chainerが提供しているデーターセットを提供しているAPIで得た画像はどうなってるのかをみてみましょう.
>>> from chainer.datasets import cifar
>>> train_dataset, test_dataset = cifar.get_cifar10(scale=255.)
>>> example=train_dataset[0][0].astype(np.uint8)
>>> example.shape
(3, 32, 32)
すでにCHWの形に整形されているようですね.