Visualizzazione della matrice di confusione per un modello - Rekognition

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Visualizzazione della matrice di confusione per un modello

Una matrice di confusione consente di visualizzare le etichette che il modello confonde con altre etichette del modello. Utilizzando una matrice di confusione, è possibile concentrare i miglioramenti sul modello.

Durante la valutazione del modello, Amazon Rekognition Custom Labels crea una matrice di confusione utilizzando le immagini di test per identificare etichette erroneamente identificate (confuse). Amazon Rekognition Custom Labels crea solo una matrice di confusione per i modelli di classificazione. La matrice di classificazione è accessibile dal file di riepilogo creato da Amazon Rekognition Custom Labels durante l’addestramento del modello. Non puoi visualizzare la matrice di confusione nella console Amazon Rekognition Custom Labels.

Utilizzo di una matrice di confusione

La tabella seguente è la matrice di confusione per il progetto di esempio Classificazione di immagini di stanze. Le intestazioni delle colonne sono le etichette (etichette di dati acquisiti sul campo) assegnate alle immagini di test. Le intestazioni delle righe sono le etichette che il modello prevede per le immagini di test. Ogni cella è la percentuale di previsioni per un'etichetta (riga) che dovrebbe essere l'etichetta di dati acquisiti sul campo (colonna). Ad esempio, il 67% delle previsioni relative a bagni sono state etichettate correttamente come bagni. Il 33% percento dei bagni è stato erroneamente etichettato come cucina. Un modello ad alte prestazioni ha valori di cella elevati quando l'etichetta prevista corrisponde all'etichetta di dati acquisiti sul campo. Puoi vederli come una linea diagonale dalla prima all'ultima etichetta prevista e di dati acquisiti sul campo. Se il valore di una cella è 0, non sono state fatte previsioni per l'etichetta prevista della cella, che dovrebbe essere l'etichetta di dati acquisiti sul campo della cella.

Nota

Poiché i modelli non sono deterministici, i valori delle celle della matrice di confusione ottenuti durante l'addestramento del progetto Stanze potrebbero differire dalla tabella seguente.

La matrice di confusione identifica le aree su cui concentrarsi. Ad esempio, la matrice di confusione mostra che nel 50% dei casi il modello ha confuso armadi con camere da letto. In questa situazione, è necessario aggiungere altre immagini di armadi e camere da letto al set di dati di addestramento. Verificate inoltre che le immagini esistenti di armadi e camere da letto siano etichettate correttamente. Ciò dovrebbe aiutare il modello a distinguere meglio tra le due etichette. Per aggiungere altre immagini a un set di dati, consulta Aggiungere altre immagini a un set di dati.

Sebbene la matrice di confusione sia utile, è importante considerare altre metriche. Ad esempio, il 100% delle previsioni ha trovato correttamente l'etichetta planimetria, che indica prestazioni eccellenti. Tuttavia, il set di dati di test ha solo 2 immagini con l'etichetta planimetria. Ha anche 11 immagini con l'etichetta soggiorno. Questo squilibrio è presente anche nel set di dati di addestramento (13 immagini soggiorno e 2 immagini armadio). Per ottenere una valutazione più accurata, bilanciate i set di dati di addestramento e di test aggiungendo altre immagini di etichette sottorappresentate (planimetrie in questo esempio). Per ottenere il numero di immagini di test per etichetta, consulta. Accesso alle metriche di valutazione (Console)

Etichetta di dati acquisiti sul campo
Etichetta prevista cortile interno bagno camera da letto armadio ingresso planimetria cortile cucina soggiorno patio
cortile interno 75% 0% 0% 0% 0% 0% 33% 0% 0% 0%
bagno 0% 67% 0% 0% 0% 0% 0% 0% 0% 0%
camera da letto 0% 0% 82% 50% 0% 0% 0% 0% 9% 0%
armadio 0% 0% 0% 50% 0% 0% 0% 0% 0% 0%
ingresso 0% 0% 0% 0% 33% 0% 0% 0% 0% 0%
planimetria 0% 0% 0% 0% 0% 100% 0% 0% 0% 0%
cortile 25% 0% 0% 0% 0% 0% 67% 0% 0% 0%
cucina 0% 33% 0% 0% 0% 0% 0% 88% 0% 0%
soggiorno 0% 0% 18% 0% 67% 0% 0% 12% 91% 33%
patio 0% 0% 0% 0% 0% 0% 0% 0% 0% 67%

Ottenere la matrice di confusione per un modello

Il codice seguente utilizza le operazioni DescribeProjectsand DescribeProjectVersions per ottenere il file di riepilogo di un modello. Utilizza quindi il file di riepilogo per visualizzare la matrice di confusione per il modello.

Visualizzare la matrice di confusione per un modello (SDK)
  1. Se non l'hai già fatto, installa e configura gli AWS CLI AWS SDK. Per ulteriori informazioni, consulta Passaggio 4: configura gli SDK e AWS CLIAWS.

  2. Utilizza il codice seguente per visualizzare la matrice di confusione per un modello. Fornisci i seguenti argomenti riga di comando:

    • project_name — il nome del progetto che desideri utilizzare. Puoi ottenere il nome del progetto dalla pagina dei progetti nella console di Amazon Rekognition Custom Labels.

    • version_name — la versione del modello che desideri utilizzare. Puoi ottenere il nome della versione dalla pagina dei dettagli di progetto nella console di Amazon Rekognition Custom Labels.

    # Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. # SPDX-License-Identifier: Apache-2.0 """ Purpose Shows how to display the confusion matrix for an Amazon Rekognition Custom labels image classification model. """ import json import argparse import logging import boto3 import pandas as pd from botocore.exceptions import ClientError logger = logging.getLogger(__name__) def get_model_summary_location(rek_client, project_name, version_name): """ Get the summary file location for a model. :param rek_client: A Boto3 Rekognition client. :param project_arn: The Amazon Resource Name (ARN) of the project that contains the model. :param model_arn: The Amazon Resource Name (ARN) of the model. :return: The location of the model summary file. """ try: logger.info( "Getting summary file for model %s in project %s.", version_name, project_name) summary_location = "" # Get the project ARN from the project name. response = rek_client.describe_projects(ProjectNames=[project_name]) assert len(response['ProjectDescriptions']) > 0, \ f"Project {project_name} not found." project_arn = response['ProjectDescriptions'][0]['ProjectArn'] # Get the summary file location for the model. describe_response = rek_client.describe_project_versions(ProjectArn=project_arn, VersionNames=[version_name]) assert len(describe_response['ProjectVersionDescriptions']) > 0, \ f"Model {version_name} not found." model=describe_response['ProjectVersionDescriptions'][0] evaluation_results=model['EvaluationResult'] summary_location=(f"s3://{evaluation_results['Summary']['S3Object']['Bucket']}" f"/{evaluation_results['Summary']['S3Object']['Name']}") return summary_location except ClientError as err: logger.exception( "Couldn't get summary file location: %s", err.response['Error']['Message']) raise def show_confusion_matrix(summary): """ Shows the confusion matrix for an Amazon Rekognition Custom Labels image classification model. :param summary: The summary file JSON object. """ pd.options.display.float_format = '{:.0%}'.format # Load the model summary JSON into a DataFrame. summary_df = pd.DataFrame( summary['AggregatedEvaluationResults']['ConfusionMatrix']) # Get the confusion matrix. confusion_matrix = summary_df.pivot_table(index='PredictedLabel', columns='GroundTruthLabel', fill_value=0.0).astype(float) # Display the confusion matrix. print(confusion_matrix) def get_summary(s3_resource, summary): """ Gets the summary file. : return: The summary file in bytes. """ try: summary_bucket, summary_key = summary.replace( "s3://", "").split("/", 1) bucket = s3_resource.Bucket(summary_bucket) obj = bucket.Object(summary_key) body = obj.get()['Body'].read() logger.info( "Got summary file '%s' from bucket '%s'.", obj.key, obj.bucket_name) except ClientError: logger.exception( "Couldn't get summary file '%s' from bucket '%s'.", obj.key, obj.bucket_name) raise else: return body def add_arguments(parser): """ Adds command line arguments to the parser. : param parser: The command line parser. """ parser.add_argument( "project_name", help="The ARN of the project in which the model resides." ) parser.add_argument( "version_name", help="The version of the model that you want to describe." ) def main(): """ Entry point for script. """ logging.basicConfig(level=logging.INFO, format="%(levelname)s: %(message)s") try: # Get the command line arguments. parser = argparse.ArgumentParser(usage=argparse.SUPPRESS) add_arguments(parser) args = parser.parse_args() print( f"Showing confusion matrix for: {args.version_name} for project {args.project_name}.") session = boto3.Session(profile_name='custom-labels-access') rekognition_client = session.client("rekognition") s3_resource = session.resource('s3') # Get the summary file for the model. summary_location = get_model_summary_location(rekognition_client, args.project_name, args.version_name ) summary = json.loads(get_summary(s3_resource, summary_location)) # Check that the confusion matrix is available. assert 'ConfusionMatrix' in summary['AggregatedEvaluationResults'], \ "Confusion matrix not found in summary. Is the model a classification model?" # Show the confusion matrix. show_confusion_matrix(summary) print("Done") except ClientError as err: logger.exception("Problem showing confusion matrix: %s", err) print(f"Problem describing model: {err}") except AssertionError as err: logger.exception( "Error: %s.\n", err) print( f"Error: {err}\n") if __name__ == "__main__": main()