Tensorflowtf.image.decode_imageは形状を返しません
Tensorflow Tf Image Decode_image Returns No Shape
セマンティックセグメンテーションを行う場合、画像を読み取る手順を実行します。 TensorFlowによると 公式チュートリアル 使用しましたtf.data.Dataset
このAPI。
画像を読む公式の例によると、最初の私のコードは次のとおりです。
def load_image(filename, resized_shape): ''' :param filename: image file name :param resized_shape: Resized image size ''' image = tf.read_file(filename) image = tf.image.decode_png(image) image = tf.image.convert_image_dtype(image, tf.float32) image = tf.image.resize_images( image, size=resized_shape, method=tf.image.ResizeMethod.AREA) return image
トレーニング画像はpng
だからですフォーマットなので、decode_png
。
ここでも使用されますresize_images
小規模なテスト中に画像を減らすことでトレーニング速度を上げることができるため、機能します。
今のところ問題はありませんが、最近データセットを処理しているときに遭遇しましたjpg
トレーニング画像をフォーマットします。TensorFlowにはdecode_image
があることがわかりました。この関数は、画像形式を自動的に判別してからデコードできるようです。
しかし、それを使用した後、エラーが報告されました。このエラーはresize_images
にありますいつ:
ValueError: 'images' contains no shape.
によるとdecode_image
公式文書:
Returns: Tensor with type uint8 with shape [height, width, num_channels] for BMP , JPEG, and PNG images and shape [num_frames, height, width, 3] for GIF images.
返されたテンソルには形状がありますが、デバッグから形状が不明であることがわかるため、戻り値には形状がないはずです。少しグーグルした後、問題を解明できることがわからなかったので、この機能は一時的に利用できなくなりました。
しかし、私は解決策を見つけました:
def load_image(filename, resized_shape): ''' :param filename: image file name :param resized_shape: Resized image size ''' image = tf.read_file(filename) image = tf.cond( tf.image.is_jpeg(image), lambda: tf.image.decode_jpeg(image), lambda: tf.image.decode_png(image)) image = tf.image.convert_image_dtype(image, tf.float32) image = tf.image.resize_images( image, size=resized_shape, method=tf.image.ResizeMethod.AREA) return image
使用するだけですtf.cond()
機能スルーtf.image.is_jpeg(image)
画像がjpg
であるかどうかを確認しますフォーマットし、はいの場合は実行decode_jpeg
、そうでない場合は実行decode_png
。セマンティックセグメンテーションでは、ほとんどのトレーニング画像はjpg
であるためです。またはpng
、他の形式の画像はほとんどないため、1つの条件で十分です。
実はdecode_image
関数が使用されますtf.cond
判断するには、判断後にデコードしてからconvert_image_dtype
、なぜリターンに形がないのか、わかりません。
もう1つの方法は、tf.Tensor.set_shapeを使用することです。このメソッドをコードで使用するのは不便なので、試しませんでした。