Em sistemas de direção autônoma, a análise de imagens do veículo é um caso de uso central da pilha de percepção. O sistema processa sinais visuais de câmeras internas e externas em tempo real para compreender o ambiente com precisão e tomar decisões. Ao analisar e pesquisar 100.000 imagens em diversas áreas de tráfego, regiões geográficas, ambientes e condições climáticas, esta solução valida uma técnica completa para análise de trajetória, otimização de percepção e reconhecimento mais preciso de pedestres e veículos. Isso aumenta a adaptabilidade do sistema a cenários de tráfego complexos, eleva a segurança e melhora a experiência do usuário.
Capacidades principais
Esta prática recomendada para processamento de imagens, pesquisa e análise multimodal envolve as seguintes capacidades principais:
Modelos gerenciados do Hologres: O Hologres oferece recursos de implantação e invocação de modelos gerenciados por meio de nós de IA. Implante modelos diretamente nos nós de IA do Hologres e invoque-os via SQL padrão usando AI Functions, sem configurar serviços externos de inferência. Nesta solução, o Hologres chama os modelos gerenciados implantados diretamente.
Object Table: Leia dados não estruturados, como PDFs, imagens e PPTs, do Object Storage Service (OSS) em formato de tabela.
-
AI Function: No Hologres, use SQL padrão para chamar funções que invocam automaticamente grandes modelos integrados e criam serviços de IA.
Processamento de dados: Fornece operadores Embed e Chunk para transformar dados não estruturados em dados estruturados para armazenamento. Gere embeddings automaticamente sem algoritmos externos.
Pesquisa e análise de dados: Disponibiliza operadores como
ai_geneai_summarizepara executar inferência, resumo e tradução de dados usando apenas SQL.
Dynamic Table: Suporta modo de atualização incremental para processar dados não estruturados automaticamente. Esse modo processa apenas dados incrementais, o que reduz computações redundantes e o uso de recursos.
Índice HGraph (Recomendado): Permite pesquisa vetorial usando SQL padrão para buscas de similaridade e reconhecimento de cenas em dados não estruturados. Combine livremente pesquisas vetoriais e escalares na mesma consulta.
Índice invertido de texto completo: Possibilita pesquisa eficiente de dados não estruturados por meio de mecanismos como indexação invertida e tokenização. Oferece suporte a métodos avançados de pesquisa, como correspondência de palavras-chave e busca por frases, para uma recuperação mais flexível.
Benefícios
Com essas capacidades principais, o Hologres oferece as seguintes vantagens essenciais para pesquisa de imagens:
Processamento de dados de IA de ponta a ponta: Cobre todo o fluxo de trabalho, desde embedding e fragmentação de dados até processamento incremental, pesquisa e análise. Construir aplicações de IA torna-se tão simples quanto trabalhar com sistemas de big data.
Processe dados de imagem com SQL padrão: Não é necessária nenhuma linguagem de programação especializada. Use SQL puro para extrair e processar dados de imagem.
Uma única plataforma para pesquisa cross-modal: Suporta tanto pesquisa de texto para imagem quanto de imagem para imagem. A compreensão semântica vai além dos limites de palavras-chave e habilita pesquisa cross-modal dentro do Hologres.
Pesquisa mais precisa, flexível e inteligente: Construa facilmente pipelines de pesquisa híbrida que combinam palavras-chave, semântica e pesquisa multimodal para atender desde buscas exatas até descobertas baseadas em intenção. Utilize também AI Function para compreensão profunda da intenção do usuário, correlação semântica e raciocínio contextual, permitindo pesquisas mais inteligentes.
Maior segurança com processamento no banco de dados: Não é necessário exportar dados para sistemas externos. Esta solução integra-se perfeitamente aos diversos recursos de segurança do Hologres para proteger seus dados com eficiência.
Como funciona
O fluxo de trabalho desta solução é o seguinte:
-
Prepare o conjunto de dados.
Faça upload dos dados de imagem para o Object Storage Service (OSS).
-
Processe as imagens.
Use uma Object Table para ler os metadados da imagem e crie uma Dynamic Table com atualização incremental para gerar embeddings. Crie um índice vetorial para a Dynamic Table a fim de acelerar as pesquisas subsequentes.
Utilize o operador
ai_embedpara criar embeddings de consultas em linguagem natural e use a pesquisa vetorial para recuperar os N principais resultados.
Pré-requisitos
-
Preparação de dados
Este tópico utiliza o arquivo
val.zipdo conjunto de dados de imagens de direção autônoma BDD100K, disponível publicamente no ModelScope, para simular dados reais de direção de múltiplos veículos. -
Preparação do ambiente
Adquira recursos de nó de IA do Hologres. No console do Hologres, acesse a página de detalhes da instância e vá para a seção AI Nodes (GPU) para comprar recursos de nó de IA. Para obter mais informações sobre AI Functions e modelos gerenciados, consulte Introdução a Recursos e Funções de IA.
É necessária uma instância do Hologres versão 4.0.40 ou posterior, 4.1.26 ou posterior, 4.2.5 ou posterior, ou 5.0 ou posterior. Regiões suportadas atualmente: China (Pequim), China (Xangai), China (Hangzhou), China (Shenzhen) e Singapura.
Implante um modelo gerenciado. No console do Hologres, acesse a página de detalhes da instância, clique em AI Model e depois clique em Deploy Model. Selecione Hologres AI Node como provedor do modelo e implante o modelo qwen3-vl-embedding. Para mais detalhes, consulte Implantar modelos gerenciados.
Procedimento
-
Baixe os dados de imagem e faça upload para o OSS.
Baixe o arquivo
val.zipdo conjunto de dados de imagens de direção autônoma BDD100K.-
Faça login no console do OSS, crie um bucket e faça upload do arquivo
val.zipbaixado para o bucket. Para mais informações sobre upload de arquivos, consulte Upload simples.NotaUse letras minúsculas para nomes de pastas.
-
Conceda permissões.
-
Faça login no console do Resource Access Management (RAM). Crie uma função RAM do Alibaba Cloud e conceda a ela permissões de OSS.
Recomendamos conceder a permissão AliyunOSSReadOnlyAccess.
-
Conceda permissões de login e acesso ao Hologres para a função RAM.
-
Conta Alibaba Cloud (conta raiz)
Atualize a política de confiança da função RAM. Atualize estes parâmetros:
Action: Defina como
sts:AssumeRole.Service: Defina como
hologres.aliyuncs.com.
{ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "RAM": [ "acs:ram::1866xxxx:root" ], "Service": [ "hologres.aliyuncs.com" ] } } ], "Version": "1" } -
Usuário RAM (subconta)
-
Conceda permissões ao usuário RAM.
-
Na página , clique em Create Policy e selecione o modo Script Editor para criar uma política. Para mais informações, consulte Criar uma política personalizada.
O Hologres usa esta política para verificar se o usuário RAM tem permissão para criar a função RAM. Conteúdo da política:
{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": "hologram:GrantAssumeRole", "Resource": "<RoleARN>" } ] } Na página , clique em Add Permissions na coluna Actions.
-
-
Conceda permissões à função RAM.
Atualize a política de confiança da função RAM. Atualize estes parâmetros:
Action: Defina como
sts:AssumeRole.Service: Defina como
hologres.aliyuncs.com.
{ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "RAM": [ "acs:ram::1866xxxx:root" ], "Service": [ "hologres.aliyuncs.com" ] } } ], "Version": "1" }
-
-
-
-
Gere embeddings para as imagens.
Crie uma Object Table e uma Dynamic Table para ler metadados de imagem e gerar embeddings. O Hologres fornece esse processo extenso como um procedimento armazenado. Este procedimento armazenado inclui as seguintes capacidades:
Cria uma Object Table para ler metadados de imagem.
Cria uma Dynamic Table com atualização incremental como tabela de resultados para armazenar os dados processados e cria um índice vetorial. A atualização automática está desativada para esta Dynamic Table; portanto, atualize-a manualmente.
Durante o processo de atualização, esta Dynamic Table usa a função
ai_embedpara gerar embeddings de imagem.
Para usar este procedimento armazenado, execute a seguinte instrução:
-- Stored procedure to create an Object Table and a Dynamic Table, and use the Dynamic Table to embed images. CALL create_image_table_from_oss( oss_path => 'oss://xxxx/bdd100k/val/images', oss_endpoint => 'oss-cn-hangzhou-internal.aliyuncs.com', oss_role_arn => 'acs:ram::1xxxx:role/xxxx', image_table => 'public.dt_image_bdd100k', embedding_model =>'qwen3_vl_embedding' ); -
Atualize a tabela de resultados.
Atualize manualmente a Object Table e a Dynamic Table da etapa anterior para concluir o processamento de dados. Esta etapa também está encapsulada em um procedimento armazenado. Este procedimento armazenado oferece as seguintes capacidades:
Atualiza a Object Table uma vez para obter metadados de imagem.
Atualiza a Dynamic Table uma vez para gerar embeddings para as imagens.
Para usar este procedimento armazenado, execute a seguinte instrução:
-- Refresh the Dynamic Table to generate embeddings for the images. CALL refresh_image_table( image_table => 'public.dt_image_bdd100k' ); -
Pesquise as imagens.
Após o processamento dos dados de imagem, pesquise usando pesquisa vetorial e AI Function.
Pesquisa de texto para imagem
A seguinte instrução SQL é um exemplo de pesquisa de texto para imagem:
-- Text-to-image search SELECT object_uri, approx_cosine_distance (embedding_vector, ai_embed ('qwen3_vl_embedding', 'a red car in the rain')) AS score FROM public.dt_image_bdd100k ORDER BY score DESC LIMIT 1; object_uri | score ---------------------------------------------------------------+------- oss://****/bdd100k/val/images/c11a0015-fc7c****.jpg| 0.559552908 (5 rows)Na página de detalhes do objeto OSS, o resultado da pesquisa mostra uma cena de rua chuvosa capturada através da janela de um carro. É possível ver gotas de chuva, semáforos, veículos em movimento e uma faixa de pedestres. A cena apresenta forte correspondência semântica com o texto da consulta
a red car in the rain. Os metadados do objeto indicam tempo de expiração de 300 segundos.Pesquisa de imagem para imagem
A seguinte instrução SQL é um exemplo de pesquisa de imagem para imagem:
-- Image-to-image search SELECT object_uri, approx_cosine_distance (embedding_vector, ai_embed ('qwen3_vl_embedding', to_file ('oss://xxxx/val/images/b9b53753-91a5d5f8.jpg', 'oss-cn-hangzhou-internal.aliyuncs.com', 'acs:ram::18xxx:role/xxx'))) AS score FROM public.dt_image_bdd100k WHERE object_uri <> 'oss://****-hangzhou/bdd100k/val/images/b9b53753-91a5****.jpg' -- Exclude the image itself. ORDER BY score DESC LIMIT 1; object_uri | score ---------------------------------------------------------------+------ oss://****/bdd100k/val/images/c0e9b7c4-cd8b****.jpg | 0.811107099Uma comparação mostra que a imagem de consulta (uma cena de condução urbana chuvosa) e a imagem recuperada (uma cena de rua urbana com um sedã branco, um ônibus e um táxi) possuem alta similaridade visual. Isso valida a precisão do resultado da pesquisa de imagem para imagem.
Apêndice: Procedimentos armazenados
-
Criar uma Object Table e uma Dynamic Table
-- By default, a query returns a maximum of 200 rows. To return more data, modify the LIMIT clause. The maximum is 10,000 rows or 20 MB. CREATE OR REPLACE PROCEDURE create_image_table_from_oss( oss_path TEXT, oss_endpoint TEXT, oss_role_arn TEXT, image_table TEXT, embedding_model TEXT DEFAULT NULL, overwrite BOOLEAN DEFAULT FALSE ) AS $$ DECLARE image_schema_name TEXT; image_table_name TEXT; obj_table_name TEXT; full_image_table_ident TEXT; full_obj_ident TEXT; embed_expr TEXT; create_sql TEXT; embedding_dims INT; BEGIN -- 1. Split the schema name and table name. IF position('.' in image_table) > 0 THEN image_schema_name := split_part(image_table, '.', 1); image_table_name := split_part(image_table, '.', 2); ELSE image_schema_name := 'public'; image_table_name := image_table; END IF; obj_table_name := image_table_name || '_obj_table'; full_image_table_ident := format('%I.%I', image_schema_name, image_table_name); full_obj_ident := format('%I.%I', image_schema_name, obj_table_name); -- 2. If overwrite is true, drop the tables and indexes first. IF overwrite THEN DECLARE dyn_table_exists BOOLEAN; rec RECORD; BEGIN -- Check whether the dynamic table exists. SELECT EXISTS ( SELECT 1 FROM pg_class c JOIN pg_namespace n ON n.oid = c.relnamespace WHERE c.relname = image_table_name AND n.nspname = image_schema_name ) INTO dyn_table_exists; IF dyn_table_exists THEN -- 2.1 Disable auto-refresh for the dynamic table. -- RAISE NOTICE 'Disabling auto refresh for %', full_image_table_ident; -- EXECUTE format('ALTER TABLE IF EXISTS %s SET (auto_refresh_enable=false)', full_image_table_ident); -- 2.2 Find and cancel the RUNNING refresh job. FOR rec IN EXECUTE format( $f$ SELECT query_job_id FROM hologres.hg_dynamic_table_refresh_log(%L) WHERE status = 'RUNNING'; $f$, image_table ) LOOP RAISE NOTICE 'Found running refresh job: %', rec.query_job_id; IF hologres.hg_internal_cancel_query_job(rec.query_job_id::bigint) THEN RAISE NOTICE 'Cancel job % succeeded.', rec.query_job_id; ELSE RAISE WARNING 'Cancel job % failed.', rec.query_job_id; END IF; END LOOP; -- 2.3 Drop the Dynamic Table. EXECUTE format('DROP TABLE IF EXISTS %s;', full_image_table_ident); ELSE RAISE NOTICE 'Dynamic table % does not exist, skip cancel job and drop.', full_image_table_ident; END IF; -- 2.4 Drop the Object Table. EXECUTE format('DROP OBJECT TABLE IF EXISTS %s;', full_obj_ident); END; END IF; -- 3. Create the Object Table. RAISE NOTICE 'Create object table: %', obj_table_name; EXECUTE format( $f$ CREATE OBJECT TABLE %s WITH ( path = %L, oss_endpoint = %L, role_arn = %L ); $f$, full_obj_ident, oss_path, oss_endpoint, oss_role_arn ); COMMIT; -- 4. Refresh the Object Table. RAISE NOTICE 'Refresh object table: %', obj_table_name; EXECUTE format('REFRESH OBJECT TABLE %s;', full_obj_ident); COMMIT; -- 5. Select an embedding model. IF embedding_model IS NULL OR length(trim(embedding_model)) = 0 THEN embed_expr := 'ai_embed(file)'; EXECUTE 'SELECT array_length(ai_embed(''dummy''), 1)' INTO embedding_dims; ELSE embed_expr := format('ai_embed(%L, file)', embedding_model); EXECUTE format( 'SELECT array_length(ai_embed(%L, ''dummy''), 1)', embedding_model ) INTO embedding_dims; END IF; RAISE NOTICE 'embedding dimension is: %', embedding_dims; -- 6. Create the Dynamic Table for RAG output. RAISE NOTICE 'create dynamic table: %', image_table_name; EXECUTE format( $f$ CREATE DYNAMIC TABLE %s( CHECK(array_ndims(embedding_vector) = 1 AND array_length(embedding_vector, 1) = %s) ) WITH ( vectors = '{ "embedding_vector": { "algorithm": "HGraph", "distance_method": "Cosine", "builder_params": { "base_quantization_type": "sq8_uniform", "max_degree": 64, "ef_construction": 400, "precise_quantization_type": "fp32", "use_reorder": true } } }', auto_refresh_mode = 'incremental', freshness = '5 minutes', auto_refresh_enable = 'false' ) AS SELECT object_uri, etag, %s AS embedding_vector FROM %s; $f$, full_image_table_ident, embedding_dims, embed_expr, obj_table_name ); COMMIT; RAISE NOTICE ''; RAISE NOTICE 'Create image table success: %', image_table; RAISE NOTICE ' Vector index is: %.embedding_vector', image_table; END; $$ LANGUAGE plpgsql; -
Atualizar a Object Table e a Dynamic Table
CREATE OR REPLACE PROCEDURE refresh_image_table( image_table TEXT ) AS $$ DECLARE image_schema_name TEXT; image_table_name TEXT; obj_table_name TEXT; full_image_table_ident TEXT; full_obj_ident TEXT; BEGIN -- 1. Parse the schema and table name. IF position('.' in image_table) > 0 THEN image_schema_name := split_part(image_table, '.', 1); image_table_name := split_part(image_table, '.', 2); ELSE image_schema_name := 'public'; image_table_name := image_table; END IF; obj_table_name := image_table_name || '_obj_table'; full_image_table_ident := format('%I.%I', image_schema_name, image_table_name); full_obj_ident := format('%I.%I', image_schema_name, obj_table_name); -- 2. Refresh the Object Table. RAISE NOTICE 'Refreshing Object Table: %', obj_table_name; EXECUTE format('REFRESH OBJECT TABLE %s;', full_obj_ident); -- 3. Refresh the Dynamic Table. RAISE NOTICE 'Refreshing Dynamic Table: %', image_table_name; EXECUTE format('REFRESH TABLE %s;', full_image_table_ident); RAISE NOTICE 'Refresh image table complete: %', image_table; END; $$ LANGUAGE plpgsql; -
Procedimento para excluir tabelas
CREATE OR REPLACE PROCEDURE drop_image_table( image_table TEXT ) AS $$ DECLARE image_schema_name TEXT; image_table_name TEXT; obj_table_name TEXT; full_image_table_ident TEXT; full_obj_ident TEXT; rec RECORD; BEGIN -- 1. Parse the schema and table name. IF position('.' in image_table) > 0 THEN image_schema_name := split_part(image_table, '.', 1); image_table_name := split_part(image_table, '.', 2); ELSE image_schema_name := 'public'; image_table_name := image_table; END IF; obj_table_name := image_table_name || '_obj_table'; full_image_table_ident := format('%I.%I', image_schema_name, image_table_name); full_obj_ident := format('%I.%I', image_schema_name, obj_table_name); -- 2. Delete the table. -- 2.1 Disable auto-refresh for the dynamic table. -- RAISE NOTICE 'Disabling auto refresh for %', full_image_table_ident; -- EXECUTE format('ALTER TABLE IF EXISTS %s SET (auto_refresh_enable=false)', full_image_table_ident); -- 2.2 Find and cancel the RUNNING refresh job. FOR rec IN EXECUTE format( $f$ SELECT query_job_id FROM hologres.hg_dynamic_table_refresh_log(%L) WHERE status = 'RUNNING'; $f$, image_table ) LOOP RAISE NOTICE 'Found running refresh job: %', rec.query_job_id; IF hologres.hg_internal_cancel_query_job(rec.query_job_id::bigint) THEN RAISE NOTICE 'Cancel job % succeeded.', rec.query_job_id; ELSE RAISE WARNING 'Cancel job % failed.', rec.query_job_id; END IF; END LOOP; -- 2.3 Drop the Dynamic Table. RAISE NOTICE 'Dropping Dynamic Table: %', image_table_name; EXECUTE format('DROP TABLE IF EXISTS %s;', full_image_table_ident); -- 2.4 Drop the Object Table. RAISE NOTICE 'Dropping Object Table: %', obj_table_name; EXECUTE format('DROP OBJECT TABLE IF EXISTS %s;', full_obj_ident); RAISE NOTICE 'Drop image table complete: %', image_table; END; $$ LANGUAGE plpgsql;