Come addestrare una rete neurale per classificare oggetti partendo da una rete pre addestrata. Esempio per il riconoscimento di volti con mascherina e senza mascherina.
In questo articolo farò vedere come usare una rete neurale convoluzionale preaddestrata per classificare e riconoscere dei volti di persone con mascherina e senza mascherina.
L’esempio è stato scritto per essere eseguito in colab o su Jupiter notebook, qui potete trovare l’esempio su colab.
Il rimo passo e recuperare un dataset idoneo allo scopo. Nella fattispecie sarà necessario recuperare una serie di immagini di persone con mascherina ed una seria di immagini di persone senza mascherina.
Per comodità lascio il link di un dataset di prova al seguente link.
Il dataset è organizzato in due directory :
——–> con_mask
——–> senza_mask
Dato che utilizzeremo una rete preaddestrata, per il nostro esempio utilizzeremo come backbone quello di una rete InceptionV3 pre-addestrata con dataset ImageNet. Vediamo come fare.
Prima di tutto dobbiamo importare le librerie necessarie:
from keras.applications import InceptionV3, inception_v3
from keras.layers import Dense from keras.models import Model from keras.preprocessing.image import ImageDataGenerator from keras.optimizers import Adam import pathlib import math import tensorflow as tf import matplotlib.pyplot as plt
backbone = InceptionV3(weights='imagenet', include_top=False, pooling="avg")
for l in backbone.layers: l.trainable = False
for l in backbone.layers: l.trainable = True
x = backbone.output x = Dense(1024, activation='relu')(x) x = Dense(1024, activation='relu')(x) x = Dense(512, activation='relu')(x)
classificatore = Dense(2, activation='softmax')(x)
model = Model(inputs=backbone.input, outputs=classificatore)
model.summary()
oppure posso esaminare graficamente i blocchi:
tf.keras.utils.plot_model(model,show_layer_names=True)
A questo punto compiliamo il modello indicando la loss function e l’ottimizzatore da utilizzare:
model.compile(loss="categorical_crossentropy", optimizer=Adam(lr=0.0001), metrics=["accuracy"])
e generiamo i dataset di traning e di validation a partire dalla nostra dir in cui abbiamo inserito le immagini categorizzate. Per fare ciò, prima tutto scarichiamo il dataset al path di cui sopra:
!wget https://www.domsoria.com/download/DATASET/MASKNOMASK/datasetMaskNoMask.zip
!unzip -a datasetMaskNoMask.zip -d "dataset" !rm -rf dataset/__MACOSX # rimuovo una cartella inutile creata con lo zip
dataset_dir = pathlib.Path('drive/MyDrive/DATASET/')
datagen = ImageDataGenerator(preprocessing_function=inception_v3.preprocess_input, rescale=1./255, shear_range=0.2, zoom_range=0.2, horizontal_flip=True, validation_split=0.2) # set validation split
train_data = datagen.flow_from_directory(dataset_dir, target_size=(224, 224), color_mode='rgb', batch_size=32, class_mode='categorical', shuffle=True, subset='training') val_data = datagen.flow_from_directory(dataset_dir, target_size=(224, 224), color_mode='rgb', batch_size=32, class_mode='categorical', shuffle=True, subset='validation')
Per l’addestramento provate ad utilizzare 10 epoche e vedrete che probabilmente otterrete una accuracy molto elevata.
hist = model.fit(train_data, steps_per_epoch=math.ceil(train_data.n / train_data.batch_size), epochs=10, verbose=1, validation_data=val_data)
Al termine dell’addestramento eseguiamo la seguente riga di codice per salvare il modello :
model.save_weights('model.h5')
attenzione se usate colab il modello salvato alla fine della sessione verrà cancellato.
In tal caso vi consiglio di salvare il modello ad esempio sul vostro drive google.
from google.colab import drive drive.mount('/content/drive') model.save_weights('drive/MyDrive/<Path su drive google>/model.h5')
Nel prossimo articolo farò vedere come fare la predict e quindi come utilizzare il modello salvato.
Qui potete trovare il link del progetto completo su github.
Sono amante della tecnologia e delle tante sfumature del mondo IT, ho partecipato, sin dai primi anni di università ad importanti progetti in ambito Internet proseguendo, negli anni, allo startup, sviluppo e direzione di diverse aziende; Nei primi anni di carriera ho lavorato come consulente nel mondo dell’IT italiano, partecipando attivamente a progetti nazionali ed internazionali per realtà quali Ericsson, Telecom, Tin.it, Accenture, Tiscali, CNR. Dal 2010 mi occupo di startup mediante una delle mie società techintouch S.r.l che grazie alla collaborazione con la Digital Magics SpA, di cui sono Partner la Campania, mi occupo di supportare ed accelerare aziende del territorio .
Attualmente ricopro le cariche di :
– CTO MareGroup
– CTO Innoida
– Co-CEO in Techintouch s.r.l.
– Board member in StepFund GP SA
Manager ed imprenditore dal 2000 sono stato,
CEO e founder di Eclettica S.r.l. , Società specializzata in sviluppo software e System Integration
Partner per la Campania di Digital Magics S.p.A.
CTO e co-founder di Nexsoft S.p.A, società specializzata nella Consulenza di Servizi in ambito Informatico e sviluppo di soluzioni di System Integration, CTO della ITsys S.r.l. Società specializzata nella gestione di sistemi IT per la quale ho partecipato attivamente alla fase di startup.
Sognatore da sempre, curioso di novità ed alla ricerca di “nuovi mondi da esplorare“.
Comments