keras.preprocessingのrandom_rotationが回転してくれない時の対処

今回の話については、何が原因なのかわかっていません。
でも対処法があるので書いている次第です。

/**TLDR
keras.preprocessingのrandom_rotationがちゃんと回転してくれない時は

random_rotation(x,rg=360,row_axis=0,col_axis=1,channel_axis=2)

みたいに row_axis ,col_axis ,channel_axis もちゃんと指定してあげよう。
**/


/** ここから解説 **/
まずは現象が発生した僕の環境ですが
tensorflow 1.6 + keras 2.1.5です。

画像はまずarrayに変換する必要があります。
keras.preprocessingを使いますと、

img = load_img("sample.jpg", target_size=(200,300))
array = img_to_array(img) 

みたいにしますよね。ここで
print(array.shape)
として、arrayの構造を見てみますと、
(200,300,3)と出ます。
つまり(縦ピクセル数 , 横ピクセル数, チャネル)ですね。
よって、random_rotationを呼び出すときは
row_axis=0, 
col_axis=1, 
channel_axis=2,
が正しいわけです。ここまでよろしいでしょうか?


では、これらaxisを指定しない場合どうなるか...kerasのソースのデフォルト値を見てみましょう
https://github.com/tensorflow/tensorflow/blob/r1.7/tensorflow/python/keras/_impl/keras/preprocessing/image.py

row_axis=1,
col_axis=2,
channel_axis=0,

....ずれてる...
おいkeras!img_to_arrayも同じkeras.preprocessingなんだからちゃんと合わせようよ!www

実はこのkeras.preprocessing、他のrandom_zoomやrandom_shift関数でも全部ずれてます。
謎なのは、random_zoomやrandom_shiftの場合はrow_axis ,col_axis ,channel_axis を呼び出す時に指定しないでも(つまりデフォルト値で)正常に動作するのです...
random_rotationだけがダメなのです...

さて、今日の情報はお役に立ちましたでしょうか?

Comments