这里是针对YOLOv5的半监督目标检测实现

Efficient Teacher包含一篇论文(https://arxiv.org/pdf/2302.07577.pdf)和一套开源代码库(https://github.com/AlibabaResearch/efficientteacher)。其中,论文讲解了如何针对YOLOv5进行半监督训练,开源代码库可以针对YOLOv5及后续YOLO系列进行有监督和半监督的目标检测训练,库中半监督的部分用来支持仅有少量标注数据的任务完成具有良好泛化性能目标检测器的训练。本篇文章不会涉及到太多技术细节,更多是给大家分享我们为何要开展半监督目标检测这项工作。

有监督目标检测业态

我们的业务是将训练出的神经网络放置于AI Box这样的边缘计算设备以及智能摄像头这样的端侧计算设备上,为客户提供普惠的、软硬一体的、端云一体的AI解决方案。简单理解就是,客户会从阿里云买到带有智能算法的硬件,放置在自己的场景里,接入摄像头,开启AI检测任务,客户就会在自己的设备上看到检测结果。

Efficient Teacher_人工智能

在产品建设初期,困扰我们的最大问题是,如何在受限算力设备上让算法对任意场景都有好的效果。正如之前所说,算法是跟随硬件一起售卖的,在客户打开摄像头之前,算法工程师不知道模型是否有足够的准确率。如果算法一直是这样一种开盲盒的状态,那么不管硬件多么便宜、架构多么出色,产品都不可能取得商业成功,因为它没有基本的可复制性。

怎样让神经网络在任意场景都有较高的准确率?沿着主流技术路径推演得到的结论是——收集大量来自各种场景的数据,并一一进行准确标注,在有监督学习的范式下,神经网络一定会学到有一个稳健的数据分布(本质是让神经网络背下所有可能发生的情况,做到心中有数)。

这样的解决方案完全符合奥卡姆剃刀原则——直面问题、稳定、高效。于是我们开始大量购买图片,并对其进行标注。经过几轮迭代后,我们发现,在具有广泛商业应用场景的检测任务上(譬如车辆),这种方案效率出奇的高,除了少数极其复杂的场景,我们的盒子做到了既开即用。大家发现,只需要氪金就可以无限提升算法的表现,大量的标注帮助我们的边缘计算产品度过了第一阶段,代价是算法工程师被倒逼成了标注头子和脚本大师,但几乎所有人都觉得这是一笔划算的买卖。

Efficient Teacher_人工智能_02

从有监督走向半监督

靠着标注训练拿到了一些订单之后,我们发现,沿着这个方向发展带来的边际效应急速下降。我们开始接触大量有着客制化需求的长尾客户:A客户希望检测“纸箱子”与“塑料袋”,B客户希望检测“火焰”与“厨师帽”,C客户希望检测“三轮车”和“电动车”,那么在不增加已有图片数据的前提下,标注任务已经翻成了3倍;同时,在签署数据协议后,客户还会向我们传输大量的现场图片,在一轮又一轮针对客制化需求的迭代后我们发现,人工标注的速度远远赶不上新场景和新需求出现的速度,检查标注内容或者自行标注变成了算法工程师的主要工作内容,这个过程当然很有意义,但每周的工作总结写完就两行:“1.本周检查了多少万张标注数据。2.加入新标注的数据重新训练神经网络”。

怎样在尽量少标注的情况下快速让模型在任意场景都有较高的准确率?站在2022年4月的节点,我们惊喜地发现,在半监督目标检测的理论上已经有了一定的突破。从CVPR2021对FasterRCNN到CVPR2022针对FCOS的半监督目标检测论文,都表明该技术正在完成技术萌芽期。

半监督训练技术是一种借助少量标注数据和大量无标注数据来联合训练神经网络的方案,主流的半监督目标检测方案统一采用了teacher-student解决范式,运用teacher网络对无标注数据生成的伪标签来指导student学到全量数据的分布,同时student又会以集成学习的方式来更新teacher的参数,形成互学习的飞轮效应。

我们组立刻预研了一个版本的半监督算法,应用在标准的YOLOv5检测器上,结果发现,提升并不大。表面原因是,当时虽然有大量的半监督学术文章,但是没有文章聊过怎么把方法接到像YOLOv5这样充满了各种工程化trick实现的检测器上。背后的真实原因是,其一,我们对半监督这个任务的理解不够深刻;其二,业界缺乏一个工程化良好的目标检测库来支撑完成半监督的YOLOv5。

Efficient Teacher_目标检测_03

基于这次尝试的反馈,我们决定从2022年5月份开始重构一个目标检测库算法实现,以YOLOv5开源库(https://github.com/ultralytics/yolov5)为基线,重构一个既能方便运用配置文件来增删改查各种参数、又能同时训练one stage anchor based和anchor free检测器(YOLOv5/YOLOX)、还能干净地同时完成有监督训练和半监督训练的检测库。

同时,我们还仔细研读了CVPR2022的一系列半监督目标检测工作,其中两篇关键论文加速了我们的研究进度,一篇是来自阿里达摩院的《Dense Learning based Semi-Supervised Object Detection》,一篇是来自海康研究院的《Label Matching Semi-Supervised Object Detection》。这两篇论文不仅有扎实的理论阐述,还提供了优雅、可读性高的代码实现。根据这两篇论文的思路和超参说明,我们第一次在实验中让YOLOv5的COCO半监督实验指标开始提升。

在经过大量的调参、测试、实验现象分析后,我们总结形成了一篇针对YOLOv5的半监督训练论文,按照论文的方案,可以稳定地将检测器在COCO少量标注任务上的mAP提升12~15点的绝对指标。 

Efficient Teacher_人工智能_04

在重构的检测库能够稳定实现COCO数据集的半监督任务后,我们对Efficient Teacher使用场景进行了总结:

(1)训练时的数据和模型实际部署场景差异较大,现场算法常出现漏检和误检;

(2)模型部署现场的图片数据回传成本大,仅能获得很少量的现场数据;

(3)大量回传的现场图片标注成本高,大量检测任务并行开发且客制化程度高,无法相互复用;

在这些情况下,Efficient Teacher都可以使用半监督的训练方案基于少量的标注和大量的无标注数据训练出一个拥有良好泛化性能的检测器。

下面是我们在一些实际场景上训练获得的效果图,左边是全监督训练的YOLOv5l,右边是半监督训练的YOLOv5l,这些渲染图片都是在神经网络训练时从没有见过和标注过的图片:

Efficient Teacher_数据_05

 

Efficient Teacher_数据_06

可以看到,使用了半监督训练后,神经网络在未见过的数据上的泛化性能有了大幅提升,抑制了漏检和误检,而这些提升从头到尾没有依赖过添加手工标注。

上面这些实验的具体步骤如下:(1)利用有监督训练在数据集上训练出一个模型A; (2)基于模型A在标注数据和大量无标注数据上半监督训练出模型B,最后比较A和B模型的表现差异。这个过程中,我们也少量标注了一些新的验证集来验证半监督训练的效果,原因是半监督训练往往不太影响模型在原有验证集上的表现,而是加强模型在分布外验证集上的效果。

在验证过程中,我们也发现了当前半监督方案存在的不足之处——生成伪标签时是需要精调得分阈值和NMS阈值的。为了解决这个问题,我们添加了半监督训练时的log进行辅助提示,在训练时,进度条会将当前每幅图像生成的伪标签和训练集中每幅图片的平均标签个数都打印出来。如果在训练过程中发现平均每幅图的伪标签已经远远大于或小于训练集中每幅图的平均标签数,就意味着,应该修改伪标签生成的得分阈值和NMS阈值超参了。

one more thing

在完成了上述验证工作后,我们发现YOLO社区又有了新工作——YOLOv6/YOLOv7/YOLOv8,由于我们的重构检测库已经去掉了原始YOLOv5实现的限制,所以我们很轻松地将社区的最新工作也移植进了检测库,从而可以在一个库里用干净的参数和配置文件来检验更换backbone/neck/label assigner模块。这样,就可以量化出对同一任务使用不同检测器的收益,包括mAP/precision/recall/GFLOPs/Parameter等各种指标,这些指标又与标准YOLOv5实现是完全对应的,所以也能够帮助有需求的朋友们从开源YOLOv5仓库迁移到YOLOX/v6/v7/v8这些检测器下。

 

Efficient Teacher_人工智能_07

开源地址在:https://github.com/AlibabaResearch/efficientteacher

最近ChatGPT的出圈重新带起了资本对AI领域的“短期乐观”,仿佛通用人工智能下一秒就要降临了。而一段技术冷静期后,大家又会变得“长期悲观”,表示这个领域遭遇了严重的技术瓶颈。但我们坚持“长期乐观,短期悲观”,我的“长期乐观”是:

AI算法的应用落地,未来不会是无限依赖于收集大量数据并标注的重资产路线,而是一种端云结合、自主感知的演进路线,未来,云端的超大神经网络将会成为所有边缘AI的知识来源;

AI算法未来不再是针对标注数据的GPU启动脚本,而是通过具体项目驱动的、永远在自我更新的参数

“短期悲观”是:

现阶段的半监督方案是一种打破有监督范式的折中方案,不是终极解决方案,虽然它展示了一定的潜力,但还需要结合譬如human in the loop式的学习方案,完成向终极方案的过渡。