NE.VAL.SYS.

NEvi VALuetion SYStem 

Ecco uno strumento avanzato per la diagnostica digitale per immagini dei nevi (nei), realizzato in Python, usando Keras e i DATASET dell’ ISIC, su piattaforma Raspberry 4 OS 64Bit utilizzando Tensoflow e TFlite (10 Epochs - Epoche).

Il modello  KERAS è stato addestrato su un DATASET di 5300 nevi maligni e 5300 nevi benigni, è stata fatta la fase di valutazione e test per far si che il modello non avesse overfitting.

In basso una rappresentazione 3D del file “.h5” generato dall’apprendimento del modello.

* Il codice è a disposizione di tutti per il download. 

import h5py

import plotly.graph_objects as go

import numpy as np

# Percorso del file caricato dall'utente

file_path = "skin_cancer_model.h5"



# Funzione per esplorare la struttura del file HDF5

def explore_hdf5_structure(hdf5_file):

    nodes = [("/", 0)]  # Assicura che la root sia nel grafo

    edges = []

    

    with h5py.File(hdf5_file, 'r') as f:

        def recursive_explore(group, parent_name, level):

            for key in group.keys():

                path = f"{parent_name.rstrip('/')}/{key}"  # Rimuove eventuali "/" in eccesso

                nodes.append((path, level))  

                edges.append((parent_name, path))  


                if isinstance(group[key], h5py.Group):

                    recursive_explore(group[key], path, level + 1)


        recursive_explore(f, "/", 1)  


    return nodes, edges


# Recupera nodi e archi

nodes, edges = explore_hdf5_structure(file_path)


# Convertire i dati per la visualizzazione

node_labels = [node[0] for node in nodes]

num_nodes = len(nodes)


# Generazione posizioni casuali per una distribuzione a nuvola

np.random.seed(42)  # Fissa il seed per risultati ripetibili

node_x = np.random.uniform(-1, 1, num_nodes)  # Coordinate X

node_y = np.random.uniform(-1, 1, num_nodes)  # Coordinate Y

node_z = np.random.uniform(-1, 1, num_nodes)  # Coordinate Z


# Creazione delle linee di collegamento

edge_x = []

edge_y = []

edge_z = []

for edge in edges:

    if edge[0] in node_labels and edge[1] in node_labels:

        parent_idx = node_labels.index(edge[0])

        child_idx = node_labels.index(edge[1])

        edge_x.extend([node_x[parent_idx], node_x[child_idx], None])  

        edge_y.extend([node_y[parent_idx], node_y[child_idx], None])

        edge_z.extend([node_z[parent_idx], node_z[child_idx], None])


# Creazione del grafico interattivo 3D

fig = go.Figure()


# Aggiunta delle connessioni

fig.add_trace(go.Scatter3d(

    x=edge_x, y=edge_y, z=edge_z,

    mode='lines',

    line=dict(color='black', width=1),

    hoverinfo='none'

))


# Aggiunta dei nodi

fig.add_trace(go.Scatter3d(

    x=node_x, y=node_y, z=node_z,

    mode='markers+text',

    marker=dict(size=5, color=node_z, colorscale='Viridis', showscale=True),

    text=node_labels,

    textposition="top center"

))


# Layout del grafico

fig.update_layout(

    title="Struttura del file HDF5 in una nuvola 3D",

    scene=dict(

        xaxis=dict(title="X"),

        yaxis=dict(title="Y"),

        zaxis=dict(title="Z"),

    ),

    showlegend=False

)


# Mostra il grafico

fig.show()