Crie e treine modelos de visão computacional para detectar posições de carros em imagens usando Amazon SageMaker e Amazon Rekognition | Amazon Web Services

Crie e treine modelos de visão computacional para detectar posições de carros em imagens usando Amazon SageMaker e Amazon Rekognition | Amazon Web Services

A visão computacional (CV) é uma das aplicações mais comuns de aprendizado de máquina (ML) e aprendizado profundo. Os casos de uso variam de carros autônomos, moderação de conteúdo em plataformas de mídia social, detecção de câncer e detecção automatizada de defeitos. Reconhecimento da Amazônia é um serviço totalmente gerenciado que pode executar tarefas de CV como detecção de objetos, detecção de segmentos de vídeo, moderação de conteúdo e muito mais para extrair insights de dados sem a necessidade de qualquer experiência anterior em ML. Em alguns casos, pode ser necessária uma solução mais personalizada junto com o serviço para resolver um problema muito específico.

Neste post, abordamos áreas onde o CV pode ser aplicado em casos de uso onde a pose dos objetos, sua posição e orientação são importantes. Um desses casos de uso seriam aplicativos móveis voltados para o cliente, onde é necessário o upload de uma imagem. Pode ser por motivos de conformidade ou para fornecer uma experiência de usuário consistente e melhorar o envolvimento. Por exemplo, em plataformas de compras online, o ângulo em que os produtos são mostrados nas imagens afeta a taxa de compra desse produto. Um desses casos é detectar a posição de um carro. Demonstramos como você pode combinar soluções conhecidas de ML com pós-processamento para resolver esse problema na Nuvem AWS.

Usamos modelos de aprendizado profundo para resolver esse problema. O treinamento de algoritmos de ML para estimativa de pose requer muito conhecimento e dados de treinamento personalizados. Ambos os requisitos são difíceis e caros de obter. Portanto, apresentamos duas opções: uma que não requer nenhum conhecimento em ML e usa Amazon Rekognition, e outra que usa Amazon Sage Maker para treinar e implantar um modelo de ML personalizado. Na primeira opção, usamos o Amazon Rekognition para detectar as rodas do carro. Em seguida, inferimos a orientação do carro a partir das posições das rodas usando um sistema baseado em regras. Na segunda opção, detectamos as rodas e outras peças do carro usando o Detetron modelo. Estes são novamente usados ​​para inferir a posição do carro com código baseado em regras. A segunda opção requer experiência em ML, mas também é mais personalizável. Ele pode ser usado para posterior pós-processamento da imagem, por exemplo, para recortar o carro inteiro. Ambas as opções podem ser treinadas em conjuntos de dados disponíveis publicamente. Por fim, mostramos como você pode integrar esta solução de detecção de pose de carro em seu aplicativo Web existente usando serviços como Gateway de API da Amazon e Amplificar AWS.

Visão geral da solução

O diagrama a seguir ilustra a arquitetura da solução.

Crie e treine modelos de visão computacional para detectar posições de carros em imagens usando Amazon SageMaker e Amazon Rekognition | Inteligência de dados PlatoBlockchain da Amazon Web Services. Pesquisa vertical. Ai.

A solução consiste em um aplicativo web simulado no Amplify onde um usuário pode fazer upload de uma imagem e invocar o modelo Amazon Rekognition ou o modelo Detectron personalizado para detectar a posição do carro. Para cada opção, hospedamos um AWS Lambda funciona por trás de um API Gateway que é exposto ao nosso aplicativo simulado. Configuramos nossa função Lambda para ser executada com o modelo Detectron treinado no SageMaker ou no Amazon Rekognition.

Pré-requisitos

Para este passo a passo, você deve ter os seguintes pré-requisitos:

Crie um aplicativo sem servidor usando o Amazon Rekognition

Nossa primeira opção demonstra como você pode detectar orientações de carros em imagens usando o Amazon Rekognition. A ideia é usar o Amazon Rekognition para detectar a localização do carro e de suas rodas e, em seguida, fazer o pós-processamento para derivar a orientação do carro a partir dessas informações. Toda a solução é implantada usando Lambda, conforme mostrado na Repositório Github. Esta pasta contém dois arquivos principais: um Dockerfile que define a imagem Docker que será executada em nossa função Lambda, e o app.py arquivo, que será o principal ponto de entrada da função 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')

A função Lambda espera um evento que contenha um cabeçalho e um corpo, onde o corpo deve ser a imagem necessária para ser rotulada como objeto decodificado em base64. Dada a imagem, o Amazon Rekognition detect_labels função é invocada a partir da função Lambda usando boto3. A função retorna um ou mais rótulos para cada objeto na imagem e detalhes da caixa delimitadora para todos os rótulos de objetos detectados como parte da resposta, junto com outras informações como a confiança do rótulo atribuído, os rótulos ancestrais do rótulo detectado, possíveis aliases para o rótulo e as categorias às quais o rótulo detectado pertence. Com base nos rótulos retornados pelo Amazon Rekognition, executamos a função label_image, que calcula o ângulo do carro a partir das rodas detectadas da seguinte forma:

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]]]

Observe que o aplicativo exige que apenas um carro esteja presente na imagem e retorna um erro se não for o caso. Contudo, o pós-processamento pode ser adaptado para fornecer descrições de orientação mais granulares, cobrir vários carros ou calcular a orientação de objetos mais complexos.

Melhorar a detecção de rodas

Para melhorar ainda mais a precisão da detecção da roda, você pode usar Rótulos personalizados do Amazon Rekognition. Semelhante ao ajuste fino usando o SageMaker para treinar e implantar um modelo de ML personalizado, você pode trazer seus próprios dados rotulados para que o Amazon Rekognition possa produzir um modelo de análise de imagem personalizado para você em apenas algumas horas. Com os rótulos personalizados do Rekognition, você só precisa de um pequeno conjunto de imagens de treinamento específicas para seu caso de uso, neste caso, imagens de carros com ângulos específicos, porque ele usa os recursos existentes no Amazon Rekognition de ser treinado em dezenas de milhões de imagens em todo o mundo. muitas categorias. Os rótulos personalizados do Rekognition podem ser integrados com apenas alguns cliques e pequenas adaptações à função Lambda que usamos para a solução padrão do Amazon Rekognition.

Treine um modelo usando um trabalho de treinamento do SageMaker

Em nossa segunda opção, treinamos um modelo personalizado de aprendizado profundo no SageMaker. Nós usamos o Estrutura Detectron2 para a segmentação de peças automotivas. Esses segmentos são então usados ​​para inferir a posição do carro.

A estrutura Detectron2 é uma biblioteca que fornece algoritmos de detecção e segmentação de última geração. Detectron fornece uma variedade de modelos Mask R-CNN que foram treinados no famoso conjunto de dados COCO (Common Objects in Context). Para construir nosso modelo de detecção de objetos de carro, usamos o aprendizado de transferência para ajustar um modelo Mask R-CNN pré-treinado no segmentação de peças automotivas conjunto de dados. Este conjunto de dados nos permite treinar um modelo que pode detectar rodas, mas também outras peças de automóveis. Esta informação adicional pode ser usada posteriormente nos cálculos do ângulo do carro em relação à imagem.

O conjunto de dados contém dados anotados de peças de automóveis a serem usadas para detecção de objetos e tarefas de segmentação semântica: aproximadamente 500 imagens de sedãs, picapes e veículos utilitários esportivos (SUVs), obtidas em múltiplas visualizações (frontal, traseira e lateral). Cada imagem é anotada por 18 máscaras de instância e caixas delimitadoras que representam as diferentes partes de um carro, como rodas, espelhos, luzes e vidros dianteiro e traseiro. Modificamos as anotações básicas das rodas de forma que cada roda seja considerada um objeto individual em vez de considerar todas as rodas disponíveis na imagem como um objeto.

Usamos Serviço de armazenamento simples da Amazon (Amazon S3) para armazenar o conjunto de dados usado para treinar o modelo Detectron junto com os artefatos do modelo treinado. Além disso, o contêiner Docker executado na função Lambda é armazenado em Registro do Amazon Elastic Container (Amazon ECR). O contêiner Docker na função Lambda é necessário para incluir as bibliotecas e dependências necessárias para executar o código. Poderíamos alternativamente usar Camadas lambda, mas está limitado a uma cota de tamanho de pacote de implantação descompactado de 250 MB e um máximo de cinco camadas podem ser adicionadas a uma função Lambda.

Nossa solução é construída no SageMaker: estendemos Contêineres Docker do SageMaker para PyTorch executar nosso PyTorch personalizado código de treinamento. Em seguida, usamos o SageMaker Python SDK para agrupar a imagem de treinamento em um estimador SageMaker PyTorch, conforme mostrado nos seguintes trechos de código:

d2_estimator = Estimator( image_uri=training_image_uri, role=role, sagemaker_session=sm_session, instance_count=1, instance_type=training_instance, output_path=f"s3://{session_bucket}/{prefix_model}", base_job_name=f"detectron2") d2_estimator.fit({ "training": training_channel, "validation": validation_channel, }, wait=True)

Finalmente, iniciamos o trabalho de treinamento chamando o fit() função no estimador PyTorch criado. Quando o treinamento for concluído, o artefato do modelo treinado será armazenado no bucket de sessão no Amazon S3 para ser usado no pipeline de inferência.

Implante o modelo usando SageMaker e pipelines de inferência

Também usamos o SageMaker para hospedar o endpoint de inferência que executa nosso modelo Detectron personalizado. A infraestrutura completa usada para implantar nossa solução é provisionada usando o AWS CDK. Podemos hospedar nosso modelo personalizado através de um Ponto de extremidade em tempo real do SageMaker chamando deploy no estimador PyTorch. Esta é a segunda vez que estendemos um contêiner SageMaker PyTorch pré-construído para incluir o PyTorch Detectron. Nós o usamos para executar o script de inferência e hospedar nosso modelo PyTorch treinado da seguinte forma:

model = PyTorchModel( name="d2-sku110k-model", model_data=d2_estimator.model_data, role=role, sagemaker_session=sm_session, 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)

Observe que usamos uma GPU ml.g4dn.xlarge para implantação porque é a menor GPU disponível e suficiente para esta demonstração. Dois componentes precisam ser configurados em nosso roteiro de inferência: carregamento de modelo e serviço de modelo. A função model_fn() é usado para carregar o modelo treinado que faz parte do contêiner Docker hospedado e também pode ser encontrado no Amazon S3 e retornar um objeto de modelo que pode ser usado para servir o modelo da seguinte maneira:

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)

A função predict_fn() executa a previsão e retorna o resultado. Além de usar nosso modelo treinado, usamos uma versão pré-treinada do modelo Mask R-CNN treinado no conjunto de dados COCO para extrair o carro principal da imagem. Esta é uma etapa extra de pós-processamento para lidar com imagens onde existe mais de um carro. Veja o seguinte código:

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

Semelhante à solução Amazon Rekognition, as caixas delimitadoras previstas para o wheel classe são filtradas das saídas de detecção e fornecidas ao módulo de pós-processamento para avaliar a posição do carro em relação à saída.

Por fim, também melhoramos o pós-processamento da solução Detectron. Ele também usa segmentos de diferentes peças do carro para inferir a solução. Por exemplo, sempre que é detectado um pára-choques dianteiro, mas nenhum pára-choques traseiro, assume-se que temos uma visão frontal do carro e o ângulo correspondente é calculado.

Conecte sua solução ao aplicativo web

As etapas para conectar os endpoints do modelo ao Amplify são as seguintes:

  • Clone o repositório do aplicativo criado pela pilha do AWS CDK, denominado car-angle-detection-website-repo. Certifique-se de procurá-lo na região usada para implantação.
  • Copie os endpoints do API Gateway para cada uma das funções do Lambda implantadas no arquivo index.html arquivo no repositório anterior (há espaços reservados onde o endpoint precisa ser colocado). O código a seguir é um exemplo da aparência desta seção do arquivo .html:
<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>

  • Salve o arquivo HTML e envie a alteração do código para a ramificação principal remota.

Isso atualizará o arquivo HTML na implantação. O aplicativo agora está pronto para uso.

  • Navegue até o console do Amplify e localize o projeto que você criou.

A URL do aplicativo ficará visível após a conclusão da implantação.

  • Navegue até o URL e divirta-se com a IU.

Crie e treine modelos de visão computacional para detectar posições de carros em imagens usando Amazon SageMaker e Amazon Rekognition | Inteligência de dados PlatoBlockchain da Amazon Web Services. Pesquisa vertical. Ai.

Conclusão

Parabéns! Implantamos uma arquitetura serverless completa na qual usamos o Amazon Rekognition, mas também demos uma opção para seu próprio modelo personalizado, com este exemplo disponível em GitHub. Se você não tiver experiência em ML em sua equipe ou dados personalizados suficientes para treinar um modelo, poderá selecionar a opção que usa o Amazon Rekognition. Se você deseja mais controle sobre seu modelo, personalizá-lo ainda mais e tem dados suficientes, pode escolher a solução SageMaker. Se você tiver uma equipe de cientistas de dados, eles também poderão querer aprimorar ainda mais os modelos e escolher uma opção mais personalizada e flexível. Você pode colocar a função Lambda e o API Gateway por trás de seu aplicativo web usando qualquer uma das duas opções. Você também pode usar essa abordagem para um caso de uso diferente para o qual você queira adaptar o código.

A vantagem desta arquitetura sem servidor é que os blocos de construção são completamente intercambiáveis. As oportunidades são quase ilimitadas. Então, comece hoje!

Como sempre, a AWS agradece o feedback. Por favor, envie quaisquer comentários ou perguntas.


Sobre os autores

Crie e treine modelos de visão computacional para detectar posições de carros em imagens usando Amazon SageMaker e Amazon Rekognition | Inteligência de dados PlatoBlockchain da Amazon Web Services. Pesquisa vertical. Ai.Michael Wallner é consultor sênior de dados e IA da AWS Professional Services e é apaixonado por permitir que os clientes em sua jornada se tornem orientados por dados e incríveis na nuvem AWS. Além disso, ele gosta de pensar grande com os clientes para inovar e inventar novas ideias para eles.

Crie e treine modelos de visão computacional para detectar posições de carros em imagens usando Amazon SageMaker e Amazon Rekognition | Inteligência de dados PlatoBlockchain da Amazon Web Services. Pesquisa vertical. Ai.Aamna Najmi é cientista de dados da AWS Professional Services. Ela é apaixonada por ajudar os clientes a inovar com tecnologias de Big Data e Inteligência Artificial para aproveitar o valor comercial e os insights dos dados. Ela tem experiência em trabalhar em plataformas de dados e projetos de IA/ML na vertical de saúde e ciências biológicas. Nas horas vagas, ela gosta de jardinagem e de viajar para novos lugares.

Crie e treine modelos de visão computacional para detectar posições de carros em imagens usando Amazon SageMaker e Amazon Rekognition | Inteligência de dados PlatoBlockchain da Amazon Web Services. Pesquisa vertical. Ai.David Sauerwein é cientista de dados sênior na AWS Professional Services, onde capacita os clientes em sua jornada de IA/ML na nuvem AWS. David se concentra em gêmeos digitais, previsão e computação quântica. Ele tem doutorado em física teórica pela Universidade de Innsbruck, Áustria. Ele também foi pesquisador de doutorado e pós-doutorado no Instituto Max-Planck de Óptica Quântica na Alemanha. Nas horas vagas adora ler, esquiar e estar com a família.

Crie e treine modelos de visão computacional para detectar posições de carros em imagens usando Amazon SageMaker e Amazon Rekognition | Inteligência de dados PlatoBlockchain da Amazon Web Services. Pesquisa vertical. Ai.Srikrishna Chaitanya Konduru é cientista de dados sênior com serviços profissionais da AWS. Ele oferece suporte aos clientes na prototipagem e operacionalização de seus aplicativos de ML na AWS. Srikrishna se concentra em visão computacional e PNL. Ele também lidera iniciativas de design de plataforma de ML e identificação de casos de uso para clientes em diversos setores verticais do setor. Srikrishna possui mestrado em Engenharia Biomédica pela Universidade RWTH Aachen, Alemanha, com foco em Imagens Médicas.

Crie e treine modelos de visão computacional para detectar posições de carros em imagens usando Amazon SageMaker e Amazon Rekognition | Inteligência de dados PlatoBlockchain da Amazon Web Services. Pesquisa vertical. Ai.Ahmed Mansour é cientista de dados na AWS Professional Services. Ele fornece suporte técnico aos clientes durante sua jornada de IA/ML na nuvem AWS. Ahmed se concentra em aplicações de PNL ao domínio de proteínas junto com RL. Possui doutorado em Engenharia pela Universidade Técnica de Munique, Alemanha. Nas horas vagas adora ir à academia e brincar com os filhos.

Carimbo de hora:

Mais de Aprendizado de máquina da AWS