一、业务背景
自动驾驶的量产车与路测车队,前视、环视、后视摄像头每天回传海量道路场景图像。一辆采集车一天就能产出几十万帧,整个车队沉淀在对象存储 OSS 里的图像数以亿计。
- 智能驾驶数据的规模与复杂性
- 数据类型:摄像头图像(多路)、LiDAR 点云、毫米波雷达、GPS/IMU、CAN 总线信号
- 规模:单车单日产生数百 GB,全车队数据 PB 级别
- 多模态融合:不同传感器时间戳对齐、空间坐标对齐
这些图像是模型迭代的燃料——但燃料本身不产生价值,能从里面精准挖出"模型现在最需要的那几千帧"才产生价值。真正的难题不是数据不够多,而是当模型在某类场景上表现不好时,怎么从上亿帧里快速捞出这类场景的训练数据。
二、业务挑战
第一,图像语义无法用传统条件表达。
比如感知模型在"阴天 + 行人横穿""夜间逆光""施工路段锥桶绕行"这些长尾场景上频繁误检,算法团队就需要定向扩充这些 Corner Case 的训练集。可图像本身只是一堆 jpg,文件名里没有"天气""光照""有没有行人"这些信息,几亿帧根本看不过来。
第二,理解、向量化、检索、打标回写是四个割裂环节。
图像先送模型打标,再算 Embedding,再灌进向量库检索,再把圈选结果写回,中间反复落表读表、跨引擎搬数据,链路长、延迟大、排查难。从海量数据中找到特定驾驶场景(鬼探头、夜间变道)耗时数天
第三,图像原文与打标结果两套系统,检索和训练取数割裂。
原图在 OSS、标签向量在向量库或湖表,想按语义圈选、想把结果交给训练管线,都要跨系统关联,还得自己维护增量水位,避免存量图像重复推理白烧成本。
三、解决方案
团队基于阿里云 EMR Serverless StarRocks,用 StarRocks AI Function 在库内直接调用大模型,把"道路图像 → 结构化标签 + 向量 → 混合检索圈选 → 打标回写训练集"整条链路收敛成标准 SQL。
核心思路:图像原图不出 OSS,用 Object Table 挂载增量文件,AI 抽取的场景标签与图像向量直接落 DLF Paimon 湖表,参与检索圈选和打标回写,下游训练管线按标签直接取数、数据不出湖。
AI_EMBED(image_url / frame_description, model):图像 / 场景描述向量化AI_CLASSIFY(frame_data, scenario_labels):驾驶场景分类AI_EXTRACT(annotation_json, schema):标注数据结构化提取与校验AI_GENERATE(context):自动生成标注说明、数据质量报告cosine_similarity:做"给一张困难样本、找语义相似帧"的向量检索、标量过滤与向量相似度在一条 SQL 里原生融合,实现"约束条件下找相似图"
整条链路的关键,是用一份固定的场景 schema 把杂乱图像收敛成一套可查询、可聚合的结构化标签。
四、平台整体架构
五、实践步骤
验证环境:EMR Serverless StarRocks 3.5.16-2.2.1(object-table 分支),ai_embed_multimodal 实测输出 2560 维;数据集为 nuScenes CAM_FRONT 前视图像。
第一步,用 Object Table 挂载 OSS 上的道路图像。
图像按采集批次/相机位/年月目录沉淀在 OSS,建 Object Table 把对象映射进来,file 描述符直接交给 AI 函数、签名地址由系统自动生成,用 object_uri + etag 做增量水位,实现"文件不出 OSS、只处理新增帧"。
SET CATALOG default_catalog; CREATE DATABASE IF NOT EXISTS ad_data_mining; CREATE OBJECT TABLE ad_data_mining.camfront_objects PROPERTIES ( "path" = "oss://<BUCKET>/CAM_FRONT/", "aliyun.oss.endpoint" = "oss-cn-hangzhou-internal.aliyuncs.com", "aliyun.oss.public_endpoint" = "oss-cn-hangzhou.aliyuncs.com", "aliyun.oss.access_key" = "<AK>", "aliyun.oss.secret_key" = "<SK>", "recursive" = "true", "file_pattern" = ".*\\.(jpg|jpeg|png)$" ); REFRESH OBJECT TABLE ad_data_mining.camfront_objects;
打标结果落 DLF Paimon 湖表,供检索圈选与下游训练共享。
CREATE TABLE dlf_catalog_demo.`default`.camfront_ai_enriched ( id STRING, object_uri STRING, etag STRING, file_name STRING, caption STRING, -- 场景自然语言描述 metadata STRING, -- 结构化元数据 JSON(天气/光照/路况/目标物/风险) vector ARRAY<FLOAT>, -- 图像向量,2560 维 weather STRING, lighting STRING, road_type STRING, is_cloudy_candidate INT, is_daytime INT, is_nighttime INT, scene_type STRING, dataset_tag INT -- 检索圈选后回写:0 未选 / 1 阴天 / 2 阴天+行人 ) ENGINE = paimon PROPERTIES ("file.format"="parquet","primary-key"="id","merge-engine"="partial-update","bucket"="1");
第二步,一条 SQL 完成场景理解、结构化打标与向量化。
这是方案核心:无论输入是哪种路况,ai_complete 先把图像读成一句场景描述,再用带 JSON Schema 的 ai_complete 按同一份固定字段输出规范元数据(天气/光照/道路/目标物/风险,值域用枚举锁死),ai_embed_multimodal 生成图像向量。
LEFT ANTI JOIN 用 object_uri + etag 做增量,只处理新增/变更帧——去重在 AI 函数之前:
INSERT INTO dlf_catalog_demo.`default`.camfront_ai_enriched (id, object_uri, etag, file_name, caption, metadata, vector, weather, lighting, road_type, is_cloudy_candidate, is_daytime, is_nighttime, scene_type, dataset_tag) WITH enriched AS ( SELECT o.object_uri, o.etag, regexp_extract(o.object_uri, '.*/(.+)$', 1) AS file_name, -- 场景描述(自由文本,4 参数带 model) ai_complete('qwen3.6-plus', 'You are an autonomous driving data analysis assistant. Describe the road scene in 1-2 English sentences, highlighting weather, lighting, road type, key traffic participants and potential risks. Output only the descriptive text.', o.file, 'image') AS caption, -- 结构化元数据(4 参数带 schema:prompt, file, modality, PARSE_JSON —— 不带 model) ai_complete( 'You are an autonomous driving data analysis assistant. Output structured metadata.', o.file, 'image', PARSE_JSON('{"type":"object","required":["weather","lighting","road_type","objects","risks"],"properties":{"weather":{"type":"string","enum":["sunny","cloudy","rainy","snowy","foggy","other"]},"lighting":{"type":"string","enum":["daytime","nighttime","dusk","tunnel","other"]},"road_type":{"type":"string","enum":["urban","expressway","rural","intersection","ramp","parking_lot","other"]},"objects":{"type":"array","items":{"type":"string"}},"risks":{"type":"array","items":{"type":"string"}}},"additionalProperties":false}') ) AS metadata, ai_embed_multimodal(o.file, 'image') AS vector FROM `default_catalog`.`ad_data_mining`.`camfront_objects` o LEFT ANTI JOIN dlf_catalog_demo.`default`.camfront_ai_enriched e ON o.object_uri = e.object_uri AND o.etag = e.etag WHERE object_file_is_image(o.file) ) SELECT uuid(), object_uri, etag, file_name, caption, metadata, vector, get_json_string(metadata, '$.validated_result.weather') AS weather, get_json_string(metadata, '$.validated_result.lighting') AS lighting, get_json_string(metadata, '$.validated_result.road_type') AS road_type, IF(get_json_string(metadata, '$.validated_result.weather') = 'cloudy', 1, 0), IF(get_json_string(metadata, '$.validated_result.lighting') = 'daytime', 1, 0), IF(get_json_string(metadata, '$.validated_result.lighting') = 'nighttime',1, 0), concat_ws('_', get_json_string(metadata,'$.validated_result.lighting'), get_json_string(metadata,'$.validated_result.weather')), 0 FROM enriched;
带 Schema 的 ai_complete 返回 {is_valid, validated_result, validation_errors} 结构,字段值被强制约束到枚举、口径统一,这正是自由文本打标做不到的——不加 schema 时模型常夹带 markdown 围栏,导致字段解析失败。
第三步,数据质量巡检 + 混合检索圈选,标量过滤与向量相似度原生融合。
训练前先看标签分布是否均衡、有无长尾;再给一张困难样本做种子,在约束条件下找相似帧。
-- 训练集均衡性评估:各天气占比,判断是否需要定向采集 SELECT weather, COUNT(*) AS cnt, ROUND(COUNT(*) * 100.0 / SUM(COUNT(*)) OVER (), 1) AS pct FROM dlf_catalog_demo.`default`.camfront_ai_enriched GROUP BY weather ORDER BY cnt DESC; -- 混合检索:阴天 + 行人 高危 Corner Case(标量过滤 + 向量相似度 一条 SQL) WITH seed AS ( SELECT vector AS seed_vec FROM dlf_catalog_demo.`default`.camfront_ai_enriched WHERE is_cloudy_candidate = 1 ORDER BY id LIMIT 1 ) SELECT t.object_uri, t.caption, t.weather, t.road_type, json_query(t.metadata, '$.validated_result.objects') AS objects, cosine_similarity(t.vector, seed.seed_vec) AS similarity FROM dlf_catalog_demo.`default`.camfront_ai_enriched t CROSS JOIN seed WHERE t.weather = 'cloudy' AND t.metadata LIKE '%pedestrian%' AND cosine_similarity(t.vector, seed.seed_vec) > 0.8 ORDER BY similarity DESC;
"给一张阴天行人困难样本、把视觉相似的帧全捞出来",这种语义召回配合天气/目标物的精确过滤,一条 SQL 就完成,不需要独立向量库、不需要跨系统搬数据。
第四步,检索后打标,Partial Update 回写供下游训练取数。
把圈中的候选按策略打上 dataset_tag(阴天+行人→2、仅阴天→1、其余→0)写进中间表,预览确认无误后,用 Partial Update 只把标签回写源表,其他列不动。下游训练管线直接按标签取数:
-- 打标:阴天+行人(相似度>0.7)→2;仅阴天(相似度>0.4)→1;其余→0 CREATE TABLE dlf_catalog_demo.`default`.dataset_search_tags (id VARCHAR(65533), dataset_type INT); INSERT INTO dlf_catalog_demo.`default`.dataset_search_tags SELECT id, CASE WHEN id IN (SELECT t.id FROM dlf_catalog_demo.`default`.camfront_ai_enriched t, (SELECT vector AS v FROM dlf_catalog_demo.`default`.camfront_ai_enriched WHERE is_cloudy_candidate=1 ORDER BY id LIMIT 1) s WHERE t.weather='cloudy' AND t.metadata LIKE '%pedestrian%' AND cosine_similarity(t.vector,s.v)>0.7) THEN 2 WHEN id IN (SELECT t.id FROM dlf_catalog_demo.`default`.camfront_ai_enriched t, (SELECT vector AS v FROM dlf_catalog_demo.`default`.camfront_ai_enriched WHERE is_cloudy_candidate=1 ORDER BY id LIMIT 1) s WHERE t.weather='cloudy' AND cosine_similarity(t.vector,s.v)>0.4) THEN 1 ELSE 0 END FROM dlf_catalog_demo.`default`.camfront_ai_enriched; -- Partial Update 回写:只更新 dataset_tag,caption/metadata/vector 不动 INSERT INTO dlf_catalog_demo.`default`.camfront_ai_enriched SELECT t.id, t.object_uri, t.etag, t.file_name, t.caption, t.metadata, t.vector, t.weather, t.lighting, t.road_type, t.is_cloudy_candidate, t.is_daytime, t.is_nighttime, t.scene_type, COALESCE(s.dataset_type, t.dataset_tag) AS dataset_tag FROM dlf_catalog_demo.`default`.camfront_ai_enriched t LEFT JOIN dlf_catalog_demo.`default`.dataset_search_tags s ON t.id = s.id; -- 下游训练直接按标签取数 SELECT object_uri FROM dlf_catalog_demo.`default`.camfront_ai_enriched WHERE dataset_tag = 2;
需要提醒的成本细节:大模型按调用次数计费,去重必须发生在 AI 函数之前,用 Object Table 的 object_uri + etag 做增量水位——图像被重新上传后 etag 变化会自动触发重跑;
六、实施成效
方案上线后,最直接的变化是上亿帧"只能看不能算"的道路图像,第一次变成了一套字段固定、口径统一、可查询可聚合的结构化标签 + 向量。
归纳起来收益有四点。
挖掘效率上,"按场景找训练数据"从人工翻图变成一句 SQL,新场景、新长尾无需写规则,视觉大模型语义理解天然覆盖。
闭环速度上,理解、向量化、检索、打标回写收敛在同一引擎、同一套 SQL,数据不跨系统搬运,模型迭代的数据闭环显著提速。
数据链路上,图像原图与标签向量同库,检索圈选与训练取数不再割裂。
数据安全上,图像不导出到第三方,在库内完成加工分析,数据始终留在数据湖。
七、总结
通过 StarRocks AI Function,把视觉大模型能力以 SQL 函数的形式嵌入数据链路,构建了"图像挂载 → 场景理解 → 结构化打标 + 向量化 → 混合检索圈选 → 检索后打标 → 回写训练集"的全链路闭环。整个方案数据不出湖,推理即查询,用一份固定 schema 把杂乱图像收敛成一套可检索、可圈选的结构化资产,让原本依赖人工翻图的训练数据挖掘,变成了可复用、可编排的标准 SQL。
同一套 SQL 模板,还可以平移到多相机位场景检索、事件片段挖掘、数据集去重与均衡、仿真素材筛选等更多自动驾驶数据闭环场景。对于同样面临"海量非结构化图像、需要按语义挖掘、图片进标签出"需求的团队,StarRocks 提供了一条清晰的落地路径——会写 SQL,就能从上亿帧里精准挖出模型最需要的那一批。