背景
图像识别,是指利用计算机对图像进行处理、分析和理解,以识别各种不同模式的目标和对象的技术。图片识别功能基于图片AI技术,能够检测图片标签和置信度。 当前图片识别分析出的数据越来越丰富,随着实体信息(含原始数据及处理后的结构化元数据信息)的不断膨胀也带来了更多挑战。首先,如何弹性存储无限增长的海量数据并保证数据不丢不错。其次,信息存储后如何进行后续数据管控分析,如何从多个维度对外提供服务。这些对于系统的存储和使用都提出了越来越高的要求。
需求场景
图像识别有着非常丰富的使用场景,图像识别出的元素信息保存后,可以在后续服务提供图片中物品、环境信息等搜索功能。
在自动驾驶场景中,汽车通过摄像头雷达等识别周围环境中的实体信息,通过将识别出的实体信息及后期人工标注的信息存储后,基于大规模数据模型训练可以进一步提升汽车的自动驾驶能力。
方案
图像识别涉及图像的内容分析、原始数据与元数据存储以及后续不同场景的使用,随着图像原数据的不断增大,图像识别的元信息也会不断膨胀,针对于此也有多种数据存储方案。
对于图像原始数据存储后解析出的结构化实体信息当前常见的便是将数据存储到MySQL中,但存储在MySQL天然存在诸多问题。首先,MySQL提供了丰富的数据检索功能,但在图像识别场景下需要的大量文本检索、组合查询、子文档查询等能力略显不足。其次,当数据量达到当前 MySQL 集群瓶颈,集群扩容会有一定难度,需要更大的集群以及大量数据的迁移工作,MySQL扩容也是个负担。
对于图像识别后的结构化实体信息另一个常用的存储便是MongoDB,MongoDB是一款面向文档的NoSQL数据库,具有模型简单上手快的优势,但MongoDB在检索方面能力略显不足以及在后续规模扩展方面存在问题。。
我们重新梳理下在大规模图像识别场景下我们到底是需要什么样的实体存储方案?
-
原始数据及元信息的存储可以应对不断增长的大规模数据场景
-
能提供满足业务场景的丰富检索能力
-
释放运维能力,提供serverless能力
OSS + Tablestore方案便可以很好的满足以上所有要求(表格存储 Tablestore是阿里云上售卖的一款自研的多模型结构化Serverless 数据库产品,提供海量结构化数据存储以及快速的查询和分析服务。Tablestore 的多元索引,底层使用自研索引引擎,可以支持多种复杂查询功能。阿里云对象存储OSS是一款海量、安全、低成本、高可靠的云存储服务),整体架构如下:
终端采集的原始数据存储到OSS,图像处理可以通过图像识别、人工标注等多种方式进行进行实体信息的抽取,并将最终的实体元信息保存到Tablestore中。Tablestore实现非常丰富的高性能数据访问、聚合查询等功能(比如毫米级检索含有汽车的所有图片),从而可以在多个领域对外提供多种多样的智能化服务。同时Tablestore 提供了SQL查询能力以及通道服务,基于SQL查询能力用户可以直接通过SQL语句便可完成数据查询及分析,基于Tablestore 的通道服务可以对接 Spark streaming 或 Flink实现实时数据处理,可以对接OSS等存储服务实现数据的转存及离线分析。
OSS + Tablestore 存储方案已经在阿里云智能媒体管理(IMM)得到验证,在支撑海量数据存储情况下同时满足了多种业务场景。
图像元数据管理示例
这里以场景及人脸相关图片为例,图像元信息定义如下:
创建表及多元索引
进入Tablestore控制台首页。选择Tablestore 实例后进入实例管理,选择创建数据表,Tablestore数据表是schema free的,添加完基础列后,后期可以根据需求动态追加列。
点击索引管理后选择创建多元索引,对于嵌套数据字段类型可以选择嵌套文档,并输入对应字段信息
数据写入&索引同步
Tablestore数据表的数据写入可以在控制台操作,也可以基于Tablestore SDK进行操作,当前提供Java、Go、Python等多种语言SDK。
多元索引创建后,会自动同步数据,同步过程中,同步状态显示为存量;数据同步结束后,同步状态显示为增量。此时可以在行数统计处看到记录总数。
数据检索
Tablestore数据表结合多元索引,可以实现非常丰富的查询能力,可以支持主键列查询、非主键列查询、全文检索、前缀查询、模糊查询、多字段自由组合查询、嵌套查询、地理位置查询和统计聚合(max、min、count、sum、avg、distinct_count、group_by)等,具体可参考多元索引基础功能。
在图像元数据管理示例中如果我们想搜索表情为HAPPY的图片元信息,那么可以在控制台执行查询操作:
返回数据:
也可以通过SDK实现查询:
// 搜索表情为HAPPY的图片元信息
public void testFaceEmotionQuery() {
SyncClient syncClient = new SyncClient(conf.getEndpoint(), conf.getAccessId(),
conf.getAccessKey(),
conf.getInstanceName());
SearchQuery searchQuery = new SearchQuery();
NestedQuery nestedQuery = new NestedQuery();
nestedQuery.setPath("Faces");
TermQuery termQuery = new TermQuery();
termQuery.setFieldName("Faces.Emotion");
termQuery.setTerm(ColumnValue.fromString("HAPPY"));
nestedQuery.setQuery(termQuery);
nestedQuery.setScoreMode(ScoreMode.None);
searchQuery.setQuery(nestedQuery);
searchQuery.setGetTotalCount(false);
SearchRequest searchRequest = new SearchRequest(tableName, indexName, searchQuery);
SearchRequest.ColumnsToGet columnsToGet = new SearchRequest.ColumnsToGet();
columnsToGet.setReturnAllFromIndex(true);
searchRequest.setColumnsToGet(columnsToGet);
// 进行搜索
SearchResponse response = syncClient.search(searchRequest);
// 解析数据,获取文件名
if (response != null && response.getRows().size() > 0) {
List<Row> item = response.getRows();
for (Row r : item) {
System.out.println(r.getColumn("FileName"));
}
}
}
总结
本文简要介绍了大规模图像识别场景中的实体管理方案。基于OSS + Tablestore方案可以支持大数据存储、高性能数据检索、实时与离线数据分析,且部署简单、运维成本低,可以有效应对图像识别场景下的多种需求。
如果希望继续交流,可以加入我们的开发者技术交流群,可在钉钉搜索群号『11789671』或『23307953』。