У меня есть набор видео. Поскольку набор данных небольшой, я пытаюсь увеличить видеоданные. Я не нашел никаких ресурсов по увеличению видео, поэтому я думаю, что это сработает -
Теперь, допустим, я извлек 20 кадров из одного видео. Чтобы мои данные имели смысл, мне придется применить такое же увеличение к этим 20 кадрам. Как я могу этого добиться? Я также открыт для других библиотек, если это облегчит работу.
Я предполагаю, что некоторые изменения в аргументах ImageDataGenerator.flow_from_directory(...)
сделают свое дело. Вот фрагмент кода из документации Keras.
ImageDataGenerator.flow_from_directory(
directory,
target_size=(256, 256),
color_mode = "rgb",
classes=None,
class_mode = "categorical",
batch_size=32,
shuffle=True,
seed=None,
save_to_dir=None,
save_prefix = "",
save_format = "png",
follow_links=False,
subset=None,
interpolation = "nearest",
)
Заранее спасибо!
Я не уверен, что применение одного и того же увеличения к изображениям из одного и того же видео является лучшим подходом в этом случае. Хотя, как вы сказали, это имеет больше смысла, я думаю, что наличие различных дополнений может заставить сеть действительно сосредоточиться на неизменных в последовательности данных и может в конечном итоге помочь с переоснащением. Но это, вероятно, требует гораздо больше данных.
Вы можете использовать tf.data.Dataset
и применять преобразования после пакетной операции. Это потребует некоторой работы, чтобы сделать свой собственный итератор каталога (что-то вроде этого), но вот суть этого:
import tensorflow as tf
import matplotlib.pyplot as plt
from skimage import data
cats = tf.concat([data.chelsea()[None, ...] for i in range(24)], axis=0)
test = tf.data.Dataset.from_tensor_slices(cats)
def augment(tensor):
tensor = tf.cast(x=tensor, dtype=tf.float32)
tensor = tf.divide(x=tensor, y=tf.constant(255.))
tensor = tf.image.random_hue(image=tensor, max_delta=5e-1)
tensor = tf.image.random_brightness(image=tensor, max_delta=2e-1)
return tensor
test = test.batch(8).map(lambda x: augment(x))
fig = plt.figure()
plt.subplots_adjust(wspace=.1, hspace=.2)
images = next(iter(test))
for index, image in enumerate(images):
ax = plt.subplot(4, 2, index + 1)
ax.set_xticks([])
ax.set_yticks([])
ax.imshow(tf.clip_by_value(image, clip_value_min=0, clip_value_max=1))
plt.show()
Не то, чтобы по какой-то причине это не работает для tf.image.random_flip_left_right
.
Попробуйте установить
batch_size
равнымnumber _of_frames
или создайте свой собственный генератор