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、なぜリターンに形がないのか、わかりません。
画像

decode_image関数スニペット

もう1つの方法は、tf.Tensor.set_shapeを使用することです。このメソッドをコードで使用するのは不便なので、試しませんでした。