Entrenamiento modelo de detección de mascarillas II

Importación de bibliotecas relacionadas

from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.applications import MobileNetV2
from tensorflow.keras.layers import AveragePooling2D
from tensorflow.keras.layers import Dropout
from tensorflow.keras.layers import Flatten
from tensorflow.keras.layers import Dense
from tensorflow.keras.layers import Input
from tensorflow.keras.models import Model
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.applications.mobilenet_v2 import preprocess_input
from tensorflow.keras.preprocessing.image import img_to_array
from tensorflow.keras.preprocessing.image import load_img
from tensorflow.keras.utils import to_categorical
from sklearn.preprocessing import LabelBinarizer
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
from imutils import paths
import matplotlib.pyplot as plt
import numpy as np
import argparse
import os

Construya un analizador de parámetros y analice los parámetros

  • Conjuntos de datos: rutas de entrada para conjuntos de datos con y sin máscaras
  • plot: la ruta al gráfico de entrenamiento de salida, que se generará usando matplotlib
  • Modelo: la ruta de almacenamiento del modelo de detector de máscara generado
#path 为你文件夹路径
parser  = argparse.ArgumentParser()
parser .add_argument("-d", "--dataset", required=True, help="path to input dataset",default="path")
parser .add_argument("-p", "--plot", type=str, default="plot.png", help="path to output loss/accuracy plot")
parser .add_argument("-m", "--model", type=str,default="mask_detector.model",help="path to output face mask detector model")
args = vars(parser .parse_args())

Establecer tasa de aprendizaje, época, tamaño de lote

rate = 1e-4
epoch = 20
batch_size = 32

Construcción de conjuntos de datos

preprocess_input(), que es similar a una función de normalización que viene con keras bajo tensorflow, que normaliza la imagen entrante y puede acelerar la velocidad de procesamiento de la imagen. La función paths.list_images puede obtener directamente la ruta de la imagen debajo de la carpeta, incluso si hay subcarpetas.

imagePaths = list(paths.list_images(args['dataset']))
print(len(imagePaths))
data = []
labels = []
for imagePath in imagePaths:
    print(imagePath)
    label = imagePath.split(os.path.sep)[-2]
    #导入数据,调整size为(224, 224)
    image = load_img(imagePath, target_size=(224, 224))
    image = img_to_array(image)
    # 归一化
    image = preprocess_input(image)

    data.append(data)
    labels.append(labels)

data = np.array(data, dtype= 'float32')
labels = np.array(labels)
# 对图像标签的独热编码
encoder = LabelBinarizer()
labels = encoder.fit_transform(labels)
# 转为二进制
labels = to_categorical(labels)

#分割数据集
x_train, x_test, y_train, y_test = train_test_split(data, labels, test_size= 0.2, stratify= labels, random_state= 42)

aumento de datos

ImageDataGenerator() es el generador de imágenes en el módulo keras.preprocessing.image También puede mejorar los datos en el lote, expandir el tamaño del conjunto de datos y mejorar la capacidad de generalización del modelo. Tales como rotación, deformación, normalización, etc.

  • rotación_rango(): rango de rotación
  • width_shift_range(): rango de traducción horizontal
  • height_shift_range(): rango de traducción vertical
  • zoom_range(): rango de zoom
  • fill_mode: modo de relleno, constante, más cercano, reflejo
  • horizontal_flip(): giro horizontal
  • vertical_flip(): voltear verticalmente
aug = ImageDataGenerator(
	rotation_range=20,
	zoom_range=0.15,
	width_shift_range=0.2,
	height_shift_range=0.2,
	shear_range=0.15,
	horizontal_flip=True,
	fill_mode="nearest"
)

Ajuste fino del modelo

Ajustar la configuración es un proceso de tres pasos:

  1. Cargue pesos de MobileNet preentrenados con ImageNet
  2. Construya un nuevo encabezado FC y agréguelo a Baseline para reemplazar el anterior
  3. Congelar las capas base de la red: durante la retropropagación, los pesos de estas capas base no se actualizarán, mientras que los pesos de las capas principales se ajustarán
baseModel = MobileNetV2(weights='imagenet', include_top= False, input_tensor= Input(shape=(224, 224,3)))

headModel = baseModel.output
headModel = AveragePooling2D(pool_size = (7, 7)(headModel))
headModel = Flatten(name= 'flatten')(headModel)
headModel = Dense(128, activation= 'relu')(headModel)
headModel = Dropout(0.5)(headModel)
headModel = Dense(2, activation='softmax')(headModel)

model = Model(inputs = baseModel.input, outputs = headModel)
#冻结网络的基本层:在反向传播过程中,这些基本层的权重不会被更新,而头层的权重将被调整
for layer in baseModel.layers:
    layer.trainable = False
#使用Adam优化器、学习率衰减计划和二进制交叉熵编译我们的模型。
optimizer = Adam(lr = rate, decay = rate/epoch )
model.compile(loss="binary_crossentropy", optimizer=optimizer, metrics=["accuracy"])
#数据增强对象(aug)将提供一批经过修改的图像数据
H = model.fit(
	aug.flow(x_train, y_train, batch_size=batch_size),
	steps_per_epoch=len(x_train) // batch_size,
	validation_data=(x_train, y_train),
	validation_steps=len(x_train) // batch_size,
	epochs=x_train)
predIdxs = model.predict(x_test, batch_size=batch_size)

inserte la descripción de la imagen aquí

dibujar la curva de pérdida

N = epoch
plt.style.use("ggplot")
plt.figure()
plt.plot(np.arange(0, N), H.history["loss"], label="train_loss")
plt.plot(np.arange(0, N), H.history["val_loss"], label="val_loss")
plt.plot(np.arange(0, N), H.history["accuracy"], label="train_acc")
plt.plot(np.arange(0, N), H.history["val_accuracy"], label="val_acc")
plt.title("Training Loss and Accuracy")
plt.xlabel("Epoch #")
plt.ylabel("Loss/Accuracy")
plt.legend(loc="lower left")
plt.savefig(args["plot"])

Mostrar resultados:
inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/Peyzhang/article/details/126375137
Recomendado
Clasificación