技术研究(工业安全) | 由Yolo浅谈开源目标检测算法

2022-11-25 来源:长扬科技

1. 前言


目标检测算法是业界最为人所熟知的AI算法之一,检测到需要检测的物体,并给他画上框获得它的坐标位置,是大多数人对它的印象,在人脸识别、游戏、安防、自动驾驶等领域有着十分广泛的应用,相较于其他图像算法,其具有以下三个特性:


  • 应用场景广泛,与不同物体结合可以形成多种不同的应用场景。


1669340498183381.png

图一. 目标检测的广泛应用


  • 复用成本低,在保证精度的前提下,如果检测目标相似,仅改变业务逻辑即可完成算法的迁移,适配于不同的应用场景。


1669340547670417.png

图二. 行人检测算法模型复用


  • 具有成熟的开源落地算法Yolo,在保证运算速度的情况下,提高较高精度的目标检测功能。


Yolo算法家族,具有庞大的分支和活跃的社区,自Yolov1 2016年发布以来,整个系列已经有着6年的历史,目标检测领域没有任何比它资历更老且如此活跃的开源算法了。系列最火的开源算法项目Yolov5在github上的收藏数量已经超过30k,要知道目前最为火热的AI模型框架Pytorch的官方仓库收藏数量也才50k,学习和使用Pytorch的人中,每五个人就有三个人在使用Yolov5算法。


1669340603785639.jpg

表一. Yolo家族系列


接下来我将以最具代表性的Yolo算法——Yolov5为例,来谈谈其作为一种标志性的开源算法的利与弊。


2. Yolov5:为何能脱颖而出


2.1. 简单易用效果好


2020年2月21日,“Yolo之父”Joseph Redmon在Twitter上发文表示“自己将退出视觉算法领域”以抗议AI在军事和个人隐私领域的使用。当时,Yolov3是速度最快的目标检测算法之一,同时还拥有极高的精度。以当时另一个以速度见长的模型RetinaNet为例作比较,见下表二:

1669340669405194.jpg

表二. Yolov3与RetinaNet对比


两个月后,Alexey Bochkovskiy宣布自己从Joseph Redmon的手上接过Yolo的接力棒,发布了Yolo系列的正统续作Yolov4,再过两个月之后,由商业公司ultralytics开发的Yolov5 1.0正式登场。两个模型在精度和速度上难分伯仲,但是之后v5项目平步青云,几乎把所有Yolo项目都甩在了身后,原因何在?


  • 初学者友好


因为v4为Yolo正统续作,所以被集成在了原Yolov3的项目仓库中,所以使用了原Yolo系列的模型定义方法。在结构相似的情况下,在v4中定义一个算法模型,需要在yaml文件中定义1279行配置,无论是书写还是学习都十分麻烦,而v5则仅需要48行,之后v4第二作者尝试使用v5的方法来定义算法模型,只用了53行。

微信图片_20221125100916.png微信图片_20221125100920.png

图三. Yolov4的配置文件(上图)与Yolov5的配置文件(下图)


其次,正统Yolo之所以高效速度快,C++ cuda编写是原因之一,但是在Python+神经网络框架(Pytorch,TensorFlow等)做AI的大环境下,这又成了最大的入门门槛,但是如今使用Python+Pytorch编写的Yolov5精度和速度都与使用C++编写的Yolov4相似,且因为Pytorch的特性,可以兼容转换到各种不同设备上,甚至在算法落地部署时,还可以转换成C++部署时,C++编写反而成了累赘。


  • 模型训练时间短


以3个类(红细胞、白细胞、血小板)的数据集BCCD(blood cell count and detection dataset,血细胞计数与检测数据集,共364张图片,4888个目标框)为例。


Yolov4在默认配置下完成训练,花费了1300次迭代,共计3.5小时,Yolov5在默认配置下完成训练,花费200次迭代,共计14.46分钟。


更短的训练时间,可以极大的提高工作效率,在有限的时间内带来更多的调试机会,提高了调优的容错率,并且上述测试中训练的两个模型,精度差别还不大。(以上测试结果均来自Roboflow CEO Joseph Nelson)


  • 指引简单易懂


Yolov4集成在Yolo系列的老仓库“darknet”上,而darknet项目包含了Yolov1-v4、Yolov7等78个不同的算法模型配置,这些模型的配置、用法以及项目的运行方式等等介绍和说明被凌乱的塞在了一个说明文档里,而这个文档不算子链接,就有接近900行,且没有目录和跳转。


从Redmon手中接手Yolo的Alexey Bochkovskiy就职于Apple公司,但darknet项目本身对他来说仅是一个个人维护的项目,Apple并没有为他提供额外的维护支持,所以darknet项目在指引和项目维护上的凌乱也成了理所当然。


Yolov5出自商业公司ultralytics,也是该公司唯一的产品,所以Yolov5项目的管理、文档、社区推广井井有条,且Yolov5有着严谨的版本管理和更新计划,截至目前,已发行至6.2版本。从1.0版本,项目就提供了简洁的接口和清晰的新手指引,项目根目录下有专门的使用教学代码,上手难度极低。


2.2. 社群活跃


Yolov5的正式发行1.0版本至今6.2版本,共发布了9个大版本。


最初1.0版本的项目官方贡献名单中仅有v4二作Chien-Yao Wang一人,一个月后(20年7月),在听取了社区反馈后,v5官方修复了1.0早期版本的众多bug,重写了算法结构,为其长期更新打下基础,正式发布2.0版本。


一个月之后(20年8月),v5官方将由社区用户制作的v5详细使用教程作为正式的官方使用教程,合并了七位社区用户提供的功能代码,加上他们自己升级的新算法,发布了3.0版本。


同年10月,3.1版本合并了11个社区分支;21年1月,4.0版本合并7个社区分支,适配了最新的pytorch,提供多种框架的部署方案;21年4月,5.0版本合并4个分支,适配了亚马逊、Youtube、wandb等等工具或资源,提供了精度更高的算法模型;21年10月,6.0版本合并465个社区分支,修复了大量bug,添加了逾20个社区增强,22年2月和8月又分别更新了6.1和6.2版本,修复了271个bug。


v5的大部分功能性更新均来自于社区成员的提供,社区至今已经有各种提问、bug提交、增强建议等6700多条,已经解决的有6500条,而v5官方也听取了这些建议,对自己的项目做出了更新。正是如此,Yolov5社区成为了最活跃的Yolo社区,也成为了最好用的目标检测算法。


3. Yolov5:“短效止疼药”


Yolov5简单易用好上手,社群又非常活跃,大家用了都说好!


...


好吗?


3.1. 更新但不兼容


自发布以来,Yolov5的版本发布间隔实际上是越来越长的,因为项目前期的易用性并不高,后续社区为项目补足了这部分缺陷,但随着易用性的可更新内容越来越少,项目的版本更新必须有实际算法提升才行,而算法提升才是最困难的,所以后续的更新会越来越慢。


而由前面所有版本的算法更新来看,每一次算法上的更新,都不会进行旧版本兼容,1.0的模型没办法在2.0上跑,4.0的不能在5.0跑。而4.0的基本依赖相较3.0又做了升级,6.0相较5.0甚至改了大体框架,这意味着如果我们需要长期使用Yolov5来实现落地场景,那么我们便需要长期使用某一个固定的版本来工作,但如果使用固定版本的话,那活跃的开源社区和频繁更新的功能这两样红利不就等于没有了吗?


为什么我们不自己在某个版本上进行代码的更新呢?


3.2. 模块耦合严重


Yolov5是一个开源项目,但是其背后是一家利用该项目赚钱的商业公司,所以其代码实际上是做了一部分防盗的,例如项目中大量使用了字母缩写,例如:num class被缩写为nc,num layer缩写为nl,module缩写为m,使部分代码阅读起来十分痛苦,且项目中很少有注释,大部分数学公式的代码实现需要自己去猜测和推敲其用途。


Yolov5项目最严重的问题是其模块耦合严重,改动某一个模块的代码往往需要牵动多个模块和底层依赖的版本,这也让自行在某个版本上进行代码更新变得困难重重。


3.3. 好用但不利于发展


Yolov5项目上手快,操作简单,可以快速将自己的资源转换为算法模型输出,解决了很大一部分团队AI能力有无的问题,但是最近一年来,国内多家商业公司也开始入局开源实时目标检测这一领域,例如:旷世的YoloR,美团的Yolov7,百度的PP-Yolo-E等,单纯使用Yolov5在未来可能很难跟上行业的发展节奏,它只能是解决能力有无问题的“短效止痛药”。


利用开源项目,可以降低开发成本,但算法模型不同于软件开发,每天都有海量的idea被发布,受制于开源项目缓慢的更新迭代,很可能让自己失去算法模型升级的核心创造力,在市场竞争中掉队。所以不应被动地等待开源算法官方的算法提升更新,更应该主动出击,持续运营和升级自己的算法,打破开源算法的桎梏。


4. 自研目标检测框架YoloCy


分析研究了Yolov5,YoloX,Yolov4,mmdetection等知名开源项目的优缺点,长扬科技推出了自研目标检测框架YoloCy。


4.1. 模块化设计


YoloCy模块化解耦了算法模型和算法模型训练过程中的所有核心模块,提供统一接口,可以快速自定义和修改任意模块内容,降低单模块的研发门槛和学习成本。

1669341195389226.png


图四. 模块化算法流程


4.2. 三方模型快速集成


借助于模块化设计的优势,使用YoloCy可以快速地集成第三方开源的算法模型,并且可以将第三方开源的权重转换成YoloCy中的权重。以Yolov7算法为例,花费了两小时,便完成了v7在YoloCy中的复现和权重转换。


目前YoloCy已经集成了上文表1中的所有算法模型,在此基础上,衍生和优化了数个自研的算法模型。网络复现的成本降低,让工程师可以快速试验自己的优化方案,验证算法迭代的结果,提升算法优化的容错率和算法产出的工作效率。


4.3. 最新优化快速集成


模块化让模块内添加新的方法变得快捷高效,在大多数情况下,只需要调整开源组件的接口与YoloCy对齐即可,而另一部分需要重写或复现的组件也仅需要在接口固定的情况下,修改内部即可,无需考虑会对其他模块的影响。这意味着,我们可以快速高效地复刻科研界最新的研究成果,并在我们自己的数据和设备上实验,以快速迭代我们的产品,提升核心竞争力。


4.4. 部署兼容


在YoloCy框架下,即便原算法模型不支持,作为迁移进来的第三方模型依然可以快速运行在YoloCy框架下兼容的部分部署平台,例如TensorRT,ONNX,MindSpore,RKNN等,这省去了为新的算法模型适配第三方平台所需要的大量人力和时间成本。同样,在YoloCy框架下需要为所有的模型适配新平台的时候,也只需进行一次适配,即可完成对YoloCy框架下所有模型的适配,大大降低研发成本。


4.5. 训练优化


在YoloCy中,我们实验并优化了数据处理与增强流程,优化了训练的Loss函数配置,在保证模型结构相同的前提下,最终以一半的训练迭代次数,获得了超越原版模型的效果。这意味着,使用YoloCy训练模型可以使训练时长减半,且最终模型精度更高。

1669341305856321.jpg


表三. YoloCy相较Yolov5精度上的提高


Yolo系列算法作为目标检测领域的常青树,从16年蓬勃发展至今离不开全球一个又一个睿智的头脑,帮助无数的团队完成了目标检测能力的从无到有。


“人见利而不见害,鱼见食而不见钩。”Yolo身为开源项目的使命是“降低能力的使用门槛的同时,尽量拔高项目的上限”,这也是大部分开源项目可以蓬勃发展的生存之道。但一个成熟的团队,往往想要更多自主把控的权力,外部因素对自己的影响越小,团队的产品输出就会越稳定。


所以,从0到1的突破,使用开源算法成本最低收益最高,值得推荐,但是1到正无穷的发展,一定要采长补短,慢慢形成自己的东西,才是长久之道。


参考资料:

1. Roboflow CEO 关于v4与v5的测试博客:https://blog.roboflow.com/yolov4-versus-yolov5/#comparing-yolov4-and-yolov5s-model-storage-size

2. Yolov3 Paper:https://arxiv.org/pdf/1804.02767.pdf

3. Yolov4 Paper:https://arxiv.org/pdf/2004.10934.pdf

4. v4一、二作与v5作者的讨论:https://github.com/ultralytics/yolov5/issues/6

5. Yolov5 仓库地址:https://github.com/ultralytics/yolov5

6. Darknet仓库地址:https://github.com/AlexeyAB/darknet


ISO9001

质量管理体系认证

ISO14001

环境管理体系认证

ISO27001

信息安全管理体系认证

ISO20000

信息技术服务管理体系认证

信息系统

安全运维服务资质