炎炎夏日,当白领们坐在写字楼里敲键盘时,可能不会想到,中国成百上千家垃圾处理厂里,许多分拣员正在垃圾山里“攀岩”,承受着身体和精神上的双重压力进行垃圾分类分拣工作。与此同时,工业化、城镇化的兴起和人口增加,加剧了全球范围内的资源短缺和环境污染,垃圾分类回收成为人类的“必修课”。好在人工智能、深度学习技术的介入,正在改变这一现状。
5月20日,由深度学习技术及应用国家工程实验室与百度联合主办的“WAVE SUMMIT”2020深度学习开发者峰会召开,除了技术升级与产品更新之外,百度飞桨深度学习平台还展示了各行业的典型落地案例,其中,金漉科技的案例最接地气,也与时下社会民生关注的热门话题“垃圾分类”有关。
据现场介绍,引入飞桨深度学习算法后,针对垃圾材质进行筛选的准确率可以达到97%以上,与人工相差无几。垃圾分类工终于迎来了解放双手的契机,而且深度学习还带来了未来垃圾精细化操作的可能性。
可能是最不人道的工种之一
垃圾分拣员
有个很形象的比喻,如果说小区里日常的垃圾分类是“C端”,那垃圾填埋场就是“B端”的工作——城市每天都在不断地产生大量垃圾,它们必须经过回收到垃圾处理厂进行集中处理,为节约填埋用地、保护环境、充分利用再生资源,这些垃圾需要进行分类分拣。
目前,垃圾分类工作由人工和机器共同完成,但在机器分类之前,必须先要手工操作。由垃圾分拣员先挑选出大块的垃圾;然后借助重力、风力、磁力等手段进行大致分类;最后金属被回收利用,可燃物被焚烧,有机物被送去堆肥,其他垃圾会被送去填埋。
但这份工作并不好做,过去几年,金漉科技CEO张志文在垃圾填埋场见过了几百张来去匆匆的面孔,一批又一批的人重复着机械的工作,还要承担人们想象不到的健康风险。被玻璃、刀片、锐物划伤已经是“物理轻伤”,垃圾填埋场的有害气体、霉变物品随时可能摄入,更别说肉眼不可见的各种细菌和病毒在这片“乐土”安家,手套也挡不住有害物质的入侵,不少工人都得了不知名的皮肤病……甚至有一次,工人还找到了一颗废弃的炸弹。
每天在这样的环境中工作7个多小时,严重考验着垃圾分类工人的忍耐力和承受力。“在垃圾填埋场,工人的平均工龄是2-3年,时间长了就会有各种‘职业病’。”被同行称为”阿牛哥”的张志文是一个在机器视觉领域奋斗了十几年的老兵,他说自己了解到垃圾分类工人的现状后,就开始思考如何运用AI技术来解决这一问题。
传统算法的门堵死了
AI算法的窗敞开着
其实,机器视觉技术在外国早已用于一些垃圾场,尤其在是发达国家。机器视觉传统算法已经体现出成本低廉、架设简单、操作简便等优点,在高效工作的同时实现去人工化。
但是,包括阿牛哥在内的业内人士心里清楚,把那套方案平移到中国百分之百会“水土不服”。对新国家的垃圾内容兼容性差、对检测品质持续改善能力不足是一方面,最关键的是识别不了没有清洗过的垃圾。
“外国对垃圾分类的初步处理比较完善,举例来说,日本人会把饮料瓶清洗干净再丢弃,现阶段你不可能要求每个中国人都这么做,不现实。”阿牛哥解释。
行业里,之前也有人把机器视觉传统算法引入到垃圾处理上。由于识别准确率一直无法提升,导致最后很多设备都空置着,垃圾依然需要人工分拣处理。于是,阿牛哥把目光投向了人工智能深度学习,这个领域目前在国内属于“风口”,可是阿牛哥他们找了很多家都不太合适。不是没法满足定制化需求,就是上手门槛太高。最后,基于成本、技术等因素综合考虑,金漉科技选择了百度智能云。他们决定通过百度智能云的服务在百度飞桨深度学习平台上搭建自己的人工智能算法。当时,飞桨已经被中国企业广泛使用,并且拥有活跃的开发者社区生态可以群策群力,更重要的是上手快、门槛低。
其中,飞桨PaddleX对项目的推进落地起到了关键作用,这是飞桨推出的开发、训练、部署全流程开发工具,集成了飞桨多元产品矩阵,打通深度学习全流程,帮助开发者降低AI应用的落地门槛。
阿牛哥他们借助飞桨很快就推出了一套深度契合垃圾分类需求的高性能方案——金漉科技应用PaddleX所提供的YOLOv3模型进行目标检测训练和DeepLapV3+模型进行2分类(塑料瓶or背景)语义分割训练,训练后获得一个可快速检测出塑料瓶的颜色并定位塑料瓶所在区域的模型,进而准确按照颜色输出塑料瓶种类及塑料瓶中心点位置。整个处理流程已经在AI Studio上以示例教程方式公开,路径如下:
https://aistudio.baidu.com/aistudio/projectdetail/587733
1. YOLOv3检测模型训练
使用PaddleX训练模型非常便捷和流程化,三个步骤即可完成训练。
定义图像数据流程;
定义数据集读取器;
定义模型开始训练。
下面即为在垃圾分拣项目中,YOLOv3模型训练的完整代码。
1.1 定义图像数据流程
在PaddleX中,transforms用于定义模型训练和验证过程中,输入图像的处理流程。在如下代码中,对于训练过程的train_transforms,加入了MixupImage,RandomDistort,RandomExpand等图像增强策略。而在验证过程,则只需对图像进行Resize并归一化即可。
from paddlex.det import transforms
Import paddlex as pdx
train_transforms = pdx.det.transforms.Compose([
pdx.det.transforms.MixupImage(mixup_epoch=250),
pdx.det.transforms.RandomDistort(),
pdx.det.transforms.RandomExpand(),
pdx.det.transforms.RandomCrop(),
pdx.det.transforms.Resize(target_size=608, interp='RANDOM'),
pdx.det.transforms.RandomHorizontalFlip(),
pdx.det.transforms.Normalize()
])
eval_transforms = pdx.det.transforms.Compose([
pdx.det.transforms.Resize(target_size=608, interp='CUBIC'),
pdx.det.transforms.Normalize()
])
1.2 定义数据集读取器
项目中标注的数据采用COCO格式保存,因此使用接口paddlex.datasets.CocoDetection加载数据集,其中train_dataset用于训练模型,eval_dataset用于在训练过程中评估保存的模型。
train_dataset = pdx.datasets.CocoDetection(
data_dir='garbage_ins_det/JPEGImages',
ann_file='garbage_ins_det/train.json',
transforms=train_transforms,
shuffle=True)
eval_dataset = pdx.datasets.CocoDetection(
data_dir='garbage_ins_det/JPEGImages',
ann_file='garbage_ins_det/val.json',
transforms=eval_transforms)
1.3 定义模型开始训练
定义YOLOv3模型,使用ResNet34作为Backbone。训练过程中,设定批大小为8,学习率为0.000125,并且学习率在第210轮,和240轮时进行衰减。
num_classes = len(train_dataset.labels)
model = pdx.det.YOLOv3(num_classes=num_classes, backbone='ResNet34')
model.train(
num_epochs=270,
train_dataset=train_dataset,
train_batch_size=8,
eval_dataset=eval_dataset,
learning_rate=0.000125,
lr_decay_epochs=[210, 240],
save_interval_epochs=20,
save_dir='output/yolov3_darknet53')
YOLOv3代码已整理在AI Sudio教程的train_yolov3.py代码中,直接执行脚本即可开始训练。
2. 数据格式转换
Deeplabv3+模型在训练时,目标是将物体的像素从YOLOv3检测得到的框中识别出来,因此我们从原标注的COCO格式数据集中,裁剪出标注的目标图像,并将其标注信息转换成语义分割数据集格式。
数据转换脚本已提供在AI Studio教程中,直接按如下命令执行即可。
python coco2seg.py
3. DeepLabv3+语义分割模型训练
与YOLOv3模型训练一样,同样是分为定义图像数据流程、定义数据集读取器和定义模型进行训练三个步骤,此处不再复述,训练代码在AI Studio教程上,直接按如下命令执行即可开始训练。
Python train_deeplab.py
4. 组合YOLOv3和DeepLabv3+模型进行预测
使用YOlOv3预测出塑料瓶的位置和颜色并裁剪出对应子图,使用DeepLapV3+预测出子图的分割区域,将子图像的分割区域预测结果和该子图像中塑料瓶的颜色进行组合,并转换到原图上进行可视化(AI Studio教程中只提供一种较为直观的可视化方式,用户可根据需求修改该部分代码进行实现)。
import paddlex as pdx
# 加载检测和分割模型
det_model = pdx.load_model('./output/yolov3_resnet34/best_model')
seg_model = pdx.load_model('./output/deeplab/best_model')
img = cv2.imread(‘test.jpg’)
# YOLOv3模型预测
det_res = det_model.predict(img)
for dt in det_res:
crop_img, bbox_info = crop_object(img, dt)
# DeepLabV3+模型预测
seg_res = seg_model.predict(crop_img)
seg_res = seg_res['label_map']
# 获取最大连通区域
cnt = get_max_connected_area(seg_res, bbox_info)
# 信息整理
det_results.append(bbox_info)
seg_results.append(cnt)
# 可视化
visulize_result(canvas, det_results, seg_results)
预测脚本代码已整理在AI Sudio教程的predict.py代码中,直接执行脚本即可开始预测。
python predict.py test.jpg
结果可视化如下图所示。
模型最终通过Paddle Lite(
https://github.com/PaddlePaddle/Paddle-Lite)部署到Edgeboard实现预测,并输出信号(使用分割区域计算出中心点位置)给产线其他硬件(例如机械臂),实现对垃圾的分类。
简单来说就是,首先机器会借助目标检测模型来判断垃圾种类,再借助图像分割模型,找到瓶子等垃圾类型的边缘,确定瓶子中心点位置,然后将判断结果传递给机械臂,把垃圾分拣出来。通过YOLOv3和DeepLabV3+两个模型的组合,金漉科技实现了高精度的垃圾分拣解决方案,准召均达到97+%,并且最终在实际应用场景中,EdgeBoard上单张图片识别耗时在500毫秒内,满足了应用场景的要求。
高准确率外的惊喜
AI也有“熟练工”一说
“对PET瓶子的颜色识别,如果是二次清洗过的瓶子,机器视觉传统算法可以做到95%的正确筛选率,而飞桨的模型则能做到准确率和召回率99%;对于没有处理的瓶子,也就是国内垃圾处理厂随处可见的饮料罐,机器视觉传统算法准确率就下降到74%,而飞桨模型依然可以保证97%的正确筛选率。”阿牛哥很直观地比较出两种方法的优劣。
另外一个惊喜是,阿牛哥他们发现,传统算法的正确筛选率一直在60%~90%浮动,这主要取决于识别的垃圾质量;而深度学习算法则一直在93%~99%之间浮动,甚至可以随着数据量的积累自我“学习”垃圾分类,不断地提升正确筛选率,这也是传统方案不可能实现的。
金漉科技与一家再生资源公司进行合作,应用了这套系统之后,不仅让该公司的垃圾分选效率从93%左右提升到97%以上,而且每个垃圾场常驻的4~6个工人不必整天和臭烘烘的垃圾作伴,其身心健康也得到了保障。
在阿牛哥看来,深度学习技术的优势一是对产品适应性非常强,不但能检测品质还能通过自我“学习”持续改善能力;二是有很高的兼容性,这使得该方案具备可复制性。有了人工智能,垃圾分类能从工艺角度修整且节约大量的设备及人力成本。除了高效、安全,一年还能帮工厂节约支出30~50万,销售利润提高10%左右,“对于这套系统有需求的企业不在少数。”
阿牛哥还认为,用飞桨搭建视觉模型,针对颜色进行垃圾识别只是AI的其中一个“人设”,有更多潜力尚待挖掘,不仅垃圾分拣人力可以节约大概96%,还可以进一步细化现阶段难以实现的分拣内容,例如大块的有机物、小块的金属等,AI可以自我学习让这些任务变得更加精细化。同时,掩埋垃圾也不是一个好的处理办法,在未来人工智能或许能够给出更多新思路。
百度飞桨在垃圾分类上的“接地气”应用,仅是人工智能产业落地的一个缩影,峰会上展示的案例,涵盖了消费电子、工业、商业、服务业等,从众多细节场景推动社会智能化转型。目前,飞桨累计开发者数量超过190万;服务企业数量达到8万4千家;发布模型数量超过23万个,是国内最领先、服务开发者规模最大、功能最完备的开源开放深度学习平台,正在为各行各业、国计民生提供前所未有的智能加速度。
如在使用过程中有问题,可加入飞桨官方QQ群进行交流:1108045677。
如果您想详细了解更多飞桨的相关内容,请参阅以下文档。
官网地址:
https://www.paddlepaddle.org.cn
飞桨开源框架项目地址:
GitHub:
https://github.com/PaddlePaddle/Paddle
Gitee:
https://gitee.com/paddlepaddle/Paddle
END