

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

# Amélioration d’un modèle entraîné Étiquettes personnalisées Amazon Rekognition
<a name="improving-model"></a>

Lorsque l’entraînement est terminé, vous évaluez les performances du modèle. Pour vous aider, Étiquettes personnalisées Amazon Rekognition fournit les métriques récapitulatives et les métriques d’évaluation de chaque étiquette. Pour plus d’informations sur les métriques disponibles, consultez [Métriques d’évaluation du modèle](im-metrics-use.md). Pour améliorer votre modèle à l’aide des métriques, consultez [Amélioration d’un modèle Étiquettes personnalisées Amazon Rekognition](tr-improve-model.md). 



Si vous êtes satisfait de la précision du modèle, vous pouvez commencer à l’utiliser. Pour plus d’informations, consultez [Exécution d’un modèle Étiquettes personnalisées Amazon Rekognition entraîné](running-model.md). 

**Topics**
+ [Métriques d’évaluation du modèle](im-metrics-use.md)
+ [Accès aux métriques d’évaluation (console)](im-access-training-results.md)
+ [Accès aux métriques d’évaluation d’Étiquettes personnalisées Amazon Rekognition (kit SDK)](im-metrics-api.md)
+ [Amélioration d’un modèle Étiquettes personnalisées Amazon Rekognition](tr-improve-model.md)

# Métriques d’évaluation du modèle
<a name="im-metrics-use"></a>

Une fois le modèle formé, Étiquettes personnalisées Amazon Rekognition renvoie les métriques des tests du modèle. Vous pouvez les utiliser pour évaluer les performances du modèle. Cette rubrique décrit les métriques mises à votre disposition et explique comment déterminer si le modèle entraîné fonctionne correctement. 

La console Étiquettes personnalisées Amazon Rekognition fournit les métriques suivantes comme résumé des résultats de l’entraînement et comme métriques de chaque étiquette : 
+ [Précision](#im-precision-metric)
+ [Rappel](#im-recall-metric)
+ [F1](#im-f1-metric)

Chaque métrique fournie constitue une métrique couramment utilisée pour évaluer les performances d’un modèle de machine learning. Étiquettes personnalisées Amazon Rekognition renvoie les métriques des résultats des tests pour l’ensemble du jeu de données, ainsi que les métriques de chaque étiquette personnalisée. Vous pouvez aussi examiner les performances du modèle entraîné personnalisé pour chaque image du jeu de données des tests. Pour plus d’informations, consultez [Accès aux métriques d’évaluation (console)](im-access-training-results.md).

## Évaluation des performances du modèle
<a name="tr-evaluate-performance"></a>

Au cours des tests, Étiquettes personnalisées Amazon Rekognition prédit si une image de test contient une étiquette personnalisée. Le score de confiance est une valeur quantifiant la certitude de la prédiction du modèle.

Si le score de confiance d’une étiquette personnalisée dépasse la valeur seuil, la sortie du modèle inclut l’étiquette. Les prédictions peuvent être classées de la manière suivante : 
+ *Vrai positif* : le modèle Étiquettes personnalisées Amazon Rekognition prédit correctement la présence de l’étiquette personnalisée dans l’image de test : l’étiquette prédite est également une étiquette de vérité sur le terrain pour l’image. Par exemple, Étiquettes personnalisées Amazon Rekognition renvoie correctement une étiquette de ballon de football lorsqu’un tel ballon est présent dans une image. 
+ *Faux positif* : le modèle Étiquettes personnalisées Amazon Rekognition prédit incorrectement la présence d’une étiquette personnalisée dans une image de test : l’étiquette prédite n’est pas une étiquette de vérité sur le terrain pour l’image. Par exemple, Étiquettes personnalisées Amazon Rekognition renvoie une étiquette de ballon de football, mais il n’existe aucune étiquette de ballon de football dans la vérité sur le terrain pour l’image.
+ *Faux négatif* : le modèle Étiquettes personnalisées Amazon Rekognition ne prédit pas la présence d’une étiquette personnalisée dans l’image, mais la vérité sur le terrain de l’image inclut l’étiquette. Par exemple, Étiquettes personnalisées Amazon Rekognition ne renvoie pas d’étiquette personnalisée « ballon de football » pour une image en contenant un. 
+ *Vrai négatif* : le modèle Étiquettes personnalisées Amazon Rekognition prédit correctement qu’une étiquette personnalisée n’est pas présente dans l’image de test. Par exemple, Étiquettes personnalisées Amazon Rekognition ne renvoie pas d’étiquette personnalisée « ballon de football » pour une image n’en contenant pas un. 

La console permet d’accéder aux valeurs vrai positif, faux positif et faux négatif pour chaque image du jeu de données des tests. Pour plus d’informations, consultez [Accès aux métriques d’évaluation (console)](im-access-training-results.md).

Les résultats de prédiction permettent de calculer les métriques suivantes de chaque étiquette, ainsi qu’un cumul pour la totalité du jeu de données des tests. Les mêmes définitions s’appliquent aux prédictions faites par le modèle au niveau du cadre de délimitation, à la différence que toutes les métriques sont calculées sur chaque cadre de délimitation (prédiction ou vérité sur le terrain) de chaque image de test.

### Intersection sur l’union (IoU, Intersection over Union) et détection d’objets
<a name="tr-evaluate-performance-object-detection"></a>

Intersection sur l’union mesure le pourcentage de chevauchement entre deux cadres de délimitation d’objet sur leur surface combinée. La plage est comprise entre 0 (chevauchement le plus faible) et 1 (chevauchement complet). Pendant le test, un cadre de délimitation prédit est correct si l’Intersection sur l’union entre le cadre de délimitation de la vérité sur le terrain et le cadre de délimitation prédit est au moins de 0,5.

## Seuil supposé
<a name="im-assumed-threshold"></a>

Étiquettes personnalisées Amazon Rekognition calcule automatiquement une valeur seuil supposée (0-1) pour chacune des étiquettes personnalisées. Vous ne pouvez pas définir la valeur de seuil supposée pour une étiquette personnalisée. Le *seuil supposé* de chaque étiquette est la valeur au-dessus de laquelle une prédiction est considérée comme « vrai » ou « faux positif ». Il est défini en fonction du jeu de données des tests. Le seuil supposé est calculé sur la base du meilleur score F1 obtenu sur le jeu de données des tests lors de l’entraînement du modèle.

Vous pouvez obtenir la valeur du seuil supposé d’une étiquette à partir des résultats d’entraînement du modèle. Pour plus d’informations, consultez [Accès aux métriques d’évaluation (console)](im-access-training-results.md).

Les modifications des valeurs de seuil supposées sont généralement utilisées pour améliorer la précision et le rappel d’un modèle. Pour plus d’informations, consultez [Amélioration d’un modèle Étiquettes personnalisées Amazon Rekognition](tr-improve-model.md). Comme il est impossible de définir le seuil supposé du modèle d’une étiquette, vous pouvez obtenir les mêmes résultats en analysant une image avec `DetectCustomLabels` et en spécifiant un paramètre d’entrée `MinConfidence`. Pour plus d’informations, consultez [Analyse d’une image avec un modèle entraîné](detecting-custom-labels.md). 

## Précision
<a name="im-precision-metric"></a>

Étiquettes personnalisées Amazon Rekognition fournit les métriques de précision pour chaque étiquette et une métrique de précision moyenne pour la totalité du jeu de données des tests. 

La *précision* est le rapport entre les prédictions correctes (vrais positifs) et toutes les prédictions du modèle (vrais et faux positifs) au seuil supposé d’une étiquette donnée. Si le seuil augmente, il se peut que le modèle propose moins de prédictions. En général, toutefois, le ratio entre les vrais positifs et les faux positifs est plus élevé que le seuil inférieur. Les valeurs de précision possibles sont comprises entre 0 et 1 et les valeurs plus élevées indiquent une précision supérieure.

Par exemple, lorsque le modèle prédit la présence d’un ballon de football dans une image, à quelle fréquence la prédiction est-elle correcte ? Supposons qu’il y ait une image avec 8 ballons de football et 5 rochers. Si le modèle prédit 9 ballons de football (8 correctement prédits et 1 faux positif), la précision de cet exemple est de 0,89. Toutefois, si le modèle a prédit 13 ballons de football sur l’image avec 8 prédictions correctes et 5 incorrectes, la précision obtenue est inférieure.

Pour plus d’informations, consultez [Précision et rappel](https://en.wikipedia.org/wiki/Precision_and_recall).

## Rappel
<a name="im-recall-metric"></a>

Étiquettes personnalisées Amazon Rekognition fournit les métriques de rappel moyen de chaque étiquette et une métrique de rappel moyen pour la totalité du jeu de données des tests. 

Le *rappel* est la fraction des étiquettes du jeu de données des tests correctement prédites au-dessus du seuil supposé. Il s’agit d’une mesure de la fréquence à laquelle le modèle peut prédire correctement une étiquette personnalisée lorsqu’elle est réellement présente dans les images du jeu de données des tests. La plage de rappel est comprise entre 0 et 1. Les valeurs plus élevées indiquent un rappel supérieur.

Par exemple, si une image contient 8 ballons de football, combien d’entre eux sont correctement détectés ? Dans l’exemple où une image comporte 8 ballons de football et 5 rochers, si le modèle détecte 5 ballons de football, la valeur de rappel est 0,62. Si, après un réentraînement, le nouveau modèle détecte 9 ballons de football, dont les 8 déjà présents sur l’image, la valeur de rappel est 1,0.

Pour plus d’informations, consultez [Précision et rappel](https://en.wikipedia.org/wiki/Precision_and_recall).

## F1
<a name="im-f1-metric"></a>

Étiquettes personnalisées Amazon Rekognition utilise la métrique Score F1 pour mesurer les performances moyennes du modèle de chaque étiquette et les performances moyennes du modèle de la totalité du jeu de données des tests.

La *performance du modèle* est une mesure de cumul qui prend en compte à la fois la précision et le rappel de toutes les étiquettes (par exemple, le score F1 ou la précision moyenne). Le score de performance du modèle est une valeur comprise entre 0 et 1. Plus la valeur est élevée, meilleures sont les performances du modèle en termes de rappel et de précision. Plus précisément, les performances du modèle pour les tâches de classification sont généralement mesurées par le score F1. Ce score représente la moyenne harmonique des scores de précision et de rappel au seuil supposé. Par exemple, pour un modèle avec une précision de 0,9 et un rappel de 1,0, le score F1 est de 0,947.

Une valeur élevée pour le score F1 indique que le modèle fonctionne bien en termes de précision et de rappel. Si le modèle ne fonctionne pas correctement avec, par exemple, une précision faible de 0,30 et un rappel élevé de 1,0, le score F1 est de 0,46. De même, si la précision est élevée (0,95) et que le rappel est faible (0,20), le score F1 est de 0,33. Dans les deux cas, le score F1 est faible et indique des problèmes liés au modèle. 

Pour plus d’informations, consultez [Score F1](https://en.wikipedia.org/wiki/F1_score).

## Utilisation des métriques
<a name="im-using-metrics"></a>

Pour un modèle donné que vous avez entraîné et en fonction de l’application, vous pouvez faire un compromis entre la *précision* et le *rappel* en définissant le paramètre d’entrée `MinConfidence` sur `DetectCustomLabels`. À une valeur `MinConfidence` plus élevée, vous obtenez généralement une plus grande *précision* (plus de prédictions correctes sur les ballons de football), mais un *rappel* plus bas (le nombre manquant de vrais ballons de football sera plus grand). À une valeur `MinConfidence` plus basse, vous obtenez un *rappel* plus élevé (nombre plus élevé de ballons de football correctement prédits), mais une *précision* moindre (un plus grand nombre de prédictions seront fausses). Pour plus d’informations, consultez [Analyse d’une image avec un modèle entraîné](detecting-custom-labels.md). 

Les métriques informent également sur les mesures à prendre pour améliorer les performances du modèle si nécessaire. Pour plus d’informations, consultez [Amélioration d’un modèle Étiquettes personnalisées Amazon Rekognition](tr-improve-model.md). 

**Note**  
`DetectCustomLabels` renvoie les prédictions comprises entre 0 et 100, ce qui correspond à la plage métrique de 0 à 1.

# Accès aux métriques d’évaluation (console)
<a name="im-access-training-results"></a>

Au cours des tests, les performances du modèle sont évaluées par rapport au jeu de données des tests. Les étiquettes du jeu de données des tests sont considérées comme « vérités sur le terrain », car elles correspondent à ce que représente l’image réelle. Pendant les tests, le modèle fait des prédictions à l’aide du jeu de données des tests. Les étiquettes prédites sont comparées aux étiquettes de vérité sur le terrain et les résultats sont disponibles sur la page d’évaluation de la console.

La console Étiquettes personnalisées Amazon Rekognition affiche les métriques récapitulatives de la totalité du modèle et les métriques des étiquettes individuelles. Les métriques disponibles dans la console sont le rappel de précision, le score F1, la confiance et le seuil de confiance. Pour plus d’informations, consultez [Amélioration d’un modèle entraîné Étiquettes personnalisées Amazon Rekognition](improving-model.md).

Vous pouvez utiliser la console pour vous concentrer sur des métriques spécifiques. Par exemple, pour étudier les problèmes de précision d’une étiquette, vous pouvez filtrer les résultats de l’entraînement par étiquette et par *faux positifs*. Pour plus d’informations, consultez [Métriques d’évaluation du modèle](im-metrics-use.md).

Après l’entraînement, le jeu de données d’entraînement est en lecture seule. Si vous décidez d’améliorer le modèle, vous pouvez copier le jeu de données d’entraînement dans un nouveau jeu de données. Vous utilisez la copie du jeu de données pour entraîner une nouvelle version du modèle. 

Dans cette étape, vous utilisez la console pour accéder aux résultats de l’entraînement dans la console. 

**Pour accéder aux métriques d’évaluation (console)**

1. Ouvrez la console Amazon Rekognition à l'adresse. [https://console.aws.amazon.com/rekognition/](https://console.aws.amazon.com/rekognition/)

1. Choisissez **Utiliser Custom Labels**.

1. Choisissez **Démarrer**. 

1. Dans le volet de navigation de gauche, choisissez **Projets**.

1. Dans la page **Projets**, choisissez le projet contenant le modèle entraîné à évaluer.

1. Dans **Modèles**, choisissez le modèle à évaluer. 

1. Cliquez sur l’onglet **Évaluation** pour afficher les résultats de l’évaluation. Pour plus d’informations sur l’évaluation d’un modèle, consultez [Amélioration d’un modèle entraîné Étiquettes personnalisées Amazon Rekognition](improving-model.md).

1. Choisissez **Afficher les résultats des tests** pour visualiser les résultats des images des tests. Pour de plus amples informations, veuillez consulter [Métriques d’évaluation du modèle](im-metrics-use.md). La capture d'écran suivante du résumé de l'évaluation du modèle montre le score F1, la précision moyenne et le rappel global de 6 étiquettes avec les résultats des tests et les mesures de performance. Des détails sur l'utilisation du modèle entraîné sont également fournis.   
![\[Résumé de l'évaluation du modèle indiquant le score F1, la précision moyenne et le rappel global.\]](http://docs.aws.amazon.com/fr_fr/rekognition/latest/customlabels-dg/images/get-started-training-results.jpg)

1. Après avoir consulté les résultats des tests, choisissez le nom du projet pour revenir à la page du modèle. La page des résultats des tests affiche des images avec des étiquettes prédites et des scores de confiance pour un modèle d'apprentissage automatique formé sur les catégories d'images de la cour arrière et de la cour avant. Deux exemples d'images sont affichés.   
![\[La page des résultats du test affiche des images avec des étiquettes prédites et des scores de confiance.\]](http://docs.aws.amazon.com/fr_fr/rekognition/latest/customlabels-dg/images/get-started-image-test-results.jpg)

1. Utilisez les métriques pour évaluer les performances du modèle. Pour plus d’informations, consultez [Amélioration d’un modèle Étiquettes personnalisées Amazon Rekognition](tr-improve-model.md). 

# Accès aux métriques d’évaluation d’Étiquettes personnalisées Amazon Rekognition (kit SDK)
<a name="im-metrics-api"></a>

L'[DescribeProjectVersions](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_DescribeProjectVersions)opération permet d'accéder à des métriques autres que celles fournies dans la console. 

De même que la console, `DescribeProjectVersions` permet d’accéder aux métriques suivantes sous la forme d’informations récapitulatives pour les résultats des tests et de résultats des tests pour chaque étiquette :
+ [Précision](im-metrics-use.md#im-precision-metric)
+ [Rappel](im-metrics-use.md#im-recall-metric)
+ [F1](im-metrics-use.md#im-f1-metric)

Vous obtenez le seuil moyen de toutes les étiquettes et le seuil des étiquettes individuelles.

`DescribeProjectVersions` donne également accès aux métriques suivantes pour la classification et la détection d’images (emplacement de l’objet sur l’image).
+ *Matrice de confusion* pour la classification des images. Pour plus d’informations, consultez [Affichage de la matrice de confusion d’un modèle](im-confusion-matrix.md).
+ *Précision moyenne médiane (mAP, Mean Average Precision)* pour la détection d’images.
+ *Rappel moyen médian (mAR, Mean Average Recall)* pour la détection d’images.

`DescribeProjectVersions` donne également accès aux valeurs vrai positif, faux positif, faux négatif et vrai négatif. Pour plus d’informations, consultez [Métriques d’évaluation du modèle](im-metrics-use.md).

La métrique Score F1 cumulé est renvoyée directement par `DescribeProjectVersions`. Les autres métriques sont accessibles à partir des fichiers [Accès au fichier récapitulatif du modèle](im-summary-file-api.md) et [Interprétation de l'instantané du manifeste d'évaluation](im-evaluation-manifest-snapshot-api.md) stockés dans un compartiment Amazon S3. Pour de plus amples informations, veuillez consulter [Accès au fichier récapitulatif et à l’instantané du manifeste d’évaluation (kit SDK)](im-access-summary-evaluation-manifest.md).

**Topics**
+ [Accès au fichier récapitulatif du modèle](im-summary-file-api.md)
+ [Interprétation de l'instantané du manifeste d'évaluation](im-evaluation-manifest-snapshot-api.md)
+ [Accès au fichier récapitulatif et à l’instantané du manifeste d’évaluation (kit SDK)](im-access-summary-evaluation-manifest.md)
+ [Affichage de la matrice de confusion d’un modèle](im-confusion-matrix.md)
+ [Référence : fichier récapitulatif des résultats de l’entraînement](im-summary-file.md)

# Accès au fichier récapitulatif du modèle
<a name="im-summary-file-api"></a>

Le fichier récapitulatif contient les informations sur les résultats de l’évaluation du modèle dans son ensemble, ainsi que les métriques de chaque étiquette. Les métriques sont Précision, Rappel et Score F1. La valeur de seuil du modèle est également fournie. L’emplacement du fichier récapitulatif est accessible depuis l’objet `EvaluationResult` renvoyé par `DescribeProjectVersions`. Pour plus d’informations, consultez [Référence : fichier récapitulatif des résultats de l’entraînement](im-summary-file.md).

Voici un exemple de fichier récapitulatif.

```
{
  "Version": 1,
  "AggregatedEvaluationResults": {
    "ConfusionMatrix": [
      {
        "GroundTruthLabel": "CAP",
        "PredictedLabel": "CAP",
        "Value": 0.9948717948717949
      },
      {
        "GroundTruthLabel": "CAP",
        "PredictedLabel": "WATCH",
        "Value": 0.008547008547008548
      },
      {
        "GroundTruthLabel": "WATCH",
        "PredictedLabel": "CAP",
        "Value": 0.1794871794871795
      },
      {
        "GroundTruthLabel": "WATCH",
        "PredictedLabel": "WATCH",
        "Value": 0.7008547008547008
      }
    ],
    "F1Score": 0.9726959470546408,
    "Precision": 0.9719115848331294,
    "Recall": 0.9735042735042735
  },
  "EvaluationDetails": {
    "EvaluationEndTimestamp": "2019-11-21T07:30:23.910943",
    "Labels": [
      "CAP",
      "WATCH"
    ],
    "NumberOfTestingImages": 624,
    "NumberOfTrainingImages": 5216,
    "ProjectVersionArn": "arn:aws:rekognition:us-east-1:nnnnnnnnn:project/my-project/version/v0/1574317227432"
  },
  "LabelEvaluationResults": [
    {
      "Label": "CAP",
      "Metrics": {
        "F1Score": 0.9794344473007711,
        "Precision": 0.9819587628865979,
        "Recall": 0.9769230769230769,
        "Threshold": 0.9879502058029175
      },
      "NumberOfTestingImages": 390
    },
    {
      "Label": "WATCH",
      "Metrics": {
        "F1Score": 0.9659574468085106,
        "Precision": 0.961864406779661,
        "Recall": 0.9700854700854701,
        "Threshold": 0.014450683258473873
      },
      "NumberOfTestingImages": 234
    }
  ]
}
```

# Interprétation de l'instantané du manifeste d'évaluation
<a name="im-evaluation-manifest-snapshot-api"></a>

L’instantané du manifeste d’évaluation contient les informations détaillées sur les résultats des tests. L’instantané inclut l’indice de confiance pour chaque prédiction. Il inclut aussi la classification de la prédiction par rapport à la classification réelle de l’image (vrai positif, vrai négatif, faux positif ou faux négatif). 

Les fichiers représentent un instantané, car ne sont incluses que les images utilisées pour les tests et l’entraînement. Les images qui ne peuvent pas être vérifiées, telles que les images au mauvais format, ne sont pas incluses dans le manifeste. L’emplacement de l’instantané des tests est accessible depuis l’objet `TestingDataResult` renvoyé par `DescribeProjectVersions`. L’emplacement de l’instantané de l’entraînement est accessible depuis l’objet `TrainingDataResult` renvoyé par `DescribeProjectVersions`. 

L'instantané est au format de sortie du manifeste SageMaker AI Ground Truth avec des champs ajoutés pour fournir des informations supplémentaires, telles que le résultat de la classification binaire d'une détection. L’extrait suivant montre les champs additionnels.

```
"rekognition-custom-labels-evaluation-details": {
    "version": 1,
    "is-true-positive": true,
    "is-true-negative": false,
    "is-false-positive": false,
    "is-false-negative": false,
    "is-present-in-ground-truth": true
    "ground-truth-labelling-jobs": ["rekognition-custom-labels-training-job"]
}
```
+ *Version* : version du format du champ `rekognition-custom-labels-evaluation-details` au sein de l’instantané du manifeste.
+ *is-true-positive...* — La classification binaire de la prédiction basée sur la comparaison entre le score de confiance et le seuil minimum de l'étiquette.
+ *is-present-in-ground-truth — Vrai* si la prédiction faite par le modèle est présente dans les informations de vérité du sol utilisées pour l'entraînement, sinon fausse. La valeur ne dépend pas du fait que le score de confiance dépasse ou non le seuil minimal calculé par le modèle. 
+ *ground-truth-labeling-jobs*— Une liste des champs de vérité de base figurant dans la ligne du manifeste qui sont utilisés pour la formation.

Pour plus d'informations sur le format du manifeste SageMaker AI Ground Truth, consultez [Output](https://docs.aws.amazon.com/sagemaker/latest/dg/sms-data-output.html). 

Voici un exemple d’instantané de manifeste de tests affichant les métriques de classification d’images et de détection d’objets.

```
// For image classification
{
  "source-ref": "s3://amzn-s3-demo-bucket/dataset/beckham.jpeg",
  "rekognition-custom-labels-training-0": 1,
  "rekognition-custom-labels-training-0-metadata": {
    "confidence": 1.0,
    "job-name": "rekognition-custom-labels-training-job",
    "class-name": "Football",
    "human-annotated": "yes",
    "creation-date": "2019-09-06T00:07:25.488243",
    "type": "groundtruth/image-classification"
  },
  "rekognition-custom-labels-evaluation-0": 1,
  "rekognition-custom-labels-evaluation-0-metadata": {
    "confidence": 0.95,
    "job-name": "rekognition-custom-labels-evaluation-job",
    "class-name": "Football",
    "human-annotated": "no",
    "creation-date": "2019-09-06T00:07:25.488243",
    "type": "groundtruth/image-classification",
    "rekognition-custom-labels-evaluation-details": {
      "version": 1,
      "ground-truth-labelling-jobs": ["rekognition-custom-labels-training-job"],
      "is-true-positive": true,
      "is-true-negative": false,
      "is-false-positive": false,
      "is-false-negative": false,
      "is-present-in-ground-truth": true
    }
  }
}


// For object detection
{
  "source-ref": "s3://amzn-s3-demo-bucket/dataset/beckham.jpeg",
  "rekognition-custom-labels-training-0": {
    "annotations": [
      {
        "class_id": 0,
        "width": 39,
        "top": 409,
        "height": 63,
        "left": 712
      },
      ...
    ],
    "image_size": [
      {
        "width": 1024,
        "depth": 3,
        "height": 768
      }
    ]
  },
  "rekognition-custom-labels-training-0-metadata": {
    "job-name": "rekognition-custom-labels-training-job",
    "class-map": {
      "0": "Cap",
      ...
    },
    "human-annotated": "yes",
    "objects": [
      {
        "confidence": 1.0
      },
      ...
    ],
    "creation-date": "2019-10-21T22:02:18.432644",
    "type": "groundtruth/object-detection"
  },
  "rekognition-custom-labels-evaluation": {
    "annotations": [
      {
        "class_id": 0,
        "width": 39,
        "top": 409,
        "height": 63,
        "left": 712
      },
      ...
    ],
    "image_size": [
      {
        "width": 1024,
        "depth": 3,
        "height": 768
      }
    ]
  },
  "rekognition-custom-labels-evaluation-metadata": {
    "confidence": 0.95,
    "job-name": "rekognition-custom-labels-evaluation-job",
    "class-map": {
      "0": "Cap",
      ...
    },
    "human-annotated": "no",
    "objects": [
      {
        "confidence": 0.95,
        "rekognition-custom-labels-evaluation-details": {
          "version": 1,
          "ground-truth-labelling-jobs": ["rekognition-custom-labels-training-job"],
          "is-true-positive": true,
          "is-true-negative": false,
          "is-false-positive": false,
          "is-false-negative": false,
          "is-present-in-ground-truth": true
        }
      },
      ...
    ],
    "creation-date": "2019-10-21T22:02:18.432644",
    "type": "groundtruth/object-detection"
  }
}
```

# Accès au fichier récapitulatif et à l’instantané du manifeste d’évaluation (kit SDK)
<a name="im-access-summary-evaluation-manifest"></a>

Pour obtenir les résultats de l'entraînement, tu appelles [DescribeProjectVersions](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_DescribeProjectVersions). Pour obtenir un exemple de code, consultez [Description d’un modèle (kit SDK)](md-describing-model-sdk.md).

L’emplacement des métriques est renvoyé dans la réponse `ProjectVersionDescription` de `DescribeProjectVersions`.
+ `EvaluationResult` : emplacement du fichier récapitulatif.
+ `TestingDataResult` : emplacement de l’instantané du manifeste d’évaluation utilisé pour les tests. 

Le score F1 et l’emplacement du fichier récapitulatif sont renvoyés dans `EvaluationResult`. Par exemple :

```
"EvaluationResult": {
                "F1Score": 1.0,
                "Summary": {
                    "S3Object": {
                        "Bucket": "echo-dot-scans",
                        "Name": "test-output/EvaluationResultSummary-my-echo-dots-project-v2.json"
                    }
                }
            }
```

L’instantané du manifeste d’évaluation est stocké à l’emplacement spécifié dans le paramètre d’entrée ` --output-config` que vous avez spécifié dans [Entraînement d’un modèle (kit SDK)](training-model.md#tm-sdk). 

**Note**  
La quantité de temps d’entraînement, en secondes, pour laquelle vous êtes facturé est renvoyée dans `BillableTrainingTimeInSeconds`. 

Pour plus d’informations sur les métriques renvoyées par Étiquettes personnalisées Amazon Rekognition, consultez [Accès aux métriques d’évaluation d’Étiquettes personnalisées Amazon Rekognition (kit SDK)](im-metrics-api.md).

# Affichage de la matrice de confusion d’un modèle
<a name="im-confusion-matrix"></a>

Une matrice de confusion permet de voir les étiquettes que le modèle confond avec d’autres étiquettes du même modèle. En utilisant une matrice de confusion, vous pouvez concentrer vos améliorations sur le modèle.

Lors de l’évaluation du modèle, Étiquettes personnalisées Amazon Rekognition crée une matrice de confusion à l’aide des images de test afin de détecter les étiquettes mal identifiées (confuses). Étiquettes personnalisées Amazon Rekognition crée uniquement une matrice de confusion pour les modèles de classification. La matrice de classification est accessible depuis le fichier récapitulatif créé par Étiquettes personnalisées Amazon Rekognition lors de l’entraînement du modèle. Il n’est pas possible d’afficher la matrice de confusion dans la console Étiquettes personnalisées Amazon Rekognition.

**Topics**
+ [Utilisation d’une matrice de confusion](#im-using-confusion-matrix)
+ [Obtention de la matrice de confusion d’un modèle](#im-getting-confusion-matrix)

## Utilisation d’une matrice de confusion
<a name="im-using-confusion-matrix"></a>

Le tableau suivant constitue la matrice de confusion de l’exemple de projet de [classification d’images de pièces](getting-started.md#gs-image-classification-example) (projet Rooms). Les en-têtes de colonne représentent les étiquettes (étiquettes de vérité sur le terrain) attribuées aux images de test. Les en-têtes de ligne représentent les étiquettes que le modèle prédit pour les images de test. Chaque cellule représente le pourcentage de prédictions pour une étiquette (ligne) d’être l’étiquette de vérité sur le terrain (colonne). Par exemple, 67 % des prédictions sur les salles de bains ont été correctement étiquetées comme salles de bains. En revanche, 33 % des salles de bains ont été incorrectement étiquetées comme cuisines. Un modèle très performant possède des valeurs de cellules élevées lorsque l’étiquette prédite correspond à l’étiquette de vérité sur le terrain. Vous pouvez le voir grâce à la diagonale allant de la première à la dernière des étiquettes prédites et des étiquettes de vérité sur le terrain. Si la valeur d’une cellule est égale à 0, aucune prédiction n’a été faite pour l’étiquette prédite qui doit être l’étiquette de vérité sur le terrain de la cellule.

**Note**  
Comme les modèles ne sont pas déterministes, les valeurs des cellules de la matrice de confusion obtenues lors de l’entraînement du projet Rooms peuvent différer de celles indiquées dans le tableau ci-dessous. 

La matrice de confusion identifie les zones sur lesquelles il est nécessaire de se concentrer. Par exemple, la matrice de confusion montre que 50 % du temps, le modèle confond les placards et les chambres à coucher. Dans ce cas, vous devez ajouter de nouvelles images de placards et de chambres à coucher au jeu de données d’entraînement. Vérifiez également que les images existantes de placard et de chambre à coucher sont correctement étiquetées. Le modèle devrait ainsi mieux faire la différence entre les deux étiquettes. Pour ajouter de nouvelles images à un jeu de données, consultez [Ajout d’autres images à un jeu de données](md-add-images.md).

Bien que la matrice de confusion soit utile, il importe de prendre en compte d’autres métriques. Par exemple, 100 % des prédictions ont correctement identifié l’étiquette floor\$1plan, ce qui constitue une excellente performance. Cependant, le jeu de données des tests ne contient que 2 images avec l’étiquette floor\$1plan. Il contient également 11 images avec l’étiquette living\$1space. Ce déséquilibre est également présent dans le jeu de données d’entraînement (13 images living\$1space et 2 images closet). Pour obtenir une évaluation plus précise, équilibrez les jeux de données d’entraînement et de test en ajoutant davantage d’images d’étiquettes sous-représentées (plans de niveau dans cet exemple). Pour obtenir le nombre d’images de test par étiquette, consultez [Accès aux métriques d’évaluation (console)](im-access-training-results.md). 

Le tableau suivant est un exemple de matrice de confusion, comparant l'étiquette prévue (sur l'axe Y) à l'étiquette de vérité fondamentale :


| Étiquette prévue | backyard (jardin arrière) | bathroom (salle de bains) | bedroom (chambre à coucher) | closet (placard) | entry\$1way (entrée) | floor\$1plan (plan d’étage) | front\$1yard (jardin avant) | kitchen (cuisine) | living\$1space (pièce de vie) | patio | 
| --- |--- |--- |--- |--- |--- |--- |--- |--- |--- |--- |
| backyard (jardin arrière) | 75% | 0 % | 0 % | 0 % | 0 % | 0 % | 33 % | 0 % | 0 % | 0 % | 
| --- |--- |--- |--- |--- |--- |--- |--- |--- |--- |--- |
| bathroom (salle de bains) | 0 % | 67 % | 0 % | 0 % | 0 % | 0 % | 0 % | 0 % | 0 % | 0 % | 
| --- |--- |--- |--- |--- |--- |--- |--- |--- |--- |--- |
| bedroom (chambre à coucher) | 0 % | 0 % | 82 % | 50% | 0 % | 0 % | 0 % | 0 % | 9 % | 0 % | 
| --- |--- |--- |--- |--- |--- |--- |--- |--- |--- |--- |
| closet (placard) | 0 % | 0 % | 0 % | 50% | 0 % | 0 % | 0 % | 0 % | 0 % | 0 % | 
| --- |--- |--- |--- |--- |--- |--- |--- |--- |--- |--- |
| entry\$1way (entrée) | 0 % | 0 % | 0 % | 0 % | 33 % | 0 % | 0 % | 0 % | 0 % | 0 % | 
| --- |--- |--- |--- |--- |--- |--- |--- |--- |--- |--- |
| floor\$1plan (plan d’étage) | 0 % | 0 % | 0 % | 0 % | 0 % | 100 % | 0 % | 0 % | 0 % | 0 % | 
| --- |--- |--- |--- |--- |--- |--- |--- |--- |--- |--- |
| front\$1yard (jardin avant) | 25% | 0 % | 0 % | 0 % | 0 % | 0 % | 67 % | 0 % | 0 % | 0 % | 
| --- |--- |--- |--- |--- |--- |--- |--- |--- |--- |--- |
| kitchen (cuisine) | 0 % | 33 % | 0 % | 0 % | 0 % | 0 % | 0 % | 88 % | 0 % | 0 % | 
| --- |--- |--- |--- |--- |--- |--- |--- |--- |--- |--- |
| living\$1space (pièce de vie) | 0 % | 0 % | 18 % | 0 % | 67 % | 0 % | 0 % | 12 % | 91 % | 33 % | 
| --- |--- |--- |--- |--- |--- |--- |--- |--- |--- |--- |
| patio | 0 % | 0 % | 0 % | 0 % | 0 % | 0 % | 0 % | 0 % | 0 % | 67 % | 
| --- |--- |--- |--- |--- |--- |--- |--- |--- |--- |--- |

## Obtention de la matrice de confusion d’un modèle
<a name="im-getting-confusion-matrix"></a>

Le code suivant utilise les [DescribeProjectVersions](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_DescribeProjectVersions)opérations [DescribeProjects](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_DescribeProjects)et pour obtenir le [fichier récapitulatif](im-summary-file-api.md) d'un modèle. Il utilise ensuite le fichier récapitulatif pour afficher la matrice de confusion du modèle. 

**Pour afficher la matrice de confusion d’un modèle (kit SDK)**

1. Si ce n'est pas déjà fait, installez et configurez le AWS CLI et le AWS SDKs. Pour de plus amples informations, veuillez consulter [Étape 4 : configurer le AWS CLI et AWS SDKs](su-awscli-sdk.md).

1. Utilisez le code suivant pour afficher la matrice de confusion d’un modèle. Fournissez les arguments de ligne de commande suivants :
   + `project_name` : nom du projet que vous souhaitez utiliser. Vous pouvez obtenir le nom du projet sur la page des projets de la console Étiquettes personnalisées Amazon Rekognition.
   + `version_name` : version du modèle que vous souhaitez utiliser. Vous pouvez obtenir le nom de la version sur la page des informations détaillées du projet de la console Étiquettes personnalisées Amazon Rekognition.

   ```
   # 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()
   ```

# Référence : fichier récapitulatif des résultats de l’entraînement
<a name="im-summary-file"></a>

Le résumé des résultats de l’entraînement contient les métriques que vous pouvez utiliser pour évaluer votre modèle. Le fichier récapitulatif est également utilisé pour afficher les métriques dans la page de la console relative aux résultats de l’entraînement. Le fichier récapitulatif est stocké dans un compartiment Amazon S3 après l’entraînement. Pour obtenir le fichier récapitulatif, appelez `DescribeProjectVersion`. Pour obtenir un exemple de code, consultez [Accès au fichier récapitulatif et à l’instantané du manifeste d’évaluation (kit SDK)](im-access-summary-evaluation-manifest.md). 

## Fichier récapitulatif
<a name="im-summary-reference"></a>

Le format JSON suivant est le format du fichier récapitulatif.



**EvaluationDetails (article 3)**  
Informations générales sur la tâche d’entraînement. Ces informations incluent l’ARN du projet auquel appartient le modèle (`ProjectVersionArn)`, la date et l’heure de fin de l’entraînement, la version du modèle évalué (`EvaluationEndTimestamp`) et la liste des étiquettes détectées pendant l’entraînement (`Labels`). Figurent aussi le nombre d’images utilisées pour l’entraînement (`NumberOfTrainingImages`) et l’évaluation (`NumberOfTestingImages`). 

**AggregatedEvaluationResults (article 1)**  
Vous pouvez utiliser `AggregatedEvaluationResults` pour évaluer les performances globales du modèle entraîné lorsqu’il est utilisé avec le jeu de données des tests. Des métriques de cumul sont incluses pour les métriques `Precision`, `Recall` et `F1Score`. Pour la détection d’objets (emplacement de l’objet sur une image), les métriques `AverageRecall` (mAR) et `AveragePrecision` (mAP) sont renvoyées. Pour la classification (type d’objet dans une image), une métrique de matrice de confusion est renvoyée. 

**LabelEvaluationResults (article 2)**  
Vous pouvez utiliser `labelEvaluationResults` pour évaluer les performances de chaque étiquette. Les étiquettes sont triées en fonction du score F1 de chaque étiquette. Les métriques incluses sont `Precision`, `Recall`, `F1Score` et `Threshold` (utilisées pour la classification). 

Le format du fichier est le suivant : `EvaluationSummary-ProjectName-VersionName.json`.

```
{
  "Version": "integer",
  // section-3
  "EvaluationDetails": {
    "ProjectVersionArn": "string",
    "EvaluationEndTimestamp": "string",
    "Labels": "[string]",
    "NumberOfTrainingImages": "int",
    "NumberOfTestingImages": "int"
  },
  // section-1
  "AggregatedEvaluationResults": {
    "Metrics": {
      "Precision": "float",
      "Recall": "float",
      "F1Score": "float",
      // The following 2 fields are only applicable to object detection
      "AveragePrecision": "float",
      "AverageRecall": "float",
      // The following field is only applicable to classification
      "ConfusionMatrix":[
        {
          "GroundTruthLabel": "string",
          "PredictedLabel": "string",
          "Value": "float"
        },
        ...
      ],
    }
  },
  // section-2
  "LabelEvaluationResults": [
    {
      "Label": "string",
      "NumberOfTestingImages", "int",
      "Metrics": {
        "Threshold": "float",
        "Precision": "float",
        "Recall": "float",
        "F1Score": "float"
      },
    },
    ...
  ]
}
```

# Amélioration d’un modèle Étiquettes personnalisées Amazon Rekognition
<a name="tr-improve-model"></a>

Les performances des modèles de machine learning dépendent largement de facteurs  tels que la complexité et la variabilité des étiquettes personnalisées (objets et scènes spécifiques qui vous intéressent), la qualité et la capacité représentative du jeu de données d’entraînement que vous fournissez, ainsi que les infrastructures du modèle et les méthodes de machine learning utilisées pour entraîner le modèle. 

Étiquettes personnalisées Amazon Rekognition simplifie le processus et aucune expertise en machine learning n’est requise. Cependant, le processus de création d’un bon modèle implique souvent des itérations sur les données et des améliorations du modèle pour atteindre les performances souhaitées. Vous trouverez ci-dessous des informations sur la manière d’améliorer votre modèle.

## Données
<a name="im-data"></a>

En général, vous pouvez améliorer la qualité de votre modèle avec de plus grandes quantités de données de meilleure qualité. Utilisez des images d’entraînement qui montrent clairement l’objet ou la scène et qui ne sont pas encombrées d’objets inutiles. Pour les cadres de délimitation autour des objets, utilisez les images d’entraînement montrant l’objet entièrement visible et non masqué par d’autres objets. 

Assurez-vous que les jeux de données d’entraînement et de test correspondent au type d’images sur lesquelles l’inférence va être exécutée. Pour les objets, tels que les logos, pour lesquels vous n’avez que quelques exemples d’entraînement, vous devez fournir des cadres de délimitation autour du logo dans les images de test. Ces images représentent ou illustrent les scénarios dans lesquels vous souhaitez localiser l’objet.

Pour ajouter de nouvelles images à un jeu de données d’entraînement ou de test, consultez [Ajout d’autres images à un jeu de données](md-add-images.md).

## Réduction des faux positifs (plus grande précision)
<a name="im-reduce-false-positives"></a>
+ Tout d’abord, vérifiez si l’augmentation du seuil supposé permet de conserver les prédictions correctes, tout en diminuant les faux positifs. À un moment donné, les gains diminuent en raison du compromis entre précision et rappel pour un modèle donné. Vous ne pouvez pas définir le seuil supposé pour une étiquette, mais vous pouvez obtenir le même résultat en spécifiant une valeur élevée pour le paramètre d’entrée `MinConfidence` telle que `DetectCustomLabels`. Pour plus d’informations, consultez [Analyse d’une image avec un modèle entraîné](detecting-custom-labels.md).
+ Il se peut qu’une ou plusieurs des étiquettes personnalisées qui vous intéressent (A) soient régulièrement confondues avec la même classe d’objets (mais pas avec une étiquette qui vous intéresse) (B). Pour vous aider, ajoutez B comme étiquette de classe d’objet à votre jeu de données d’entraînement (avec les images sur lesquelles vous avez obtenu un faux positif). En fait, vous aidez le modèle à apprendre à prédire B et non A grâce aux nouvelles images d’entraînement. Pour ajouter des images à un jeu de données d’entraînement, consultez [Ajout d’autres images à un jeu de données](md-add-images.md). 
+ Vous constaterez peut-être que le modèle confond deux de vos étiquettes personnalisées (A et B) : il est prédit que l’image de test portant l’étiquette A portera l’étiquette B et inversement. Dans ce cas, vérifiez d’abord qu’il n’y a pas d’images mal étiquetées dans vos jeux de données d’entraînement et de test. Utilisez la galerie de jeux de données pour gérer les étiquettes attribuées à un jeu de données. Pour plus d’informations, consultez [Gestion des étiquettes](md-labels.md). De plus, l’ajout d’images d’entraînement liées à ce type de confusion aide un modèle réentraîné à mieux faire la distinction entre A et B. Pour ajouter des images à un jeu de données d’entraînement, consultez [Ajout d’autres images à un jeu de données](md-add-images.md). 

## Réduction des faux négatifs (meilleur rappel)
<a name="im-reduce-false-negatives"></a>
+ Utilisez une valeur inférieure pour le seuil supposé. Vous ne pouvez pas définir le seuil supposé d’une étiquette, mais vous pouvez obtenir le même résultat en spécifiant une valeur moindre pour le paramètre d’entrée `MinConfidence` telle que `DetectCustomLabels`. Pour plus d’informations, consultez [Analyse d’une image avec un modèle entraîné](detecting-custom-labels.md).
+ Utilisez de meilleurs exemples pour modéliser la diversité de l’objet et les images dans lesquelles il apparaît.
+ Scindez l’étiquette en deux catégories plus faciles à apprendre. Par exemple, au lieu de bons et de mauvais biscuits, vous préférerez peut-être de bons biscuits, des biscuits brûlés ou des biscuits brisés pour aider le modèle à mieux comprendre chaque concept unique. 