得物技术基于自注意机制的图像识别算法

2021年11月21日 阅读数:13
这篇文章主要向大家介绍得物技术基于自注意机制的图像识别算法,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

背景

对于作 CV 同窗的人来讲,图像识别是入门中最简单的模型,也是最最基础的模型。在不一样的 CV 任务重,即便发展多年,都一直保留着利用训练好的图像识别任务重的模型权重,做为 backbone 用于加速训练收敛的做用。可是面对一些图像识别的任务,咱们如何根据业务需求去改造一个已经比较完备的识别任务,仍是蛮有意思的一个话题。算法

业务需求

可以筛选出用户上传的球鞋图片中带有干净统一背景的图片,咱们暂且就叫这个项目为 背景复杂度检测 任务。帮助后续估价以及出售环节算法下降难度,以及维持整个 app 图像质量在一个水平线上。网络

项目要求

  1. 可以在测试集的准确率达到 80% 以上,能够用于给予用户提示,可是并不强制;而达到 90% 以上,能够强制用户按照要求达到上传图片质量的要求。
  2. 可以实现端侧应用。

模型设计

mobilenet backbone + FPN + modified SAMapp

最终作出来的模型各个模块分解来看其实很简单,没有什么特别难懂的地方。ide

总体须要努力的方向无外乎如下几点:工具

  1. 分析业务特色,这是一个典型的空间型识别任务,便是经过图像的某部分或者某几部分区域的内容完成目的。对于 背景复杂度 咱们要刨去主体以外的部分,判断剩余部分是不是“复杂的”,便可,因此想到能够用空间系列的注意力机制。
  2. 咱们不可能对于用户严格控制拍照中的主体占据图片中比例的大小。有些用户习惯将主体占满屏,有些用户喜欢留白多一些。对于不一样的尺度,若是想作到精细分类,是须要在较高分辨率下的 feature map 作文章,因此这里用 FPN。
  3. 为了可以在端侧实现应用,选用 mobilenet 系列是很自然的想法。

以上几点的设计思路其实就是彻底围绕当前 业务场景 而去作出的设计。学习

最终在测试集上,利用设计好的 CNN 模型达到了 96% 的正确率。能够做为强制用户上传高品质图片质量的依据。测试

若是想了解(白嫖)这个项目所用模型,其实分享到这就能够达到目标了。每个模块的设计,其实都不难,没有新的概念。代码也很简明,实现也很方便。优化

但项目自己最有趣的其实是实现整个项目的思想,为何最后选用这样的模型,中间其余的思路是如何被排除,如何试错的!!!idea

项目过程

传统 CV

项目须要在端侧实现,虽然没有明确手机实时性的要求,可是须要整个算法文件,所引用的 库 占据内存足够的小。第一可以想到的就是若是不用深度网络,这个问题是否可以解决。spa

错误的思路

分析 背景复杂度,我曾想到用

  1. 对于和整个业务无关可是又严重影响结果的主体内容,用一个固定大小的高斯核进行过滤,而后进行其余处理。
  2. 利用边缘检测、梯度信息分析一张图片的背景复杂度
  3. 傅里叶频率信息分析图片的高低频信息来判断:高频表明背景信息多,较为复杂;低频表明干净。
  4. 经过多张背景干净的图片作简单像素加权平均当作模板,而后利用异常检测的方法,筛选出背景复杂的图片。

以上都是在项目初期,我能想到的一些简单的 idea。可是观察图片样本后,这些想法,除去第一条的思路是对的(空间维度的信息),其余三条的思路都是错的。举个例子,一双鞋放在地毯上,地毯自己是干净的,图片也除去主体和地毯没有其余任何物体。可是地毯有本身的纹路,高频信息不少,梯度信息不少。按照上述 idea 二、三、4 条的原则,这样的背景属于复杂度很高的背景。可是实际上,在样本中,这样的背景算是干净的。

经过分析数据的样本以及反思业务逻辑得出如下结论:

  1. 背景复杂度概念不是针对不一样图片之间背景的差别。
  2. 背景复杂度的概念是针对每张图片自身是否出现了不一样的背景和不是主体的一些前景物体。

那么,总体的思路就要作出一些改变,就是要经过 自类似度 的方式来判断背景复杂度。这也是对于业务愈来愈熟悉以后作出策略上的调整。

模板匹配

那么须要用到哪些部分能够用于自类似度的判断呢?

  1. 四个角

上面说过,错误的 idea 中,有一个思路是对的,就是要利用空间维度去思考业务,去掉主体信息思路是对的。即咱们在判断背景自类似度的状况,是须要避免划到主体信息的。根据这个思路,咱们可根据经验,4 个角能够在必定程度上能够表明一张图的背景信息。若是 4 个角上的内容类似,能够解决大部分业务的目标。利用 4 个角的信息计算两两自类似度,有 6 个值。6 个值越高,说明 4 个角的类似度越高,是干净背景的几率也就越大。

  1. 两个角

经过观察实际的 业务 样本后发现,用户拍照的习惯每每是上面的留白会比下面的多。也就是说,下方的 2 个角常常会含有主体信息。因此最终确认的方案就是只利用 上方的 2 个角进行类似度匹配。

  1. 还没完

可是,只利用 2 个角的类似度匹配只有 1 个值的输出,那这样的值对于整个业务来讲,太不稳定了,存在很大的风险。因而我分别利用上方两个角本身做为模板,而后分别去作滑窗作匹配,记录大于必定阈值的个数,做为一个类似度评价的一个指标。因此,最终有 3 个指标来衡量一张图背景的类似度状况。一个是上方两个角彼此的类似度值。另外两个是每个角,独自做为模板,与整幅图上其余空间上内容可以匹配的个数。根据预设定好的权重,进行加权,最终获得一个分数。这个分数用来判断最后这幅图是不是背景复杂。

最终,经过这种方法,输入图片进行统一的 resize,保持图像在必定大小,让模板匹配速度控制在合理的范围内,根据以上的作法,在测试机就能够达到 80% 的正确率。这个算法能够在产品端做为引导晕乎拍照的工具。当算法判断为复杂背景时,给予提示但愿用户从新拍照。

CNN

以上传统 CV 没有听懂,没有关系。它只是叙述下整个项目利用业务分析,获得一些宝贵思路的过程。下面的方式才是此文章的重点。

baseline

为了项目快速迭代优化,选用识别的思路作这个项目。也就是很普通的图像识别任务。因为但愿可以放在手机里的模型,本身可以想到也比较熟悉的是 mobilenet v1。

优化模型

目标检测

在文章开始的时候,我提到过,这是一个标准的空间行识别问题。对于这样的识别问题,我一般的作法就是利用 检测模型 解决识别任务。

这种思路很常见。好比在社区中,咱们想识别一个图文帖子中,图中达人他的穿搭是什么样的,有没有背什么牌子的包包,穿了什么品牌的鞋。不考虑实际算法难度,端对端的思路就是一个识别问题。输入一张图,输出几个标签。可是实际上,直接利用识别模型是很难的,由于有不少冗余背景的信息。咱们面对这样的问题仍是须要利用检测模型去作。最后只是不须要输出 bounding box 就好,可能还须要作一些去重的策略上的工做。

回到本业务,有一点不一样的是,咱们最终关心的区域偏偏是去除主体的区域。在 传统 CV 中有一个思路就是用一个固定大小的高斯核去作这样相似的事情。可是偏偏是由于这一点,咱们不能像上文社区那样的例子利用一个目标检测模型加上一些策略就直接拿到输出。

首先须要一个目标检测模型拿到主体。而后用 mask 过滤的方案,接上传统 CV 算法也好,CNN 的 baseline 也罢,就能够获得最终的答案。

利用目标检测的方法,是能够很明晰地解决这样的一个业务问题,也是最直观的选择。

隐性目标检测

目标检测的方法虽然直观,可是存在两个巨大的缺陷:

  1. 不可以端对端,至少须要两个步骤,或者两个模型,对于速度,和内存空间来讲都是一个负担。
  2. 目标检测须要标签的成本也比识别的成本大的多。

那么,是否咱们能够优化掉上述的这两个缺陷呢?答案是确定的。

咱们能够像目标检测的步骤那样,在中间的模型的过程当中,预测一个区域,就是一个 bounding box。输出也就是 4 个维度。一般是能够输出 左上角、右下角;左上角、宽高;或者中心坐标、宽高。而后利用原图像和这 4 个维度的结果作一个 mask 过滤,过滤掉主体,再进行下一步的识别做用。

这样作的好处就能够避免直接用 目标检测 任务全部的缺陷。他把上一种方案分步作合并成一个模型。中间标签也是本身学出来的而不是人工标出来的,省去不少训练以前的准备工做时间。

其实著名的 拍立淘 的图搜算法就是利用了这样的思路进行图搜识别的。通常的图搜也是分为 目标检测 + 识别的方法,可是 拍立淘的方案利用上述这种方法去除了目标检测的前置任务。

隐性分割

既然目标检测能够,那么其实语义分割,或者实例分割也能够作这样的内容。咱们看看隐性目标检测也有这个他的局限性:

  1. 因为 bounding box 自己的问题,他依然囊括了一些或者去除了一些必要信息。
  2. 对于多个物体的话,这种方式就很不灵活。(固然这个问题不是不能够解决。也能够用到目标检测设计一些卷积获得 feature map 的方式解决多目标检测的问题,可是那样参数量也会上升。)

一样,咱们利用典型的分割思路,在 mask 生成的阶段,抛弃 bounding box 这种规整的形状,去省城一个物体的外轮廓边界。这个边界一样也是隐性的,是不须要人工标注的,而后用输入图像去过滤这个mask。

空间注意力机制

隐性分割当然颇有道理,可是实际上参数量会上升,计算量会加大。其实不管是目标检测仍是分割的方法,其实从广义上讲就是一个空间注意力强监督。也就是咱们人为划定好的空间注意力机制。可是仍是那个问题,咱们最终的目标不是学习 bounding box 的坐标,不是学习到背景的外轮廓信息 mask 有多么精确。这些中间结果对于最终目标不是很关键。或者说,模型能够学习到本身的一套关注的区域就能够了,不须要可解释性很强的区域也是能够的。那么对于这样的场景,咱们没有必要在分割模型上作到最上层,也就是分辨率最高那层的 mask。只要作到中间层效果就已经出来了,无需浪费更多的参数量。

对于“U”型的图像分割模型,咱们只需作到“J”型就够了。“J”型结构就是标准的 backbone + FPN。FPN 即保留了必定高分辨率的信息,又结合了底层上来的语义信息,是一个完美的“融合体”。在这一层再作一个 mask 就至关因而在这一层作了语义分割。其实这就是属于空间注意力机制。

空间 + channel 注意力机制

既然有了空间注意力,来都来了,咱们也能够加上 channel 维度的注意力机制。咱们耳熟能详的 attention 模块像 SE 属于 channel 维度的。BAM/CBAM 是空间维度 + channel 维度都有的注意力机制。可是他是分开作的。不管是串行仍是并行,都是分为两个模块作。这个项目中利用 YOLOV4 中改写的 Modified SAM 模块,一步合成了 空间 + channel 的权重。简单而又便于理解。可是 channel 维度,确实就是个“顺便”,在此业务中,我以为加不加均可以。

咱们看一下中间的 grad CAM 结果

结果对比

经过与没有加入上述 attention 模块以及 FPN 的模型对比改进以后的模型。原有模型在验证集上的正确率为 93%,改进后的模型在 96%。但更重要的是,改进后的模型在可解释性上有明显的加强。当可解释性加强以后,才会有明确的优化方向的可能性。

总结

以上就是对于如何在图像识别中作出创新的一种思路。可是创新的目的不是为了创新,整个项目下来最重要的核心就是为了 解决业务问题

文/诗诗

关注得物技术,作最潮技术人!