乐趣区

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

背景

对于做 CV 同学的人来说,图像识别是入门中最简略的模型,也是最最根底的模型。在不同的 CV 工作重,即便倒退多年,都始终保留着利用训练好的图像识别工作重的模型权重,作为 backbone 用于减速训练收敛的作用。然而面对一些图像识别的工作,咱们如何依据业务需要去革新一个曾经比拟齐备的辨认工作,还是蛮有意思的一个话题。

业务需要

可能筛选出用户上传的球鞋图片中带有洁净对立背景的图片,咱们暂且就叫这个我的项目为 背景复杂度检测 工作。帮忙后续估价以及发售环节算法升高难度,以及维持整个 app 图像品质在一个水平线上。

我的项目要求

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

模型设计

mobilenet backbone + FPN + modified SAM

最终做进去的模型各个模块合成来看其实很简略,没有什么特地难懂的中央。

整体须要致力的方向无外乎以下几点:

  1. 剖析业务特点,这是一个典型的空间型辨认工作,即是通过图像的某局部或者某几局部区域的内容实现目标。对于 背景复杂度 咱们要刨去主体之外的局部,判断残余局部是否是“简单的”,即可,所以想到能够用空间系列的注意力机制。
  2. 咱们不可能对于用户严格控制拍照中的主体占据图片中比例的大小。有些用户习惯将主体占满屏,有些用户喜爱留白多一些。对于不同的尺度,如果想做到精密分类,是须要在较高分辨率下的 feature map 做文章,所以这里用 FPN。
  3. 为了可能在端侧实现利用,选用 mobilenet 系列是很人造的想法。

以上几点的设计思路其实就是齐全围绕以后 业务场景 而去做出的设计。

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

如果想理解(白嫖)这个我的项目所用模型,其实分享到这就能够达到目标了。每一个模块的设计,其实都不难,没有新的概念。代码也很扼要,实现也很不便。

但我的项目自身最乏味的实际上是实现整个我的项目的思维,为什么最初选用这样的模型,两头其余的思路是如何被排除,如何试错的!!!

我的项目过程

传统 CV

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

谬误的思路

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

  1. 对于和整个业务无关然而又重大影响后果的主体内容,用一个固定大小的高斯核进行过滤,而后进行其余解决。
  2. 利用边缘检测、梯度信息剖析一张图片的背景复杂度
  3. 傅里叶频率信息剖析图片的高低频信息来判断:高频代表背景信息多,较为简单;低频代表洁净。
  4. 通过多张背景洁净的图片做简略像素加权均匀当做模板,而后利用异样检测的办法,筛选出背景简单的图片。

以上都是在我的项目初期,我能想到的一些简略的 idea。然而察看图片样本后,这些想法,除去第一条的思路是对的(空间维度的信息),其余三条的思路都是错的。举个例子,一双鞋放在地毯上,地毯自身是洁净的,图片也除去主体和地毯没有其余任何物体。然而地毯有本人的纹路,高频信息很多,梯度信息很多。依照上述 idea 2、3、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%。但更重要的是,改良后的模型在可解释性上有显著的加强。当可解释性加强之后,才会有明确的优化方向的可能性。

总结

以上就是对于如何在图像识别中做出翻新的一种思路。然而翻新的目标不是为了翻新,整个我的项目下来最重要的外围就是为了 解决业务问题

文 / 诗诗

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

退出移动版