打造万物识别之利器!微信扫一扫植物识别篇技术解析

2023-11-09

导语

冬去春来日渐暖,柳絮萌芽草生根。立春已过,又到了户外踏青赏花的季节。再过段时间,公园、郊外、路边各种鲜花都会渐次开放,大家踏春的时候都会拍一些好看的照片,发一些朋友圈,写一些花语。市场上也出现了不少识花app,用户下载app,拍张照片就可以知道是什么花草树木了。

识别花草树木还用单独下载app岂不是很繁琐,微信“扫一扫”植物识别已经悄悄上线了快一年了,用户只需扫一扫,拍一拍,或者长按会话图片、朋友圈图片搜一搜就可以看到植物的种类,还有许多资讯文章,花语介绍,相关视频,盆栽商品等。

背景介绍

微信扫一扫识物已经上线一年多了,前期主要以商品图(鞋子/箱包/美妆/服装/家电/玩具/图书/食品/珠宝/家具/其他)作为媒介来挖掘微信内容生态中有价值的信息,为了提高我们的识别能力,有必要对不同场景的扫物能力进行扩展。

通过对用户行为分析,数据显示用户倾向于拍摄植物照片。虽然市面上涌现出各式各样的识花类app,但大多数都是简单的拍照,告诉用户植物的种类和介绍,信息量非常少,比较单一。结合我们特有的公众号资讯类文章、公众号短视频、小程序电商,我们自研了微信扫一扫识别植物。在业务形态上,除了扫一扫识物的入口,我们还支持了会话框聊天长按识图,朋友圈识图等多个方式,如下图所示,更加便捷方便。

 

微信识图的多个入口搜索形态

 

扫一扫识物之植物识别视频

  目前扫一扫植物识别

■ 支持2w多类的细粒度植物图像识别,5k+种热门植物识别。

■ 识别精度达到业界一流水平。

■ 呈现方式多元化,包含百科信息、多图展示、相关视频、资讯、商品等。

扫一扫识花难点与挑战

  2.1 数据侧——海量植物数据获取和清洗

■ 数据获取,如何构造植物数据训练和检索库;

■ 清理噪声,需要专业知识,难以人工清洗,比较依赖算法精度。

小小“植物学家”研究植物种类‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍

  2.2 算法侧——高精度细粒度分析算法

细粒度图像任务不同于通用图像任务,细粒度图像任务算法难点主要有:

■ 类内差异大;

■ 类间混淆度高;

■ 数据分布不均衡,长尾分布严重。

通用图像任务 vs 细粒度图像任务

  2.3 工程侧——类中台化建设

  

整个扫一扫识物的框架图如下所示:

 

扫一扫识物框架图

  

其中,算法研发中台化主要指红色区域,我们需要设计一套可以复用的框架,这样在我们后续继续扩展其他类目的时候,效率更高,事半功倍。

 

 扫一扫植物识别流程框架图

扫一扫识花解决方案

  3.1 竞品预研

  

学术界细粒度图像任务的,基于细粒度图像分类的方法,主要利用强监督的信息、弱监督的信息、端到端的特征编码等。随着深度学习的迅猛发展,目前主流的细粒度图像分类的方法大多数以深度卷积网络为基础的,这些方法可以归纳于以下几个方向:

■ 基于图像分类网络微调的方法,如AlexNet、GoogleNet、ResNet以及DenseNet等;

■ 基于细粒度特征学习(fine-grained feature learning)的方法, 如Bilinear CNN等;

■ 基于目标块的检测(part detecetion) 和对齐(alignement)的方法, 如Part-RCNN等;

■ 基于视觉注意机制(visual attention)的方法, 如 RA-CNN等。

除了细粒度图像分类外,还有基于检索的方法来做细粒度图像分析任务的,以图搜图。细粒度图像检索的难点,一是图像粒度非常细微;二是对细粒度图像而言,哪怕是属于同一子类的图像本身也具有形态、姿势、颜色、背景等巨大差异。工业界借助自身强大的资源,拥有更多的分布式机器集群,可以构建更完备的检索数据库,所以有不少公司是选择基于图像检索的方法来做的。

 

通过下面几个维度对比细粒度图像分类和检索方法:

 

细粒度图像分类和检索方法对比

  

速度和复杂度方面,细粒度图像分类直接对用户图做一次识别就可以得到结果,速度很快,复杂度也比较低;检索方法需要先提取用户图的特征,然后在已有的离线检索数据库的特征进行搜索查询,取top1的结果,速度较慢复杂度较高。可扩展性方面,如果新的类目加进来,基于分类的方法需要重新训练模型,基于检索的方法不用重新训练模型,只需要把新的类目的图片特征提取加入到检索库里即可。

  3.2 数据清洗

  

通过一开始获得的数据,我们可以得到一个不错的benchmark。不过这些图像数据噪声比较多,需要进行清洗和聚类,才可以得到相对干净的训练数据,识别的才能达到更高的精度。为了节省人力,同时提高效率,我们设计了下面的数据清洗流程:

 

植物数据清洗流程

  

首先对图片通过md5和phash进行去重,然后对每个植物属里面的图片进行聚类,当然这里聚类的方法我们也对比了好多聚类方法,如下所示:

 

聚类算法对比

  

考虑到植物图像聚类的特性,我们更加关注聚类算法的抗噪声能力,对不同植物图片特征分布的适应性以及处理速度,综合分析实践后,我们选择了DBSCAN作为我们的聚类算法。聚类的时候先设定DBSCAN的一个经验值参数作为初始的参数值,聚类结束之后,通过网页可视化这些聚类结果,然后再决定要不要修改下阈值,包括距离和每个簇的最小类目数。得到的结果生成训练标签,然后训练模型。得到新的模型之后,再重复上面的过程进行迭代。

 

 聚类保留的图片 vs 聚类清除的图片

  

当然,为了更好地通过大量的实验验证我们算法的有效性,我们也构造了公正的评测数据集。评测集的构建主要有以下几个步骤:

■ 基于上面的聚类去噪方法对所有类进行类内进行去噪。

■ 从去噪之后的类目里面,按照2:1的比例划分query/gallery集和噪声集。

用这个数据集作为我们的评测集,一方面可以验证我们算法的有效性,一方面也可以看下我们模型的泛化能力。

  3.3 高精度细粒度图像检索算法

■ 3.3.1 检索模型互学习:吸收不同网络架构优点,保证精度和速度的兼得

  

首先就是尝试各种经典的卷积神经网络,包括ResNet系列,Inception系列,EfficientNet系列,轻量级的网络系列等。其中EiffientNet 系列分类精度特别高,然后用模型提取的特征做检索时精度要低的多;轻量级的网络如MobileNet系列,ShuffleNet等也是分类精度很高,模型的特征检索比较低。分析主要是对分类拟合的比较好,特征表达能力欠缺。ResNet系列里面ResNet152在速度和精度上表现最好,Inception系列里面InceptionV4 也是。

   

众所周知,一般竞赛中大家都会融合多个模型的结果来提升精度。但是在实际的项目落地,我们需要同时考虑部署模型的精度和速度,融合多个模型会占用更多计算资源,降低前向速度。那么怎么既然融合多个模型结构的优势,又不增加计算资源呢?这就是互学习模型的核心思想,如下图所示,互学习模型通过KL散度loss来吸收其他模型的结构优势,部署的时候只需要部署一个模型即可,不增加计算资源。

 

模型互学习框架图

  

实验中,我们利用表现最好的两个模型ResNet152和Inception V4进行互学习,实际部署采用ResNet152进行检索。实验结果对比如下,两者的互学习模型检索精度要比单独的ResNet152检索精度提升2个点。

ResNet152 vs ResNet152*(互学习之后的模型)

评测结果

 

互学习除了增加模型训练时间,对模型上线不增加任何负担,但是精度能够较为显著的增加。

■ 3.3.2 局部显著性擦除算法: 破坏局部纹理

  

通过上述互学习策略来提升模型的检索性能后,我们发现仍然存在一个问题,就是深度学习模型会过分关注图像的纹理区域,而忽视物体的形状。如何让模型在关注纹理的同时,也关注下物体的形状信息呢?

我们采用局部显著性擦除技术来破坏原图的纹理,迫使模型来关注物体的形状。所谓擦除,就是去除掉一部分有用的、具有判别的信息,希望网络依靠剩余信息也可以进行精准预测,这样就自然提高了网络提取更全面特征的能力。擦除一般分为两种方式,一个是对原始图片进行擦除,最常见的有Random Erasing、Grid Mask、 Cutout等,常用于训练时的数据增强;另一个是对特征图进行擦除,类似dropout的策略,是一种正则化的方法。如下图所示:

 

特征随机擦除框架图

 

在得到的特征图上面,使用随机生成的mask掩码,对特征图进行随机擦除。通过实验对比可以看到,局部显著性擦除能够有效的提升模型的检索精度。

 

随机擦除机制评测结果

■ 3.3.3 平衡采样策略、Finetune学习微调

  

在传统的分类和识别任务中,训练数据的分布往往都受到了人工的均衡,即不同类别的样本数量无明显差异。一个均衡的数据集大大简化了对算法鲁棒性的要求,也一定程度上保障了所得模型的可靠性。不过随着类别的逐渐增加,维持各个类别之间均衡就将带来指数增长的采集成本。在自然情况下,数据往往都会呈现如下图所示相同的长尾分布。直接利用长尾数据来训练的分类和识别系统,往往会对头部数据过拟合,从而在预测时忽略尾部的类别。如何有效的利用不均衡的长尾数据,来训练出均衡的分类器就是我们所关心的问题。

 

植物数据的长尾分布

  

长尾分布的最简单的两类基本方法是重采样(re-sampling)和重加权(re-weighting)。这类方法本质都是利用已知的数据集分布,在学习过程中对数据分布进行暴力的hacking,即反向加权,强化尾部类别的学习,抵消长尾效应。

 

采用均衡采样和微调策略检索精度结果

  

我们在训练的时候对图片进行均衡采样,同时训练结束后在少数的植物物种类目上进行微调,该方法也可以有效的提高我们算法识别的精度。

■ 3.3.4 更多的实验结果分析

  

我们还对比了更多的策略,加入商品的数据/多任务学习/检索之后重排序等,训练时候结合随机擦除,小样本学习,测试的时候基于检索特征得分和分类得分加权的结果最优;多任务学习在数据集相似,domain差异较小的情况下有助于模型的提升,差异较大的话反而较差。

  3.4 垂类中台并行化建设

为了在扩展其他垂类时我们的效率更高,在做植物垂类扩展时,我们把每一块都解耦出来,然后尽可能的并行化,使用多机进行处理,如下图所示

 

垂类中台并行化

    

其中离线调度系统可以参考 微信扫一扫识物——离线系统篇这篇文章有更详细的介绍,分布式训练可以参考从0到1——微信扫一扫识物分布式训练这篇文章。

 

其他垂类扩展时间

    

基于上面的中台,我们在拓展其他垂类的时候,时间大大缩短。

 

日常类目识图展示

总结与展望

目前扫一扫识花除了扫一扫的识物入口,也支持了聊天会话长按识别、朋友圈长按识别,未来希望更好地优化我们的模型和策略,持续对外输出我们的识物能力。接下来,我们会推出扫一扫识物之动物、红酒、汽车、菜品、logo等系列文章,更多关于扫一扫的技术文章可以到微信扫一扫技术系列文集查看了解。

参考文献

[1] Deep Learning for Fine-Grained Image Analysis: A Survey. 2019

[2] A Survey on Deep Learning-based Fine-Grained Object Classification and Semantic Segmentation. 2017

[3] Destruction and Construction Learning for Fine-grained Image Recognition. CVPR,2019

[4] Weakly Supervised Complementary Parts Models for Fine-Grained Image Classification From the Bottom Up. CVPR,2019

[5] Centralized Ranking Loss with Weakly Supervised Localization for Fine-Grained Object Retrieval. IJCAI,2018

[6] Batch DropBlock Network for Person Re-identification and Beyond. ICCV 2019

[7] https://scikit-learn.org/stable/modules/clustering.html

[8] ImageNet Classification with Deep Convolutional Neural Networks. NIPS 2012

[9] Deep Residual Learning for Image Recognition. CVPR 2016

[10] Going Deeper with Convolutions. CVPR 2015

[11] Densely Connected Convolutional Networks. CVPR 2017

[12] Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning. CVPR 2016

[13] EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks. PMLR 2019

[14] Bilinear CNN Models for Fine-grained Visual Recognition. ICCV 2015

[15] Part-based R-CNNs for Fine-grained Category Detection. CVPR 2014

[16] Recurrent Attention Convolutional Neural Network. CVPR 2017

[17] http://km.oa.com/knowledge/5372

[18] http://km.oa.com/group/24938/articles/show/401817

[19] http://km.oa.com/group/24938/articles/show/421861

[20] http://km.oa.com/group/24938/articles/show/418868

END

备注:目标检测

目标检测交流群

2D、3D目标检测等最新资讯,若已为CV君其他账号好友请直接私信。

我爱计算机视觉

微信号:aicvml

QQ群:805388940

微博知乎:@我爱计算机视觉

投稿:amos@52cv.net

网站:www.52cv.net

在看,让更多人看到  

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

打造万物识别之利器!微信扫一扫植物识别篇技术解析 的相关文章

随机推荐

  • UncaughtExceptionHandler加Process 让应用程序不异常崩溃退出

    我们在开发应用程序时难免会遇到出现没有被try catch抓住的RunTimeException信息 从而导致程序异常崩溃退出 大大的影响了用户体验 那么有没有什么方法能避免这一现象呢 网上一查资料 果然有 UncaughtExceptio
  • 延迟渲染到最终结果---大象无形(11.3.1)--2,PrePass预处理阶段--<2>大致工作流程

    正如上文所言 对静态物体和动态物体分别处理 一 静态物体 1 设置渲染状态 只计算像素深度 不计算颜色 具体内容是 关闭颜色写入 打开深度测试与深度写入 2 渲染三个绘制列表 1 只绘制深度的列表PositionOnlyDepthDrawL
  • java 内存同步_Java同步的内存影响

    小编典典 简而言之 就是 JSR 133的解释太过分了 这不是一个严重的问题 因为JSR 133是非规范性文档 不属于语言或JVM标准 而是 只有文档解释了一种可能的策略 该策略 足以 实现内存模型 但通常不是 必需的 最重要的是 有关 缓
  • java:变量(二)变量的基本类型

    二 整型与浮点型细节 1 组成 整型变量是由符号位和数位两部分组成 浮点变量是由符号位 指数尾 尾数位组成 整型和浮点型变量的首位都是符号位 用来表示数据的正负 2 整型浮点型变量的长度和取值范围是固定的 事实上同一语言的基本数据类型的长度
  • 云优化:您需要知道的一切

    在不考虑云优化的情况下将开发工作迁移到云端有点类似于吃 PB J 花生酱 果酱 三明治 只不过没有果酱 虽然花生酱已经够美味了 但您错过了把这一切结合在一起的要素 如果您想确保最大限度地利用您的云支出并消除任何可能拖慢速度的低效率事项 那么
  • 在idea中集成redis

    https www cnblogs com yiMro p 13529150 html SpringBoot Redis 基本配置及使用 Test public void TestRedis Jedis jedis new Jedis 19
  • [docker学习笔记] 11.docker网络模式及容器间网络通信

    docker的容器之间需要进行业务通信 11 1 默认网络 初始安装docker 之后 有三种网络 可以通过 docker network ls 查看 root localhost docker network ls NETWORK ID
  • 常用校验码(奇偶校验码、海明校验码、CRC校验码)

    常用校验码 奇偶校验码 海明校验码 CRC校验码 一 奇偶校验码二 海明校验码三 CRC校验码 计算机系统运行时 各个部之间要进行数据交换 交换的过程中 会有发生误码的可能 即0变成1或1变成0 由于计算机的储存是通过二进制代码来实现的的
  • C#连接云服务器MySql数据库

    环境 vs2017 第一步 在主窗口代码区新建一个类 用于连接数据库 在开发过程中其他窗口 常常也需要 对数据库进行操作 如果在每一个窗口的代码区域都连接一次数据库的话 就会很麻烦 所以在主窗口先用一个公共类连接了数据库 其他窗口就可以直接
  • go 进阶 请求代理相关: 一. 基于原生HTTP实现请求代理

    目录 一 代理基础概念了解 什么是正向代理 什么是反向代理 二 基于原生HTTP实现代理 简单正向代理示例 简单反向代理示例 上方代理中可能存在的问题 一 代理基础概念了解 什么是正向代理 是一种客户端的代理技术缩写为 forward pr
  • HarmonyOS云开发基础认证

    单选 答案 Cloud DB的数据同步模式包括缓存模式和本地模式 应用可以仅使用缓存模式 或者本地模式 也可以同时使用缓存模式和本地模式 正确 True Cloud DB服务在通过OnSnapshotListener类中的onSnapsho
  • MISRA-2012 规则整理

    说明 为了方便标准的对照 标题从8 1开始 目录 8 1 一个标准C环境 8 2 不使用的代码 8 3 注释 8 4 字符集 8 5 标识符 8 6 类型 8 7 常量 8 8 声明与定义 8 9 初始化 8 10 基本数据类型 8 11
  • 华为OD机试真题 整数对最小和 JavaScript java python c++ 参考解题

    题目描述 给定两个整数数组 array1 array2 数组元素按升序排列 假设从array1 array2中分别取出一个元素可构成一对元素 现在需要取出K个元素 并对取出的所有元素求和 计算和的最小值 注意 两对元素如果对应于array1
  • 在navicat中做数据库建模

    前几天 项目经理和我说要我把最近这个项目的数据表做一个关联图 我一想 这不就是数据库建模了嘛 可是公司电脑里没有power designer啊 公司电脑里还不能装外部来源的软件 这咋办 难不成要手工画图 想想就头疼 无意中就发现了navic
  • LVGL V8之flex grow

    flex grow布局 static void lv example flex 3 void lv obj t cont lv obj create lv scr act 当前活动界面创建obj对象作为容器 lv obj set size
  • 《STL源码剖析》深入剖析理解

    目录 提示 这里可以添加系列文章的所有文章的目录 目录需要自己手动添加 前言 标准程序库和STL概论 空间配置器解析 提示 写完文章后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 目录 前言 标准程序库和STL概论 空间配置器
  • OpenWrt 修改源码的密码配置(七)

    通过修改源码方式 修改账号及密码 修改密码 package base files files etc shadow root 0 0 99999 7 daemon 0 0 99999 7 ftp 1 BKbzZZm0 nrDMDt2K5Yu
  • qt修改构建套件

    1 qtcreator 工具 选项 qtVersion 添加 选择要添加的qmake 2 点击构建套件 选择对应的编译器 3 选择对应的调试器 解决can not find qmake conf问题
  • Synchronized(对象锁)和Static Synchronized(类锁)的区别

    Synchronized和Static Synchronized区别 通过分析这两个用法的分析 我们可以理解java中锁的概念 一个是实例锁 锁在某一个实例对象上 如果该类是单例 那么该锁也具有全局锁的概念 一个是全局锁 该锁针对的是类 无
  • 打造万物识别之利器!微信扫一扫植物识别篇技术解析

    导语 冬去春来日渐暖 柳絮萌芽草生根 立春已过 又到了户外踏青赏花的季节 再过段时间 公园 郊外 路边各种鲜花都会渐次开放 大家踏春的时候都会拍一些好看的照片 发一些朋友圈 写一些花语 市场上也出现了不少识花app 用户下载app 拍张照片