cover_image

无惧灵魂拷问:vivo拍照助你正确分类垃圾

vivo AI Lab vivo人工智能技术
2019年08月30日 13:00

图片







背景



自从上海成了大中国第一个实行“垃圾强制分类”的城市之后,每天早晚,上海银都要接受来自社区阿姨的灵魂拷问:你是什么垃圾?

图片


到2020年底,全国46个重点城市,统统要跑步进入垃圾分类“强制时代”:北京、天津、上海、重庆、石家庄、邯郸、太原、呼和浩特、沈阳、大连、长春、哈尔滨、南京、苏州、杭州、宁波、合肥、铜陵、福州、厦门、南昌、宜春、郑州、济南、泰安、青岛、武汉、宜昌、长沙、广州、深圳、南宁、海口、成都、广元、德阳、贵阳、昆明、拉萨、日喀则、西安、咸阳、兰州、西宁、银川、乌鲁木齐。



项目简介



为了帮助用户提高垃圾分类的效率,我们紧急启动了Jovi图像垃圾分类的项目, 我们采集了大量的高质量实拍数据,共包含4大类400个细粒度垃圾图片.


算法人员需根据标注的细粒度垃圾标签建立算法,对垃圾图片输出细粒度标签400类,中间粒度标签45类和粗粒度标签4类. 细粒度标签是object level标签, 比如易拉罐, 饮料瓶, 奶瓶等; 中间粒度是多个类似的细粒度标签聚类, 比如易拉罐, 饮料瓶, 奶瓶可以聚合成瓶罐; 粗粒度是指可回收垃圾, 有害垃圾, 湿垃圾和干垃圾.

图片


开发环境



基于Linux, Flask和Nginx搭建模型服务, 算法方面,主要基于深度神经网络ResNet-50, inception-v3和 传统图像特征Sift等Local Feature的结合,从而提升了效果。


整体思路



整体将该问题看作图像特征提取, 模型集成和特征检索问题, 特征提取采用了全局的深度特征和局部的传统特征. 深度特征拼接了两种异构特征, 充分考虑网络深度和网络宽度.


细粒度图像识别是业界一个比较有挑战的问题, 算法和工程的挑战都比较大. 从多个大规模图像项目实践经验来看,数据是提升细粒度识别效果的第一关键。因此,我们第一时间收集了大量相关数据. 我们通过搜索引擎爬取了大量的噪声数据,同时通过开源数据集获取了部分相关垃圾分类数据. 最后经过人工清洗,形成了模型训练的基础数据. 此外,我们又实际拍摄了大量垃圾数据. 通过以上三种方式, 我们构建了大量生活中常见的垃圾实拍图数据集.


算法的整体框架如下:

图片


基础模型



首先,尝试了基于预训练模型的基础模型,考虑到效果和速度的tradeoff,直接使用了经典的ResNet-50和inception-v3.


如果单纯使用一个CNN网络训练分类器, 在工业大规模分类问题上, 表现不佳. 主要问题表现在: 类内差异大, 类间差异小, 类别之间不互斥. Softmax分类器在这样的场景下表现乏力.


ResNet和 inception-v3提取的都是全局的深度特征, 具有很强的特征表达能力(representation). 前者网络很深, 后者网络很宽, 网络架构完全不同, 具有互补性.


Local Feature从另外一个维度来表征局部特征, 对于旋转, 缩放, 平移等图像操作具有一定的鲁棒性. 局部特征可以选取SIFT, ORB或者其他的.


图片


模型集成



我们基于预训练模型分别训练了ResNet-50和inception-v3的垃圾分类模型. 没有training from scratch, 这样可以节约很多训练时间, 而且模型finetune可以更快更好, 直接从公开的Imagenet的domain迁移到垃圾数据上.


然后我们又提取了单张图片的SIFT特征. 单张图片的局部特征个数是变化的, 不能直接拿来使用, 因此使用VLAD(FBOW和FV都可以), 聚合到一个固定的特征维度.


这样得到了两种异构深度学习特征和传统的局部特征. 深度特征维度很高, 我们需要降维, 我们直接采用PCA降低到512维.


那么这三种特征怎么利用起来呢? 一个有效的方法就是模型集成或者特征融合. 有很多种方式进行模型集成. 我们直接concatenate三段特征得到一个新的merge特征. 这三段特征带来了很好的特征多样性(diversity)


如果有充分的时间, 可以尝试finetune新的merge特征, 学习全连接层的参数. 这样得到的权重是soft weight, 而不是hard weight. 因为我们直接拼接的话, 人为给特征的每个维度赋予了相同的权重1. 显然每个维度的重要性是不一样的, 权重应该不一样. 


特征检索



我们采用HNSW作为检索引擎, 选取一定量的垃圾图, 得到merge特征, 注册入库. 检索返回TopK. 对这些返回的图像进行Ranking, 设置一定的后处理规则, 可以有效的判断是否属于某一类垃圾. 可以得到某个垃圾图片的细粒度标签, 聚类标签和粗粒度标签. 在Recall和Precision之间能够取得tradeoff. 

后续优化



由于时间比(不)较(到)紧(一)急(周), 我们第一版直接采用分类模型, 没有做检测. 这样要求用户要对准垃圾拍照, 垃圾在整个图像中间, 并且有一定的像素占比. 第二版算法, 我们添加了检测模型, 上述的拍照约束可以弱化, 可以提升用户体验, 增加算法的鲁棒性.


未来继续优化的点:
1、收集更多数据,以达到垃圾分类应用能够覆盖生活中绝大部分真实场景;
2、进行算法模型的训练和精调,得到更加稳定的图像特征表达;
3、增加检测算法,以确定图像的主题要素,更好的理解图像内容;
4、对图像特征进行压缩和降维,降低算法的latency;
5、调整算法识别引擎的结构,提升整体识别效果;


测试效果



图片
图片
图片
图片

8 重庆智博会参展



8月26日重庆智博会我们向用户展示了vivo垃圾分类的效果, 现场反响表现不错。其中,图像的垃圾分类需要用户拍照上传垃圾的图片,Jovi即可以识别图像中的垃圾类型(例如可回收垃圾)和中间粒度名称(例如金属); 此外我们提供了语音垃圾分类的功能,只需用户说出垃圾的名称, Jovi会告诉用户这是属于哪种类型的垃圾.


9月18号的广州电信展, 我们将会继续向外界展示vivo的垃圾分类AI能力, 敬请期待.

图片



图片



图片



继续滑动看下一个
vivo人工智能技术
向上滑动看下一个