diff --git a/DataPreparation/torcs_data_preparation.py b/DataPreparation/torcs_data_preparation.py index 4d6aa8fac4cf6838d4ad726622d6e3f187059092..3db16f76914530c12f5f32248c8e793afd8b54c7 100644 --- a/DataPreparation/torcs_data_preparation.py +++ b/DataPreparation/torcs_data_preparation.py @@ -4,6 +4,7 @@ import csv import cv2 import datetime import h5py +import matplotlib.pyplot as plt import mxnet as mx import numpy as np from PIL import Image @@ -12,6 +13,9 @@ from sklearn.cross_validation import train_test_split import tarfile import os +TEST_REC = "torcs_test.rec" +TRAIN_REC = "torcs_train.rec" + ARCHIVE = False CHUNK_SIZE = 10000 LEVELDB_PATH = "/media/sveta/4991e634-dd81-4cb9-bf46-2fa9c7159263/TORCS_Training_1F" @@ -19,34 +23,63 @@ HDF5_PATH = "/media/sveta/4991e634-dd81-4cb9-bf46-2fa9c7159263/TORCS_HDF5_3/" RAW_PATH = "/media/sveta/4991e634-dd81-4cb9-bf46-2fa9c7159263/TORCS_raw/" EXAMPLES_PATH = "/media/sveta/4991e634-dd81-4cb9-bf46-2fa9c7159263/TORCS_examples/" +TRAIN_MEAN = [99.39394537, 110.60877108, 117.86127587] +TRAIN_STD = [42.04910545, 49.47874084, 62.61726178] def main(): start_date = datetime.datetime.now() # leveldb_to_rec(start_date) - read_from_recordio() + # read_from_recordio() # compute_train_mean() + test_normalization() def compute_train_mean(): - record = mx.recordio.MXRecordIO(RAW_PATH + "torcs_train.rec", "r") - img_stats = [] - for i in range(50): + record = mx.recordio.MXRecordIO(RAW_PATH + TRAIN_REC, "r") + all_means = list() + all_std = list() + for i in range(387851): + if i % 1000 == 0: + print(i) item = record.read() header, img_as_array = mx.recordio.unpack_img(item) # img is RGB of shape (210, 280, 3) - # img = Image.fromarray(img_as_array) - # img.show() mean, std = cv2.meanStdDev(img_as_array) - mean_as_img = Image.fromarray(mean) - mean_as_img.show() - img_stats.append(np.array([mean[::-1] / 255, std[::-1] / 255])) - img_stats = np.mean(img_stats, axis=0) - print(img_stats) - + all_means.append(mean) + all_std.append(std) + # img_stats.append(np.array([mean[::-1] / 255, std[::-1] / 255])) + mean = np.mean(all_means, axis=0) + print("MEAN") + print(mean) + std = np.mean(all_std, axis=0) + print("STD") + print(std) + + +def test_normalization(): + width = 280 + height = 210 + data_mean = np.asarray([[[a] * width] * height for a in TRAIN_MEAN]) # (3, 280, 210) + data_std = np.asarray([[[a] * width] * height for a in TRAIN_STD]) + record = mx.recordio.MXRecordIO(RAW_PATH + TRAIN_REC, "r") + item = record.read() + header, img_as_array = mx.recordio.unpack_img(item) # (210, 280,3) + img = Image.fromarray(img_as_array) + img.show() + + normalized_img = (img_as_array - np.transpose(data_mean, (1, 2, 0)))/np.transpose(data_std, (1, 2, 0)) + plt.matshow(normalized_img[:,:,0]) + plt.show() + + plt.matshow(normalized_img[:,:,1]) + plt.show() + + plt.matshow(normalized_img[:,:,2]) + plt.show() def read_from_recordio(): - record = mx.recordio.MXRecordIO(RAW_PATH + "torcs_train.rec", "r") + record = mx.recordio.MXRecordIO(RAW_PATH + TRAIN_REC, "r") for i in range(50): item = record.read() header, img = mx.recordio.unpack_img(item) @@ -60,8 +93,8 @@ def read_from_recordio(): def leveldb_to_rec(start_date): - train_record = mx.recordio.MXRecordIO(RAW_PATH + "torcs_train.rec", "w") - test_record = mx.recordio.MXRecordIO(RAW_PATH + "torcs_test.rec", "w") + train_record = mx.recordio.MXRecordIO(RAW_PATH + TRAIN_REC, "w") + test_record = mx.recordio.MXRecordIO(RAW_PATH + TEST_REC, "w") keys = range(1, 484815) train_keys, test_keys = train_test_split(keys,test_size=0.2) diff --git a/GeneratedDpnetTrainingCode/CNNCreator_dpnet.py b/GeneratedDpnetTrainingCode/CNNCreator_dpnet.py index 9ed71b64e7b15743048a63a329b9f00a26d15743..3d22ca52c741c9d72414daad6096fd15c577504c 100644 --- a/GeneratedDpnetTrainingCode/CNNCreator_dpnet.py +++ b/GeneratedDpnetTrainingCode/CNNCreator_dpnet.py @@ -84,7 +84,7 @@ class CNNCreator_dpnet: def load_h5_files(self): train_h5 = None test_h5 = None - train_path = self._data_dir_ + "train_2.h5" + train_path = self._data_dir_ + "train.h5" test_path = self._data_dir_ + "test.h5" if os.path.isfile(train_path): train_h5 = h5py.File(train_path, 'r') @@ -113,7 +113,7 @@ class CNNCreator_dpnet: optimizer_params=(('learning_rate', 0.001),), load_checkpoint=True, context='gpu', - checkpoint_period=1, + checkpoint_period=5, normalize=True): if context == 'gpu': mx_context = mx.gpu() @@ -161,8 +161,8 @@ class CNNCreator_dpnet: self.module.fit( train_data=train_iter, - eval_metric='mse', eval_data=test_iter, + eval_metric='mse', optimizer=optimizer, optimizer_params=optimizer_params, batch_end_callback=mx.callback.Speedometer(batch_size), @@ -334,8 +334,3 @@ class CNNCreator_dpnet: data_names=self._input_names_, label_names=self._output_names_, context=context) - # print("start viz") - # graph = mx.viz.plot_network(predictions, shape={'image':(0,3,210,280), 'predictions_label':(0,14)}, node_attrs={"shape":'rect',"fixedsize":'false'}) - # # graph.format = 'png' - # graph.render('graph') - diff --git a/GeneratedDpnetTrainingCode/CNNTrainer_Dpnet.py b/GeneratedDpnetTrainingCode/CNNTrainer_Dpnet.py index 4b46ef06a973e7d1b1b3735bb3ff97f0a97fd4fc..11fd5d674ac93e8a9c84374716cd33e53bb8a56f 100644 --- a/GeneratedDpnetTrainingCode/CNNTrainer_Dpnet.py +++ b/GeneratedDpnetTrainingCode/CNNTrainer_Dpnet.py @@ -5,18 +5,23 @@ import CNNCreator_dpnet if __name__ == "__main__": logging.basicConfig(level=logging.DEBUG) logger = logging.getLogger() - handler = logging.FileHandler("train.log","w+", encoding=None, delay="true") + handler = logging.FileHandler("train.log","w", encoding=None, delay="true") logger.addHandler(handler) dpnet = CNNCreator_dpnet.CNNCreator_dpnet() dpnet.train( batch_size = 64, - num_epoch = 10, + num_epoch = 100, context = 'cpu', - normalize = False, + normalize = True, optimizer = 'sgd', optimizer_params = { 'weight_decay': 5.0E-4, - 'learning_rate': 0.01} + 'learning_rate_minimum': 0.01, + 'learning_rate_decay': 0.9, + 'step_size': 8000} + + + ) diff --git a/GeneratedDpnetTrainingCode/custom_functions.py b/GeneratedDpnetTrainingCode/custom_functions.py index 1b06e3c89a287b16f61fb7b9272cfe44d2dbca7c..b23c9d067d14ef3110e9fdc56f5944ba1ee99e50 100644 --- a/GeneratedDpnetTrainingCode/custom_functions.py +++ b/GeneratedDpnetTrainingCode/custom_functions.py @@ -1,11 +1,17 @@ import mxnet as mx +import numpy as np + +TRAIN_MEAN = [99.39394537, 110.60877108, 117.86127587] +TRAIN_STD = [42.04910545, 49.47874084, 62.61726178] def load_data_rec(self, batch_size): + width = 280 + height = 210 train_iter = mx.image.ImageIter( path_imgrec=self._data_dir_ + "torcs_train.rec", - data_shape=(3, 210, 280), # (channels, height, width) + data_shape=(3, height, width), # (channels, height, width) batch_size=batch_size, label_width=14, data_name='image', @@ -13,14 +19,14 @@ def load_data_rec(self, batch_size): ) test_iter = mx.image.ImageIter( path_imgrec=self._data_dir_ + "torcs_test.rec", - data_shape=(3, 210, 280), # (channels, height, width) + data_shape=(3, height, width), # (channels, height, width) batch_size=batch_size, label_width=14, data_name='image', label_name='predictions_label' ) - data_mean = None - data_std = None + data_mean = np.asarray([[[a] * width] * height for a in TRAIN_MEAN]) + data_std = np.asarray([[[a] * width] * height for a in TRAIN_STD]) return train_iter, test_iter, data_mean, data_std diff --git a/GeneratedDpnetTrainingCode/requirements-cpu.txt b/GeneratedDpnetTrainingCode/requirements-cpu.txt new file mode 100644 index 0000000000000000000000000000000000000000..16219d6b91b21ec1b3461ed0d4e4d5186354a772 --- /dev/null +++ b/GeneratedDpnetTrainingCode/requirements-cpu.txt @@ -0,0 +1,2 @@ +mxnet +h5py \ No newline at end of file diff --git a/GeneratedDpnetTrainingCode/requirements_gpu.txt b/GeneratedDpnetTrainingCode/requirements_gpu.txt new file mode 100644 index 0000000000000000000000000000000000000000..96f5298f60154f3d8467ab9cb001fee5b24f5e3d --- /dev/null +++ b/GeneratedDpnetTrainingCode/requirements_gpu.txt @@ -0,0 +1,2 @@ +mxnet-cu75 +h5py \ No newline at end of file