Construisez et entraînez des modèles de vision par ordinateur pour détecter les positions des voitures dans les images en utilisant Amazon SageMaker et Amazon Rekognition

Entraînez des modèles de vision par ordinateur pour détecter les positions des voitures dans les images avec Amazon SageMaker et Amazon Rekognition.

La vision par ordinateur (CV) est l’une des applications les plus courantes de l’apprentissage automatique (ML) et de l’apprentissage en profondeur. Les cas d’utilisation vont des voitures autonomes à la modération de contenu sur les plateformes de médias sociaux, en passant par la détection du cancer et la détection automatisée des défauts. Amazon Rekognition est un service entièrement géré qui peut effectuer des tâches de CV telles que la détection d’objets, la détection de segments vidéo, la modération de contenu, et plus encore, pour extraire des informations des données sans nécessiter aucune expérience préalable en ML. Dans certains cas, une solution plus personnalisée peut être nécessaire en complément du service pour résoudre un problème très spécifique.

Dans cet article, nous abordons les domaines où la CV peut être appliquée à des cas d’utilisation où la pose des objets, leur position et leur orientation sont importants. Un tel cas d’utilisation serait celui des applications mobiles orientées clients où un téléchargement d’image est requis. Cela peut être pour des raisons de conformité ou pour offrir une expérience utilisateur cohérente et améliorer l’engagement. Par exemple, sur les plateformes de vente en ligne, l’angle sous lequel les produits sont présentés sur les images a un effet sur le taux d’achat de ce produit. Un tel cas est la détection de la position d’une voiture. Nous montrons comment vous pouvez combiner des solutions d’apprentissage automatique bien connues avec un post-traitement pour résoudre ce problème sur le Cloud AWS.

Nous utilisons des modèles d’apprentissage en profondeur pour résoudre ce problème. La formation d’algorithmes d’apprentissage automatique pour l’estimation de la pose nécessite beaucoup d’expertise et de données d’entraînement personnalisées. Les deux exigences sont difficiles et coûteuses à obtenir. Par conséquent, nous présentons deux options : l’une ne nécessite aucune expertise en ML et utilise Amazon Rekognition, et l’autre utilise Amazon SageMaker pour former et déployer un modèle d’apprentissage automatique personnalisé. Dans la première option, nous utilisons Amazon Rekognition pour détecter les roues de la voiture. Nous déduisons ensuite l’orientation de la voiture à partir des positions des roues à l’aide d’un système basé sur des règles. Dans la deuxième option, nous détectons les roues et les autres parties de la voiture à l’aide du modèle Detectron. Ces éléments sont à nouveau utilisés pour déduire la position de la voiture avec du code basé sur des règles. La deuxième option nécessite une expérience en ML mais est également plus personnalisable. Elle peut être utilisée pour un post-traitement supplémentaire sur l’image, par exemple pour recadrer la voiture entière. Les deux options peuvent être formées sur des ensembles de données disponibles publiquement. Enfin, nous montrons comment vous pouvez intégrer cette solution de détection de la pose de la voiture dans votre application web existante à l’aide de services tels qu’Amazon API Gateway et AWS Amplify.

Aperçu de la solution

Le diagramme suivant illustre l’architecture de la solution.

La solution se compose d’une application web fictive dans Amplify où un utilisateur peut télécharger une image et invoquer soit le modèle Amazon Rekognition, soit le modèle personnalisé Detectron pour détecter la position de la voiture. Pour chaque option, nous hébergeons une fonction AWS Lambda derrière un API Gateway qui est exposé à notre application fictive. Nous avons configuré notre fonction Lambda pour s’exécuter avec le modèle Detectron formé dans SageMaker ou Amazon Rekognition.

Prérequis

Pour ce tutoriel, vous devez disposer des prérequis suivants :

  • Un compte AWS.
  • Un utilisateur AWS Identity and Access Management (IAM) avec les autorisations nécessaires pour déployer et provisionner l’infrastructure, par exemple PowerUserAccess (notez que les autorisations devraient être restreintes davantage pour une application prête pour la production et dépendent des intégrations possibles avec d’autres services).
  • Docker dans votre environnement de développement (machine locale ou instance de notebook SageMaker à partir de laquelle vous déployez la solution).
  • Le kit de développement Cloud AWS (AWS CDK) installé. Il peut être installé à l’aide de npm comme expliqué dans notre dépôt GitHub.

Créer une application sans serveur en utilisant Amazon Rekognition

Notre première option démontre comment vous pouvez détecter les orientations des voitures sur des images en utilisant Amazon Rekognition. L’idée est d’utiliser Amazon Rekognition pour détecter l’emplacement de la voiture et de ses roues, puis de faire un post-traitement pour déduire l’orientation de la voiture à partir de ces informations. Toute la solution est déployée à l’aide de Lambda, comme le montre le dépôt Github. Ce dossier contient deux fichiers principaux : un Dockerfile qui définit l’image Docker qui s’exécutera dans notre fonction Lambda, et le fichier app.py, qui sera le point d’entrée principal de la fonction Lambda :

def lambda_handler(event, context):
    body_bytes = json.loads(event["body"])["image"].split(",")[-1]
    body_bytes = base64.b64decode(body_bytes)

    rek = boto3.client('rekognition')
    response = rek.detect_labels(Image={'Bytes': body_bytes}, MinConfidence=80)
    
    angle, img = label_image(img_string=body_bytes, response=response)

    buffered = BytesIO()
    img.save(buffered, format="JPEG")
    img_str = "data:image/jpeg;base64," + base64.b64encode(buffered.getvalue()).decode('utf-8')

La fonction Lambda attend un événement qui contient un en-tête et un corps, où le corps devrait être l’image à étiqueter en tant qu’objet décodé en base64. En utilisant Boto3, la fonction Amazon Rekognition detect_labels est invoquée à partir de la fonction Lambda. La fonction renvoie un ou plusieurs libellés pour chaque objet dans l’image et les détails de la boîte englobante pour tous les libellés d’objets détectés en tant que partie de la réponse, ainsi que d’autres informations telles que la confiance du libellé attribué, les libellés ancestraux du libellé détecté, les alias possibles pour le libellé, et les catégories auxquelles le libellé détecté appartient. En fonction des libellés renvoyés par Amazon Rekognition, nous exécutons la fonction label_image, qui calcule l’angle de la voiture à partir des roues détectées comme suit:

n_wheels = len(wheel_instances)

wheel_centers = [np.array(_extract_bb_coords(wheel, img)).mean(axis=0)
for wheel in wheel_instances]

wheel_center_comb = list(combinations(wheel_centers, 2))
vecs = [(k, pair[0] - pair[1]) for k,pair in enumerate(wheel_center_comb)]
vecs = sorted(vecs, key = lambda vec: np.linalg.norm(vec[1]))

vec_rel = vecs[1] if n_wheels == 3 else vecs[0]
angle = math.degrees(math.atan(vec_rel[1][1]/vec_rel[1][0]))

wheel_centers_rel = [tuple(wheel.tolist()) for wheel in
wheel_center_comb[vec_rel[0]]]

Notez que l’application nécessite la présence d’une seule voiture dans l’image et renvoie une erreur si ce n’est pas le cas. Cependant, le post-traitement peut être adapté pour fournir des descriptions d’orientation plus détaillées, couvrir plusieurs voitures ou calculer l’orientation d’objets plus complexes.

Améliorer la détection des roues

Pour améliorer davantage la précision de la détection des roues, vous pouvez utiliser les étiquettes personnalisées d’Amazon Rekognition. Tout comme l’ajustement fin à l’aide de SageMaker pour former et déployer un modèle d’apprentissage automatique personnalisé, vous pouvez apporter vos propres données étiquetées afin qu’Amazon Rekognition puisse produire un modèle d’analyse d’image personnalisé pour vous en seulement quelques heures. Avec les étiquettes personnalisées de Rekognition, vous avez seulement besoin d’un petit ensemble d’images d’entraînement spécifiques à votre cas d’utilisation, dans ce cas des images de voitures avec des angles spécifiques, car il utilise les capacités existantes d’Amazon Rekognition qui ont été formées sur des dizaines de millions d’images dans de nombreuses catégories. Les étiquettes personnalisées de Rekognition peuvent être intégrées en seulement quelques clics et de petites adaptations à la fonction Lambda que nous utilisons pour la solution standard d’Amazon Rekognition.

Former un modèle à l’aide d’un travail d’entraînement SageMaker

Dans notre deuxième option, nous formons un modèle d’apprentissage profond personnalisé sur SageMaker. Nous utilisons le framework Detectron2 pour la segmentation des pièces de voiture. Ces segments sont ensuite utilisés pour déduire la position de la voiture.

Le framework Detectron2 est une bibliothèque qui fournit des algorithmes de détection et de segmentation de pointe. Detectron propose une variété de modèles Mask R-CNN qui ont été formés sur le célèbre ensemble de données COCO (Common objects in Context). Pour construire notre modèle de détection d’objets de voiture, nous utilisons le transfert d’apprentissage pour affiner un modèle Mask R-CNN pré-entraîné sur l’ensemble de données de segmentation des pièces de voiture. Cet ensemble de données nous permet de former un modèle qui peut détecter les roues mais aussi d’autres pièces de voiture. Ces informations supplémentaires peuvent ensuite être utilisées dans les calculs d’angle de la voiture par rapport à l’image.

L’ensemble de données contient des données annotées des pièces de voiture à utiliser pour la détection d’objets et les tâches de segmentation sémantique : environ 500 images de berlines, de pickups et de véhicules utilitaires sportifs (VUS), prises sous plusieurs angles (avant, arrière et latéraux). Chaque image est annotée par 18 masques d’instance et des boîtes englobantes représentant les différentes parties d’une voiture comme les roues, les rétroviseurs, les feux, les vitres avant et arrière. Nous avons modifié les annotations de base des roues de sorte que chaque roue soit considérée comme un objet individuel au lieu de considérer toutes les roues disponibles dans l’image comme un seul objet.

Nous utilisons le service de stockage simple d’Amazon (Amazon S3) pour stocker l’ensemble de données utilisé pour former le modèle Detectron ainsi que les artefacts du modèle entraîné. De plus, le conteneur Docker qui s’exécute dans la fonction Lambda est stocké dans le registre de conteneurs élastique d’Amazon (Amazon ECR). Le conteneur Docker dans la fonction Lambda est nécessaire pour inclure les bibliothèques et les dépendances nécessaires à l’exécution du code. Nous pourrions utiliser alternativement des couches Lambda, mais cela est limité à une taille de déploiement non compressée de 250 Mo et un maximum de cinq couches peuvent être ajoutées à une fonction Lambda.

Notre solution est construite sur SageMaker : nous étendons les conteneurs Docker préconstruits de SageMaker pour PyTorch afin d’exécuter notre code d’entraînement PyTorch personnalisé. Ensuite, nous utilisons le SDK Python de SageMaker pour envelopper l’image d’entraînement dans un estimateur SageMaker PyTorch, comme le montrent les extraits de code suivants:

d2_estimator = Estimator(
        image_uri=training_image_uri,
        role=rôle,
        sagemaker_session=session_sm,
        instance_count=1,
        instance_type=type_instance_formation,
        output_path=f"s3://{session_bucket}/{prefix_model}",
        base_job_name=f"detectron2")

d2_estimator.fit({
            "training": canal_formation,
            "validation": canal_validation,
        },
        wait=True)

Enfin, nous lançons le travail de formation en appelant la fonction fit() sur l’estimateur PyTorch créé. Lorsque la formation est terminée, l’artefact du modèle formé est stocké dans le compartiment de session Amazon S3 pour être utilisé dans le pipeline d’inférence.

Déployer le modèle à l’aide de SageMaker et des pipelines d’inférence

Nous utilisons également SageMaker pour héberger le point de terminaison d’inférence qui exécute notre modèle Detectron personnalisé. L’infrastructure complète utilisée pour déployer notre solution est provisionnée à l’aide d’AWS CDK. Nous pouvons héberger notre modèle personnalisé via un point de terminaison en temps réel SageMaker en appelant déployer sur l’estimateur PyTorch. C’est la deuxième fois que nous étendons un conteneur SageMaker PyTorch pré-construit pour inclure PyTorch Detectron. Nous l’utilisons pour exécuter le script d’inférence et héberger notre modèle PyTorch formé comme suit :

model = PyTorchModel(
        name="d2-sku110k-model",
        model_data=d2_estimator.model_data,
        role=rôle,
        sagemaker_session=session_sm,
        entry_point="predict.py",
        source_dir="src",
        image_uri=serve_image_uri,
        framework_version="1.6.0")

    predictor = model.deploy(
        initial_instance_count=1,
        instance_type="ml.g4dn.xlarge",
        endpoint_name="detectron-endpoint",
        serializer=sagemaker.serializers.JSONSerializer(),
        deserializer=sagemaker.deserializers.JSONDeserializer(),
        wait=True)

Notez que nous avons utilisé une GPU ml.g4dn.xlarge pour le déploiement car c’est la plus petite GPU disponible et suffisante pour cette démo. Deux composants doivent être configurés dans notre script d’inférence : le chargement du modèle et le service du modèle. La fonction model_fn() est utilisée pour charger le modèle formé qui fait partie du conteneur Docker hébergé et qui peut également être trouvé dans Amazon S3 et renvoie un objet modèle qui peut être utilisé pour le service du modèle comme suit :

def model_fn(model_dir: str) -> DefaultPredictor:
  
    for p_file in Path(model_dir).iterdir():
        if p_file.suffix == ".pth":
            path_model = p_file
        
    cfg = get_cfg()
    cfg.MODEL.WEIGHTS = str(path_model)

    return DefaultPredictor(cfg)

La fonction predict_fn() effectue la prédiction et renvoie le résultat. En plus d’utiliser notre modèle formé, nous utilisons une version pré-entraînée du modèle Mask R-CNN formé sur l’ensemble de données COCO pour extraire la voiture principale de l’image. Il s’agit d’une étape supplémentaire de post-traitement pour traiter les images où plus d’une voiture existe. Voir le code suivant :

def predict_fn(input_img: np.ndarray, predictor: DefaultPredictor) -> Mapping:
    
    pretrained_predictor = _get_pretraind_model()
    car_mask = get_main_car_mask(pretrained_predictor, input_img)
    outputs = predictor(input_img)
    fmt_out = {
        "image_height": input_object.shape[0],
        "image_width": input_object.shape[1],
        "pred_boxes": outputs["instances"].pred_boxes.tensor.tolist(),
        "scores": outputs["instances"].scores.tolist(),
        "pred_classes": outputs["instances"].pred_classes.tolist(),
        "car_mask": car_mask.tolist()
    }
    return fmt_out

Tout comme la solution Amazon Rekognition, les boîtes englobantes prédites pour la classe roue sont filtrées à partir des sorties de détection et fournies au module de post-traitement pour évaluer la position de la voiture par rapport à la sortie.

Enfin, nous avons également amélioré le post-traitement pour la solution Detectron. Il utilise également les segments des différentes parties de la voiture pour déduire la solution. Par exemple, chaque fois qu’un pare-chocs avant est détecté, mais pas de pare-chocs arrière, on suppose que nous avons une vue avant de la voiture et l’angle correspondant est calculé.

Connectez votre solution à l’application web

Les étapes pour connecter les points de terminaison du modèle à Amplify sont les suivantes :

  • Clonez le dépôt de l’application que la pile AWS CDK a créée, nommé car-angle-detection-website-repo. Assurez-vous de le chercher dans la région que vous avez utilisée pour le déploiement.
  • Copiez les points de terminaison d’API Gateway pour chacune des fonctions Lambda déployées dans le fichier index.html du dépôt précédent (il y a des espaces réservés où le point de terminaison doit être placé). Le code suivant est un exemple de ce à quoi cette section du fichier .html ressemble :
<td align="center" colspan="2">
<select id="endpoint">
<option value="https://ey82aaj8ch.execute-api.eu-central-1.amazonaws.com/prod/">
                Amazon Rekognition</option>
<option value="https://nhq6q88xjg.execute-api.eu-central-1.amazonaws.com/prod/">
                Amazon SageMaker Detectron</option>
</select>
<input class="btn" type="file" id="ImageBrowse" />
<input class="btn btn-primary" type="submit" value="Upload">
</td>
  • Enregistrez le fichier HTML et poussez le changement de code vers la branche principale à distance.

Cela mettra à jour le fichier HTML dans le déploiement. L’application est désormais prête à être utilisée.

  • Accédez à la console Amplify et localisez le projet que vous avez créé.

L’URL de l’application sera visible une fois le déploiement terminé.

  • Accédez à l’URL et amusez-vous avec l’interface utilisateur.

Conclusion

Félicitations ! Nous avons déployé une architecture serverless complète dans laquelle nous avons utilisé Amazon Rekognition, mais nous avons également donné la possibilité d’utiliser votre propre modèle personnalisé, avec cet exemple disponible sur GitHub. Si vous n’avez pas d’expertise en ML dans votre équipe ou suffisamment de données personnalisées pour entraîner un modèle, vous pouvez sélectionner l’option qui utilise Amazon Rekognition. Si vous souhaitez avoir plus de contrôle sur votre modèle, le personnaliser davantage et avoir suffisamment de données, vous pouvez choisir la solution SageMaker. Si vous avez une équipe de data scientists, ils voudront peut-être également améliorer davantage les modèles et choisir une option plus personnalisée et flexible. Vous pouvez mettre la fonction Lambda et la passerelle API derrière votre application web en utilisant l’une ou l’autre des deux options. Vous pouvez également utiliser cette approche pour un cas d’utilisation différent pour lequel vous souhaiteriez adapter le code.

L’avantage de cette architecture serverless est que les blocs de construction sont entièrement interchangeables. Les opportunités sont presque illimitées. Alors, lancez-vous dès aujourd’hui !

Comme toujours, AWS apprécie les commentaires. Veuillez soumettre tous vos commentaires ou questions.

We will continue to update IPGirl; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more

AI

La ville la plus tournée vers la technologie aux États-Unis a des doutes concernant les voitures autonomes

Les responsables et les résidents de San Francisco ne sont pas impressionnés par les voitures autonomes, soulignant a...

AI

Le Pinceau Magique qui Fonctionne en 3D Blended-NeRF est un Modèle d'IA qui Génère des Objets sans Aucune Donnée dans les Champs de Radiance Neurale

Les dernières années ont été riches en moments de découverte pour différentes disciplines. Nous avons observé l’...

AI

Apprentissage automatique vs IA vs Apprentissage profond vs Réseaux neuronaux Quelle est la différence ?

L'évolution rapide de la technologie façonne notre existence quotidienne alors que les entreprises se tournent de plu...

AI

L'équipe de recherche fait avancer l'informatique neuromorphique d'un pas en avant

On l'appelle parfois reservoir computing, car il utilise des phénomènes physiques non linéaires pour détecter des mot...

AI

Une étude révèle que ChatGPT améliore la productivité des travailleurs pour certaines tâches d'écriture

Un nouveau rapport des chercheurs du MIT met en évidence le potentiel de l'IA générative pour aider les travailleurs ...

AI

Une nouvelle chimie

Les batteries à ions d'oxygène avancent.