Conector de detecção de objetos do ML - AWS IoT Greengrass

AWS IoT Greengrass Version 1 entrou na fase de vida útil prolongada em 30 de junho de 2023. Para obter mais informações, consulte política de manutenção do AWS IoT Greengrass V1. Após essa data, AWS IoT Greengrass V1 não lançaremos atualizações que forneçam recursos, aprimoramentos, correções de erros ou patches de segurança. Os dispositivos que funcionam AWS IoT Greengrass V1 não serão interrompidos e continuarão operando e se conectando à nuvem. É altamente recomendável que você migre para AWS IoT Greengrass Version 2, o que adiciona novos recursos significativos e suporte para plataformas adicionais.

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Conector de detecção de objetos do ML

Atenção

Esse conector passou para a fase de vida útil estendida e AWS IoT Greengrass não lançará atualizações que forneçam atributos, aprimoramentos para atributos existentes, patches de segurança ou correções de erros. Para obter mais informações, consulte Política de manutenção do AWS IoT Greengrass Version 1.

Os conectores de detecção de objetos do ML fornecem um serviço de inferência de machine learning (ML), que é executado no núcleo AWS IoT Greengrass. Esse serviço de inferência local executa a detecção de objetos usando um modelo de detecção de objetos compilado pelo compilador de aprendizado profundo do SageMaker Neo. Dois tipos de modelos de detecção de objetos são compatíveis: Single Shot Multibox Detector (SSD) e You Only Look Once (YOLO) v3. Para obter mais informações, consulte Requisitos do modelo de detecção de objetos.

As funções do Lambda definidas pelo usuário usam o SDK AWS IoT Greengrass de machine learning para enviar solicitações de inferência ao serviço de inferência local. O serviço realiza a inferência local em uma imagem de entrada e retorna uma lista de previsões para cada objeto detectado na imagem. Cada previsão contém uma categoria de objeto, uma pontuação de confiança de previsão e coordenadas de pixels que especificam uma caixa delimitadora em torno do objeto previsto.

O AWS IoT Greengrass fornece conectores de objeto do ML para várias plataformas:

Conector

Descrição e ARN

Detecção de objetos do ML Aarch64 JTX2

Serviço de inferência de detecção de objetos para NVIDIA Jetson TX2. Compatível com a aceleração de GPU.

ARN: arn:aws:greengrass:region::/connectors/ObjectDetectionAarch64JTX2/versions/1

Detecção de objetos do ML x86_64

Serviço de inferência de detecção de objetos para plataformas x86_64.

ARN: arn:aws:greengrass:region::/connectors/ObjectDetectionx86-64/versions/1

Detecção de objetos do ML ARMv7

Serviço de inferência de detecção de objetos para plataformas ARMv7.

ARN: arn:aws:greengrass:region::/connectors/ObjectDetectionARMv7/versions/1

Requisitos

Esses conectores têm os seguintes requisitos:

  • Software Core AWS IoT Greengrass v1.9.3 ou posterior.

  • Python, versão 3.7 ou 3.8, instalado no dispositivo de núcleo e adicionado à variável de ambiente PATH.

    nota

    Para usar o Python 3.8, execute o comando a seguir para criar um symblink da pasta de instalação padrão do Python 3.7 para os binários instalados do Python 3.8.

    sudo ln -s path-to-python-3.8/python3.8 /usr/bin/python3.7

    Isso configura seu dispositivo para atender ao requisito Python para AWS IoT Greengrass.

  • Dependências do runtime de aprendizado profundo do SageMaker Neo instaladas no dispositivo de núcleo. Para obter mais informações, consulte Instalar dependências do runtime de aprendizado profundo do Neo no núcleo do AWS IoT Greengrass.

  • Um recurso de ML no grupo do Greengrass. O recurso de ML deve fazer referência a um bucket do Amazon S3 que contém um modelo de detecção de objeto. Para obter mais informações, consulte Origem de modelo do Amazon S3.

    nota

    O modelo deve ser um tipo de modelo de detecção de objetos Single Shot Multibox Detector ou You Only Look Once v3. Ele deve ser compilado usando o compilador de aprendizado profundo do SageMaker Neo. Para obter mais informações, consulte Requisitos do modelo de detecção de objetos.

  • O conector de feedback do ML adicionado ao grupo do Greengrass e configurado. Isso será necessário somente se você quiser usar o conector para fazer upload de dados de entrada do modelo e publicar previsões em um tópico MQTT.

  • AWS IoT GreengrassA versão v1.1.0 do SDK de machine learning é necessária para interagir com esse conector.

Requisitos do modelo de detecção de objetos

Os conectores de detecção de objetos do ML oferecem suporte aos tipos de modelo de detecção de objetos Single Shot multibox Detector (SSD) e You Only Look Once (YOLO) v3. Você pode usar os componentes de detecção de objetos fornecidos pelo GluonCV para treinar o modelo com seu próprio conjunto de dados. Ou pode usar modelos pré-treinados do GluonCV Model Zoo:

Seu modelo de detecção de objetos deve ser treinado com imagens de entrada 512 x 512. Os modelos pré-treinados do GluonCV Model Zoo já atendem a esse requisito.

Os modelos de detecção de objetos treinados devem ser compilados com o compilador de aprendizado profundo do SageMaker Neo. Ao compilar, verifique se o hardware de destino corresponde ao hardware do seu dispositivo de núcleo do Greengrass. Para obter informações, consulte SageMaker Neo no Guia do desenvolvedor do Amazon SageMaker.

O modelo compilado deve ser adicionado como um recurso de ML (origem de modelo do Amazon S3) ao mesmo grupo do Greengrass que o conector.

Parâmetros do conector

Esses conectores fornecem os parâmetros a seguir.

MLModelDestinationPath

O caminho absoluto para o bucket do Amazon S3 que contém o modelo de ML compatível com Neo. Esse é o caminho de destino especificado para o recurso de modelo de ML.

Nome de exibição no console AWS IoT: Caminho de destino do modelo

Obrigatório: true

Digite: string

Padrão válido: .+

MLModelResourceId

O ID do recurso de ML que faz referência ao modelo de origem.

Nome de exibição no console AWS IoT: Recurso do ML do grupo do Greengrass

Obrigatório: true

Digite: S3MachineLearningModelResource

Padrão válido: ^[a-zA-Z0-9:_-]+$

LocalInferenceServiceName

O nome para o serviço de inferência local. As funções do Lambda definidas pelo usuário invocam o serviço passando o nome para a função invoke_inference_service do SDK AWS IoT Greengrass de Machine Learning. Para ver um exemplo, consulte Exemplo de uso.

Nome de exibição no console AWS IoT: Nome do serviço de inferência local

Obrigatório: true

Digite: string

Padrão válido: ^[a-zA-Z0-9][a-zA-Z0-9-]{1,62}$

LocalInferenceServiceTimeoutSeconds

O tempo (em segundos) até que a solicitação de inferência seja encerrada. O valor mínimo é 1. O valor padrão é 10.

Nome de exibição no console AWS IoT: Tempo limite (segundos)

Obrigatório: true

Digite: string

Padrão válido: ^[1-9][0-9]*$

LocalInferenceServiceMemoryLimitKB

A quantidade de memória (em KB) que o serviço tem acesso. O valor mínimo é 1.

Nome de exibição no console AWS IoT: Limite de memória

Obrigatório: true

Digite: string

Padrão válido: ^[1-9][0-9]*$

GPUAcceleration

O contexto de computação CPU ou GPU (acelerada). Essa propriedade aplica-se somente ao conector Aarch64 JTX2 de classificação de imagens do ML.

Nome de exibição no console AWS IoT: Aceleração de GPU

Obrigatório: true

Digite: string

Valores válidos: CPU ou GPU

MLFeedbackConnectorConfigId

O ID da configuração de feedback a ser usada para fazer upload dos dados de entrada do modelo. Ele deve corresponder ao ID de uma configuração de feedback definida para o conector ML Feedback.

Esse parâmetro é necessário somente se você quiser usar o conector ML Feedback para fazer upload de dados de entrada do modelo e publicar previsões em um tópico MQTT.

Nome de exibição no console AWS IoT: ID de configuração do conector de feedback do ML

Obrigatório: false

Digite: string

Padrão válido: ^$|^[a-zA-Z0-9][a-zA-Z0-9-]{1,62}$

Exemplo de criação de conector (AWS CLI)

O seguinte comando da CLI cria um ConnectorDefinition com uma versão inicial que contém um conector de detecção de objeto do ML. Este exemplo cria uma instância do conector ARMv7l detecção de objeto do ML.

aws greengrass create-connector-definition --name MyGreengrassConnectors --initial-version '{ "Connectors": [ { "Id": "MyObjectDetectionConnector", "ConnectorArn": "arn:aws:greengrass:region::/connectors/ObjectDetectionARMv7/versions/1", "Parameters": { "MLModelDestinationPath": "/path-to-model", "MLModelResourceId": "my-ml-resource", "LocalInferenceServiceName": "objectDetection", "LocalInferenceServiceTimeoutSeconds": "10", "LocalInferenceServiceMemoryLimitKB": "500000", "MLFeedbackConnectorConfigId" : "object-detector-random-sampling" } } ] }'
nota

A função do Lambda nesses conectores tem um ciclo de vida longo.

No console do AWS IoT Greengrass, você pode adicionar um conector na página Conectores do grupo. Para obter mais informações, consulte Conceitos básicos de conectores do Greengrass (console).

Dados de entrada

Esses conectores aceitam um arquivo de imagem como entrada. Os arquivos de imagem de entrada devem estar no formato jpeg ou png. Para obter mais informações, consulte Exemplo de uso.

Esses conectores não aceitam mensagens MQTT como dados de entrada.

Dados de saída

Esses conectores retornam uma lista formatada de resultados de previsão para os objetos identificados na imagem de entrada:

{ "prediction": [ [ 14, 0.9384938478469849, 0.37763649225234985, 0.5110225081443787, 0.6697432398796082, 0.8544386029243469 ], [ 14, 0.8859519958496094, 0, 0.43536216020584106, 0.3314110040664673, 0.9538808465003967 ], [ 12, 0.04128098487854004, 0.5976729989051819, 0.5747185945510864, 0.704264223575592, 0.857937216758728 ], ... ] }

Cada previsão na lista está contida entre colchetes e contém seis valores:

  • O primeiro valor representa a categoria de objeto prevista para o objeto identificado. As categorias de objetos e seus valores correspondentes são determinados ao treinar seu modelo de machine learning de detecção de objetos no compilador de aprendizado profundo do Neo.

  • O segundo valor é a pontuação de confiança para a previsão da categoria de objeto. Isso representa a probabilidade de a previsão estar correta.

  • Os últimos quatro valores correspondem às dimensões de pixels que representam uma caixa delimitadora em torno do objeto previsto na imagem.

Esses conectores não publicam mensagens MQTT como dados de saída.

Exemplo de uso

O exemplo de função do Lambda a seguir usa o SDK AWS IoT Greengrass de machine learning para interagir com um conector de detecção de objetos do ML.

nota

Você pode baixar o SDK na página de downloads do ‭AWS IoT Greengrass‬SDK de Machine Learning‭.

O exemplo inicializa um cliente do SDK e de forma síncrona chama a função invoke_inference_service do SDK para invocar o serviço de inferência local. Ela passa o tipo de algoritmo, o nome do serviço, o tipo de imagem e o conteúdo da imagem. Em seguida, o exemplo analisa a resposta do serviço para obter os resultados de probabilidade (previsões).

import logging from threading import Timer import numpy as np import greengrass_machine_learning_sdk as ml # We assume the inference input image is provided as a local file # to this inference client Lambda function. with open('/test_img/test.jpg', 'rb') as f: content = bytearray(f.read()) client = ml.client('inference') def infer(): logging.info('invoking Greengrass ML Inference service') try: resp = client.invoke_inference_service( AlgoType='object-detection', ServiceName='objectDetection', ContentType='image/jpeg', Body=content ) except ml.GreengrassInferenceException as e: logging.info('inference exception {}("{}")'.format(e.__class__.__name__, e)) return except ml.GreengrassDependencyException as e: logging.info('dependency exception {}("{}")'.format(e.__class__.__name__, e)) return logging.info('resp: {}'.format(resp)) predictions = resp['Body'].read().decode("utf-8") logging.info('predictions: {}'.format(predictions)) predictions = eval(predictions) # Perform business logic that relies on the predictions. # Schedule the infer() function to run again in ten second. Timer(10, infer).start() return infer() def function_handler(event, context): return

A função invoke_inference_service do SDK AWS IoT Greengrass de machine learning aceita os seguintes argumentos.

Argumento

Descrição

AlgoType

O nome do tipo de algoritmo a ser usado para inferência. No momento, só há compatibilidade com object-detection.

Obrigatório: true

Digite: string

Valores válidos: object-detection

ServiceName

O nome do serviço de inferência local. Use o nome que você especificou para o parâmetro LocalInferenceServiceName quando você configurou o conector.

Obrigatório: true

Digite: string

ContentType

O tipo de mime da imagem de entrada.

Obrigatório: true

Digite: string

Valores válidos: image/jpeg, image/png

Body

O conteúdo do arquivo de imagem de entrada.

Obrigatório: true

Digite: binary

Instalar dependências do runtime de aprendizado profundo do Neo no núcleo do AWS IoT Greengrass

Os conectores de detecção de objetos do ML são empacotados com o runtime de aprendizado profundo (DLR) do SageMaker Neo. Os conectores usam o runtime para atender ao modelo de ML. Para usar esses conectores, você deve instalar as dependências do DLR no dispositivo de núcleo.

Antes de instalar as dependências do DLR, certifique-se de que as bibliotecas do sistema necessárias (com as versões mínimas especificadas) estejam presentes no dispositivo.

NVIDIA Jetson TX2
  1. Instale CUDA Toolkit 9.0 e cuDNN 7.0. Você pode seguir as instruções em Configurar outros dispositivos no tutorial Conceitos básicos.

  2. Habilite repositórios universe para que o conector possa instalar softwares livres mantidos pela comunidade. Para obter mais informações, consulte Repositórios/Ubuntu na documentação do Ubuntu.

    1. Abra o arquivo /etc/apt/sources.list.

    2. Certifique-se de que as seguintes linhas permaneçam sem comentário.

      deb http://ports.ubuntu.com/ubuntu-ports/ xenial universe deb-src http://ports.ubuntu.com/ubuntu-ports/ xenial universe deb http://ports.ubuntu.com/ubuntu-ports/ xenial-updates universe deb-src http://ports.ubuntu.com/ubuntu-ports/ xenial-updates universe
  3. Salve uma cópia do script de instalação a seguir em um arquivo denominado nvidiajtx2.sh no dispositivo de núcleo.

    #!/bin/bash set -e echo "Installing dependencies on the system..." echo 'Assuming that universe repos are enabled and checking dependencies...' apt-get -y update apt-get -y dist-upgrade apt-get install -y liblapack3 libopenblas-dev liblapack-dev libatlas-base-dev apt-get install -y python3.7 python3.7-dev python3.7 -m pip install --upgrade pip python3.7 -m pip install numpy==1.15.0 python3.7 -m pip install opencv-python || echo 'Error: Unable to install OpenCV with pip on this platform. Try building the latest OpenCV from source (https://github.com/opencv/opencv).' echo 'Dependency installation/upgrade complete.'
    nota

    Se o OpenCV não for instalado com êxito usando esse script, você poderá tentar compilar a partir do código-fonte. Para obter mais informações, consulte Instalação no Linux na documentação do OpenCV ou consulte outros recursos online da sua plataforma.

  4. A partir do diretório em que você salvou o arquivo, execute o seguinte comando:

    sudo nvidiajtx2.sh
x86_64 (Ubuntu or Amazon Linux)
  1. Salve uma cópia do script de instalação a seguir em um arquivo denominado x86_64.sh no dispositivo de núcleo.

    #!/bin/bash set -e echo "Installing dependencies on the system..." release=$(awk -F= '/^NAME/{print $2}' /etc/os-release) if [ "$release" == '"Ubuntu"' ]; then # Ubuntu. Supports EC2 and DeepLens. DeepLens has all the dependencies installed, so # this is mostly to prepare dependencies on Ubuntu EC2 instance. apt-get -y update apt-get -y dist-upgrade apt-get install -y libgfortran3 libsm6 libxext6 libxrender1 apt-get install -y python3.7 python3.7-dev elif [ "$release" == '"Amazon Linux"' ]; then # Amazon Linux. Expect python to be installed already yum -y update yum -y upgrade yum install -y compat-gcc-48-libgfortran libSM libXrender libXext else echo "OS Release not supported: $release" exit 1 fi python3.7 -m pip install --upgrade pip python3.7 -m pip install numpy==1.15.0 python3.7 -m pip install opencv-python || echo 'Error: Unable to install OpenCV with pip on this platform. Try building the latest OpenCV from source (https://github.com/opencv/opencv).' echo 'Dependency installation/upgrade complete.'
    nota

    Se o OpenCV não for instalado com êxito usando esse script, você poderá tentar compilar a partir do código-fonte. Para obter mais informações, consulte Instalação no Linux na documentação do OpenCV ou consulte outros recursos online da sua plataforma.

  2. A partir do diretório em que você salvou o arquivo, execute o seguinte comando:

    sudo x86_64.sh
ARMv7 (Raspberry Pi)
  1. Salve uma cópia do script de instalação a seguir em um arquivo denominado armv7l.sh no dispositivo de núcleo.

    #!/bin/bash set -e echo "Installing dependencies on the system..." apt-get update apt-get -y upgrade apt-get install -y liblapack3 libopenblas-dev liblapack-dev apt-get install -y python3.7 python3.7-dev python3.7 -m pip install --upgrade pip python3.7 -m pip install numpy==1.15.0 python3.7 -m pip install opencv-python || echo 'Error: Unable to install OpenCV with pip on this platform. Try building the latest OpenCV from source (https://github.com/opencv/opencv).' echo 'Dependency installation/upgrade complete.'
    nota

    Se o OpenCV não for instalado com êxito usando esse script, você poderá tentar compilar a partir do código-fonte. Para obter mais informações, consulte Instalação no Linux na documentação do OpenCV ou consulte outros recursos online da sua plataforma.

  2. A partir do diretório em que você salvou o arquivo, execute o seguinte comando:

    sudo bash armv7l.sh
    nota

    Em um Raspberry Pi, usar o pip para instalar dependências de machine learning é uma operação com uso intensivo de memória que pode fazer com que o dispositivo fique sem memória e deixe de responder. Como alternativa, você pode aumentar temporariamente o tamanho da permuta. Em /etc/dphys-swapfile, aumente o valor da variável CONF_SWAPSIZE e, em seguida, execute o seguinte comando para reiniciar dphys-swapfile.

    /etc/init.d/dphys-swapfile restart

Registro em log e solução de problemas

Dependendo das suas configurações de grupo, os logs de erro e evento são gravados no CloudWatch Logs, no sistema de arquivos local, ou ambos. Os logs desse conector usam o prefixo LocalInferenceServiceName. Se o conector se comportar de forma inesperada, verifique os logs do conector. Normalmente, eles contêm informações úteis de depuração, como uma dependência de biblioteca de ML ausente ou a causa de uma falha de startup do conector.

Se o grupo AWS IoT Greengrass estiver configurado para gravar logs locais, o conector grava arquivos de log em greengrass-root/ggc/var/log/user/region/aws/. Para obter mais informações sobre o registro em log do Greengrass, consulte Monitoramento com logs do AWS IoT Greengrass.

Use as informações a seguir para ajudar a solucionar os problemas com os conectores de detecção de objetos do ML.

Bibliotecas do sistema necessárias

As guias a seguir listam as bibliotecas do sistema necessárias para cada conector de detecção de objetos do ML.

ML Object Detection Aarch64 JTX2
Ferramentas Versão mínima
ld-linux-aarch64.so.1 GLIBC_2.17
libc.so.6 GLIBC_2.17
libcublas.so.9.0 não aplicável
libcudart.so.9.0 não aplicável
libcudnn.so.7 não aplicável
libcufft.so.9.0 não aplicável
libcurand.so.9.0 não aplicável
libcusolver.so.9.0 não aplicável
libgcc_s.so.1 GCC_4.2.0
libgomp.so.1 GOMP_4.0, OMP_1.0
libm.so.6 GLIBC_2.23
libnvinfer.so.4 não aplicável
libnvrm_gpu.so não aplicável
libnvrm.so não aplicável
libnvidia-fatbinaryloader.so.28.2.1 não aplicável
libnvos.so não aplicável
libpthread.so.0 GLIBC_2.17
librt.so.1 GLIBC_2.17
libstdc++.so.6 GLIBCXX_3.4.21, CXXABI_1.3.8
ML Object Detection x86_64
Ferramentas Versão mínima
ld-linux-x86-64.so.2 GCC_4.0.0
libc.so.6 GLIBC_2.4
libgfortran.so.3 GFORTRAN_1.0
libm.so.6 GLIBC_2.23
libpthread.so.0 GLIBC_2.2.5
librt.so.1 GLIBC_2.2.5
libstdc++.so.6 CXXABI_1.3.8, GLIBCXX_3.4.21
ML Object Detection ARMv7
Ferramentas Versão mínima
ld-linux-armhf.so.3 GLIBC_2.4
libc.so.6 GLIBC_2.7
libgcc_s.so.1 GCC_4.0.0
libgfortran.so.3 GFORTRAN_1.0
libm.so.6 GLIBC_2.4
libpthread.so.0 GLIBC_2.4
librt.so.1 GLIBC_2.4
libstdc++.so.6 CXXABI_1.3.8, CXXABI_ARM_1.3.3, GLIBCXX_3.4.20

Problemas

Sintomas Solução

Em um Raspberry Pi, a mensagem de erro a seguir será registrada em log e você não está usando a câmera: Failed to initialize libdc1394

Execute o comando a seguir para desabilitar o driver:

sudo ln /dev/null /dev/raw1394

Essa operação é efêmera. O symblink desaparece após a reinicialização. Consulte o manual de distribuição do seu sistema operacional para saber como criar o link automaticamente na reinicialização.

Licenças

Os conectores de detecção de objetos do ML incluem o seguinte licenciamento/software de terceiros:

Esse conector é liberado de acordo com o Contrato de licença de software do Greengrass Core.

Consulte também