
系统框架

整个系统分为离线和在线两个部分。
离线部分是图片入库的流程。在数据流程中,符合要求的商品图和街拍图在经过服装检测、特征提取模型后得到 512 维的特征向量;将该特征向量加入到向量数据库,建立搜索索引。
在线部分是图片搜索的过程。查询图片同样经过服装检测、特征提取后得到特征向量。基于该特征向量,使用向量数据库 Milvus 搜索得到 TopK 个相似向量以及相对应的图片 ID。最后经过后处理(筛选、重排序等)后得到与查询图片的服装相似的图片集合。
实现
基于系统框架,Stylepedia 的功能实现分为四个模块,分别是服装检测、特征提取、相似向量搜索、后处理。
服装检测
服装检测模块使用 YOLOv5 作为目标检测模型,识别图片中的服饰单品,并将其切割(crop)出来作为特征提取模型的输入。YOLOv5 是一个一段式(one-stage)、人为设定框(anchor-based)的目标检测框架, 检测性能较好。由于检测目标较大,此处选择了深度最小、特征图宽度最小的 YOLOv5s 网络。另外,我们将所有服装分为六大类(上衣、外套、裤子、半身裙、连衣裙、连体衣),检测模型也会输出分类的预测结果, 用于后续处理。
特征提取
特征提取模型是相似性检索的关键。模型的输入是以某件单品为主体的图片,经过转化后输出 512 维的浮点向量,作为该单品的特征。我们采用基于度量学习的方法,以 EfficientNet 为骨干网络。
度量学习的对象是样本特征向量之间的距离,其目的是通过训练和学习减小同类样本之间的距离,同时增大不同类别样本之间的距离。在本文所描述的场景下,同类样本即同一件单品。
EfficientNet 同时兼顾速度和精度,有助于探索网络深度、网络宽度和图像分辨率的最优组合。我们选取其中的 EfficientNet-B4 作为特征提取网络,其最后一层全连接层的输出便是我们需要的图片特征。
相似向量搜索
我们采用 Milvus 作为大规模相似向量搜索引擎。Milvus 是一款开源的向量数据库,支持针对 TB 级向量的增删改操作和近实时查询,具有高度灵活、稳定可靠以及快速查询等特点。它集成了 Faiss、NMSLIB、Annoy 等广泛应用的向量索引库,提供了一整套简单直观的 API,可以针对不同场景选择不同的索引类型。
基于业务场景和数据规模的需求, 我们使用的是 CPU 版 Milvus,搭配 HNSW 索引。系统内有商品和街拍两个索引库(集合),服务于不同业务需求,每个索引库又基于检测分类结果分为六个分区来缩小搜索范围。Milvus 在千万级数据上的向量搜索时间以毫秒计算,在开发成本低、资源占用少的前提条件下实现最优性能。
后处理
为了提高召回图片和搜索目标图片的相似度,我们结合业务场景在召回的街拍图片集合增加了颜色特征过滤和主要标签(袖长、衣长、衣领等)过滤,筛选掉不符合要求的图片。
此外, 我们还利用图片质量评估算法对街拍图重新排序, 让用户优先看到质量更高的图片。
应用
用户拍照搜索
用户可以将自己的衣服拍照上传到虚拟衣柜,并基于上传的图片找到商品库中与之最相似的同类商品图。

搭配建议
通过商品图和街拍图之间的相似搜索,可以找到含有特定单品的所有街拍图。然后通过与之搭配的另一件单品的聚类,形成对用户有价值的搭配建议。如下图所示,一件黑夹克可以和很多单品搭配,其中一种是黑色牛仔裤。

搭配组合示例

搭配效果展示

虚拟衣柜示例

街拍推荐
参考资料:

Github @Milvus-io|CSDN @Zilliz Planet|Bilibili @Zilliz-Planet



