tf.image.decode_imageでエラーValueError: ‘images’ contains no shape.

jpegやpngなど何種類かの拡張子の画像をまとめてTensorflowに流したかったが、decode_jpegやdecode_pngを拡張子に合わせて実装するのは面倒くさい。

decode_imageならbmpでもjpegでもgifでも何でもござれのようなのだが、その後にresize_imagesを使たら表題のエラーが発生してshapeがないと怒られた。

まずは関数を見てみる。

tf.io.decode_image  |  TensorFlow Core v2.4.1
Function for decode_bmp, decode_gif, decode_jpeg, and decode_png.

tf.io.decode_image(
    contents, channels=None, dtype=tf.dtypes.uint8, name=None,
    expand_animations=True
)

expand_animationsって何?

expand_animations

Controls the shape of the returned op’s output. If True, the returned op will produce a 3-D tensor for PNG, JPEG, and BMP files; and a 4-D tensor for all GIFs, whether animated or not. If, False, the returned op will produce a 3-D tensor for all file types and will truncate animated GIFs to the first frame.

読み込ませたファイルはjpegとgifが混ざっており、デフォルトでTrueのexpand_animationが適応されることで3次元テンソルと4次元テンソルがごちゃまぜになったのが原因ではないかと予想。

img = tf.io.read_file(filepath)
img = tf.image.decode_image(img, channels=3, expand_animations=False)
img = tf.image.resize(img, [256,256])

Falseにすることで、その後のリサイズも問題なく処理を行うことが出来た。

エラーは消え、無事にtf.dataを作ることが出来るようになった。

コメント

タイトルとURLをコピーしました