1.COLLECT. Данные
- Предварительная обработка данных
- Визуализация данных
- Модель сборки
- Модель поезда
- Оценка обученной модели
- Сохранить обученную модель
- Прогнозировать на пользовательских данных
- Обнаружение в реальном времени
1.Collect Data.
В каждом обучении машины данные проблемы являются основными. Здесь данные собираются из Kaggle Отказ Данные – это подмножество этого набора данных, вы можете скачать его из здесь
2.Data Предварительная обработка
Перед обработкой данных, сначала структурируйте наши данные в правой папке. Для этого у нас есть два варианта:
- Используйте Tensorflow image_dataset_from_directory Отказ
- Загрузите файл CSV.
Здесь мы решили загрузить из файла CSV. Для этого мы изменяем имя изображения с маской и без маски.
С маска
# importing os module import os # Function to rename multiple files def main(): for count, filename in enumerate(os.listdir("DATASET/")): dst ="withmask." + str(count) + ".jpeg" src ='DATASET/'+ filename dst ='DATASET/'+ dst # rename() function will # rename all the files os.rename(src, dst) # Driver Code if __name__ == '__main__': # Calling main() function main()
Без маски
# importing os module import os # Function to rename multiple files def main(): for count, filename in enumerate(os.listdir("New folder/")): dst ="withoutmask." + str(count) + ".jpeg" src ='New folder/'+ filename dst ='New folder/'+ dst # rename() function will # rename all the files os.rename(src, dst) # Driver Code if __name__ == '__main__': # Calling main() function main()
Теперь переместите все изображения в одну папку и создайте Pandas DataFrame
Генерировать dataframe.
import pandas as pd filenames=os.listdir("FULL_DATA/") categories=[] for f_name in filenames: category=f_name.split('.')[0] if category=='withmask': categories.append('withmask') else: categories.append('withoutmask') df=pd.DataFrame({ 'filename':filenames, 'labels':categories })
Сохраните DataFrame в файл CSV.
Теперь данные в правильной структуре, мы можем загрузить данные
- Читать CSV-файл
- Shuffle DataFrame с)
- Поверните этикетку в массив логического
- Создайте проверку набор с помощью urs_test_split
- Переключение изображений в тензор
# Define image size IMG_SIZE = 224 # Function def process_image(image_path, image_size=IMG_SIZE): """ Takes an image file path and turns the image into a Tensor. """ # Read in an image file image = tf.io.read_file(image_path) # Turn the jpg image into numerical Tensor with 3 colour channel(RGB) image = tf.image.decode_jpeg(image,channels=3) # Convert the color channel values to (0-1) values image = tf.image.convert_image_dtype(image,tf.float32) # Resize the image to (224,224) image = tf.image.resize(image, size=[image_size,image_size]) return image
- Превращение данных в партии
# Create a function to return a tuple (image, label) def get_image_lable(image_path,label): """ Takes an image file path name and the label, processes the image and return a tuple (image, label). """ image = process_image(image_path) return image, label
# Define the batch size BATCH_SIZE = 32 # Function to convert data into batches def create_data_batches(X,y=None, batch_size=BATCH_SIZE,valid_data=False): """ Creates batches of data of image (X) and label (y) pairs. Shuffle the data if it's training data but doesn't shuffle if it's validation data. """ # If data is valid dataset (NO SHUFFLE) if valid_data: print("Creating valid data batches.........") data = tf.data.Dataset.from_tensor_slices((tf.constant(X), tf.constant(y))) data_batch = data.map(get_image_lable).batch(batch_size) return data_batch else: print("Creating train data batches.........") # Turn filepaths and labels into Tensors data = tf.data.Dataset.from_tensor_slices((tf.constant(X), tf.constant(y))) # Shuffling pathname and labels before mapping image processor fun data = data.shuffle(buffer_size=len(X)) data_batch = data.map(get_image_lable).batch(batch_size) return data_batch
import matplotlib.pyplot as plt # Create fun for viewing in a data batch def show_images(images, labels): """ Displays a plot of 25 images and their labels from a data batch. """ plt.figure(figsize=(20, 20)) for i in range(25): # Subplot ax = plt.subplot(5,5,i+1) plt.imshow(images[i]) plt.title(unique_category[labels[i].argmax()]) plt.axis("Off")
Позвони этому удовольствию
Для данных поезда
train_images, train_labels = next(train_data.as_numpy_iterator()) show_images(train_images,train_labels)
Для действительных данных
val_images, val_labels = next(val_data.as_numpy_iterator()) show_images(val_images, val_labels)
Здесь мы можем использовать Tensorflow Hub для предварительно обученных моделей. Для этой задачи мы используем MobileNet V2, которая является небольшой моделью.
- Установить input_shape = [ Нет, 224,224,3]
- Набор
- Используйте последовательную модель от TF.keras
# Create a fun to build a keras model def create_model(input_shape=INPUT_SHAPE,output_shape=OUTPUT_SHAPE, model_url=MODEL_URL): print("Building model with:", model_url) # Setup the model model = tf.keras.Sequential([ hub.KerasLayer(model_url), tf.keras.layers.Dense(units=output_shape, activation="softmax") ]) # Compile the model model.compile( loss = tf.keras.losses.BinaryCrossentropy(), optimizer = tf.keras.optimizers.Adam(), metrics = ["accuracy"] ) # Build the model model.build(input_shape) return model
Обучить модель на urch_data и valid_data для 25 эпох
Кроме того, добавьте раннюю остановку обратного вызова
model = create_model() model.summary()
С этой моделью Val_Loss составляет 0,0096, а точность почти 99,99%
Использование Model.Predict () на модели Val_data Возврат Numpy Array формы (_, 2)
Сохраните обученную модель с помощью Save_Model от KERAS.
Загрузка модели немного отличается от обычной Load_Model
model = load_model( 'model/model.h5', custom_objects={"KerasLayer": hub.KerasLayer})
Здесь мы должны предоставить custom_objects = {“Keraslayer”: Hub. Keraslayer} в функции Load_Model рядом с Model_Path.
Перед прогнозированием новых данных убедитесь, что он находится в правильной форме, а также правильный размер.
def test_data(path): demo = imread(path) demo = tf.image.convert_image_dtype(demo,tf.float32) demo = tf.image.resize(demo,size=[224,224]) demo = np.expand_dims(demo,axis=0) pred = model.predict(demo) result = unique_category[np.argmax(pred)] return result
В этом мы можем использовать нашу предварительно обученную модель с OpenCV, чтобы сделать обнаружение в реальном времени.
- Импорт библиотеки
- Используйте веб-камеру с CV2.Videocapture ()
- Используйте файл XML Haarcascade_frontalalaceface для обнаружения лица.
- Прогнозировать с загруженной моделью.
- Здесь вы можете узнать больше о проектах OpenCV.
Вы можете найти код REPO здесь
Vivek2509/конец к концу маска-детектор
Построить глубокую модель обучения для обнаружения маски
Построить глубокую модель обучения для обнаружения маски
Загрузить данные
Используйте модель Tensorflow Hub
Предсказанное изображение
Используйте OpenCV для обнаружения в реальном времени.
Эй, читатели, спасибо за ваше время. Если вам понравился блог, не забудьте ценить это.
Энтузиаст AI/ML | Блогер
Если у вас есть какие-либо вопросы или предложения, не стесняйтесь связаться со мной на
Оригинал: “https://dev.to/vivek2509/end-to-end-mask-detection-3ln6”