Amenity Detection and Beyond – Novas Fronteiras da Visão Computacional no Airbnb

Construa tecnologias de IA altamente personalizadas em produtos de compartilhamento doméstico e ajude nossos hóspedes em qualquer lugar.

Shijing Yao Seg , 17 de Julho · 15 min ler

Autores: Shijing Yao, Dapeng Li, Shawn Chen

Quais comodidades existem nesta imagem? Um algoritmo pode detectar todos eles? Como podemos treinar o algoritmo de forma eficaz? Se você está interessado nas respostas, por favor, continue a ler!

Introdução

Em 2018, publicamos uma postagem no blog intitulada Categorizing Listing Photos no Airbnb . Nesse post, apresentamos um modelo de classificação de imagens que categorizava a listagem de fotos em diferentes tipos de quarto e ajudava a organizar centenas de milhões de fotos na plataforma Airbnb. Desde então, a tecnologia tem alimentado uma ampla gama de ferramentas internas de moderação de conteúdo, bem como alguns recursos voltados ao consumidor no site do Airbnb. Esperamos que essa tecnologia de classificação de imagens torne nosso negócio mais eficiente e nossos produtos mais agradáveis de usar.

A Classificação de Imagens é um sub-campo de uma tecnologia mais ampla chamada Visão Computacional, que lida com a forma como algoritmos de computador podem ser feitos para obter entendimentos de imagens ou vídeos digitais. Outro sub-campo relacionado é a detecção de objetos, que lida com a detecção de instâncias de objetos semânticos de uma determinada classe em imagens ou vídeos digitais.

O Airbnb tem milhões de anúncios em todo o mundo. Para garantir que nossas listagens mantenham altos padrões de qualidade, precisamos determinar se as comodidades anunciadas on-line correspondem às reais. Em nossa escala, usar somente os esforços humanos para fazer isso obviamente não é econômico nem sustentável. As tecnologias de detecção de objetos, no entanto, podem nos ajudar, já que as comodidades podem ser detectadas automaticamente na listagem de fotos. Além disso, a tecnologia abre uma nova porta para uma plataforma de compartilhamento de residências onde a listagem de fotos é pesquisável por comodidades, o que ajuda nossos clientes a navegar pelas listas com muito mais facilidade.

Detecção de Amenidade

De soluções genéricas para personalizadas

As tecnologias de detecção de objetos evoluem rapidamente. Há apenas alguns anos, a ideia de construir um modelo de detecção de objetos para detectar comodidades em uma imagem digital pode parecer proibitivamente difícil e intimidante. Hoje em dia, um grande número de soluções decentes já surgiram, algumas das quais requerem esforços mínimos. Por exemplo, muitos fornecedores terceirizados fornecem APIs genéricas de detecção de objetos, que geralmente são bastante econômicas e fáceis de integrar em produtos.

Testamos alguns serviços de API diferentes com nossas fotos de listagem. Infelizmente, os resultados sugeriram que as APIs apresentavam lacunas notáveis com nossos requisitos de negócios. A imagem abaixo mostra os resultados de uma amostra de imagem dos nossos dados de teste.

Um exemplo de resultado de detecção de amenidade de um serviço de API de terceiros, de um fornecedor líder do setor

Embora o serviço de API seja capaz de detectar certas comodidades, os rótulos previstos são muito vagos. Em um negócio de compartilhamento de casa como o Airbnb, saber que os utensílios de cozinha existem em uma foto não nos diz muito além do tipo de quarto. Da mesma forma, saber que há uma tabela na foto também não nos ajuda. Nós não sabemos que tipo de mesa é, ou para que ela poderia ser usada. Nosso objetivo real é entender se as comodidades detectadas proporcionam conveniência para os hóspedes. Os hóspedes podem cozinhar nesta casa? Eles têm utensílios de cozinha específicos que eles querem? Eles têm uma mesa de jantar de tamanho decente para hospedar pessoas suficientes se for uma viagem em família? Um resultado de detecção de amenidades mais desejável seria algo como abaixo.

Um exemplo de resultado do modelo de detecção de amenidade do Airbnb, com rótulos mais específicos

Como se pode ver, os rótulos previstos são muito mais específicos. Podemos usar esses resultados para verificar a exatidão das descrições de listagens e exibir pesquisas de Casas para convidados com solicitações específicas de comodidade.

Além da API de terceiros, projetos de código aberto como o Tensorflow Detection Model Zoo e o Detectron Model Zoo também oferecem uma coleção de modelos de detecção de objetos pré-treinados gratuitos, usando diferentes conjuntos de dados de imagens públicas e diferentes arquiteturas de modelos. Testamos vários modelos pré-treinados dos Zoológicos Modelo. Da mesma forma, os resultados também não cumpriram nossa exigência. Precisão foi significativamente menor e alguns rótulos previstos estavam muito longe.

Esses testes sugeriram que era muito necessário que nós construíssemos um modelo personalizado de detecção de objetos para resolver nosso problema particular de Detecção de Amenidades.

Para fazer isso, precisamos determinar primeiro o que um conjunto personalizado de comodidades deve ser, criar um conjunto de dados de imagem com base nesse conjunto de rótulos de amenidade e ter as imagens anotadas com os rótulos. Por meio do treinamento contra imagens com essas anotações, esperamos que o modelo possa aprender como reconhecer essas comodidades e localizar cada instância detectada. Esta é uma jornada bastante longa e, nas seções seguintes, compartilharemos como percorremos todo esse processo.

Definindo a taxonomia

A taxonomia é um esquema de rótulos de amenidades. Definir uma taxonomia que englobe as amenidades de nosso interesse é uma questão bastante aberta. Idealmente, a taxonomia deve vir de uma necessidade comercial específica. No nosso caso, no entanto, a taxonomia não era clara ou variava em relação às unidades de negócios, de modo que assumimos a responsabilidade de criar uma lista mínima viável primeiro. Isso foi um grande esforço como cientistas de dados devido às limitações do nosso escopo, mas acreditamos que poderia ser um problema comum a ser resolvido em muitas organizações. Nossa estratégia foi começar com algo leve e depois iterar rapidamente. Seja um empreendedor e nunca seja tímido para lançar a bola !

Na falta de experiência anterior, decidimos começar de algo que as pessoas tinham trabalhado antes, espero encontrar alguma dica. Descobrimos que o Open Image Dataset V4 oferecia uma grande quantidade de dados de imagem. Incluía cerca de 9 milhões de imagens que foram anotadas com rótulos no nível da imagem, caixas delimitadoras de objeto (BB) e relações visuais. Em particular, as anotações do BB abrangem um conjunto avançado de 600 classes de objetos. Essas classes formaram uma estrutura hierárquica e cobriram um amplo espectro de objetos. No nível mais alto, eles incluíam Animal , Roupas , Veículos , Alimentos , Construção , Equipamentos, Ferramentas e uma coleção de itens domésticos, como Móveis , Eletrodomésticos e Suprimentos para o Lar . Nosso objetivo era descobrir as classes de objetos que eram relevantes para as amenidades e filtrar o resto.

Analisamos manualmente as 600 turmas e selecionamos cerca de 40 turmas que eram relevantes para nosso caso de uso. Eles eram geralmente comodidades importantes na cozinha , no banheiro e no quarto , como fogão a gás , forno , geladeira , banheira , chuveiro , toalha , cama , travesseiro, etc. O Conjunto de Dados de Imagens Abertas V4 nos poupou muito tempo. Se fôssemos começar do zero, construir uma taxonomia razoável por si só nos levaria muito tempo.

Construindo um conjunto de dados de imagem

Depois que a taxonomia foi determinada, a próxima etapa seria coletar dados de imagem com base nela. O conjunto de dados de imagem aberto V4 tinha 14.6M BBs anotados em imagens de 1.7M. Idealmente, poderíamos obter um grande número de amostras de imagens, uma vez que nossa taxonomia era basicamente um subconjunto das 600 classes completas. No entanto, à medida que nos aprofundamos nos dados, descobrimos que as 600 classes de objetos eram altamente desequilibradas. Algumas classes tiveram milhões de instâncias, enquanto outras tiveram apenas algumas.

[ Origem ] Distribuição de rótulo de classe. Para evitar o excesso de plotagem, o eixo horizontal mostra apenas um nome de rótulo a cada oito. Observe que o eixo vertical do histograma está na escala de log, o que significa que as contagens de instâncias de classe no lado direito são ordens de magnitude menores que as do lado esquerdo.

As 40 classes de nosso interesse caíram principalmente no lado minoritário (à direita) da distribuição de rótulo de classe mostrada acima. Como resultado, acabamos com apenas 100 mil instâncias de objetos, anotados a partir de cerca de 50 mil imagens – cerca de apenas 3% de todo o conjunto de dados. Nós superestimamos a quantidade de dados disponíveis significativamente!

Os modelos modernos de detecção de objetos são quase exclusivamente baseados em aprendizado profundo, o que significa que precisam de muitos dados de treinamento para um bom desempenho. Uma regra geral é que alguns milhares de amostras de imagens por classe podem levar a um desempenho de modelo decente. 50k imagens anotadas com 40 classes de objetos implicaram em média 1.2k imagens por classe, o que foi adequado, mas não ótimo. Portanto, decidimos adicionar alguns dados internos e fundi-los com os dados públicos. Para garantir que o conjunto de dados interno inclua classes de amenidades ricas, diversificadas e uniformemente distribuídas, foram amostradas imagens de 10k para quarto , banheiro , cozinha e sala de estar e imagens adicionais de 1k para cenas externas como piscina , vista e outras .

Criando Anotações

Muitos fornecedores fornecem serviços de anotação para tarefas de detecção de objetos. O fluxo de trabalho básico é que os clientes fornecem uma instrução de rotulagem e os dados brutos. O fornecedor anota os dados com base na instrução de rotulagem e retorna as anotações. Uma boa instrução de rotulagem faz com que o processo se mova suavemente e produza anotações de alta qualidade e, portanto, é extremamente importante. Tente ser o mais específico possível e sempre forneça exemplos concretos . Escrevendo uma pensativa de uma só vez é geralmente impossível, especialmente se você está fazendo isso pela primeira vez, então esteja preparado para iterar.

Neste projeto, escolhemos o serviço de etiquetagem de dados do Google sobre três coisas que realmente gostamos: 1) suportar até 100 classes de objeto para rotulagem, 2) uma interface agradável e limpa onde poderíamos monitorar o progresso do trabalho de rotulagem e 3) feedback e perguntas foram constantemente enviadas para nós à medida que o trabalho de rotulagem avançava. Como resultado, conseguimos esclarecer instruções vagas e abordar casos de borda em todo o processo.

Uma estratégia importante era enviar pequenos lotes de dados antes de aumentar. Dessa forma, você terá a oportunidade de corrigir suas instruções de rotulagem e ter a maioria dos seus dados anotados com uma versão melhorada . Em nossa experiência, descobrimos que algumas amenidades eram onipresentes e menos úteis (por exemplo , cortinas, janelas ) nesses resultados de pequenos lotes. Nós os retiramos de acordo e refinamos nossa taxonomia de 40 classes para 30. Depois disso, nossos dados foram completamente anotados em cerca de duas semanas.

Fluxograma de preparação de dados. Constantemente iterar de taxonomia para anotação de dados.

Treinamento de Modelo

Combinando as imagens internas marcadas de 43k e as imagens públicas de 32k, acabamos com 75k imagens anotadas com 30 objetos de amenidade personalizados. Agora era hora de realmente construir o modelo!

Nós tentamos dois caminhos construindo o modelo. Um caminho era alavancar a API Tensorflow Object Detection – criando registros com base nos dados da imagem anotada, usando o model_main.py para iniciar o treinamento e executando o Tensorboard para monitorar o progresso do treinamento. Havia muitos tutoriais on-line sobre como fazer isso. Vamos pular a maioria dos detalhes aqui e citar apenas o nosso favorito .

Em particular, escolhemos dois modelos pré-treinados para ajuste fino: ssd_mobilenet_v2 e faster_rcnn_inception_resnet_v2 . O ssd_mobilenet_v2 era rápido, mas com menor precisão, e o faster_rcnn_inception_resnet_v2 era o oposto. Para configurar um benchmark, testamos a precisão de ambos os modelos pré-treinados em 10% de dados retidos (7,5k imagens com 30 classes de objetos) antes do ajuste fino. Usamos a Média de Precisão Média ( mAP ) como a métrica, que é padrão para avaliar um modelo de detecção de objetos. Ele mede a precisão média ( AUC de uma curva de recuperação de precisão ) de um modelo em todas as classes de objetos, e varia entre 0 e 1. Mais detalhes são explicados aqui .

ssd_mobilenet_v2 alcançado mapa de 14% e faster_rcnn_inception_resnet_v2 alcançado mapa de 27%. Um leitor cuidadoso pode achar que nossos resultados de benchmark para esses dois modelos pré-treinados foram muito menores do que os mAPs relatados no site: 36% para ssd_mobilenet_v2 e 54% para faster_rcnn_inception_resnet_v2. Isso não estava incorreto. Nosso conjunto de teste tinha apenas 30 classes, todas minoria no conjunto de dados em que o modelo pré-treinado foi treinado. A degradação da precisão dos modelos pré-treinados deveu-se a uma mudança na distribuição de classes entre treinamentos e conjuntos de testes.

Para começar a treinar em nosso conjunto de dados, congelamos os parâmetros nas camadas de extração de recursos e apenas treinamos as camadas totalmente conectadas. A taxa de aprendizado inicial padrão foi 8e-4 para ssd_mobilenet_v2 e 6e-5 para faster_rcnn_inception_resnet_v2 . Como estávamos fazendo aprendizado de transferência, reduzimos as taxas de aprendizado para apenas 10% dos valores padrão. A lógica era que não queríamos fazer uma atualização de gradiente muito grande para “destruir” o que já havia sido aprendido nos pesos do modelo pré-treinados. Também diminuímos o número de etapas de treinamento de 10M para 1M e dimensionamos os parâmetros de decaimento correspondentes na programação da taxa de aprendizado. Em termos de recurso de computação, uma instância do AWS p2.xlarge , com GPU de núcleo único Tesla K80 , foi usada para o trabalho de treinamento.

Ao treinar ssd_mobilenet_v2 , a função loss diminuiu muito rapidamente no começo. No entanto, após 100k passos (5 dias), a melhoria tornou-se marginal e a função de perda começou a oscilar. Não tendo certeza se continuar o treinamento ainda faria sentido, paramos o treinamento depois de 5 dias porque o progresso era muito lento. A precisão do modelo ( mAP ) aumentou de 14% para 20% .

Ao treinar o faster_rcnn_inception_resnet_v2 , a função loss começou muito pequena, mas imediatamente começou a mostrar um monte de comportamento selvagem. Não conseguimos melhorar o mAP do modelo.

Estimamos que um mAP de pelo menos 50% fosse necessário para construir um produto viável mínimo, e obviamente ainda havia uma grande lacuna. A essa altura, passáramos muito tempo lidando com o treinamento de modelo. Nós hipotetizamos que a função de perda provavelmente ficou presa em alguns mínimos locais, e precisávamos aplicar alguns truques numéricos para pular fora dela. O diagnóstico estaria bastante envolvido. Enquanto isso, mudar para outra arquitetura de modelo que era mais fácil de reciclar era definitivamente uma opção também. Decidimos sair de lá e planejamos revisitar o problema no futuro.

Outro caminho para construir o modelo foi através de uma ferramenta de autoatendimento automatizada. Nós tentamos o Google AutoML Vision. Surpreendentemente, os resultados foram muito impressionantes. Apenas fazendo o upload das imagens anotadas de 75k e clicando em alguns botões, fomos capazes de treinar um modelo de detecção de objetos em 3 dias. Optamos por uma maior precisão no menu de autoatendimento, de modo que o treinamento demorou mais que o normal.

Avaliação de modelo

Escolhemos usar o modelo treinado pelo AutoML. O modelo alcançou um mAP de cerca de 68% com base em nossa avaliação off-line em 10% de dados retidos (7,5k imagens). O resultado é significativamente maior do que todas as métricas que vimos até agora. Certas classes tiveram um desempenho particularmente bom, como banheiro , piscina e cama , todas alcançando 90% + precisão média. As classes com pior desempenho foram Porch, Wine rack e Jacuzzi . Descobrimos que a precisão média de cada classe de objetos estava fortemente correlacionada com a sua prevalência nos dados de treinamento. Portanto, o aumento de amostras de treinamento para essas classes minoritárias provavelmente melhoraria muito o desempenho dessas categorias.

Divisão da precisão média para diferentes classes de objetos. Curva de recordação de precisão de previsões para "Bed".

Em nossa avaliação off-line, também descobrimos que o mAP era bastante sensível à divisão de teste de treinamento. Uma divisão diferente devido à aleatoriedade estatística simples poderia levar a um desvio de 2 a 3%. A maior instabilidade do mAP veio de classes minoritárias, onde o tamanho da amostra era muito pequeno. Recomendamos usar a mediana de APs de todas as classes para atenuar esse problema .

Implantação de modelo e serviço on-line

Implantação de modelo em AutoML também foi extremamente fácil, com apenas um clique. Após a implantação, o modelo foi transformado em um serviço online que as pessoas poderiam facilmente usar através da API REST ou algumas linhas de código Python. Consultas por segundo ( QPS ) pode variar dependendo do número de horas de nó implantadas. Uma grande desvantagem do AutoML era que você não podia baixar o modelo original que você criou. Este foi um problema em potencial e decidimos revisitá-lo no futuro.

Por fim, queremos demonstrar o desempenho de nosso modelo mostrando mais alguns exemplos concretos, nos quais nosso modelo personalizado será comparado a um serviço de API de terceiros líder do setor. Por favor, note que nossa taxonomia inclui apenas 30 classes de amenidades, mas o serviço de API inclui centenas.

Nosso modelo é capaz de detectar travesseiros que são importantes para a análise de listagem em nosso negócio Plus. Nosso modelo categoriza erroneamente um vaso como uma toalha. O modelo de terceiros prevê conceito vago, como móveis. Nosso modelo é capaz de detectar a área de pia, toalha, vaso sanitário e chuveiro. O modelo de terceiros perde a maioria deles. Armário de banheiro não está incluído em nossa taxonomia, pois não achamos que seja útil o suficiente neste momento. Nosso modelo prevê de maneira confiável as comodidades definidas em nossa taxonomia. Por favor, note que a toalha no espelho não é detectada e isso é de propósito. Nós não queríamos contar com comodidades espelhadas em dobro em nosso processo de etiquetagem, e o modelo aprendeu com sucesso nossas regras! Nosso modelo oferece uma lista muito abrangente de comodidades neste estúdio. O modelo de terceiros novamente prevê conceitos vagos. O presidente e a mesa não estão na nossa taxonomia porque não acreditamos que eles forneçam informações importantes. Nosso modelo é capaz de detectar muitas comodidades em uma área tão pequena da cozinha. Por favor, note que o modelo de terceiros fez uma falsa detecção para o caddy utensílio. Nosso modelo é capaz de detectar mesa de bilhar, espelho, TV e sofá com muita confiança. O modelo de terceiros perde muitas das principais comodidades. Treehouse é um tipo de casa icônico na plataforma Airbnb. Mesmo com dados mínimos, somos capazes de detectá-los em certos casos. Por favor, note que a nossa pontuação de confiança é muito baixa, o que significa que ainda há espaço para melhorar nesta categoria. O modelo de terceiros apenas prevê House, que não é muito informativo em nosso caso de uso. Nosso modelo é capaz de detectar uma piscina, com confiança extremamente alta. O modelo de terceiros só detecta House, o que novamente não é muito útil para nós.

Como se pode ver, nosso modelo é consideravelmente mais específico e fornece uma cobertura muito mais ampla para essas 30 classes de objetos. Uma comparação mais quantitativa entre nosso modelo e o modelo de terceiros nesta demonstração precisa de alguns pensamentos cuidadosos. Primeiro, nossa taxonomia é diferente daquela do modelo de terceiros. Ao calcular o mAP, devemos incluir apenas a interseção dos dois conjuntos de classes. Em segundo lugar, a API de terceiros mostra apenas resultados parciais, pois qualquer previsão com pontuação confiável menor que 0,5 seria filtrada e não seria observada por nós. Isso basicamente trunca o lado direito da curva de recuperação de precisão de seus resultados, onde a recuperação é alta (e o limite é baixo) e, portanto, diminui o mAP de seus resultados. Para fazer uma comparação justa, devemos truncar nossos resultados removendo detecções cujas pontuações também sejam inferiores a 0,5. Após o tratamento, calculou-se que o mapa “truncada” para o nosso modelo foi de 46%, e 18% para o deles. É realmente encorajador ver que nosso modelo pode superar significativamente um modelo de terceiros de um fornecedor líder do setor. A comparação também demonstra a importância dos dados específicos de domínio no mundo da visão computacional.

Uma comparação justa entre o modelo personalizado da Airbnb e o modelo genérico de terceiros, usando o mAP "truncado". Note que muitas categorias no modelo de terceiros têm simplesmente zero AP. Isso se deve à representação de dados muito pequena em seus dados de treinamento.

Além da detecção de amenidades

Detecção de objetos de amplo alcance

Além da Detecção de Conveniência, a Detecção de Objetos com escopo mais amplo é outra área importante na qual estamos investindo. Por exemplo, o Airbnb aproveita muitas plataformas on-line de terceiros para anunciar listagens. Para fornecer anúncios legítimos, precisamos garantir que as fotos exibidas na listagem não representem riscos excessivos de privacidade ou segurança para nossa comunidade. Usando o Broad-scope Object Detection, podemos realizar a moderação de conteúdo necessária para evitar que itens como armas, rostos humanos de grande porte etc. sejam expostos sem proteção. No momento, estamos usando o serviço Vision do Google para potencializar isso. Também estamos construindo um sistema de detecção configurável chamado Telescope, que pode realizar ações em imagens com objetos arriscados adicionais quando necessário.

Controle de Qualidade de Imagem

Outra necessidade crescente em nossos negócios é usar a IA para auxiliar nosso processo de controle de qualidade para listar imagens. Como um dos primeiros a adotar, aproveitamos uma nova tecnologia na qual o Google está trabalhando e desenvolvemos um melhor conjunto de critérios de seleção de catálogos para campanhas de remarketing e de prospecção.

A tecnologia suporta dois modelos: um prevê uma pontuação estética e o outro prevê uma pontuação técnica. A pontuação estética avalia o apelo estético do conteúdo, cor, ângulo de imagem, socialidade, etc., enquanto a pontuação técnica avalia ruído, manchas, exposição, correção de cor, etc. Na prática, eles se complementam muito bem. Por exemplo, a imagem abaixo foi uma vez no nosso catálogo de anúncios. Agora que entendemos que ela tem uma alta pontuação técnica, mas uma pontuação estética ruim, podemos substituí-la confortavelmente por uma imagem mais atraente, ainda que informativa.

Um exemplo de listagem de foto com baixa pontuação estética para anúncios gráficos.

Além disso, as pontuações de avaliação de qualidade de imagem também são testadas em nosso modelo de recomendação de listagem. Os resultados off-line mostram que eles estão entre os três principais recursos mais importantes do modelo. Estamos rastreando ativamente seu impacto em experimentos on-line e planejamos estender os aplicativos se os resultados forem positivos.

Conclusão

Para concluir este post, gostaríamos de compartilhar algumas lições importantes aprendidas em nossa jornada de aplicação das tecnologias de Visão Computacional aos negócios do Airbnb.

  1. Na era do aprendizado profundo, os dados se tornam muito mais importantes que o modelo. Para resolver um problema como um cientista de dados, você provavelmente gastará 90% do seu tempo coletando e analisando grandes blocos de dados.
  2. Seja criativo ao coletar dados e não reinvente a roda. Aproveite os dados públicos da comunidade de código aberto quando possível e integre-os aos seus dados privados, se necessário.
  3. Até que a inovação aconteça em algoritmos de aprendizado não supervisionados, obter rótulos de alta qualidade para seus dados é quase sempre o passo mais crítico para um modelo supervisionado. Ter seus dados rotulados é frequentemente o processo mais demorado, pois pode haver muitos esforços de coordenação entre as organizações. Planeje com antecedência e escolha um fornecedor para anotações com sabedoria.
  4. O uso de uma boa ferramenta de aprendizado de máquina pode acelerar significativamente o treinamento e a implantação do modelo, o que torna mais rápido a entrega do modelo como um serviço.
  5. Seja mente aberta. Não tenha medo de começar com uma solução simples, mesmo que seja apenas uma API genérica de terceiros. Pode não resolver seu problema de negócios imediatamente, mas provavelmente levará a uma solução bem-sucedida algum tempo depois.

Aplicativos de visão computacional, como Detecção de Conveniência, Detecção de Objetos de Grande Escopo e Controle de Qualidade de Imagem, ajudam a Airbnb a se tornar uma plataforma de compartilhamento de casa mais inteligente e segura para nossos anfitriões e convidados. Esperamos que essas tecnologias tornem nossos negócios mais eficientes e liberem todos os potenciais para o futuro.