Integración de Vision con Oracle Analytics Cloud (OAC)
Cree un flujo de Data Integration que utilice Vision SDK para detectar objetos en imágenes y proyectar esa información en una tabla de un almacén de datos. A continuación, Oracle Analytics Cloud utiliza estos datos de salida para crear visualizaciones y buscar patrones.
Este es el flujo de alto nivel del sistema entre Vision y OAC:
Antes de empezar
Para seguir este tutorial, debe ser capaz de crear redes, funciones y gateways de API de VCN y utilizar Data Integration y Vision.
Hable con el administrador sobre las políticas necesarias.
Configuración de las políticas necesarias
Siga estos pasos para configurar las políticas necesarias.
1. Creación de una red virtual en la nube
Cree una VCN para que sirva como directorio raíz para la función sin servidor y el gateway de API creado más adelante en el tutorial.
1.1 Creación de una VCN con acceso a Internet
Siga estos pasos para crear una VCN con acceso a Internet.
- En el menú de navegación, seleccione Networking.
- Seleccione Redes virtuales en la nube.
- Iniciar asistente de VCN rápido.
- Seleccione Crear una VCN con conexión a Internet.
- Seleccione Iniciar asistente de VCN.
- Introduzca un nombre para la VCN. Evite introducir información confidencial.
- Seleccione Siguiente.
- Haga clic en Crear.
1.2 Acceso a la VCN desde Internet
Debe agregar una nueva regla de entrada con estado a la subred regional pública para permitir el tráfico en el puerto 443.
Complete 1.1 Creación de una VCN con acceso a Internet antes de intentar esta tarea.
El gateway de API se comunica en el puerto 443, que no está abierto por defecto.
2. Creación de una puerta de enlace de API
Un gateway de API permite agregar todas las funciones que ha creado en un único punto final que pueden consumir sus usuarios.
Complete 1. Cree una red virtual en la nube antes de intentar esta tarea.
3. Creación de una función de enriquecimiento
Siga estos pasos para crear una función de enriquecimiento a la que se pueda llamar desde Oracle Cloud Infrastructure Data Integration.
Cree una función sin servidor que solo se ejecute bajo demanda. La función cumple con el esquema necesario para que la integración de datos la consuma. La función sin servidor llama a la API de Vision a través del SDK de Python.
3.1 Creación de Aplicaciones
Para agregar una función, primero tenemos que crear una aplicación.
Complete 2. Creación de un gateway de API antes de intentar esta tarea.
3.2 Creación de una función
Siga estos pasos para crear una función en la aplicación:
Complete 3.1 Creación de una aplicación antes de intentar esta tarea.
La forma más rápida es que el sistema genere una plantilla de Python.
Contenido 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: 300
Contenido 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
requests
Contenido 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 rstr
3.3 Despliegue de la función
Desplegar la función en la aplicación
Complete 3.2 Creación de una función antes de intentar esta tarea.
3.4 Llamada a la función
Pruebe la función llamándola.
Complete 3.3 Despliegue de la función antes de intentar esta tarea.
{"data":"eyJpZCI6MSwiaW5wdXRUZXh0IjoiaHR0cHM6Ly9pbWFnZS5jbmJjZm0uY29tL2FwaS92MS9pbWFnZS8xMDYxOTYxNzktMTU3MTc2MjczNzc5MnJ0czJycmRlLmpwZyJ9", "parameters":{"column":"inputText"}}
Los datos codificados son la versión codificada base 64 de un juego de formato de líneas JSON (cada línea es un JSON para cada registro). Cada registro tiene un ID que se utiliza para asociar la salida. La descodificación de la cadena de ejemplo proporciona:{"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. Adición de una política de funciones
Cree una política para que la función se pueda utilizar con Vision.
Complete 3. Cree una función de enriquecimiento antes de intentar esta tarea.
5. Creación de un espacio de trabajo de integración de datos de Oracle Cloud Infrastructure
Antes de utilizar Data Integration, asegúrese de que tiene los derechos para utilizar la capacidad.
Complete 4. Adición de una política de Functions antes de intentar esta tarea.
Cree las políticas que le permitan utilizar Data Integration.
6. Adición de políticas de integración de datos
Actualice la política para que pueda utilizar Data Integration.
Complete 5. Creación de un espacio de trabajo de Oracle Cloud Infrastructure Data Integration antes de intentar esta tarea.
7. Preparación de orígenes y receptores de datos
Está utilizando imágenes de aparcamiento junto con la fecha en que se tomaron las imágenes como datos de muestra.
Reúna 10 imágenes (o más) de vehículos estacionados como origen de datos en el que realiza análisis de detección de objetos mediante Data Integration y Vision.
7.1 Cargando datos de muestra
Cargue los datos de muestra de las imágenes de automóviles estacionados en su cubo.
Complete 6. Adición de políticas de Data Integration antes de intentar esta tarea.
7.2 Creación de un cubo temporal
Data Integration necesita una ubicación temporal en la que volcar archivos intermedios antes de publicar datos en un almacén de datos.
Complete 7.1 Loading Sample Data antes de realizar esta tarea.
- En el menú de navegación de la consola, seleccione Almacenamiento.
- Seleccione Cubos.
- Seleccione Crear cubo.
-
Dale un nombre adecuado, por ejemplo,
data-staging
. Evite introducir información confidencial. - Haga clic en Crear.
- Acepte todos los valores por defecto.
7.3 Preparación de la base de datos de destino
Configure la base de datos de destino de Autonomous Data Warehouse para agregar un esquema y una tabla.
Complete 7.2 Creación de un cubo temporal antes de intentar esta tarea.
7.4 Creación de una Tabla para Proyectar los Datos Analizados
Cree una tabla para almacenar cualquier información sobre los objetos detectados.
Complete 7.3 Preparación de la base de datos de destino antes de intentar esta tarea.
8. Uso de un flujo de datos en Data Integration
Cree los componentes necesarios para crear un flujo de datos en Data Integration.
El flujo de datos es:
Todos los recursos de almacenamiento subyacentes se crearon en capítulos anteriores. En Data Integration, puede crear los activos de datos para cada uno de los elementos del flujo de datos.
8.1 Creación de un activo de datos para el origen y la ubicación temporal
Cree un activo de datos para los datos de origen y temporales.
Complete 7. Prepare los orígenes y receptores de datos antes de intentar esta tarea.
8.2 Creación de un Activo de Datos para el Destino
Cree un activo de datos para el almacén de datos de destino.
Complete 8.1 Creación de un activo de datos para su origen y ubicación temporal antes de intentar esta tarea.
8.3 Creación de un flujo de datos
Cree un flujo de datos en Data Integration para ingerir los datos del archivo.
Complete 8.2 Creación de un activo de datos para el destino antes de intentar esta tarea.
- En la página de detalles del proyecto del laboratorio de visión, seleccione Flujos de datos.
- Seleccione Crear flujo de datos.
- En el diseñador de flujos de datos, seleccione el panel Propiedades.
-
En Nombre, introduzca
lab-data-flow
. - Haga clic en Crear.
8.4 Adición de un Origen de Datos
Ahora, agregue un origen de datos al flujo de datos.
Complete 8.3 Creación de un flujo de datos antes de intentar esta tarea.
Una vez creado el flujo de datos en 8.3 Creación de un flujo de datos, el diseñador permanece abierto y puede agregarle un origen de datos mediante los siguientes pasos:
8.5 Adición de una expresión
Agregue una expresión para cambiar el formato de ID
a entero y el formato del campo date_taken
a una fecha.
Complete 8.4 Adición de un origen de datos antes de intentar esta tarea.
8.6 Adición de una función
Agregue una función al flujo de datos para extraer objetos de las imágenes de entrada.
Complete 8.5 Adición de una expresión antes de intentar esta tarea.
8.7 Asignación de la Salida a la Tabla del Almacén de Datos
Asigne la salida del análisis de sentimiento a la tabla del almacén de datos.
Complete 8.6 Agregación de una función antes de intentar esta tarea.
8.8 Ejecución de Data Flow
Ejecute el flujo de datos para rellenar la base de datos de destino.
Complete la 8.7 Asignación de la salida a la tabla del almacén de datos antes de realizar esta tarea.
9. Visualización de datos en Analytics Cloud
Muestre los datos que ha creado con Analytics Cloud.
Necesita acceso a Analytics Cloud y crear una instancia de Analytics Cloud.
9.1 Creación de una instancia de Analytics Cloud
Siga estos pasos para crear una instancia de Analytics Cloud.
Complete 8. Utilice un flujo de datos en Data Integration antes de intentar esta tarea.
- En el menú de navegación de la consola, seleccione Análisis y AI.
- Seleccione Analytics Cloud.
- Seleccione el compartimento,
- Seleccione Crear instancia.
- Introducir un Nombre. No introducir información confidencial
-
Seleccione
2 OCPUs
. Los demás parámetros de configuración se mantienen como valores por defecto. - Haga clic en Crear.
9.2 Creación de una Conexión al Almacén de Datos
Siga estos pasos para configurar una conexión de la instancia de Analytics Cloud al almacén de datos.
Complete 9.1 Creación de una instancia de Analytics Cloud antes de intentar esta tarea.
9.3 Creación de un juego de datos
Siga estos pasos para crear un conjunto de datos.
Complete 9.2 Creación de una Conexión al Almacén de Datos antes de intentar esta tarea.
- Seleccione Datos.
- Haga clic en Crear.
- Seleccione Crear nuevo juego de datos.
- Seleccione el almacén de datos.
- Desde la base de datos USER1, arrastre la tabla OBJECTS al lienzo.
- Guarde el juego de datos.
9.4 Creación de una visualización
Siga estos pasos para mostrar los datos en Analytics Cloud.
Complete 9.3 Creación de un conjunto de datos antes de realizar esta tarea.