
LOGO作为公司或品牌的代表性标志,具有较强的识别和推广作用。本文将介绍微信扫一扫及长按识图中LOGO检测及识别的相关技术。
扫一扫识物和长按识图上线以来,可识别的类目已经从商品扩充到了包含植物、动物、地标、菜品、汽车、名画等的各个垂类。随着用户量的上升,对于LOGO检测和识别的需求愈发强烈,LOGO作为品牌的标识,可以让用户快速认识和了解品牌,同时也能更快地接入商家的服务,进入到商家的公众号及小程序。
针对LOGO识别,最直接的解决思路就是检测到query图中的logo区域进行分类,或者采用检索的方式从gallery里面找到距离最近的图片,同时需要限制这个距离剔除库中不存在此LOGO的情况。但在实现过程中,我们发现LOGO识别主要存在以下难点:
针对以上难点,我们在设计LOGO识别方案时,为了更加灵活的迭代算法,采用了检索的方式。同时,由于视觉检索模型对于文本的特征表达能力不足,为了兼顾了文本和图案类型的LOGO,我们还引入了OCR模块来进行二次验证,最终得到了如下图所示的整体解决方案。
如上图所示,首先进行LOGO检测获取目标区域,再对目标进行检索找到top1检索距离小于一定阈值的结果作为预识别结果,根据预识别结果判断是否为文本,如果为文本则进行OCR识别后做二次验证,计算文本相似度,满足一定阈值条件才输出结果,如果不是文本则在直接输出结果。
在进行LOGO识别前,首先需要解决的问题是在图像中检测到LOGO,我们起初尝试复用多源异构数据的检测器进行LOGO分支的开发,但实现中发现LOGO数据会与历史遗留的大部分商品数据的存在重叠,异构模式下两个冲突的分支对主干backbone会产生影响,由于LOGO广泛存在于商品中,且大部分LOGO为较小的目标。
为了更好地检测LOGO且不对主干商品和垂类检测产生影响,我们构造了一个独立于商品检测器的双流retinanet LOGO检测器。我们将数据分为两类,一类是具有表观一致性的LOGO数据,另一类是无表观一致性的数据利用全图框来表征(如大量的背景图及噪声类),两组数据独立交替更新参数共享的检测网络。最后引入全图分类模块和梯度裁剪策略,加快模型收敛防止梯度爆炸。部署阶段我们采用TensorRT int8量化模型来进行优化提速。
此外,为了解决长按识图场景下对于部分商家图片的LOGO大多是拼接在图片角落的方式,或者以水印方式贴上的LOGO,我们引入了一个在线LOGO拼接的数据增强方式。对于标注好的真实样本,将LOGO的patch作为增强样本,随机padding到原图无LOGO处。在合成过程中,我们主要采用了以下两种方式来随机合成:
mixup是对图像进行混类增强的算法,可以将不同类之间的图像进行混合,从而扩充训练数据集。
mixed_imgx=∗imgx+(1−)∗logo_patch
直接对目标区域位置进行图像替换,类似构建水印的方式直接合成。
具体实现中也会采用两种方式来选取合成区域,一种是将图像划分为特定子区域,在无LOGO区域内采用上述方式合成,另一种是采用特定角落区域合成LOGO。