前言
本次是2024.0429最新更新。YOLOv8经过一年的沉淀,也已经逐渐成熟。YOLOv8论文还没出,猜测U神团队没打算写论文。目前最新的论文是YOLOv9,但v9需要的算力太高了,普通人还是抱以欣赏态度吧。
代码下载
目前最新版本的YOLOv8公开版是8.2.0版本
官方Github下载地址:/ultralytics/ultralytics
YOLOv8结构图
图片来源于:/qq_37706472/article/details/128679699
YOLOv8实操过程
(1)安装环境依赖,输入命令 :
pip install ultralytics
(2) 训练train
数据集格式跟v5相同,数据集这里不多赘述,不懂的可以搜一下。
主讲一下需要注意的地方:
第一,第一次用v8的童鞋们,可能找不到在哪。v8的根目录不像v5直接有
在v8中,要先进入路径:ultralytics/models/yolo/v8/detect
,就可以看到和
文件;
第二,直接输入命令python 或者直接运行都是不行的。而且,v8的找不到类似v5那种参数设置,如batchsize、workers等。
如何解决?
YOLOv8将超参数和其他参数的设置全部集成到了ultralytics/yolo/cfg/
(注意看清路径,别找半天找不到);
其中,文件的参数如下:
注意黄色框的几个参数,task
是选择训练任务类型,detect是目标检测,segment是分割任务;mode
参数,train是训练,val是验证,predict是推理测试;model
是使用的网络结构;data
是数据集的设置;
第三,参数都设置好之后,可以直接输入命令,即可开始训练:yolo cfg=ultralytics/yolo/cfg/
(没看错,不用怀疑,就是这个命令,不用什么.py
)
重点!!!重点!!!重点!!!
以上训练命令,改参数太麻烦了,还费劲。
推荐使用以下方式:
直接自己在根目录下新建一个****文件,内容如下:
from ultralytics import YOLO
# Load a model
model = YOLO("ultralytics/cfg/models/v8/") # build a new model from scratch
model = YOLO("") # load a pretrained model 不使用预训练权重,就注释这一行即可
# train
model.train(data='dataset/',
cache=False,
imgsz=640,
epochs=100,
batch=16,
close_mosaic=0,
workers=4,
device='0',
optimizer='SGD', # using SGD
amp=False, # close amp
project='runs/train',
name='exp',
)
然后,直接在命令窗口输入python
或者直接运行即可
(3)验证val
注意,这里直接写推荐的方式。
直接根目录新建一个文件,直接运行即可:
from ultralytics import YOLO
if __name__ == '__main__':
model = YOLO('runs/train/exp/weights/') # 自己训练结束后的模型权重
model.val(data='dataset/',
split='val',
imgsz=640,
batch=16,
save_json=True, # if you need to cal coco metrice
project='runs/val',
name='exp',
)
下面讲解一下参数,以及什么叫“验证”。部分新手不理解这个程序的作用。
首先,在训练时和训练结束后,我知道会直接输出mAP值。但是,这不是最终结果,不能直接用,也不能说这是验证的结果,这些说法都是错的。
什么叫做验证?就是训练完后的模型权重,用跑一遍,才叫验证。(别懒,必须得跑)
我知道,有人会说,之后的mAP结果和训练完后的mAP结果一样,或者相差很小,也有相差大的时候(都不重要,别管,以
跑出来的结果为准)
这是因为,你里面split参数设置的是val,代表此时调用的是验证集图像,跑出来的就是验证集mAP结果
如果split参数设置是test,则代表此时调用的是测试集图像,跑出来的就是测试集mAP的结果
还有重要的一点,不知道大家听懂了没。没有什么,验证和测试都是这个这个程序,只是有的人叫法不同。
split参数设置为val,代表测的就是验证集结果,大家就习惯叫成验证结果
split参数设置为test,代表测的就是测试集结果,大家就习惯叫成测试结果
它们两个共用一个程序!!!没有什么所谓的,别被迷惑了!!!
以上,大家常说的,验证集结果和测试集结果是多少。它们都是用这一个程序跑出来的,split参数不同代表调用的数据集不同。
还有,问的比较多的一点,没有测试集怎么办??没有就不用呗,就把split参数设置为val