行业:
互联网、新零售、交通、智能楼宇、教育、游戏、医疗、社交、公安、机场等.
应用场景:
人脸识别, 人脸支付, 刷脸打卡, 图像识别等
例如,
- 智能楼宇, 根据人脸识别到是本大楼的员工时, 自动进行打卡, 自动按工作楼层设定电梯.
- 智能酒店, 根据人脸识别, 自动入住, 根据会员等级自动对接专属服务等等.
- 电商, 图像识别, 搜索类似商品.
- 教育, 根据人脸特征, 记录学生的听课状态(打盹, 走神, 小动作, 举手等)
- 交通, 违规时自动识别驾驶员.
- 新零售, 根据人脸识别对应后台的会员系统, 做到: 到店提醒, 导购引导, 定制化运营等.
- 公共交通, 刷脸支付.
- 游戏, 虚拟现实相关游戏.
场景挑战与痛点:
业务特点:
- 1、需要高效率、高精度的以图搜图
- 2、业务不仅有图像搜索的需求, 同时还有其他条件的过滤需求
业务挑战与痛点:
- 1、通用关系数据库例如MySQL不支持向量检索, 需要遍历查询并全部返回到应用端进行计算, 性能差, 并且需要耗费大量网络带宽.
- 2、即使关系数据库支持了向量检索的操作符, 但是并不支持向量索引, 所以依然需要遍历计算, 性能差, 无法支撑高并发查询.
- 3、当图像向量计算上移到应用层实现时, 需要从数据库加载所有数据, 加载速度慢, 而且图像更新后无法实时加载, 效率低
- 4、当图像向量计算上移到应用层实现时, 无法支撑图像识别以及其他属性检索的联合过滤, 效率低下.
技术方案:
方案1
- 数据库仅存储图像向量, 不进行向量计算
- 图像向量计算上移到应用层实现
缺陷:
- 普通数据库不支持向量索引, 无法在数据库中完成向量过滤
- 应用需要从数据库加载所有数据, 加载速度慢, 而且图像更新后无法被应用实时加载, 效率低.
- 无法在数据库中实现图像识别条件筛选+其他属性的条件筛选的联合过滤, 需要在业务层过滤图像条件, 网络传输的记录多, 效率低, 无法支持高并发场景
方案2
- 使用RDS PG存储图像向量特征值
- 在RDS PG的pase插件, 创建图像特征向量的向量索引
- 应用输入特征向量, 在数据库中通过向量索引, 快速搜索到与之相似的图像, 支持返回向量距离, 以及按向量距离进行排序
- 当有多个过滤条件时, 数据库可以使用多个索引对多个条件进行合并过滤
优势:
- RDS PG数据库支持向量索引, 图像搜索可以直接在数据库中高效率过滤, 应用与数据库之间
- RDS PG支持索引合并过滤, 可以同时过滤图像条件、其他属性条件, 通过索引可以最大化收敛条件结果集, 大幅度提升性能, 降低传输量. 单次查询可以毫秒级完成.
- 通过RDS PG只读实例, 可以再次提高整体查询吞吐.
注意:
- 本方案为数据库向量搜索加速方案, 并未涉及图像特征值提取(图像转换为高维向量)的部分, 图像特征值提取可以在应用层完成.
目前阿里云RDS PG pase插件支持两种业界流行的向量索引算法ivfflat和hnsw, 未来将持续集成业界优秀的向量索引算法.
ivfflat算法
hnsw算法
详细使用方法请参考阿里云RDS PG官方手册pase插件说明文档.
(https://help.aliyun.com/document_detail/147837.html)
RDS PG方案价值:
1、RDS PG支持了高维向量索引检索功能(pase插件), 可以非常高效率的实现图像向量的相似匹配搜索, 单次请求仅需毫秒级.
2、高维向量检索不仅能应用在图像搜索, 同时还能应用在任意可以数字化的特征搜索, 例如用户画像特征搜索, 营销系统中的相似人群扩选等场景.
3、RDS PG支持索引合并搜索, 从而在数据库中可以一次性完成向量搜索、普通查询条件过滤的联合过滤, 大幅度提升性能.
使用RDS PG数据库, 满足了在互联网、新零售、交通、智能楼宇、教育、游戏、医疗、社交、公安、机场等行业中的人脸识别、图像搜索、营销系统的相似人群扩选等高并发需求.
对比MySQL的通用方案, RDS PG 的pase向量索引插件加速方案优势非常明显, 是一个低成本, 高效率的人脸识别、图像搜索、相似人群扩选解决方案.
- 平均性能提升 2457900%, 达到毫秒级响应.
以上数据来自4核8G RDS数据库实例, 100万图片的实操对比数据.
目前支持该功能的RDS PG版本:
- RDS PG V11
- 未来将在V10以上的所有版本支持.
本功能产品手册:
https://help.aliyun.com/document_detail/147837.html
客户案例:
蚂蚁金服
DEMO介绍:
通用操作
1、购买RDS PG 11
2、配置白名单
3、创建用户
4、创建数据库
方案 DEMO
方案1 demo
1、创建测试表
create table if not exists t_vec_80(
id serial PRIMARY KEY, -- 主键
c1 int, -- 其他属性字段
c2 int,
c3 text,
c4 timestamp,
vec float4[] -- 图像特征值向量
);
2、创建生成随机向量的函数(用于模拟图像特征值, 实际场景请使用实际图片特征值存入)
create or replace function gen_float4_arr(int,int) returns float4[] as $$
select array_agg(trunc(random()*$1)::float4) from generate_series(1,$2);
$$ language sql strict volatile;
3、写入100万随机向量
insert into t_vec_80 (c1,c2,c3,c4,vec)
select random()*100, random()*100000, md5(random()::text), clock_timestamp(),
gen_float4_arr(10000, 80)
from generate_series(1,1000000);
结果样例:
select * from t_vec_80 limit 3;
-[ RECORD 1 ]------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
id | 1
c1 | 99
c2 | 7428
c3 | 9b74e40ab38ed4f41b5d50b8eedf8b72
c4 | 2020-02-27 15:36:56.895773
vec | {6469,3787,5852,1642,2798,7728,1527,6990,7399,3460,7802,7682,8102,6499,3428,7687,567,8894,8144,1685,6139,9549,3613,1714,721,9099,4218,1930,9031,4961,3966,5501,8748,9818,7143,1546,7547,8671,8536,4946,2132,6338,2629,234,2838,6057,7922,3405,4951,6066,5091,1091,5615,8704,2805,6336,7804,7024,8266,6836,1985,2233,2337,733,2051,9481,2280,9598,8152,816,4545,285,7155,7174,519,9993,3232,8441,3399,8183}
-[ RECORD 2 ]------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
id | 2
c1 | 45
c2 | 84908
c3 | a48d421b772486121ef520eb3e285f95
c4 | 2020-02-27 15:36:56.896329
vec | {123,7195,2080,6460,5000,9104,4727,1836,1089,6960,4174,1823,9012,3656,4103,8611,1808,4920,3157,2094,2076,332,2613,2070,3564,1055,5469,1748,5563,3960,1023,5686,1156,3103,2147,6156,2208,6874,7993,3298,3834,2167,5121,2847,5823,9225,1458,7632,4145,4615,9726,6222,4947,2340,8292,8511,3395,3762,259,8958,7722,1282,4644,8878,4386,6792,5035,6594,3666,3028,9892,7501,5196,5014,348,1019,4239,1806,8652,8384}
-[ RECORD 3 ]-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------