def generator(data, opt, batch_size=cfg.BATCH_SIZE): num_records = len(data) while True: #shuffle again for good measure random.shuffle(data) for offset in range(0, num_records, batch_size): batch_data = data[offset:offset + batch_size] if len(batch_data) != batch_size: break b_inputs_img = [] b_vec_in = [] b_labels = [] b_vec_out = [] for seq in batch_data: inputs_img = [] vec_in = [] labels = [] vec_out = [] num_images_target = len(seq) iTargetOutput = -1 if opt['look_ahead']: num_images_target = cfg.SEQUENCE_LENGTH iTargetOutput = cfg.SEQUENCE_LENGTH - 1 for iRec, record in enumerate(seq): #get image data if we don't already have it if len(inputs_img) < num_images_target: if record['img_data'] is None: img_arr = load_scaled_image_arr( record['image_path'], cfg) if img_arr is None: break if aug: img_arr = augment_image(img_arr) if cfg.CACHE_IMAGES: record['img_data'] = img_arr else: img_arr = record['img_data'] inputs_img.append(img_arr) if iRec >= iTargetOutput: vec_out.append(record['angle']) vec_out.append(record['throttle']) else: vec_in.append(0.0) #record['angle']) vec_in.append(0.0) #record['throttle']) label_vec = seq[iTargetOutput]['target_output'] if look_ahead: label_vec = np.array(vec_out) labels.append(label_vec) b_inputs_img.append(inputs_img) b_vec_in.append(vec_in) b_labels.append(labels) if look_ahead: X = [np.array(b_inputs_img).reshape(batch_size,\ cfg.TARGET_H, cfg.TARGET_W, cfg.SEQUENCE_LENGTH)] X.append(np.array(b_vec_in)) y = np.array(b_labels).reshape( batch_size, (cfg.SEQUENCE_LENGTH + 1) * 2) else: X = [np.array(b_inputs_img).reshape(batch_size,\ cfg.SEQUENCE_LENGTH, cfg.TARGET_H, cfg.TARGET_W, cfg.TARGET_D)] y = np.array(b_labels).reshape(batch_size, 2) yield X, y
def generator(save_best, opts, data, batch_size, isTrainSet=True, min_records_to_train=1000): num_records = len(data) while True: if isTrainSet and opts['continuous']: ''' When continuous training, we look for new records after each epoch. This will add new records to the train and validation set. ''' records = gather_records(cfg, tub_names, opts) if len(records) > num_records: collate_records(records, gen_records, opts) new_num_rec = len(data) if new_num_rec > num_records: print('picked up', new_num_rec - num_records, 'new records!') num_records = new_num_rec save_best.reset_best() if num_records < min_records_to_train: print( "not enough records to train. need %d, have %d. waiting..." % (min_records_to_train, num_records)) time.sleep(10) continue batch_data = [] keys = list(data.keys()) random.shuffle(keys) kl = opts['keras_pilot'] if type(kl.model.output) is list: model_out_shape = (2, 1) else: model_out_shape = kl.model.output.shape if type(kl.model.input) is list: model_in_shape = (2, 1) else: model_in_shape = kl.model.input.shape has_imu = type(kl) is KerasIMU has_bvh = type(kl) is KerasBehavioral img_out = type(kl) is KerasLatent if img_out: import cv2 for key in keys: if not key in data: continue _record = data[key] if _record['train'] != isTrainSet: continue if continuous: #in continuous mode we need to handle files getting deleted filename = _record['image_path'] if not os.path.exists(filename): data.pop(key, None) continue batch_data.append(_record) if len(batch_data) == batch_size: inputs_img = [] inputs_imu = [] inputs_bvh = [] angles = [] throttles = [] out_img = [] out = [] for record in batch_data: #get image data if we don't already have it if record['img_data'] is None: filename = record['image_path'] img_arr = load_scaled_image_arr(filename, cfg) if img_arr is None: break if aug: img_arr = augment_image(img_arr) if cfg.CACHE_IMAGES: record['img_data'] = img_arr else: img_arr = record['img_data'] if img_out: rz_img_arr = cv2.resize(img_arr, (127, 127)) / 255.0 out_img.append(rz_img_arr[:, :, 0].reshape( (127, 127, 1))) if has_imu: inputs_imu.append(record['imu_array']) if has_bvh: inputs_bvh.append(record['behavior_arr']) inputs_img.append(img_arr) angles.append(record['angle']) throttles.append(record['throttle']) out.append([record['angle'], record['throttle']]) if img_arr is None: continue img_arr = np.array(inputs_img).reshape(batch_size,\ cfg.TARGET_H, cfg.TARGET_W, cfg.TARGET_D) if has_imu: X = [img_arr, np.array(inputs_imu)] elif has_bvh: X = [img_arr, np.array(inputs_bvh)] else: X = [img_arr] if img_out: y = [out_img, np.array(angles), np.array(throttles)] elif model_out_shape[1] == 2: y = [np.array([out]).reshape(batch_size, 2)] else: y = [np.array(angles), np.array(throttles)] yield X, y batch_data = []