I don’t see what the difference would be between duplicating images vs. using more epochs.
In both cases random transformations would be applied on the original data (in the first case you would just create copies of the original data and apply the transformations on them).
I’ll try to “visualize” it:
# duplicating data
initial_dataset = [0, 1, 2, 3]
dataset = [0, 1, 2, 3, 0, 1, 2, 3] # one epoch would contain 2*initial_dataset = 8 samples
loader = [trans(0), trans(1), trans(2), trans(3), trans(0), trans(1), trans(2), trans(3)] # each sample will be randomly transformed in this epoch

# keeping the original data
initial_dataset = [0, 1, 2, 3]
dataset = initial_dataset # one epoch would contain initial_dataset = 4 samples
loader = [trans(0), trans(1), trans(2), trans(3)] # each sample will be randomly transformed in this epoch
# train for 2 epochs
data_seen_in_2_epochs = [trans(0), trans(1), trans(2), trans(3), trans(0), trans(1), trans(2), trans(3)]