作者:lincolnlin,腾讯WXG专家研究员
从一个query到结果,识物引擎是如何完成一次图像识别全过程呢?
首先我们会对query的图片做目标检测,去除背景干扰。
然后以图像主体进行检索,拿到图像召回的列表。
最后一步是进行信息提炼,得到商品的标题,品牌,主体,主图等。
从一个识别天地一号的例子来讲,可以看到从检测、图像召回、信息提炼后,我们得到了这是一个天地一号的苹果醋,再关联更多的搜索结果。
识物搜索的现状
商品识别
社群中经常会看到商家在推荐商品,我们直接通过搜一搜,可以快速了解商品信息,看看是否真是物有所值,价廉物美。
细分类识别
我们还支持动物识别、菜品识别、红酒识别、名画识别等细分类识别能力。菜品识别对一些正在减肥健身的人群,了解食品的热量是个强需求。长按识别菜品我们很快会支持查热量,我们支持常见的菜肴、水果蔬菜、包装食品等。
以图搜图的拓展
接下来介绍以图搜图的一些拓展能力:
搜索物料:通过识别logo+ocr的方法,可以实现内容提取并跳转的能力。
以图搜图的系统实现
前面是一些产品介绍,接下来我详细聊一下以图搜图的系统实现,核心讲三个东西:分类、检测、检索。
分类篇|图片内容标签体系
分类篇|多标签分类
分类篇|细分类的应用
前面提到的图像标签,是一个粗分类的方法。我们只需要知道是一只狗,但不需要知道是蛤蟆狗,还是哈士奇。要真的能见微知著,通过一些细节来分辨物体具体的款式,这也是计算机视觉擅长的领域。实现细分类,总的来说,我们有两种做法。
电商场景:我们要识别的集合是无限大的,而且还是动态的。所以我们是通过动态图像召回。从召回的结果上推断出商品的具体款式。
动植物汽车这种场景:集合是相对固定的。而且需要一些专业的数据库。我们采用分类+检索的方法,在具体的处理逻辑上,也依据具体的场景不同而不同。目前我们支持了动物/植物/菜品/地标/汽车/名画/红酒识别。
检测篇|移动端主体检测
我们基于centernet的方法,并基于移动端的场景进行专项优化,如大感受野、轻检测头、改进可形变卷积在移动端的实现等。最终我们的方法与主流方法在ms-coco上对比,在MAP相当的情况下,参数量只有1M,大大降低。在iphone下测试,每帧只需25ms.。从上图可以看出,扫描模型改进版,有效提高了扫描速度,节省3倍流量。
检测篇|服务端物品检测
移动端是objness的无类别主体检测,服务端则更倾向于class-wise的目标检测。我们既要支持商品类目,又需同时识别出各种自然场景。故我们基于maskrcnn的训练框架,改进RetinaNet成为双流的RetinaNet,一条流用于商品的精确位置和类别输出,一条流只用于分类自然场景图片,以便快速拓展更新模型。
检测篇|目标检测的应用
目标检测算法对于Query理解,去除背景干扰,理解多主体,还有压缩源数据的基础算法能力。
在我们离线构建检索库的过程中,检测器会检出非常多的目标,这里会包含很多的噪声目标,如图中还会检出鞋子、上衣等。我们最后会根据标题NER后的主体,还有所有bbox之的聚类结果,来决定商品最后的bbox是哪些。
以图搜图本质上是寻找度量图像之间距离的方法,这个距离的表示有很多维度。
所以这里的核心工作之一,就是寻找一个强大的特征表达,可以跨越不同视角,不同装扮下的gap,让我们探寻事物的本质,更靠近任务的目标。一开始在重复图任务上,我们还会使用ORB,SIFT,SURF这些局部特征,再使用像BOW、VLAD、FisherVector这些方法,把多个局部特征聚合成一个统一维度的向量表示,以利于检索的工程化。但当我们积累了足够多的同款数据后,CNN的方法在平面图上的表达能力,也已远超传统的图像方法。
关于CNN特征学习的探索,在一文中已有全面的论述。我们的另一块核心工作,是解决大规模数据下带来的挑战。
检索篇|大规模检索系统之分库实现
检索篇|识物引擎系统框架
检索篇|识物引擎之分库路由
2.路由:那么当一个query到来时候,我们去检测哪个库呢?这就涉及到路由的逻辑。
前面提到服务端的检测是带有类别的,比如图中输出鞋子,那么我们就走鞋子的专用检索模型提取特征,再到鞋子库中检索。这是最朴素的版本。然而现实场景中的真实的数据分布往往是离散,且存在较大交叉边界的,这会导致以下问题。
检索的开集问题,比如未出现过的子类容易分错;
类间混淆性,从视觉上存在歧义。
检索篇|识物引擎之类目预测
基于我们前面提到的数据分布,我们首先从分类好的商品库中,采样出图片进行聚类,通过聚类堆中包含商品类目的多少,把所有的堆分成cleancluster和dirtyclean。如上图所示,cleancluster代表商品图是容易从视觉上分类的,都是鼠标。而dirtyclean则代表不容易视觉区分,都是一些相似的瓶瓶罐罐。相应的,clean的图一般只需检索1-2个类目库,而dirty的图需要检索4-5个类目库。简单讲,我们实现了一个动态topk检索的优化。从最终优化效果看,在平均检索次数更低的情况下,实现了更高的类别准确率。
检索篇|通用以图搜图之无监督的分库
上面提到的是识物的检索方案实现,回到通用的以图搜图场景,我们无法简单的把图片定义成N个库出来,所以我们用了无监督的分库方法。
1.分库:基于moco这种无监督的对比学习方法,得到图片一个向量表示。再通过聚类的方法产生伪标签,如下面的16个标签。可以看出,相同topic的图片,会被尽量分到同一个库中。
检索篇|图搜流程框架
2.路由:在离线流程中,我们把所有的图片通过上述的分库方法,分成了16个库。在线检索的时候,路由层会预测query图的标签,只走top3的分库。最后通过一个统一多库精排模型,把召回结果融合到一起。