对付外行人,不管是做交通、医疗、环保还是机器行业的,他们每每会认为每一个场景都是一项技能。我打仗过一个读者,他说要给我130多个AI项目做。我问都是什么项目?他见告我,检测道路积水、检测流动摊贩、检测门前脏乱、检测违规撑伞……
我说,停停停!
从我看来,这便是一个项目,都是针对某个目标进行检测。我说你有这么多须要检测的场景,咱别一个项目一个项目的走,不如做一个通用的检测平台,一招办理以是问题。
不管是检测路上的杂物,还是检测车船,看着有上百种要识别的场景。其实用到的技能都是目标检测算法。一样平常是用YOLO算法。
这里面最难的便是获取演习数据。这么多场景,对数据量的哀求很大。由于每做一类,都要对数据进行标记。即便是现在大厂做的模型,也仅仅是通用模型,没这么细致。所谓通用便是一些生活中常见的事物,比如人啊,汽车呀。他没有细致到详细车的反光镜,扮装镜,还是后视镜。你想要搞这么细,你得找个几千张图片,然后挨个标记,交给模型去演习,演习完之后他才能进行识别。
举个例子,比方说我们想识别下图中的①和②,得先有演习素材,然后标记成演习集,末了去演习。
有些人确实是这么做了。实在,能迈出这一步的人,已经很不错了。由于多数人都望而生畏,说一句:都说AI方便,什么破技能,这么费劲巴拉!
有些先驱们,前期耗费了一些人力物力,搞了一些演习集,但是终极创造还是没有得到好的效果。于是就对检测技能产生了疑惑。
我搜了搜,网上都在讲YOLO平台,还没有人专门讲过它演习参数的配置。如果配置不好参数,无异于高速上挂S档跑长途,很难得到预期的效果。
那么,YOLO进行演习时,它有哪些参数可以设置呢?又会起到什么浸染呢?
以YOLOv8举例,我们可以去一个地方查询,那便是安装目录下的ultralytics\cfg\default.yaml文件。
这里面有100多项参数配置。为了方便利用,多数它都默认了一个通用的数值。这个通用一词,它又涌现了。
英文阅读有困难的,我供应了一个中文版。
它包含了任务模式设置、演习设置、分割设置、分类设置、测试设置、预测设置、可视化设置、导出设置、超参数设置等几大类设置。
当然,咱没法挨个都讲一遍。我先说几个常见的、主要的,紧张是提醒大伙儿理解配置的主要性。
就拿我这个数字标号的检测来说,如果我正常标记,不改配置直接演习的话,效果可能不会太好。
为啥?常规操作不都是这样吗?标记数据,形成演习集,然后演习。
我们超参数设置下的一个配置,便是下图中的fliplr:
这项设置的浸染是:图像旁边翻转的概率。它默认是1.0,也便是说100%会进行旁边翻转。
演习的过程中,处理流程会有记录,我们在runs/detect/train目录下,可看到详细效果:
放大图片,创造了没有?我们正常的图片被镜面翻转了。也便是图片发生了flip left-right。为什么会这样?
实在对付AI来说,它须要很多数据,越多越好。但是,我们每每供应不敷。因此,AI框架会想办法在合理范围内自己造数据。这一步操作叫“图片增强”。
大家看,这是一张狗的图片!
那么问题来了!
下面这些图片,你看还是不是狗?
依然是狗。即便经由翻转、旋转、改变透明度,乃至放大、缩小、尺寸压缩变形,更过分的话,裁掉一部分。我们打眼一看,它就很狗!
我和AI一起过日子,我很理解,AI真正想要的是这类素材。AI说,既然你们人类说这些都是,那为什么不交给我演习?人类没有说话。因此,这才有了“图片增强”!
YOLOv8中,关于图片增强常用的设置有如下几个:
degrees: 图像旋转角度(+/- 度数)。translate: 图像平移(+/- 比例)。scale: 图像缩放(+/- 增益)。shear: 图像剪切(+/- 度数)。perspective: 图像透视(+/- 比例),范围0-0.001。flipud: 图像高下翻转(概率)。fliplr: 图像旁边翻转(概率)。bgr: 图像通道BGR(概率)。mosaic: 图像马赛克(概率)。mixup: 图像稠浊(概率)。copy_paste: 分割拷贝粘贴(概率)。上面说了,它都有一个通用的默认设置。我们是可以修正的。它默认的数值,不一定就适宜我们的场景。
举个例子,如果默认进行翻转。那么这一点,对我检测数字的场景就不得当。看下图,2水平翻转后便是5,而6和9也只差一个旋转。
这时候你标记了大量的数字2,但是经由数据增强后,数据实在是5,但是标记依然是2。这就造成2、5不分。
拿数字举例子虽然深刻,但多少有些抬杠。换一个生活中的物体。比如检测车辆行驶。如果轮胎不才面,那么便是正常行驶。如果轮胎朝天,那便是翻车了。
因此这些图片增强,要根据你的实际场景进行开启和关闭。
再讲一个主要的参数。网上没有人讲过,不知道是大家不知道,还是故意保密。便是mosaic这个参数,它是图像马赛克的掌握。这项设置也是默认100%运用。
很多人对这一项不理解。我们看看开启和关闭有什么差异。
当mosaic为0.0,也便是完备不开启的时候,我们的演习数据便是标注的那样。
当mosaic为1.0,表示100%的图像都开启马赛克效果,那么演习数据会在标注的根本上做如下效果的处理。
你看出来差异了吗?我阐明一下。Mosaic数据增强会将四张图像拼接成一张图像。这样可以供应更多的高下文和更多的目标实例,从而有助于模型的演习。
它的事情事理如下:
图像拼接:从数据集中随机选择四张图像,将它们分别放置在拼接图像的四个象限中。这四张图像的大小会根据拼接图像的大小进行调度。随机裁剪和缩放:在拼接过程中,图像可能会被随机裁剪和缩放,以天生具有不同尺寸和内容的新的组合图像。标签调度:每张原始图像中的目标标签(如边界框)也会相应地调度,以适应新的拼接图像的位置和大小。通过将多张图像组合在一起,增加了演习样本的多样性,有助于模型更好地适应不同的视角和尺度,从而提高模型在不同场景下的鲁棒性。
在配置文件中,可以将这个值设置为0到1之间的一个小数。例如,mosaic: 0.5表示每张图像有50%的概率运用 Mosaic数据增强。
从算法角度看,这是一件好事。但是,是否打开也取决于你的详细的场景。
这种增强虽然好,但是由于对裁剪拼接的数据进行了演习。它会毁坏检测的完全性。也便是说,如果你的检测画面中存在目标的一小部分,它也会检测出来。有时候,可能我们并不想这样。拿检测汽车来说,如果你希望只检测出完全的汽车,那么mosaic这个开关要关掉。
诸如此类的配置,还有很多。希望大家根据自己的情形自行调度。千万不要拿到演习集不思考,直接一条命令就演习。
上面说的参数配置会影响模型演习的准确率。那么下面说的一些参数,则会影响演习的韶光效率。
在train settings也便是演习设置中,有两项参数batch和workers。
这个batch是一次演习多少张图片。我们在runs文件下常常看到如下的图片。
他们名称都带batch,而且都是4行4列共16格子的图片。由于这里默认的batch便是16。
batch该设置多少,跟你的演习设备配置有关。这就相称于你用饭的饭量。有人一筷子能夹起4个藕片,有人则一下吃16个。吃多吃少,都要与自身匹配。
该如何设置数值呢?
如果你用CPU进行演习,batch的大小影响的是RAM,也便是内存。如果你用GPU演习,那么批次大小影响的是显存。
批次越大,显存/内存花费越多。如果显存/内存不敷,演习可能会失落败或变得非常缓慢。如果批次太小,那么利用率又会太低,很多资源都会闲置着。
我们可以从一个较小的批次大小开始,如8或16。然后逐步增加,直到显存/内存耗尽,或着创造模型性能开始低落。
如果你嫌麻烦,也可以利用自动批次大小:在配置文件中,可以将批次大小设置为-1。这样YOLO会自动根据你的GPU显存选择得当的批次大小。
再说一下workers参数。这个参数是设置数据加载时的事情线程数,也便是并行加载数据的进程数。一样平常workers可以是任何正整数,并不一定非假如2的倍数。选择适当的workers数量,要根据系统的CPU核心数量和任务负载进行调度。
每个worker线程会占用一个CPU核心,因此设置的workers数量该当与系统的CPU核心数量相匹配。如果系统有8个CPU核心,设置workers: 8是合理的。如果workers数量过多,可能会导致CPU资源争用,反而降落数据加载的效率。
实际实践中,也是从较小值开始。比如从系统CPU核心数量的一半开始设置。然后逐步增加,不雅观察数据加载效率和系统负载情形,直到找到一个最佳值。
我都是看两者的占用情形。如果CPU占用率只有40%,那我就增加workers数量,以充分利用CPU资源。如果内存还有很大空余,那么就增加batch数量。batch相称于质料入口的供应,workers相称于加工的吞吐性能,两者要找到一个平衡点。
对付GPU设备,workers的设置应考虑数据加载速率与GPU打算速率的平衡。一样平常情形下,可以设置为GPU数量的4倍到8倍。详细可以从workers为8或16开始,然后根据GPU利用率和数据加载速率进行调度。
batch: 32 # 初始batch sizeworkers: 8 # 初始workers数量device: 0 # 指定利用GPU 0cache: ram # 利用内存缓存数据,加快数据加载速率
做人工智能运用嘛!
又不是让你研发AI芯片或者创建全新的算法框架。紧张事情可不便是调来调去的,根据参数调效果。我认为它是一门以实践为主的科学。如果知道了怎么调,仍旧连调不愿调就说不好用,那就太
下一期,我们讲一下《详解根据YOLO的演习结果评价演习效果》。类似于从血常规化验单看身体状况。