def train(cfg, tub_names, new_model_path, base_model_path=None): """ use the specified data in tub_names to train an artifical neural network saves the output trained model as model_name """ X_keys = ['cam/image_array'] y_keys = ['user/angle', 'user/throttle'] new_model_path = os.path.expanduser(new_model_path) kl = KerasLinear() if base_model_path is not None: base_model_path = os.path.expanduser(base_model_path) kl.load(base_model_path) print('tub_names', tub_names) if not tub_names: tub_names = os.path.join(cfg.DATA_PATH, '*') tubgroup = TubGroup(tub_names) train_gen, val_gen = tubgroup.get_train_val_gen(X_keys, y_keys, batch_size=cfg.BATCH_SIZE, train_frac=cfg.TRAIN_TEST_SPLIT) total_records = len(tubgroup.df) total_train = int(total_records * cfg.TRAIN_TEST_SPLIT) total_val = total_records - total_train print('train: %d, validation: %d' % (total_train, total_val)) steps_per_epoch = total_train // cfg.BATCH_SIZE print('steps_per_epoch', steps_per_epoch) kl.train(train_gen, val_gen, saved_model_path=new_model_path, steps=steps_per_epoch, train_split=cfg.TRAIN_TEST_SPLIT)
def my_train(cfg, tub_names, model_name): ''' use the specified data in tub_names to train an artifical neural network saves the output trained model as model_name ''' X_keys = ['cam/image_array'] y_keys = ['user/angle', 'user/throttle'] def rt(record): record['user/angle'] = dk.utils.linear_bin(record['user/angle']) return record print('tub_names', tub_names) if not tub_names: tub_names = os.path.join(cfg.DATA_PATH, '*') tubgroup = TubGroup(tub_names) train_gen, val_gen = tubgroup.get_train_val_gen(X_keys, y_keys, record_transform=rt, batch_size=cfg.BATCH_SIZE, train_frac=cfg.TRAIN_TEST_SPLIT) model_path = os.path.expanduser(model_name) total_records = len(tubgroup.df) total_train = int(total_records * cfg.TRAIN_TEST_SPLIT) total_val = total_records - total_train print('train: %d, validation: %d' % (total_train, total_val)) steps_per_epoch = total_train // cfg.BATCH_SIZE print('steps_per_epoch', steps_per_epoch) train(train_gen, val_gen, saved_model_path=model_path, steps=steps_per_epoch, train_split=cfg.TRAIN_TEST_SPLIT)
def train(cfg, tub_names, new_model_path, base_model_path=None): """ use the specified data in tub_names to train an artifical neural network saves the output trained model as model_name """ X_keys = ['cam/image_array'] y_keys = ['user/angle', 'user/throttle'] new_model_path = os.path.expanduser(new_model_path) kl = KerasLinear() if base_model_path is not None: base_model_path = os.path.expanduser(base_model_path) kl.load(base_model_path) print('tub_names', tub_names) if not tub_names: tub_names = os.path.join(cfg.DATA_PATH, '*') tubgroup = TubGroup(tub_names) train_gen, val_gen = tubgroup.get_train_val_gen( X_keys, y_keys, batch_size=cfg.BATCH_SIZE, train_frac=cfg.TRAIN_TEST_SPLIT) print(train_gen[0]) print(type(train_gen)) print(len(train_gen))
def train(cfg, tub_names, model_name): ''' use the specified data in tub_names to train an artifical neural network saves the output trained model as model_name ''' X_keys = ['cam/image_array'] y_keys = ['user/angle', 'user/throttle'] def rt(record): record['user/angle'] = dk.utils.linear_bin(record['user/angle']) return record kl = KerasCategorical() print('tub_names', tub_names) if not tub_names: tub_names = os.path.join(cfg.DATA_PATH, '*') tubgroup = TubGroup(tub_names) train_gen, val_gen = tubgroup.get_train_val_gen(X_keys, y_keys, record_transform=rt, batch_size=cfg.BATCH_SIZE, train_frac=cfg.TRAIN_TEST_SPLIT) model_path = os.path.expanduser(model_name) total_records = len(tubgroup.df) total_train = int(total_records * cfg.TRAIN_TEST_SPLIT) total_val = total_records - total_train print('train: %d, validation: %d' % (total_train, total_val)) steps_per_epoch = total_train // cfg.BATCH_SIZE print('steps_per_epoch', steps_per_epoch) kl.train(train_gen, val_gen, saved_model_path=model_path, steps=steps_per_epoch, train_split=cfg.TRAIN_TEST_SPLIT)
def train(cfg, tub_names, new_model_path, base_model_path=None): """ 引数 tub_names 似て指定されたパスに格納されている tub データを学習データとして トレーニングを行い、引数 new_model_path にて指定されたパスへ学習済みモデルファイルを格納する。 引数: cfg 個別車両設定オブジェクト、`config.py`がロードされたオブジェクト。 tub_names 学習データとして使用するtubディレクトリのパスを指定する。 new_model_path トレーニング後モデルファイルとして保管するパスを指定する。 base_model_path ファインチューニングを行う場合、ベースとなるモデルファイルを指定する。 戻り値 なし """ # モデルの入力データとなる項目 X_keys = ['cam/image_array'] # モデルの出力データとなる項目 y_keys = ['user/angle', 'user/throttle'] # トレーニング後モデルファイルとして保管するパスをフルパス化 new_model_path = os.path.expanduser(new_model_path) # トレーニング後モデルファイルとして保管するパスをフルパス化 kl = KerasLinear() # ファインチューニングを行う場合は base_model_path にベースモデルファイルパスが指定されている if base_model_path is not None: # ベースモデルファイルパスをフルパス化 base_model_path = os.path.expanduser(base_model_path) # ベースモデルファイルを読み込む kl.load(base_model_path) print('tub_names', tub_names) # 引数tub_names 指定がない場合 if not tub_names: # config.py 上に指定されたデータファイルパスを使用 tub_names = os.path.join(cfg.DATA_PATH, '*') # Tub データ群をあらわすオブジェクトを生成 tubgroup = TubGroup(tub_names) # トレーニングデータGenerator、評価データGeneratorを生成 train_gen, val_gen = tubgroup.get_train_val_gen(X_keys, y_keys, batch_size=cfg.BATCH_SIZE, train_frac=cfg.TRAIN_TEST_SPLIT) # 全学習データ件数を取得 total_records = len(tubgroup.df) # トレーニングデータ件数の取得 total_train = int(total_records * cfg.TRAIN_TEST_SPLIT) # 評価データ件数の取得 total_val = total_records - total_train print('train: %d, validation: %d' % (total_train, total_val)) # 1epochごとのステップ数の取得 steps_per_epoch = total_train // cfg.BATCH_SIZE print('steps_per_epoch', steps_per_epoch) # トレーニングの開始 kl.train(train_gen, val_gen, saved_model_path=new_model_path, steps=steps_per_epoch, train_split=cfg.TRAIN_TEST_SPLIT)
def train(cfg, tub_names, new_model_path, base_model_path=None, model_class=''): """ use the specified data in tub_names to train an artifical neural network saves the output trained model as model_name """ X_keys = ['cam/image_array'] y_keys = ['user/angle', 'user/throttle'] new_model_path = os.path.expanduser(new_model_path) import tensorflow as tf config = tf.ConfigProto() config.gpu_options.allow_growth = True # dynamically grow the memory used on the GPU # config.log_device_placement=True sess = tf.Session(config=config) tf.keras.backend.set_session(sess) model_module, model_class_name = model_class.rsplit('.', 1) print("loading {} from {}...".format(model_class_name, model_module)) module = importlib.import_module(model_module) model_cls = getattr(module, model_class_name) kl = model_cls() if base_model_path is not None: base_model_path = os.path.expanduser(base_model_path) kl.load(base_model_path) print('tub_names', tub_names) if not tub_names: tub_names = os.path.join(cfg.DATA_PATH, '*') tubgroup = TubGroup(tub_names) top_view_transform = TopViewTransform(cfg.CAMERA_RESOLUTION) train_gen, val_gen = tubgroup.get_train_val_gen( X_keys, y_keys, batch_size=cfg.BATCH_SIZE, train_frac=cfg.TRAIN_TEST_SPLIT, train_record_transform=top_view_transform, val_record_transform=top_view_transform) total_records = len(tubgroup.df) total_train = int(total_records * cfg.TRAIN_TEST_SPLIT) total_val = total_records - total_train print('train: %d, validation: %d' % (total_train, total_val)) steps_per_epoch = total_train // cfg.BATCH_SIZE print('steps_per_epoch', steps_per_epoch) kl.train(train_gen, val_gen, saved_model_path=new_model_path, steps=steps_per_epoch, train_split=cfg.TRAIN_TEST_SPLIT)
def train(cfg, tub_names, new_model_path, base_model_path=None): """ use the specified data in tub_names to train an artifical neural network saves the output trained model as model_name """ X_keys = ['cam/image_array'] y_keys = ['user/angle', 'user/throttle'] def train_record_transform(record): """ convert categorical steering to linear and apply image augmentations """ record['user/angle'] = dk.util.data.linear_bin(record['user/angle']) # TODO add augmentation that doesn't use opencv return record def val_record_transform(record): """ convert categorical steering to linear """ record['user/angle'] = dk.util.data.linear_bin(record['user/angle']) return record new_model_path = os.path.expanduser(new_model_path) kl = KerasCategorical() if base_model_path is not None: base_model_path = os.path.expanduser(base_model_path) kl.load(base_model_path) print('tub_names', tub_names) if not tub_names: tub_names = os.path.join(cfg.DATA_PATH, '*') tubgroup = TubGroup(tub_names) train_gen, val_gen = tubgroup.get_train_val_gen( X_keys, y_keys, train_record_transform=train_record_transform, val_record_transform=val_record_transform, batch_size=cfg.BATCH_SIZE, train_frac=cfg.TRAIN_TEST_SPLIT) total_records = len(tubgroup.df) total_train = int(total_records * cfg.TRAIN_TEST_SPLIT) total_val = total_records - total_train print('train: %d, validation: %d' % (total_train, total_val)) steps_per_epoch = total_train // cfg.BATCH_SIZE print('steps_per_epoch', steps_per_epoch) kl.train(train_gen, val_gen, saved_model_path=new_model_path, steps=steps_per_epoch, train_split=cfg.TRAIN_TEST_SPLIT) kl.model.save(new_model_path + '.h5', save_format='h5')
def train(cfg, tub_names, model_name, resnet50, tensorboardlog_path): ''' use the specified data in tub_names to train an artifical neural network saves the output trained model as model_name ''' X_keys = ['cam/image_array'] y_keys = ['user/angle', 'user/throttle'] def rt(record): record['user/angle'] = dk.utils.linear_bin(record['user/angle']) return record if resnet50: print('Using resnet50') kl = KerasCategorical(cfg=cfg, modelType=ModelType.RESNET50) else: print('Using categorical') kl = KerasCategorical(cfg=cfg) if tensorboardlog_path: kl.activate_tensorboard_log(tensorboardlog_path) print('tub_names', tub_names) if not tub_names: tub_names = os.path.join(cfg.DATA_PATH, '*') tubgroup = TubGroup(tub_names) train_gen, val_gen = tubgroup.get_train_val_gen( X_keys, y_keys, record_transform=rt, batch_size=cfg.BATCH_SIZE, train_frac=cfg.TRAIN_TEST_SPLIT) model_path = os.path.expanduser(model_name) total_records = len(tubgroup.df) total_train = int(total_records * cfg.TRAIN_TEST_SPLIT) total_val = total_records - total_train print('train: %d, validation: %d' % (total_train, total_val)) steps_per_epoch = total_train // cfg.BATCH_SIZE print('steps_per_epoch', steps_per_epoch) kl.train(train_gen, val_gen, saved_model_path=model_path, steps=steps_per_epoch, train_split=cfg.TRAIN_TEST_SPLIT)
def train(cfg, tub_names, model_name): X_keys = ['cam/image_array'] y_keys = ['user/angle', 'user/throttle'] def rt(record): record['user/angle'] = donkeycar.utils.utils.linear_bin( record['user/angle']) return record def combined_gen(gens): import itertools combined_gen = itertools.chain() for gen in gens: combined_gen = itertools.chain(combined_gen, gen) return combined_gen kl = KerasCategorical() logger.info('tub_names', tub_names) if not tub_names: tub_names = os.path.join(cfg.DATA_PATH, '*') tubgroup = TubGroup(tub_names) train_gen, val_gen = tubgroup.get_train_val_gen( X_keys, y_keys, record_transform=rt, batch_size=cfg.BATCH_SIZE, train_frac=cfg.TRAIN_TEST_SPLIT) model_path = os.path.expanduser(model_name) total_records = len(tubgroup.df) total_train = int(total_records * cfg.TRAIN_TEST_SPLIT) total_val = total_records - total_train logger.info('train: %d, validation: %d' % (total_train, total_val)) steps_per_epoch = total_train // cfg.BATCH_SIZE logger.ino('steps_per_epoch', steps_per_epoch) kl.train(train_gen, val_gen, saved_model_path=model_path, steps=steps_per_epoch, train_split=cfg.TRAIN_TEST_SPLIT)
def train(cfg, tub_names, model_name): ''' use the specified data in tub_names to train an artifical neural network saves the output trained model as model_name ''' X_keys = ['cam/image_array'] y_keys = ['user/angle', 'user/throttle'] #use these offsets from the current frame as points to learn the future #steering values. frames = [0, 20, 40, 120] new_y_keys = [] for iFrame in frames: for key in y_keys: new_y_keys.append(key + "_" + str(iFrame)) y_keys = new_y_keys kl = KerasLinear(num_outputs=len(y_keys)) tubgroup = TubGroup(tub_names) train_gen, val_gen = tubgroup.get_train_val_gen( X_keys, y_keys, batch_size=cfg.BATCH_SIZE, train_frac=cfg.TRAIN_TEST_SPLIT) model_path = os.path.expanduser(model_name) total_records = len(tubgroup.df) total_train = int(total_records * cfg.TRAIN_TEST_SPLIT) total_val = total_records - total_train print('train: %d, validation: %d' % (total_train, total_val)) steps_per_epoch = total_train // cfg.BATCH_SIZE print('steps_per_epoch', steps_per_epoch) kl.train(train_gen, val_gen, saved_model_path=model_path, steps=steps_per_epoch, train_split=cfg.TRAIN_TEST_SPLIT)
def train(cfg, tub_names, model_name): ''' use the specified data in tub_names to train an artifical neural network saves the output trained model as model_name ''' X_keys = ['cam/image_array'] y_keys = ['user/angle', 'user/throttle'] def rt(record): record['user/angle'] = dk.utils.linear_bin(record['user/angle']) return record tubgroup = TubGroup(tub_names) model_path = os.path.expanduser(model_name) total_records = len(tubgroup.df) total_train = int(total_records * cfg.TRAIN_TEST_SPLIT) total_val = total_records - total_train print('train: %d, validation: %d' % (total_train, total_val)) steps_per_epoch = total_train // cfg.BATCH_SIZE print('steps_per_epoch', steps_per_epoch) if (hasattr(cfg, 'ENGINE') and cfg.ENGINE == "mxnet"): import donkeycar.parts.mxnetpart as mxp df = tubgroup.df train_df = train=df.sample(frac=cfg.TRAIN_TEST_SPLIT,random_state=200) val_df = df.drop(train_df.index) m1 = mxp.MxnetLinear() train_iter, val_iter = m1.get_train_val_iter(train_df, val_df, cfg.BATCH_SIZE) m1.train(train_iter, val_iter, saved_model_path=model_path, steps=steps_per_epoch, train_split=cfg.TRAIN_TEST_SPLIT) else: kl = KerasCategorical() train_gen, val_gen = tubgroup.get_train_val_gen(X_keys, y_keys, record_transform=rt, batch_size=cfg.BATCH_SIZE, train_frac=cfg.TRAIN_TEST_SPLIT) kl.train(train_gen, val_gen, saved_model_path=model_path, steps=steps_per_epoch, train_split=cfg.TRAIN_TEST_SPLIT)
import keras from donkeycar.parts.datastore import TubGroup from model import create_model verbose = 2 train_split = .8 X_keys = ['cam/image_array'] y_keys = ['user/angle'] tubgroup = TubGroup( "..\..\..\picar_sync\wide-36.6-day,..\..\..\picar_sync\wide-36.6-evening-ccw-recovery" ) train_gen, val_gen = tubgroup.get_train_val_gen(X_keys, y_keys, batch_size=10, train_frac=train_split) save_best = keras.callbacks.ModelCheckpoint('model_{val_loss:.4f}.hdf5', monitor='val_loss', verbose=verbose, save_best_only=True, mode='min') early_stop = keras.callbacks.EarlyStopping(monitor='val_loss', min_delta=.0005, patience=5, verbose=verbose, mode='auto') steps_per_epoch = 100
def train(cfg, tub_names, model_name, model_type): ''' use the specified data in tub_names to train an artifical neural network saves the output trained model as model_name ''' X_keys = ['cam/image_array'] y_keys = ['user/angle', 'user/throttle'] binning = dk.utils.linear_bin if model_type == "hres_cat": binning = dk.utils.linear_bin_hres def rt(record): record['user/angle'] = binning(record['user/angle']) return record kl = KerasCategorical() if model_type == 'linear': kl = KerasLinear() if model_type == 'categorical': kl = KerasCategorical() if model_type == 'hres_cat': kl = KerasHresCategorical() print('tub_names', tub_names) if not tub_names: tub_names = os.path.join(cfg.DATA_PATH, '*') tubgroup = TubGroup(tub_names) train_gen, val_gen = tubgroup.get_train_val_gen( X_keys, y_keys, record_transform=rt, batch_size=cfg.BATCH_SIZE, train_frac=cfg.TRAIN_TEST_SPLIT) if model_type == 'linear': train_gen, val_gen = tubgroup.get_train_val_gen( X_keys, y_keys, batch_size=cfg.BATCH_SIZE, train_frac=cfg.TRAIN_TEST_SPLIT) model_path = os.path.expanduser(model_name) total_records = len(tubgroup.df) total_train = int(total_records * cfg.TRAIN_TEST_SPLIT) total_val = total_records - total_train print('train: %d, validation: %d' % (total_train, total_val)) steps_per_epoch = total_train // cfg.BATCH_SIZE print('steps_per_epoch', steps_per_epoch) print(val_gen) history, save_best = kl.train(train_gen=train_gen, val_gen=val_gen, saved_model_path=model_path, steps=steps_per_epoch, train_split=cfg.TRAIN_TEST_SPLIT) plt.plot(history.history['loss']) plt.plot(history.history['val_loss']) plt.title('model loss : %f' % save_best.best) plt.ylabel('loss') plt.xlabel('epoch') plt.legend(['train', 'test'], loc='upper left') plt.savefig(model_path + '_' + model_type + '_loss_%f.png' % save_best.best)
show(fig, (1, 1, 1), "Predicted steering angle : {}".format(steering_angle), image) savefig(parameter['saved_images_folder'] + name) def load_N_make_prediction(self, path, name): image = load_image(path[0]) self.make_prediction(image, name) if __name__ == "__main__": X_keys = ['cam/image_array'] y_keys = ['user/angle', 'user/throttle'] tubgroup = TubGroup("./data/tub_29_18-09-09") train_gen, val_gen = tubgroup.get_train_val_gen(X_keys, y_keys, batch_size=32, train_frac=0.8) print("Fetching data ...") steering_angles = [] for _, user_data in train_gen: steering_angles.append(user_data[0]) print("%f frames.".format(len(steering_angles))) if 0: i = get_random_image_id(image_paths) save_3_views(image_paths[i], steering_angles[i], '3views.png') if 0: i = get_random_image_id(image_paths) save_3_views(image_paths[i],