Почему некоторые изображения сохраняются правильно, а другие нет при использовании ImageDataGenerator и.flow()?
Я пытался дополнить некоторые тренировочные данные и соответствующие метки с помощью ImageDataGenerator.
Вот как я подошел (извиняюсь, если форматирование немного отключено)
def create_morph():
i = 0
img_type = 'png'
#get the path to all the images to be morphed
print ('getting morph path...')
imgs = glob(OG_PATH + "/*." + img_type)
#check how many images are in the morph path
print('length of imgs')
print(len(imgs))
#make two identical structured numpy arrays (num of images, rows, cols, binary). This is for loading into later
rows = 208
cols = 336
imgdatas = np.ndarray((len(imgs),rows,cols,1), dtype=np.uint8)
imglabels = np.ndarray((len(imgs),rows,cols,1), dtype=np.uint8)
#image-wise
for imgname in imgs:
print('inside for-loop')
midname = imgname[imgname.rindex("/")+1:]
img = load_img(OG_PATH + "/" + midname,grayscale = True)
label = load_img(GT_PATH + "/" + midname,grayscale = True)
#convert images to arrays
img = img_to_array(img)
label = img_to_array(label)
#make a big npy array
imgdatas[i] = img
imglabels[i] = label
if i % 100 == 0:
print('Done: {0}/{1} images'.format(i, len(imgs)))
i += 1
#setup the morph paramaters
morphData = dict(
horizontal_flip = True,
vertical_flip = True)
#assign the morphing to each label and og image
morph_img = ImageDataGenerator(**morphData)
morph_label = ImageDataGenerator(**morphData)
#apply morph to og images
print('saving to file')
a = 0
b = 0
for batch in morph_img.flow(
imgdatas,
save_to_dir = MORPHED_PATH + '/augment_results_im/',
batch_size = 1,
save_prefix = 'batch',
save_format = 'png'):
a+=1
if a > len(imgdatas):
break
print ('done with the OGs')
#apply morph to label images
for batch in morph_label.flow(
imglabels,
save_to_dir = MORPHED_PATH + '/augment_results_labels/',
batch_size = 1,
save_prefix = 'batch',
save_format = 'png'):
b+=1
if b > len(imgdatas):
break
print('done with labels')
Этот код работает для меня так, как я получаю перевернутые изображения, но проблема, с которой я сталкиваюсь, заключается в том, что он будет переворачивать только первые два изображения, но не остальные изображения в моих массивах imgdatas и imglabels. Остальные выходят пустыми. Смотрите здесь для примера. Я изучал этот пост и этот пост об итерации по.flow(), но все еще не уверен, почему только 2 изображения работают, когда я итерирую по.flow(). Есть идеи?
Также я не уверен, что означают названия изображений, похоже, что это случайное число, но не уверен, где оно было определено.
Спасибо за вашу помощь
1 ответ
Так что мне удалось найти решение. Мне пришлось превратить каждое из моих изображений в массив размера (1, строки, столбцы, каналы), а затем, для каждого изображения в этом массиве (которое всегда будет 1), увеличить его, если это имеет смысл. Сначала у меня был цикл for для циклического перебора всех изображений в каталоге и создания большого массива размера (total_images, rows, cols, channel), а затем я увеличил этот массив, как только это было сделано. По какой-то причине, которая не будет циклически проходить через весь массив, она просто сделает первые несколько изображений. Поэтому я изменил цикл for на следующий:
#image-wise
for imgname in range(1, len(imgs))
imgdatas = np.ndarray((1,208,336,1), dtype=np.uint8) # size of array to always contain 1 image
imglabels = np.ndarray((1,208,336,1), dtype=np.uint8)
img = load_img(OG_PATH + '/(%d).png' %(imgname), grayscale = True)
label = load_img(GT_PATH + '(%d).png' %(imgname), grayscale = True)
#convert images to arrays
img = img_to_array(img)
label = img_to_array(label)
#append to one big array
imgdatas[i] = img
imglabels[i] = label
#apply morph to og images
print('saving to file')
seed = 1
a = 0
for batch in morph_img.flow(
imgdatas,
batch_size = 1,
save_to_dir = 'morphed_og_path/',
save_prefix = str(imgname),
save_format = 'png',
seed = seed): # I added the seed as well so my originals and labels were being augmented the same way
a+=1
if a > 20:
break
print ('done with the OGs')
#apply morph to label images
b = 0
for batch in morph_label.flow(
imglabels,
batch_size = 1,
save_to_dir = 'morphed_labels_path/',
save_prefix = str(imgname),
save_format = 'png',
seed = seed):
b+=1
if b > 20:
break
print('done with labels')
Это работает так, как я хочу, но я знаю, что это действительно неэффективно, и я уверен, что есть лучший способ. Поэтому другие ответы все еще приветствуются.