From f9e3f87f2244cd937589a7e05a081e2cc45fb8b1 Mon Sep 17 00:00:00 2001 From: UditSoniJi <114995094+UditSoniJi@users.noreply.github.com> Date: Thu, 27 Oct 2022 18:37:07 +0530 Subject: [PATCH 1/2] created CNN-based camera model fingerprint --- .../VGG16_lr001_dr8_finalModel_plot.png | Bin 0 -> 23689 bytes Udit Soni/car-recognition-aws/evaluate.py | 66 ++++ Udit Soni/car-recognition-aws/matlabtester.py | 342 ++++++++++++++++++ 3 files changed, 408 insertions(+) create mode 100644 Udit Soni/car-recognition-aws/VGG16_lr001_dr8_finalModel_plot.png create mode 100644 Udit Soni/car-recognition-aws/evaluate.py create mode 100644 Udit Soni/car-recognition-aws/matlabtester.py diff --git a/Udit Soni/car-recognition-aws/VGG16_lr001_dr8_finalModel_plot.png b/Udit Soni/car-recognition-aws/VGG16_lr001_dr8_finalModel_plot.png new file mode 100644 index 0000000000000000000000000000000000000000..def0cceb4a58b12edde969c79301f9133b4df4cf GIT binary patch literal 23689 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 literal 0 HcmV?d00001 diff --git a/Udit Soni/car-recognition-aws/evaluate.py b/Udit Soni/car-recognition-aws/evaluate.py new file mode 100644 index 0000000..b5a9bd1 --- /dev/null +++ b/Udit Soni/car-recognition-aws/evaluate.py @@ -0,0 +1,66 @@ +''' +Created on 10 lut 2018 + +@author: mgdak +''' + +import os +import argparse +import sys +from pprint import pprint +import shutil as sh +import random +from keras.preprocessing.image import ImageDataGenerator +from keras.models import model_from_json +from keras.optimizers import SGD, RMSprop + +def main(args): + pprint(args) + + test_datagen = ImageDataGenerator(rescale=1. / 255) + test_generator = test_datagen.flow_from_directory( + args.test_data, + target_size=(224, 224), + batch_size=args.batch_size, + class_mode='categorical') + + + # load json and create model + json_file = open(args.model_name + '.json', 'r') + loaded_model_json = json_file.read() + json_file.close() + loaded_model = model_from_json(loaded_model_json) + # load weights into new model + loaded_model.load_weights(args.model_name + '.h5') + print('Loaded model from disk') + + # evaluate loaded model on test data + sgd = SGD(lr=args.learning_rate, decay=args.lr_decay, momentum=0.9, nesterov=True) + loaded_model.compile(optimizer=sgd, loss='categorical_crossentropy', metrics=['accuracy']) + score = loaded_model.evaluate_generator(test_generator, 3957/args.batch_size, workers=6) + print("%s: %.2f%%" % (loaded_model.metrics_names[1], score[1]*100)) + +def parse_arguments(argv): + + parser = argparse.ArgumentParser() + + parser.add_argument('--test_data', type=str, + help='Dir with test data to evaluate model on' + , default= './car_ims/tst') + + parser.add_argument('--model_name', type=str, + help='Saved model name location', default='./vgg16/tst/vgg16_lr001_dr7_decaye-4_finalModel') + + parser.add_argument('--batch_size', type=int, + help='Batch size', default=16) + + parser.add_argument('--lr_decay', type=float, + help='Learning rate decay.', default=1e-4) + + parser.add_argument('--learning_rate', type=float, + help='Initial learning rate.', default=0.001) + + return parser.parse_args(argv) + +if __name__ == "__main__": + main(parse_arguments(sys.argv[1:])) \ No newline at end of file diff --git a/Udit Soni/car-recognition-aws/matlabtester.py b/Udit Soni/car-recognition-aws/matlabtester.py new file mode 100644 index 0000000..723f78c --- /dev/null +++ b/Udit Soni/car-recognition-aws/matlabtester.py @@ -0,0 +1,342 @@ +''' +Created on 22 sty 2018 + + +3D Object Representations for Fine-Grained Categorization +Jonathan Krause, Michael Stark, Jia Deng, Li Fei-Fei +4th IEEE Workshop on 3D Representation and Recognition, at ICCV 2013 (3dRR-13). Sydney, Australia. Dec. 8, 2013. + +@author: mgdak +''' + +import os +import argparse +import sys +from pprint import pprint +import scipy.io as sio +from keras.preprocessing.image import ImageDataGenerator +from keras.layers import Dense, GlobalAveragePooling2D, Dropout +from keras.models import Model +import shutil as sh +from keras.applications.inception_v3 import InceptionV3 +from keras.applications.densenet import DenseNet121 +from keras import callbacks +from keras.applications.vgg19 import VGG19 +from keras.applications.vgg16 import VGG16 +from keras.optimizers import SGD, RMSprop +from matplotlib import pyplot as plt +from keras import regularizers +from keras.layers.core import Flatten +from keras.layers.normalization import BatchNormalization +from keras import backend as K + +train_data_dir = 'train' +val_data_dir = 'val' +nb_train_samples = 8144 +nb_val_samples = 8041 + +#Creates an array with following values: picture name, picture category ID, train/validation label +def readData(matFile): + content = sio.loadmat(matFile) + data = [(_[0][0][:],_[5][0][0],_[6][0][0]) for _ in content['annotations'][0]] + return data + +#Creates an array of all classes +def readClasses(matFile): + content = sio.loadmat(matFile) + classes = [(_[0]) for _ in content['class_names'][0]] + return classes + +#Movces raw data (pictures) into respective category subfolders with train/validation division +def dataPreprocessing(dataDir, labelsFile): + data = readData(labelsFile) + classes = readClasses(labelsFile) + print("---------------") + for recData in data: + if recData[2] == 1: + #validation set + os.makedirs(dataDir + "/" + val_data_dir + "/" + classes[recData[1] - 1] + "/", exist_ok=True) + sh.move(dataDir + "/" + recData[0][8:], dataDir + "/" + val_data_dir + "/" + classes[recData[1] - 1] + "/" + recData[0][8:]) + else: + os.makedirs(dataDir + "/" + train_data_dir + "/" + classes[recData[1] - 1] + "/", exist_ok=True) + sh.move(dataDir + "/" + recData[0][8:], dataDir + "/" + train_data_dir + "/" + classes[recData[1] - 1] + "/" + recData[0][8:]) #train set + +#serializes the trained model and its weights +def serializeModel(model, fileName): + # serialize model to JSON + model_json = model.to_json() + with open(fileName + ".json", "w") as json_file: + json_file.write(model_json) + model.save_weights(fileName + ".h5") + print("Saved model to disk") + + +def prepareDataGenerators(batchSize, srcImagesDir, labelsFile): + classes = readClasses(labelsFile) +# this is the augmentation configuration used for training + train_datagen = ImageDataGenerator( + rescale=1. / 255, + shear_range=0.2, + zoom_range=0.2, + horizontal_flip=True) +# this is the augmentation configuration used for testing: +# only rescaling + test_datagen = ImageDataGenerator(rescale=1. / 255) +# this is a generator that will read pictures found in +# subfolers of 'car_ims_dir/train', and indefinitely generate +# batches of augmented image data + train_generator = train_datagen.flow_from_directory( + srcImagesDir + "/" + train_data_dir + "/", # this is the target directory + target_size=(224, 224), # all images will be resized to 299x299 + batch_size=batchSize, + class_mode='categorical') # since we use categorical_crossentropy loss, we need categorical labels +# this is a similar generator, for validation data + validation_generator = test_datagen.flow_from_directory( + srcImagesDir + "/" + val_data_dir + "/", + target_size=(224, 224), + batch_size=batchSize, + class_mode='categorical') + return classes, train_generator, validation_generator + + +def getVGG16Architecture(classes, dropoutRate): + # create the base pre-trained model + base_model = VGG16(weights='imagenet', include_top=False, input_shape=(224, 224, 3)) + for layer in enumerate(base_model.layers): + layer[1].trainable = False + + #flatten the results from conv block + x = Flatten()(base_model.output) + + #add another fully connected layers with batch norm and dropout + x = Dense(4096, activation='relu')(x) + x = BatchNormalization()(x) + x = Dropout(dropoutRate)(x) + + #add another fully connected layers with batch norm and dropout + x = Dense(4096, activation='relu')(x) + x = BatchNormalization()(x) + x = Dropout(dropoutRate)(x) + + #add logistic layer with all car classes + predictions = Dense(len(classes), activation='softmax', kernel_initializer='random_uniform', bias_initializer='random_uniform', bias_regularizer=regularizers.l2(0.01), name='predictions')(x) + + # this is the model we will train + model = Model(inputs=base_model.input, outputs=predictions) + + return model + +def getVGG19Architecture(classes, dropoutRate): + # create the base pre-trained model + base_model = VGG19(weights='imagenet', include_top=False, input_shape=(224, 224, 3)) + for layer in enumerate(base_model.layers): + layer[1].trainable = False + + #flatten the results from conv block + x = Flatten()(base_model.output) + + #add another fully connected layers with batch norm and dropout + x = Dense(4096, activation='relu')(x) + x = BatchNormalization()(x) + x = Dropout(dropoutRate)(x) + + #add another fully connected layers with batch norm and dropout + x = Dense(4096, activation='relu')(x) + x = BatchNormalization()(x) + x = Dropout(dropoutRate)(x) + + #add logistic layer with all car classes + predictions = Dense(len(classes), activation='softmax', kernel_initializer='random_uniform', bias_initializer='random_uniform', bias_regularizer=regularizers.l2(0.01), name='predictions')(x) + + # this is the model we will train + model = Model(inputs=base_model.input, outputs=predictions) + + return model + +def getInceptionV3Architecture(classes, dropoutRate): + # create the base pre-trained model + base_model = InceptionV3(weights='imagenet', include_top=False, input_shape=(224, 224, 3)) + + # InceptionV3 + x = base_model.output + x = GlobalAveragePooling2D()(x) + + # let's add a fully-connected layer + x = Dense(1024, activation='relu', kernel_initializer='random_uniform', bias_initializer='random_uniform', bias_regularizer=regularizers.l2(0.01))(x) + + # add Dropout regularizer + x = Dropout(dropoutRate)(x) + + # and a logistic layer with all car classes + predictions = Dense(len(classes), activation='softmax', kernel_initializer='random_uniform', bias_initializer='random_uniform', bias_regularizer=regularizers.l2(0.01), name='predictions')(x) + + # this is the model we will train + model = Model(inputs=base_model.input, outputs=predictions) + + for layer in enumerate(base_model.layers): + layer[1].trainable = False + + return model + + +def setLayersToRetrain(model, modelArchitecture): + + if modelArchitecture == 'InceptionV3': + # we chose to train the top 2 inception blocks, i.e. we will freeze + # the first 249 layers and unfreeze the rest: + for layer in model.layers[:249]: + layer.trainable = False + + for layer in model.layers[249:]: + layer.trainable = True + elif modelArchitecture == 'VGG16': + #train the last conv block + for layer in model.layers[:15]: + layer.trainable = False + + for layer in model.layers[15:]: + layer.trainable = True + elif modelArchitecture == 'VGG19': + #train the last conv block + for layer in model.layers[:17]: + layer.trainable = False + + for layer in model.layers[17:]: + layer.trainable = True + + + +def initialTraining(optimazerLastLayer, noOfEpochs, batchSize, savedModelName, train_generator, validation_generator, model, modelArchitecture, lr_decay, learningRate): + # compile the model and train the top layer only + + rms = RMSprop(decay=lr_decay, lr=learningRate) + model.compile(optimizer=rms, loss='categorical_crossentropy', metrics=['accuracy']) + model.summary() + earlystop = callbacks.EarlyStopping(monitor='val_loss', min_delta=0, patience=5, mode='auto') + history = model.fit_generator( + train_generator, + steps_per_epoch=nb_train_samples // batchSize, + epochs=noOfEpochs, + validation_data=validation_generator, + validation_steps=nb_val_samples // batchSize, + callbacks=[earlystop]) + plt.plot(history.history['val_acc'], 'r') + plt.plot(history.history['acc'], 'b') + plt.title('Performance of model ' + modelArchitecture) + plt.ylabel('Accuracy') + plt.xlabel('Epochs No') + plt.savefig(savedModelName + '_initialModel_plot.png') + serializeModel(model, savedModelName + "_initialModel") + + +def finetuningTraining(learningRate, noOfEpochs, batchSize, savedModelName, train_generator, validation_generator, model, lr_decay): + # we need to recompile the model for these modifications to take effect + # we use SGD with a low learning rate + sgd = SGD(lr=learningRate, decay=lr_decay, momentum=0.9, nesterov=True) + model.compile(optimizer=sgd, loss='categorical_crossentropy', metrics=['accuracy']) + earlystop = callbacks.EarlyStopping(monitor='val_loss', min_delta=0, patience=5, mode='auto') + + # we train our model again (this time fine-tuning the top 2 inception blocks + # alongside the top Dense layers + history = model.fit_generator( + train_generator, + steps_per_epoch=nb_train_samples // batchSize, + epochs=noOfEpochs, + validation_data=validation_generator, + validation_steps=nb_val_samples // batchSize, + callbacks=[earlystop]) + plt.clf() + plt.plot(history.history['val_acc'], 'r') + plt.plot(history.history['acc'], 'b') + plt.savefig(savedModelName + '_finalModel_plot.png') + serializeModel(model, savedModelName + "_finalModel") + + +def model(learningRate, optimazerLastLayer, noOfEpochs, batchSize, savedModelName, srcImagesDir, labelsFile, modelArchitecture, dropoutRate, lr_decay): + + classes, train_generator, validation_generator = prepareDataGenerators(batchSize, srcImagesDir, labelsFile) + + if modelArchitecture == 'VGG16': + model = getVGG16Architecture(classes, dropoutRate) + elif modelArchitecture == 'VGG19': + model = getVGG19Architecture(classes, dropoutRate) + else: + model = getInceptionV3Architecture(classes, dropoutRate) + + initialTraining(optimazerLastLayer, noOfEpochs, batchSize, savedModelName, train_generator, validation_generator, model, modelArchitecture, lr_decay, learningRate) + + setLayersToRetrain(model, modelArchitecture) + + finetuningTraining(learningRate, noOfEpochs, batchSize, savedModelName, train_generator, validation_generator, model, lr_decay) + +def main(args): + pprint(args) + if args.process_data: + dataPreprocessing(args.car_ims_dir, args.car_ims_labels) + + K.clear_session() + + model(args.learning_rate, + args.optimizer_last_layer, + args.no_of_epochs, + args.batch_size, + args.saved_model_name, + args.car_ims_dir, + args.car_ims_labels, + args.model, + args.dropout_rate, + args.lr_decay) + +def str2bool(v): + if v.lower() in ('yes', 'true', 't', 'y', '1'): + return True + elif v.lower() in ('no', 'false', 'f', 'n', '0'): + return False + else: + raise argparse.ArgumentTypeError('Boolean value expected.') + +def parse_arguments(argv): + + parser = argparse.ArgumentParser() + + parser.add_argument('--process_data', + help='Divides the whole data set from Stanford (http://ai.stanford.edu/~jkrause/cars/car_dataset.html) into test and validation sets', + type=str2bool, + nargs='?', + const=True, + default=False) + + parser.add_argument('--car_ims_dir', type=str, + help='Directory where all pictures are located or where subfolder train/val are located', default='./car_ims') + + parser.add_argument('--car_ims_labels', type=str, + help='Points to the file with all labels', default='./cars_annos.mat') + + parser.add_argument('--learning_rate', type=float, + help='Initial learning rate.', default=0.001) + + parser.add_argument('--dropout_rate', type=float, + help='Fraction of the input units to drop.', default=0.7) + + parser.add_argument('--lr_decay', type=float, + help='Learning rate decay', default=1e-4) + + parser.add_argument('--optimizer_last_layer', type=str, choices=['ADAGRAD', 'ADADELTA', 'ADAM', 'RMSPROP', 'MOM'], + help='The optimization algorithm to use', default='RMSPROP') + + parser.add_argument('--model', type=str, choices=['VGG19', 'VGG16', 'InceptionV3'], + help='The optimization algorithm to use', default='VGG16') + + parser.add_argument('--no_of_epochs', type=int, + help='Number of epochs to run.', default=500) + + parser.add_argument('--batch_size', type=int, + help='Number of images to process in a batch.', default=64) + + parser.add_argument('--saved_model_name', type=str, + help='Number of images to process in a batch.', default='carRecognition') + + return parser.parse_args(argv) + +if __name__ == "__main__": + main(parse_arguments(sys.argv[1:])) \ No newline at end of file From 67d3d8410cbed59ff08474cd15f9c1d93ada46ab Mon Sep 17 00:00:00 2001 From: UditSoniJi <114995094+UditSoniJi@users.noreply.github.com> Date: Thu, 27 Oct 2022 18:44:07 +0530 Subject: [PATCH 2/2] Add files via upload --- .../createTestSetFromValidation.py | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 Udit Soni/car-recognition-aws/createTestSetFromValidation.py diff --git a/Udit Soni/car-recognition-aws/createTestSetFromValidation.py b/Udit Soni/car-recognition-aws/createTestSetFromValidation.py new file mode 100644 index 0000000..ba25230 --- /dev/null +++ b/Udit Soni/car-recognition-aws/createTestSetFromValidation.py @@ -0,0 +1,62 @@ +''' +Created on 5 lut 2018 + +@author: mgdak +''' + +import os +import argparse +import sys +from pprint import pprint +import shutil as sh +import random + +def main(args): + pprint(args) + + topDirs = os.listdir(args.src_dir) + + # This would print all the files and directories + for classDir in topDirs: + print(classDir) + files = os.listdir(args.src_dir + "/" + classDir) + train_start = int(len(files)*args.train_split_ratio) + tst_start = int(len(files)*args.tst_split_ratio) + random.shuffle(files) + #move train data + for j in range(train_start + tst_start, tst_start, -1): + os.makedirs(args.train_dst_dir + "/" + classDir, exist_ok=True) + sh.move(args.src_dir + "/" + classDir + "/" + files[j], + args.train_dst_dir + "/" + classDir + "/" + files[j]) + + #move tst data + for j in range(tst_start, 0, -1): + os.makedirs(args.tst_dst_dir + "/" + classDir, exist_ok=True) + sh.move(args.src_dir + "/" + classDir + "/" + files[j], + args.tst_dst_dir + "/" + classDir + "/" + files[j]) + +def parse_arguments(argv): + + parser = argparse.ArgumentParser() + + parser.add_argument('--tst_split_ratio', type=float, + help='Defines the split ratio from validation which has to be moved to the test' + , default=0.25) + + parser.add_argument('--train_split_ratio', type=float, + help='Defines the split ratio from validation which has to be moved to the train' + , default=0.5) + + parser.add_argument('--tst_dst_dir', type=str, + help='Destination directory for splited test data set', default='./car_ims/tst') + + parser.add_argument('--train_dst_dir', type=str, + help='Destination directory for splited train data set', default='./car_ims/train') + + parser.add_argument('--src_dir', type=str, + help='Source directory where validation data set is located', default='./car_ims/val') + + return parser.parse_args(argv) + +if __name__ == "__main__": + main(parse_arguments(sys.argv[1:])) \ No newline at end of file