重磅干貨,第一時間送達 創(chuàng)建用于室內和室外火災檢測的定制InceptionV3和CNN架構。創(chuàng)建定制的CNN架構 import tensorflow as tf import keras_preprocessing from keras_preprocessing import image from keras_preprocessing.image import ImageDataGenerator TRAINING_DIR = "Train" training_datagen = ImageDataGenerator(rescale = 1./255, horizontal_flip=True, rotation_range=30, height_shift_range=0.2, fill_mode='nearest') VALIDATION_DIR = "Validation" validation_datagen = ImageDataGenerator(rescale = 1./255) train_generator = training_datagen.flow_from_directory(TRAINING_DIR, target_size=(224,224), class_mode='categorical', batch_size = 64) validation_generator = validation_datagen.flow_from_directory( VALIDATION_DIR, target_size=(224,224), class_mode='categorical', batch_size= 16) from tensorflow.keras.optimizers import Adam model = tf.keras.models.Sequential([ tf.keras.layers.Conv2D(96, (11,11), strides=(4,4), activation='relu', input_shape=(224, 224, 3)), tf.keras.layers.MaxPooling2D(pool_size = (3,3), strides=(2,2)), tf.keras.layers.Conv2D(256, (5,5), activation='relu'), tf.keras.layers.MaxPooling2D(pool_size = (3,3), strides=(2,2)), tf.keras.layers.Conv2D(384, (5,5), activation='relu'), tf.keras.layers.MaxPooling2D(pool_size = (3,3), strides=(2,2)), tf.keras.layers.Flatten(), tf.keras.layers.Dropout(0.2), tf.keras.layers.Dense(2048, activation='relu'), tf.keras.layers.Dropout(0.25), tf.keras.layers.Dense(1024, activation='relu'), tf.keras.layers.Dropout(0.2), tf.keras.layers.Dense(2, activation='softmax')])model.compile(loss='categorical_crossentropy', optimizer=Adam(lr=0.0001), metrics=['acc'])history = model.fit( train_generator, steps_per_epoch = 15, epochs = 50, validation_data = validation_generator, validation_steps = 15 ) 創(chuàng)建定制的InceptionV3模型 import tensorflow as tf import keras_preprocessing from keras_preprocessing import image from keras_preprocessing.image import ImageDataGeneratorTRAINING_DIR = "Train" training_datagen = ImageDataGenerator(rescale=1./255, zoom_range=0.15, horizontal_flip=True, fill_mode='nearest')VALIDATION_DIR = "/content/FIRE-SMOKE-DATASET/Test" validation_datagen = ImageDataGenerator(rescale = 1./255)train_generator = training_datagen.flow_from_directory( TRAINING_DIR, target_size=(224,224), shuffle = True, class_mode='categorical', batch_size = 128)validation_generator = validation_datagen.flow_from_directory( VALIDATION_DIR, target_size=(224,224), class_mode='categorical', shuffle = True, batch_size= 14) from tensorflow.keras.applications.inception_v3 import InceptionV3 from tensorflow.keras.preprocessing import image from tensorflow.keras.models import Model from tensorflow.keras.layers import Dense, GlobalAveragePooling2D, Input, Dropoutinput_tensor = Input(shape=(224, 224, 3)) base_model = InceptionV3(input_tensor=input_tensor, weights='imagenet', include_top=False)x = base_model.output x = GlobalAveragePooling2D()(x) x = Dense(2048, activation='relu')(x) x = Dropout(0.25)(x) x = Dense(1024, activation='relu')(x) x = Dropout(0.2)(x) predictions = Dense(2, activation='softmax')(x)model = Model(inputs=base_model.input, outputs=predictions)for layer in base_model.layers: layer.trainable = Falsemodel.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['acc'])history = model.fit( train_generator, steps_per_epoch = 14, epochs = 20, validation_data = validation_generator, validation_steps = 14) #To train the top 2 inception blocks, freeze the first 249 layers and unfreeze the rest.for layer in model.layers[:249]: layer.trainable = Falsefor layer in model.layers[249:]: layer.trainable = True#Recompile the model for these modifications to take effectfrom tensorflow.keras.optimizers import SGD model.compile(optimizer=SGD(lr=0.0001, momentum=0.9), loss='categorical_crossentropy', metrics=['acc'])history = model.fit( train_generator, steps_per_epoch = 14, epochs = 10, validation_data = validation_generator, validation_steps = 14) 實時測試 import cv2 import numpy as np from PIL import Image import tensorflow as tf from keras.preprocessing import image#Load the saved model model = tf.keras.models.load_model('InceptionV3.h5') video = cv2.VideoCapture(0)while True: _, frame = video.read()#Convert the captured frame into RGB im = Image.fromarray(frame, 'RGB')#Resizing into 224x224 because we trained the model with this image size. im = im.resize((224,224)) img_array = image.img_to_array(im) img_array = np.expand_dims(img_array, axis=0) / 255 probabilities = model.predict(img_array)[0] #Calling the predict method on model to predict 'fire' on the image prediction = np.argmax(probabilities) #if prediction is 0, which means there is fire in the frame. if prediction == 0: frame = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY) print(probabilities[prediction])cv2.imshow("Capturing", frame) key=cv2.waitKey(1) if key == ord('q'): break video.release() cv2.destroyAllWindows() 結論 如果本文對小伙伴有幫助,希望可以在文末來個“一鍵三連”。 交流群 |
|