使用baseline跑出的成绩只有0.16,后面几天试过各种改进,下面记录一下自己的改进过程:
更好的模型
baseline中使用的模型是yolo8n,首先,8代表的是yolo的第八代,n代表的是模型的大小。目前yolo已经开发出第10代了,相比于第8代,第10代更高更快更强,所以理所当然的选择yolo10来训练我们的模型。至于模型的大小,这里我选择的是yolov8s,再大的模型我的显卡就跑不了了。。。
具体的模型权重可以去ultralytics下载,ultralytics这个网站对新人还是很友好的,关于yolo的训练及测试方法官方文档都写的很清楚,完全可以自学。
在下载好模型权重后,将权重的路径粘贴到YOLO函数中就完成模型导入了,非常的方便。
model = YOLO("yolov8s.pt")
参数调优
使训了效果更上次层楼的另一个方法就是对模型的超参数进行调优。下面是具体的参数设置:
results = model.train( data="yolo-dataset/yolo.yaml", epochs=2, imgsz=640, batch=8, patience=5, dropout=0.5, label_smoothing=True, exist_ok=True, name='train', dfl=0.5, multi_scale=True, optimizer='AdamW', verbose=True, close_mosaic=1, plots=True, copy_paste=0.5, )
在这里,我只设置了
- epoch=2,这是因为我们导入的YOLO已经是经过预训练的了,后续在比赛数据集上的训练应该称之为微调。在前面的实验中我发现,只需要再经过1-2个epoch模型的训练就足够了,再多就会产生过拟合。
- imagsz=640,是因为原始的图片大小大致在1080左右,太大了,会严重占用GPU的内存。将图片适当减小,空余出的内存可以用于增大batchsize,较大的batchsize可以确保模型的鲁棒性。
- batch=8是因为在后面我将multi_scale设置为了True。multi_scale=True会在训练中随即地改变输入图片的大小,使得模型能在多尺度上具有鲁棒性,增加精度。但是随机地改变图片的大小,就是说有些图片的尺寸会非常大,导致GPU内存占用特别大。所以较小的batchsize就能确保GPU有足够的空间。
- patience=5是说,当模型的loss连续5个epoch不再下降时,就自动停止训练。
- dropout=0.5: 在训练的时候随机停用50%的神经元,这个也是增加模型的鲁棒性的。
- label_smoothing=True: 也是增加模型的鲁棒性的。
- exist_os=True, name='train':模型的训练结果输出到runs文件夹下的名为train的子文件夹中。第一次运行预测代码时,系统报错在train文件夹中找不到名为best.pt的文件,后来才发现如果runs文件夹中已经有一个train文件夹后,系统会自动建一个名为train0的文件夹用来储存该次运行的结果,以避免覆盖以前运行的结果。设置这两个参数的意思是:该次运行的结果输出到train文件夹中,如果已经有一个train文件夹了,那么就覆盖掉之前的结果。
- dfl=0.5:dfloss在总体loss中的权重。训练数据中的各个类别数量十分不平衡,百度说设置这个参数可以一定程度上避免类别不平衡。
- optimizer:选择你的优化器。默认的优化器是SGD,太low了,还是用AdamW吧。
- verbose:显示训练过程。
同时,在训练中还选择了两种数据增强方法:mosaic和copy_paste,这两种方法的具体内容在官网有解释,这里不过多追述。选择这两种增强方法的理由是来自经验,其他的数据增强方法感觉效果有限。
通过这一通操作,成功将分数干到了0.23,还是很低。
总的来说:还是数据太烂了,赛事方给的标注数据太烂了
标签:文件夹,训练,检测,模型,yolo,train,MARS,True,更进一步 From: https://www.cnblogs.com/ther0gucheng0hahahahahahahaha/p/18383762