Почему некоторые изображения сохраняются правильно, а другие нет при использовании ImageDataGenerator и .flow ()? - PullRequest
0 голосов
/ 27 августа 2018

Я пытался дополнить некоторые тренировочные данные и соответствующие метки с помощью 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 Ответ

0 голосов
/ 07 сентября 2018

Так что мне удалось найти решение.Мне пришлось превратить каждое из моих изображений в массив размера (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')

Это работает так, как я хочу, но я знаю, что это действительно неэффективно, и я уверен, что есть лучший способ.Поэтому другие ответы все еще приветствуются.

...