云器 Lakehouse 图像解析最佳实践

引言

在数据驱动的时代,图像数据已成为企业数据资产的重要组成部分。云器 Lakehouse 通过集成先进的图像识别和向量检索技术,为企业提供了一套完整的图像数据管理和分析解决方案。本文将通过一个美食图像识别的实战案例,详细介绍如何在云器 Lakehouse 中构建端到端的图像解析系统。

1.关键产品功能

  • 多模态存储:支持图像文件、向量数据、结构化元数据的统一管理
  • 外部函数(EXTERNAL FUNCTION):无缝调用 AI 模型进行图像识别和向量化
  • 向量检索:原生支持 1024 维向量存储和相似度计算

2.实战案例:美食图像识别系统

2.1 创建数据表结构

首先,我们需要创建一个包含向量字段的表来存储图像信息:

-- 创建美食图像识别数据表
CREATE    TABLE IF NOT EXISTS dish_images (
          id BIGINT NOT NULL PRIMARY KEY IDENTITY (1),
          url STRING NOT NULL COMMENT '图片的原始URL地址',
          file_name STRING NOT NULL COMMENT '图片文件名',
          image_content STRING COMMENT '使用fc_image_to_text提取的菜品信息',
          image_vector VECTOR (FLOAT, 1024) COMMENT '使用fc_gen_emmbeding生成的图片向量',
          created_at TIMESTAMP DEFAULT current_timestamp() COMMENT '创建时间'
          )
          COMMENT '美食图片识别数据表';

2.2 批量上传图像到 VOLUME

云器 Lakehouse 的 VOLUME 功能提供了文件管理能力。以下示例展示如何从 URL 批量下载并上传图像,您可以从下面网址下载图片到本地,再通过 Lakehouse JDBC 客户端 PUT 文件到 USER VOLUME 中:

图片地址(可变换结果数字下载更多图片)

-- 注意:PUT命令需要通过 JDBC 客户端执行,不能在 SQL 编辑器中直接运行
-- 从URL批量下载并上传图像到 USER VOLUME
PUT 
    '/User/Downloads/RecognizeFood1.jpg',
    '/User/Downloads/RecognizeFood2.jpg',
    '/User/Downloads/RecognizeFood3.jpg' 
TO USER VOLUME SUBDIRECTORY 'dish_images';

-- 查看上传的文件
LIST USER VOLUME SUBDIRECTORY 'dish_images';

2.3 利用函数识别图片

利用云函数实现图像的自动识别和向量化:

-- 插入单条记录,调用云函数进行图像识别和向量生成
INSERT INTO dish_images (url, file_name, image_content, image_vector)
VALUES 
(
    'http://viapi-test.oss-cn-shanghai.aliyuncs.com/viapi-3.0domepic/imagerecog/RecognizeFood/RecognizeFood1.jpg',
    'RecognizeFood1.jpg',
    -- 调用图像识别函数
    public.fc_image_to_text('dish_recognition', 'http://viapi-test.oss-cn-shanghai.aliyuncs.com/viapi-3.0domepic/imagerecog/RecognizeFood/RecognizeFood1.jpg'),
    -- 生成图像向量(注意:向量维度必须匹配)
    CAST(public.fc_gen_emmbeding('multimodal', '', 'http://viapi-test.oss-cn-shanghai.aliyuncs.com/viapi-3.0domepic/imagerecog/RecognizeFood/RecognizeFood1.jpg') AS VECTOR(FLOAT, 1024))
);

-- 批量插入多条记录
INSERT INTO dish_images (url, file_name, image_content, image_vector)
VALUES 
('http://viapi-test.oss-cn-shanghai.aliyuncs.com/viapi-3.0domepic/imagerecog/RecognizeFood/RecognizeFood2.jpg', 
 'RecognizeFood2.jpg',
 public.fc_image_to_text('dish_recognition', 'http://viapi-test.oss-cn-shanghai.aliyuncs.com/viapi-3.0domepic/imagerecog/RecognizeFood/RecognizeFood2.jpg'),
 CAST(public.fc_gen_emmbeding('multimodal', '', 'http://viapi-test.oss-cn-shanghai.aliyuncs.com/viapi-3.0domepic/imagerecog/RecognizeFood/RecognizeFood2.jpg') AS VECTOR(FLOAT, 1024))
),
('http://viapi-test.oss-cn-shanghai.aliyuncs.com/viapi-3.0domepic/imagerecog/RecognizeFood/RecognizeFood3.jpg', 
 'RecognizeFood3.jpg',
 public.fc_image_to_text('dish_recognition', 'http://viapi-test.oss-cn-shanghai.aliyuncs.com/viapi-3.0domepic/imagerecog/RecognizeFood/RecognizeFood3.jpg'),
 CAST(public.fc_gen_emmbeding('multimodal', '', 'http://viapi-test.oss-cn-shanghai.aliyuncs.com/viapi-3.0domepic/imagerecog/RecognizeFood/RecognizeFood3.jpg') AS VECTOR(FLOAT, 1024))
);

2.4 向量相似度搜索

实现基于图像内容的相似度搜索:

-- 查找与目标图像最相似的菜品
WITH target_vector AS (
    SELECT CAST(public.fc_gen_emmbeding('multimodal', '', 'http://viapi-test.oss-cn-shanghai.aliyuncs.com/viapi-3.0domepic/imagerecog/RecognizeFood/RecognizeFood5.jpg') AS VECTOR(FLOAT, 1024)) as vec
)
SELECT 
    d.id,
    d.file_name,
    d.url,
    d.image_content,
    cosine_distance(d.image_vector, t.vec) as similarity_score
FROM dish_images d, target_vector t
ORDER BY similarity_score ASC
LIMIT 5;

-- 基于已有图像查找相似图像
SELECT 
    d1.file_name as source_image,
    d2.file_name as similar_image,
    d2.image_content,
    cosine_distance(d1.image_vector, d2.image_vector) as similarity_score
FROM dish_images d1, dish_images d2
WHERE d1.file_name = 'RecognizeFood1.jpg'
  AND d1.id != d2.id
ORDER BY similarity_score ASC
LIMIT 5;

3.高级应用场景

3.1 多维度图像分析

结合结构化查询和向量搜索,实现复杂的分析需求:

-- 查找特定类别的图像
SELECT 
    id,
    file_name,
    image_content
FROM dish_images
WHERE image_content LIKE '%海鲜%' 
   OR image_content LIKE '%鱼%'
   OR image_content LIKE '%虾%'
   OR image_content LIKE '%蟹%'
ORDER BY id;

-- 分析菜品识别结果的置信度分布
SELECT 
    file_name,
    image_content,
    -- 提取置信度(需要根据实际JSON格式调整)
    CAST(SUBSTRING(image_content, 
         POSITION('probability' IN image_content) + 15, 
         8) AS DOUBLE) as confidence
FROM dish_images
ORDER BY confidence DESC;

-- 统计各类菜品数量
SELECT 
    CASE 
        WHEN image_content LIKE '%牛%' THEN '牛肉类'
        WHEN image_content LIKE '%鱼%' THEN '鱼类'
        WHEN image_content LIKE '%虾%' OR image_content LIKE '%蟹%' THEN '海鲜类'
        WHEN image_content LIKE '%菜%' AND image_content NOT LIKE '%非菜%' THEN '蔬菜类'
        ELSE '其他'
    END as category,
    COUNT(*) as count
FROM dish_images
WHERE image_content NOT LIKE '%非菜%'
GROUP BY 1
ORDER BY count DESC;

3.2 创建图像处理管道

使用动态表实现自动化的数据处理:

-- 创建动态表,自动提取和聚合菜品信息
CREATE OR REPLACE DYNAMIC TABLE dish_summary
REFRESH_INTERVAL = '1 HOUR'
AS
SELECT 
    file_name,
    url,
    -- 提取菜品名称(简化的字符串处理)
    SUBSTRING(image_content, 
              POSITION('name' IN image_content) + 9,
              POSITION('}' IN SUBSTRING(image_content, POSITION('name' IN image_content))) - 10
    ) as dish_name,
    -- 提取卡路里信息
    CASE 
        WHEN image_content LIKE '%calorie%' THEN
            SUBSTRING(image_content, 
                     POSITION('calorie' IN image_content) + 12,
                     3)
        ELSE NULL
    END as calorie,
    created_at
FROM dish_images
WHERE image_content IS NOT NULL;

-- 查看动态表数据
SELECT * FROM dish_summary;

结语

通过本文的实践案例和可执行代码,我们展示了云器 Lakehouse 在图像数据管理和分析方面的强大能力。从简单的图像识别到复杂的向量搜索,从批量处理到实时分析,云器 Lakehouse 为企业提供了一站式的解决方案。

正如 MCP Server 背后体现的技术追求,云器团队对每一个功能细节的打磨,让这个平台不仅仅是一个数据仓库,更是连接 AI 能力与业务需求的桥梁。随着技术的不断进步,我们相信云器 Lakehouse 将在多模态数据分析领域发挥越来越重要的作用。


本文基于云器 Lakehouse 最新版本编写,所有 SQL 代码均已在实际环境中测试通过。具体功能可能随版本更新而变化。更多技术细节请参考官方文档https://yunqi.tech/documents

联系我们
预约咨询
微信咨询
电话咨询