model = ResNet50(input_shape=input_shape, weights=None, classes=num_classes) elif runmodel == "MNET": from keras.applications.mobilenet import MobileNet model = MobileNet(input_shape=input_shape, weights=None, classes=num_classes) elif runmodel == "CNN2": model = keras.models.load_model("leaf.CNN.h5") elif runmodel == "CNN": # Create the model model = Sequential() model.add( Conv2D(64, (3, 3), input_shape=input_shape, padding='same', activation='relu', kernel_constraint=maxnorm(3))) model.add(MaxPooling2D(pool_size=(2, 2))) model.add( Conv2D(128, (3, 3), padding='same', activation='relu', kernel_constraint=maxnorm(3))) model.add(MaxPooling2D(pool_size=(2, 2))) model.add( Conv2D(256, (3, 3), padding='same', activation='relu', kernel_constraint=maxnorm(3))) model.add(MaxPooling2D(pool_size=(2, 2)))
def DefineArchitecture(architectureName, classes, customImageSize): if architectureName == "VGG16": imageSize = 224 baseModel = VGG16(weights='imagenet', include_top=True) elif architectureName == "VGG19": imageSize = 224 baseModel = VGG19(weights='imagenet', include_top=True) elif architectureName == "ResNet50": imageSize = 224 baseModel = ResNet50(weights='imagenet', include_top=True) elif architectureName == "InceptionV3": imageSize = 299 baseModel = InceptionV3(weights='imagenet', include_top=True) elif architectureName == "InceptionResNetV2": imageSize = 299 baseModel = InceptionResNetV2(weights='imagenet', include_top=True) elif architectureName == "MobileNet": imageSize = 224 baseModel = MobileNet(weights='imagenet', include_top=True) elif architectureName == "MobileNetV2": imageSize = 224 baseModel = MobileNetV2(weights='imagenet', include_top=True) elif architectureName == "DenseNet121": imageSize = 224 baseModel = DenseNet121(weights='imagenet', include_top=True) elif architectureName == "DenseNet169": imageSize = 224 baseModel = DenseNet169(weights='imagenet', include_top=True) elif architectureName == "DenseNet201": imageSize = 224 baseModel = DenseNet201(weights='imagenet', include_top=True) elif architectureName == "Custom Model (1-Layer Network w 32 Filters)": imageSize = customImageSize baseModel = Sequential() baseModel.add( Conv2D(32, (3, 3), activation='relu', input_shape=(customImageSize, customImageSize, 3))) baseModel.add(MaxPooling2D(pool_size=(2, 2))) baseModel.add(Flatten()) baseModel.add(Dense(128, activation='relu')) baseModel.add(Dropout(0.5)) baseModel.add(Dense(classes, activation='softmax')) elif architectureName == "Custom Model (2-Layer Network)": imageSize = customImageSize baseModel = Sequential() baseModel.add( Conv2D(32, (3, 3), activation='relu', input_shape=(customImageSize, customImageSize, 3))) baseModel.add(MaxPooling2D(pool_size=(2, 2))) baseModel.add(Conv2D(32, (3, 3), activation='relu')) baseModel.add(MaxPooling2D(pool_size=(2, 2))) baseModel.add(Flatten()) baseModel.add(Dense(128, activation='relu')) baseModel.add(Dropout(0.5)) baseModel.add(Dense(classes, activation='softmax')) elif architectureName == "Custom Model (1-Layer Network w 64 Filters)": imageSize = customImageSize baseModel = Sequential() baseModel.add( Conv2D(64, (3, 3), activation='relu', input_shape=(customImageSize, customImageSize, 3))) baseModel.add(MaxPooling2D(pool_size=(2, 2))) baseModel.add(Flatten()) baseModel.add(Dense(128, activation='relu')) baseModel.add(Dropout(0.5)) baseModel.add(Dense(classes, activation='softmax')) elif architectureName == "Custom Model (1-Layer Network w 128 Filters)": imageSize = customImageSize baseModel = Sequential() baseModel.add( Conv2D(customImageSize, (3, 3), activation='relu', input_shape=(customImageSize, customImageSize, 3))) baseModel.add(MaxPooling2D(pool_size=(2, 2))) baseModel.add(Flatten()) baseModel.add(Dense(128, activation='relu')) baseModel.add(Dropout(0.5)) baseModel.add(Dense(classes, activation='softmax')) elif architectureName == "Custom Model (3-Layers)": imageSize = customImageSize baseModel = Sequential() baseModel.add( Conv2D(32, (3, 3), activation='relu', input_shape=(customImageSize, customImageSize, 3))) baseModel.add(MaxPooling2D(pool_size=(2, 2))) baseModel.add(Conv2D(32, (3, 3), activation='relu')) baseModel.add(MaxPooling2D(pool_size=(2, 2))) baseModel.add(Conv2D(64, (3, 3), activation='relu')) baseModel.add(MaxPooling2D(pool_size=(2, 2))) baseModel.add(Flatten()) baseModel.add(Dense(128, activation='relu')) baseModel.add(Dropout(0.5)) baseModel.add(Dense(classes, activation='softmax')) elif architectureName == "Custom Model (CFCN-Shallow)": imageSize = customImageSize # Create CNN architecture modelInput = Input(shape=(customImageSize, customImageSize, 3)) padding_1 = ZeroPadding2D(padding=1)(modelInput) conv2D_1a = Conv2D(32, (5, 5), strides=(2, 2), activation='relu')(padding_1) conv2D_1b = Conv2D(32, (11, 11), strides=(4, 4), activation='relu')(modelInput) # conv2D_1c = Conv2D(32, (5,5), activation='relu')(modelInput) conv2D_1 = Conv2D(32, (3, 3), activation='relu')(modelInput) pool_1 = MaxPooling2D((2, 2), strides=(2, 2))(conv2D_1) merged1 = keras.layers.concatenate([pool_1, conv2D_1a]) conv2D_2a = Conv2D(64, (5, 5), strides=(2, 2), activation='relu')(merged1) conv2D_2 = Conv2D(64, (3, 3), activation='relu')(merged1) # pool_2a = MaxPooling2D((4, 4), strides=(4,4))(conv2D_1c) pool_2 = MaxPooling2D((2, 2), strides=(2, 2))(conv2D_2) merged2 = keras.layers.concatenate([pool_2, conv2D_2a, conv2D_1b]) padding_2 = ZeroPadding2D(padding=1)(merged2) conv2D_3a = Conv2D(128, (5, 5), strides=(2, 2), activation='relu')(padding_2) conv2D_3 = Conv2D(128, (3, 3), activation='relu')(merged2) pool_3 = MaxPooling2D((2, 2), strides=(2, 2))(conv2D_3) merged3 = keras.layers.concatenate([pool_3, conv2D_3a]) dense = Flatten()(merged3) output = Dense(128, activation='relu')(dense) dropout = Dropout(0.5)(output) predictions = Dense(classes, activation='softmax')(dropout) baseModel = Model(inputs=modelInput, outputs=predictions) elif architectureName == "Custom Model (Linear-5 layers)": imageSize = customImageSize baseModel = Sequential() baseModel.add( Conv2D(128, (3, 3), activation='relu', input_shape=(customImageSize, customImageSize, 3))) baseModel.add(MaxPooling2D(pool_size=(2, 2))) baseModel.add(Conv2D(64, (3, 3), activation='relu')) baseModel.add(MaxPooling2D(pool_size=(2, 2))) baseModel.add(Conv2D(32, (3, 3), activation='relu')) baseModel.add(MaxPooling2D(pool_size=(2, 2))) baseModel.add(Conv2D(32, (3, 3), activation='relu')) baseModel.add(MaxPooling2D(pool_size=(2, 2))) baseModel.add(Conv2D(32, (3, 3), activation='relu')) baseModel.add(Flatten()) baseModel.add(Dropout(0.5)) baseModel.add( Dense(128, activation='relu', kernel_regularizer=regularizers.l2(0.01))) baseModel.add(Dropout(0.5)) baseModel.add( Dense(64, activation='relu', kernel_regularizer=regularizers.l2(0.01))) baseModel.add(Dense(classes, activation='softmax')) elif architectureName == "Custom Model (CFNC-Deep)": imageSize = customImageSize # Create CNN architecture modelInput = Input(shape=(customImageSize, customImageSize, 3)) padding_1 = ZeroPadding2D(padding=1)(modelInput) conv2D_1a = Conv2D(128, (3, 3), activation='relu')(modelInput) conv2d_1b = Conv2D(128, (5, 5), strides=(2, 2), activation='relu')(padding_1) conv2d_1c = Conv2D(128, (11, 11), strides=(4, 4), activation='relu')(modelInput) pool_1 = MaxPooling2D((2, 2), strides=(2, 2))(conv2D_1a) merged_1 = keras.layers.concatenate([pool_1, conv2d_1b]) conv2D_2a = Conv2D(64, (3, 3), activation='relu')(merged_1) conv2D_2b = Conv2D(64, (5, 5), strides=(2, 2), activation='relu')(merged_1) pool_2 = MaxPooling2D((2, 2), strides=(2, 2))(conv2D_2a) merged_2 = keras.layers.concatenate([pool_2, conv2D_2b, conv2d_1c]) pool_2a = MaxPooling2D((2, 2), strides=(2, 2))(merged_2) padding_2 = ZeroPadding2D(padding=1)(merged_2) conv2D_3a = Conv2D(32, (3, 3), activation='relu')(merged_2) conv2D_3b = Conv2D(32, (5, 5), strides=(2, 2), activation='relu')(padding_2) conv2D_2c = Conv2D(64, (11, 11), strides=(4, 4), activation='relu')(padding_2) pool_3 = MaxPooling2D((2, 2), strides=(2, 2))(conv2D_3a) merged_3 = keras.layers.concatenate([pool_3, conv2D_3b]) padding_3 = ZeroPadding2D(padding=1)(merged_3) conv2D_4a = Conv2D(32, (3, 3), activation='relu')(merged_3) conv2D_4b = Conv2D(32, (5, 5), strides=(2, 2), activation='relu')(padding_3) conv2D_4c = Conv2D(32, (5, 5), strides=(2, 2), activation='relu')(pool_2a) conv2D_4d = Conv2D(32, (7, 7), strides=(2, 2), activation='relu')(merged_3) pool_4 = MaxPooling2D((2, 2), strides=(2, 2))(conv2D_4a) merged_4 = keras.layers.concatenate( [pool_4, conv2D_4b, conv2D_2c, conv2D_4c]) conv2D_5 = Conv2D(32, (3, 3), activation='relu')(merged_4) merged_5 = keras.layers.concatenate([conv2D_5, conv2D_4d]) flatten = Flatten()(merged_5) dropout = Dropout(0.5)(flatten) dense_1 = Dense(128, activation='relu')(dropout) dropout = Dropout(0.5)(dense_1) dense_1 = Dense(64, activation='relu')(dropout) predictions = Dense(classes, activation='softmax')(dropout) baseModel = Model(inputs=modelInput, outputs=predictions) return imageSize, baseModel