code: def recursive_augmentation(self, data_groups, augmentation_num=0):
      if augmentation_num == len(self.augmentations):
          yield True
  
      else:
          # print 'BEGIN RECURSION FOR AUGMENTATION NUM', augmentation_num
  
          current_augmentation = self.augmentations[augmentation_num]
  
          for subaugmentation in current_augmentation["augmentation"]:
              subaugmentation.reset(augmentation_num=augmentation_num)
  
          for iteration in range(current_augmentation["iterations"]):
              for subaugmentation in current_augmentation[
                  "augmentation"
              ]:
                  subaugmentation.augment(
                      augmentation_num=augmentation_num
                  )
                  subaugmentation.iterate()
  
              lower_recursive_generator = self.recursive_augmentation(
                  data_groups, augmentation_num + 1
              )
  
              sub_augmentation_iterations = self.multiplier
              for i in range(augmentation_num + 1):
                  sub_augmentation_iterations /= self.augmentations[i][
                      "iterations"
                  ]
  
              for i in range(int(sub_augmentation_iterations)):
                  yield next(lower_recursive_generator)
  
imports: import os
  import csv
  import numpy
  import tables
  import copy
  from tqdm import tqdm
  from deepneuro.augmentation.augment import Copy
  from deepneuro.utilities.conversion import read_image_files
  from deepneuro.data.data_group import DataGroup
  from deepneuro.data.data_load import parse_directories, parse_filepaths, parse_hdf5, parse_csv, parse_numpy
  from deepneuro.utilities.util import add_parameter
label_desc: Use image node_id 17 for calling the DataCollection obj's underlying member method code with example usage: obj.recursive_augmentation(data_groups, augmentation_num) without return types