Почему Tensorflow tf.image.decode_jpeg() поворачивает некоторые изображения на 90 градусов?

#image-processing #computer-vision #tensorflow2.0

Вопрос:

У меня есть много изображений, которые поворачиваются на 90 градусов, когда я использую Tensorflow tf.image.decode_jpeg() для чтения изображений в моем конвейере данных. Когда я смотрю на эти изображения на своем компьютере, они выглядят правильно ориентированными, и когда я читаю изображение с помощью cv2, они также выглядят правильно ориентированными. Однако, когда я читаю их с помощью Tensorflow tf.image.decode_jpeg(), они поворачиваются на 90 градусов. Кто-нибудь знает, почему или как я могу исправить это, чтобы они читали в правильной ориентации (это происходит не со всеми изображениями, но со многими)?

Чтобы показать, что я имею в виду, вот как выглядит образец изображения на моем компьютере или когда я читаю его с открытым резюме.

введите описание изображения здесь

Однако, когда я читаю его с помощью Tensorflow (tensorflow 2.4.0) в своем конвейере, многие изображения поворачиваются на 90 градусов, и, например, одно и то же изображение выглядит примерно так.

введите описание изображения здесь

Чтобы прочитать и увидеть изображение с помощью cv2, я делаю

 import cv2
import matplotlib.pyplot as plt
import tensorflow as tf

%matplotlib inline

plt.imshow(cv2.imread(image_file_path)[:, :, ::-1]))
 

Для чтения и просмотра многих повернутых изображений с помощью Tensorflow

 def decode_images(dataset_file_paths):
    '''
    tf_read_converted_file_path = tf.io.read_file(dataset_file_paths) 
    return tf.image.decode_jpeg(tf_read_converted_file_path)

def check_processed_images(files_path_dataset, processing_function):
'''Plots images to see what the processing looks like when it is mapped in from a dataset. 
This can be used to, for example, look see how the augmentation of images look.

Arguments:
    files_path_dataset: TF TensorSliceDataset of filenames.
    processing_function: function which is used to map each element in the dataset.
    
Return:
    plot of images'''

augmentation_dataset = files_path_dataset.map(processing_function).shuffle(50).batch(16)

plt.figure(figsize=(13, 13))
for images, labels in augmentation_dataset.take(1):
    for i in range(16):
        ax = plt.subplot(4, 4, i   1)
        plt.imshow(images[i].numpy())
        
####################
####################
# Look at a sample of images
# Take a directory of jpg images and create a TensorFlow dataset of filepaths
dirPath = type_in_a_directory_here
fileNames = tf.io.gfile.glob(f'{dirPath}/**/*.jpg')
fileNames = tf.random.shuffle(fileNames)
filenamesDs = tf.data.Dataset.from_tensor_slices(fileNames)

check_processed_images(filenamesDs, decode_images)
 

Приведенный выше код создаст сетку изображений, чтобы вы могли видеть. Например, все эти изображения на моем компьютере имеют рыболовную приманку, так что они горизонтальны, но когда я использую TensorFlow для обработки своих изображений, многие из них по какой-то причине поворачиваются на 90 градусов.

введите описание изображения здесь

Я делаю что-то не так, что Tensorflow вращает многие из моих изображений?

Ответ №1:

Это не вращение изображения, это pyplot, который представляет изображения в формате [W, H, D] (Ширина, высота, глубина), в то время как TensorFlow и OpenCV используют формат [H,W,D] .

Если вы хотите визуализировать изображение без поворота с помощью pyplot, вам следует перенести его с помощью tf.transpose

Ответ №2:

решенный: Я выяснил, в чем проблема. Все изображения расположены правильно при просмотре их в виде миниатюр и при открытии их с помощью программы «Предварительный просмотр» на моем Mac. Однако, когда я смотрю на фактические размеры изображений в соответствии с их свойствами, многие из них на самом деле должны выглядеть повернутыми на 90 градусов. Я понятия не имею, почему это происходит, но, насколько я понимаю, проблема была обнаружена.