Integrando o Vision com o Oracle Analytics Cloud (OAC)
Crie um fluxo do Data Integration que use o Vision SDK para detectar objetos em imagens e projetar essas informações em uma tabela em um data warehouse. Esses dados de saída são usados pelo Oracle Analytics Cloud para criar visualizações e encontrar padrões.
Este é o fluxo de alto nível do sistema entre o Vision e o OAC:
Antes de Começar
Para seguir este tutorial, você deve ser capaz de criar redes VCN, funções e gateways de API e usar o Data Integration e o Vision.
Converse com seu administrador sobre as políticas necessárias.
Configurando as Políticas Obrigatórias
Siga estas etapas para configurar as políticas necessárias.
1. Criar uma Rede Virtual na Nuvem
Crie uma VCN para servir como home da função sem servidor e do gateway de API criado posteriormente no tutorial.
1.1 Criando uma VCN com Acesso à Internet
Siga estas etapas para criar uma VCN com acesso à internet.
- No menu de navegação, selecione Networking.
- Selecionar Redes Virtuais na Nuvem.
- Clique em Start VCN Wizard.
- Selecione Criar VCN com Conectividade de Internet.
- Selecione Iniciar Assistente de VCN.
- Informe um nome para a VCN. Evite digitar informações confidenciais.
- Selecione Próximo.
- Selecione Criar.
1.2 Acessando a sua VCN pela Internet
Você deve adicionar uma nova regra de entrada com monitoramento de estado para a sub-rede regional pública a fim de permitir o tráfego na porta 443.
Conclua 1.1 Criando uma VCN com Acesso à Internet antes de tentar esta tarefa.
O Gateway de API se comunica na porta 443, que não é aberta por padrão.
2. Criando um Gateway de API
Um Gateway de API permite agregar todas as funções criadas em um único ponto final que pode ser consumido pelos usuários.
Complete 1. Crie uma Rede Virtual na Nuvem antes de tentar esta tarefa.
3. Criar uma Função de Enriquecimento
Siga estas etapas para criar uma função de enriquecimento que possa ser chamada no Oracle Cloud Infrastructure Data Integration.
Crie uma função sem servidor que só seja executada sob demanda. A função está em conformidade com o esquema necessário para ser consumido pelo Data Integration. A função sem servidor chama a API do Vision por meio do Python SDK.
3.1 Criando um Aplicativo
Para adicionar uma função, primeiro precisamos criar um aplicativo.
Complete 2. Criando um Gateway de API antes de tentar esta tarefa.
3.2 Criando uma Função
Siga estas etapas para criar uma função no seu aplicativo.
Conclua 3.1 Criando um Aplicativo antes de tentar esta tarefa.
A maneira mais rápida é fazer com que o sistema gere um modelo Python.
Conteúdo recomendado para func.yaml.
schema_version: 20180708
name: object-detection
version: 0.0.1
runtime: python
build_image: fnproject/python:3.8-dev
run_image: fnproject/python:3.8
entrypoint: /python/bin/fdk /function/func.py handler
memory: 256
timeout: 300Conteúdo recomendado para requirements.txt.
fdk>=0.1.40
oci
https://objectstorage.us-ashburn-1.oraclecloud.com/n/axhheqi2ofpb/b/vision-oac/o/vision_service_python_client-0.3.9-py2.py3-none-any.whl
pandas
requestsConteúdo recomendado para func.py.
import io
import json
import logging
import pandas
import requests
import base64
from io import StringIO
from fdk import response
import oci
from vision_service_python_client.ai_service_vision_client import AIServiceVisionClient
from vision_service_python_client.models.analyze_image_details import AnalyzeImageDetails
from vision_service_python_client.models.image_object_detection_feature import ImageObjectDetectionFeature
from vision_service_python_client.models.inline_image_details import InlineImageDetails
def handler(ctx, data: io.BytesIO=None):
signer = oci.auth.signers.get_resource_principals_signer()
resp = do(signer,data)
return response.Response(
ctx, response_data=resp,
headers={"Content-Type": "application/json"}
)
def vision(dip, txt):
encoded_string = base64.b64encode(requests.get(txt).content)
image_object_detection_feature = ImageObjectDetectionFeature()
image_object_detection_feature.max_results = 5
features = [image_object_detection_feature]
analyze_image_details = AnalyzeImageDetails()
inline_image_details = InlineImageDetails()
inline_image_details.data = encoded_string.decode('utf-8')
analyze_image_details.image = inline_image_details
analyze_image_details.features = features
try:
le = dip.analyze_image(analyze_image_details=analyze_image_details)
except Exception as e:
print(e)
return ""
if le.data.image_objects is not None:
return json.loads(le.data.image_objects.__repr__())
return ""
def do(signer, data):
dip = AIServiceVisionClient(config={}, signer=signer)
body = json.loads(data.getvalue())
input_parameters = body.get("parameters")
col = input_parameters.get("column")
input_data = base64.b64decode(body.get("data")).decode()
df = pandas.read_json(StringIO(input_data), lines=True)
df['enr'] = df.apply(lambda row : vision(dip,row[col]), axis = 1)
#Explode the array of aspects into row per entity
dfe = df.explode('enr',True)
#Add a column for each property we want to return from imageObjects struct
ret=pandas.concat([dfe,pandas.DataFrame((d for idx, d in dfe['enr'].iteritems()))], axis=1)
#Drop array of aspects column
ret = ret.drop(['enr'],axis=1)
#Drop the input text column we don't need to return that (there may be other columns there)
ret = ret.drop([col],axis=1)
if 'name' not in ret.columns:
return pandas.DataFrame(columns=['id','name','confidence','x0','y0','x1','y1','x2','y2','x3','y3']).to_json(orient='records')
for i in range(4):
ret['x' + str(i)] = ret.apply(lambda row: row['bounding_polygon']['normalized_vertices'][i]['x'], axis=1)
ret['y' + str(i)] = ret.apply(lambda row: row['bounding_polygon']['normalized_vertices'][i]['y'], axis=1)
ret = ret.drop(['bounding_polygon'],axis=1)
rstr=ret.to_json(orient='records')
return rstr3.3 Implantando a Função
3.4 Chamando a Função
Teste a função chamando-a.
Conclua a 3.3 Implantando a Função antes de tentar esta tarefa.
{"data":"eyJpZCI6MSwiaW5wdXRUZXh0IjoiaHR0cHM6Ly9pbWFnZS5jbmJjZm0uY29tL2FwaS92MS9pbWFnZS8xMDYxOTYxNzktMTU3MTc2MjczNzc5MnJ0czJycmRlLmpwZyJ9", "parameters":{"column":"inputText"}}Os dados codificados são a versão codificada base 64 de um conjunto de formatos de Linhas JSON (cada linha é um JSON para cada registro). Cada registro tem um ID usado para associar a saída. A decodificação da string de exemplo fornece:{"id":1,"inputText":"https://<server-name>/api/v1/image/106196179-1571762737792rts2rrde.jpg"}echo '{"data":"<data-payload>", "parameters":{"column":"inputText"}}' | fn invoke <application-name> object-detection[{"id":1,"confidence":0.98330873,"name":"Traffic Light","x0":0.0115499255,"y0":0.4916201117,"x1":0.1609538003,"y1":0.4916201117,"x2":0.1609538003,"y2":0.9927374302,"x3":0.0115499255,"y3":0.9927374302},{"id":1,"confidence":0.96953976,"name":"Traffic Light","x0":0.8684798808,"y0":0.1452513966,"x1":1.0,"y1":0.1452513966,"x2":1.0,"y2":0.694972067,"x3":0.8684798808,"y3":0.694972067},{"id":1,"confidence":0.90388376,"name":"Traffic sign","x0":0.4862146051,"y0":0.4122905028,"x1":0.8815201192,"y1":0.4122905028,"x2":0.8815201192,"y2":0.7731843575,"x3":0.4862146051,"y3":0.7731843575},{"id":1,"confidence":0.8278353,"name":"Traffic sign","x0":0.2436661699,"y0":0.5206703911,"x1":0.4225037258,"y1":0.5206703911,"x2":0.4225037258,"y2":0.9184357542,"x3":0.2436661699,"y3":0.9184357542},{"id":1,"confidence":0.73488903,"name":"Window","x0":0.8431445604,"y0":0.730726257,"x1":0.9992548435,"y1":0.730726257,"x2":0.9992548435,"y2":0.9893854749,"x3":0.8431445604,"y3":0.9893854749}]4. Adicionando uma Política de Funções
Crie uma política para que a função possa ser usada com o Vision.
Complete 3. Crie uma Função de Aprimoramento antes de tentar esta tarefa.
5. Criando um Espaço de Trabalho de Integração de Dados do Oracle Cloud Infrastructure
Antes de usar o Data Integration, certifique-se de ter os direitos de usar o recurso.
Complete 4. Adicionando uma Política do Serviço Functions antes de tentar esta tarefa.
Crie as políticas que permitem usar o Data Integration.
6. Adicionando Políticas de Integração de Dados
Atualize sua política para que você possa usar o Data Integration.
Complete 5. Criando um Espaço de Trabalho do Oracle Cloud Infrastructure Data Integration antes de tentar esta tarefa.
7. Preparar as Origens de Dados e os Links
Você está usando imagens de estacionamento de carro junto com a data em que as imagens foram tiradas como dados de amostra.
Reúna 10 imagens (ou mais) de carros estacionados como a fonte de dados na qual você executa a análise de detecção de objetos usando o Data Integration e o Vision.
7.1 Carregando Dados de Amostra
Carregue os dados de amostra das imagens do carro estacionado no seu bucket.
Complete 6. Adicionando Políticas do Serviço Data Integration antes de tentar esta tarefa.
7.2 Criando um Bucket de Preparação
O Data Integration precisa de um local de preparação para fazer dump de arquivos intermediários, antes de publicar dados em um data warehouse.
Conclua 7.1 Carregando Dados de Amostra antes de tentar esta tarefa.
- No menu de navegação da Console, selecione Armazenamento.
- Selecione Buckets.
- Selecione Criar Bucket.
-
Dê a ele um Nome adequado, por exemplo,
data-staging. Evite digitar informações confidenciais. - Selecione Criar.
- Aceite todos os valores padrão.
7.3 Preparando o Banco de Dados de Destino
Configure o banco de dados de destino do Autonomous Data Warehouse para adicionar um esquema e uma tabela.
Conclua 7.2 Criando um Bucket de Preparação antes de tentar esta tarefa.
7.4 Criando uma Tabela para Projetar os Dados Analisados
Crie uma tabela para armazenar todas as informações sobre os objetos detectados.
Conclua a 7.3 Preparando o Banco de Dados de Destino antes de tentar esta tarefa.
8. Usar um Fluxo de Dados no Data Integration
Crie os componentes necessários para criar um fluxo de dados no Data Integration.
O fluxo de dados é:
Todos os recursos de armazenamento subjacentes foram criados em capítulos anteriores. No Data Integration, você cria os ativos de dados para cada um dos elementos do fluxo de dados.
8.1 Criando um Ativo de Dados para sua Origem e Tabela Intermediária
Crie um ativo de dados para seus dados de origem e de preparação.
Conclua 7. Prepare as Origens de Dados e os Sinks antes de tentar esta tarefa.
8.2 Criando um Ativo de Dados para seu Destino
Crie um ativo de dados para o data warehouse de destino.
Conclua 8.1 Criando um Ativo de Dados para sua Origem e Tabela Intermediária antes de tentar esta tarefa.
8.3 Criando um Fluxo de Dados
Crie um fluxo de dados no serviço Data Integration para ingerir os dados do arquivo.
Conclua 8.2 Criando um Ativo de Dados para seu Destino antes de tentar esta tarefa.
- Na página de detalhes do projeto de laboratório visual, selecione Fluxos de Dados.
- Selecione Criar Fluxo de Dados.
- No designer de fluxo de dados, selecione o painel Propriedades.
-
Para Nome, digite
lab-data-flow. - Selecione Criar.
8.4 Adicionando uma Origem de Dados
Agora adicione uma origem de dados ao seu fluxo de dados.
Conclua a 8.3 Criando um Fluxo de Dados antes de tentar esta tarefa.
Depois de criar o fluxo de dados em 8.3 Criando um Fluxo de Dados, o designer permanece aberto e você pode adicionar uma origem de dados a ele usando as seguintes etapas:
8.5 Adicionando uma Expressão
Adicione uma expressão para alterar o formato de ID para inteiro e o formato do campo date_taken para uma data.
Conclua 8.4 Adicionando uma Origem de Dados antes de tentar esta tarefa.
8.6 Adicionando uma Função
Adicione uma função ao Fluxo de Dados para extrair objetos das imagens de entrada.
Conclua 8.5 Adicionando uma Expressão antes de tentar esta tarefa.
8.7 Mapeando a Saída para a Tabela do Data Warehouse
Mapeie a saída da análise de sentimento para a Tabela de Data Warehouse.
Conclua 8.6 Adicionando uma Função antes de tentar esta tarefa.
8.8 Executando o Serviço Data Flow
Execute o fluxo de dados para preencher o banco de dados de destino.
Conclua a 8.7 Mapeando a Saída para a Tabela do Data Warehouse antes de tentar esta tarefa.
9. Visualizar os Dados no Analytics Cloud
Exiba os dados criados usando o Analytics Cloud.
Você precisa de acesso ao Analytics Cloud e criar uma instância do Analytics Cloud.
9.1 Criando uma Instância do Analytics Cloud
Siga estas etapas para criar uma instância do Analytics Cloud.
Complete o 8. Use um Fluxo de Dados no Data Integration antes de tentar esta tarefa.
- No menu de navegação da Console, selecione Análise e AI.
- Selecione Analytics Cloud.
- Selecione o Compartimento,
- Selecione Criar Instância.
- Informe um Nome. Não inserir informações confidenciais
-
Selecione
2 OCPUs. Os outros parâmetros de configuração são mantidos como valores padrão. - Selecione Criar.
9.2 Criando uma Conexão com o Data Warehouse
Siga estas etapas para configurar uma conexão da sua instância do Analytics Cloud com seu data warehouse.
Conclua 9.1 Criando uma Instância do Analytics Cloud antes de tentar esta tarefa.
9.3 Criando um Conjunto de Dados
Siga estas etapas para criar um conjunto de dados:
Conclua 9.2 Criando uma Conexão com o Data Warehouse antes de tentar esta tarefa.
- Selecione Dados.
- Selecione Criar.
- Selecione Create a New Dataset.
- Selecione seu data warehouse.
- No banco de dados USER1, arraste a tabela OBJECTS para a tela.
- Salve seu conjunto de dados.
9.4 Criando uma Visualização
Siga estas etapas para exibir seus dados no Analytics Cloud.
Conclua 9.3 Creating a Dataset antes de tentar esta tarefa.
Mapeamentos de Cinco a Oito
Mapeamentos Nove para Doze
Mapeamentos Treze e Quatorze