Ранее я неправильно прочитал вопрос. Вот ответ, который вы искали.
Мне удалось воссоздать вашу проблему, используя приведенный ниже код -
Код для воспроизведения проблемы - Выходные данные для обрезки изображения были все идентичны.
%tensorflow_version 2.x
import tensorflow as tf
from keras.preprocessing.image import load_img
from keras.preprocessing.image import img_to_array, array_to_img
from matplotlib import pyplot as plt
import numpy as np
AUTOTUNE = tf.data.experimental.AUTOTUNE
# Set the sub plot parameters
f, axarr = plt.subplots(5,4,figsize=(15, 15))
# Load just 4 images of Cifar10
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.cifar10.load_data()
images = x_train[:4]
for i in range(4):
axarr[0,i].title.set_text('Original Image')
axarr[0,i].imshow(x_train[i])
def data_augment(images):
image = tf.image.central_crop(images, np.random.uniform(0.50, 1.00)) # random crop central
image = tf.image.resize(image, (32,32)) # the original image size
return image
dataset = tf.data.Dataset.from_tensor_slices((images)).map(lambda x: data_augment(x)).repeat(4)
print(dataset)
ix = 0
i = 1
count = 0
for f in dataset:
crop_img = array_to_img(f)
axarr[i,ix].title.set_text('Crop Image')
axarr[i,ix].imshow(crop_img)
ix=ix+1
count = count + 1
if count == 4:
i = i + 1
count = 0
ix = 0
Вывод - 1-я строка - исходное изображение. Остальные строки представляют собой кадрированные изображения.
Что ж, это было очень сложно и предоставило два решения ниже -
Решение 1: Использование np.random.uniform
и tf.py_function
.
- Используется
np.random.uniform(0.50, 1.00)
. - Используется
tf.py_function
для украшения вызова функции - tf.py_function(data_augment, [x], [tf.float32])
.
Код для решения проблемы - Изображения на выходе обрезки теперь разные и не идентичны.
%tensorflow_version 2.x
import tensorflow as tf
from keras.preprocessing.image import load_img
from keras.preprocessing.image import img_to_array, array_to_img
from matplotlib import pyplot as plt
import numpy as np
AUTOTUNE = tf.data.experimental.AUTOTUNE
# Set the sub plot parameters
f, axarr = plt.subplots(5,4,figsize=(15, 15))
# Load just 4 images of Cifar10
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.cifar10.load_data()
images = x_train[:4]
for i in range(4):
axarr[0,i].title.set_text('Original Image')
axarr[0,i].imshow(x_train[i])
def data_augment(images):
image = tf.image.central_crop(images, np.random.uniform(0.50, 1.00)) # random crop central
image = tf.image.resize(image, (32,32)) # the original image size
return image
dataset = tf.data.Dataset.from_tensor_slices((images)).map(lambda x: tf.py_function(data_augment, [x], [tf.float32])).repeat(4)
ix = 0
i = 1
count = 0
for f in dataset:
for l in f:
crop_img = array_to_img(l)
axarr[i,ix].title.set_text('Crop Image')
axarr[i,ix].imshow(crop_img)
ix=ix+1
count = count + 1
if count == 4:
i = i + 1
count = 0
ix = 0
Вывод - 1-я строка является исходным изображением. Остальные строки представляют собой кадрированные изображения.
Решение 2: Использование tf.random.uniform
и tf.py_function
.
- Используется
tf.random.uniform(shape=(), minval=0.50, maxval=1).numpy()
. - Просто с помощью вышеуказанной опции код не работает, так как выдает ошибку
AttributeError: 'Tensor' object has no attribute 'numpy'
. Чтобы решить эту проблему, вам нужно украсить свою функцию с помощью tf.py_function(data_augment, [x], [tf.float32])
.
Код для решения проблемы - Изображения на выходе обрезки теперь разные и не идентичны .
%tensorflow_version 2.x
import tensorflow as tf
from keras.preprocessing.image import load_img
from keras.preprocessing.image import img_to_array, array_to_img
from matplotlib import pyplot as plt
import numpy as np
AUTOTUNE = tf.data.experimental.AUTOTUNE
# Set the sub plot parameters
f, axarr = plt.subplots(5,4,figsize=(15, 15))
# Load just 4 images of Cifar10
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.cifar10.load_data()
images = x_train[:4]
for i in range(4):
axarr[0,i].title.set_text('Original Image')
axarr[0,i].imshow(x_train[i])
def data_augment(images):
image = tf.image.central_crop(images, tf.random.uniform(shape=(), minval=0.50, maxval=1).numpy()) # random crop central
image = tf.image.resize(image, (32,32)) # the original image size
return image
dataset = tf.data.Dataset.from_tensor_slices((images)).map(lambda x: tf.py_function(data_augment, [x], [tf.float32])).repeat(4)
ix = 0
i = 1
count = 0
for f in dataset:
for l in f:
crop_img = array_to_img(l)
axarr[i,ix].title.set_text('Crop Image')
axarr[i,ix].imshow(crop_img)
ix=ix+1
count = count + 1
if count == 4:
i = i + 1
count = 0
ix = 0
Вывод - 1-я строка является исходным изображением. Остальные строки представляют собой кадрированные изображения.
Надеюсь, что это ответ на ваш вопрос. Счастливого обучения.