LoginSignup
6
7

More than 5 years have passed since last update.

初めてChainerCVを触ったときに困惑したこと

Posted at

本日は

最近はChainerに関する本がでていたり,ハンズオンがでてきたりとChainerに対する敷居も下がってきているように思えます(主観).

慣れてきたころに改めて

Chainer v3 ビギナー向けチュートリアル

をみるととても分かりやすいし得られることも多いです.この記事の後半でChainerCVでData Augmentationをすることを紹介していたのでChainerCVを触ってみようと思いました.

そこで引っかかったことを紹介します.

install

pip を使って一発です.

> pip install chainercv

困惑した現象

適用するケースによりますがData Augmentationの手法の一つとして画像の回転,反転をすることがあります.

image.png

たとえば上の letterF.png という名前で保存している画像を読み込んで画像の反転をしたいとします.

>>> from imageio import imread
>>> letter = imread('letterF.png')

Numpy を使う場合は flipud を使うことで上下反転できます.

numpy.flipud

>>> import numpy as np
>>> flip_np = np.flipud(letter)

image.png

一方 ChainerCV で行う場合は chainercv.transforms.flip を使います.

chainercv.transforms.flip

>>> img=transforms.flip(letter, y_flip=False, x_flip=True, copy=True)
>>> plt.imshow(img)

ちなみに出力画像は次のようになります.

image.png

まっしろ!!!

原因

原因は使い方に問題がありました.

ChainerCVのリポジトリのReadmeには次のようた但し書きが入っていました.

image.png

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))

image.png

できました. 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の形に整形されているようですね.

6
7
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
7