前言

本次是2024.0429最新更新。YOLOv8经过一年的沉淀,也已经逐渐成熟。YOLOv8论文还没出,猜测U神团队没打算写论文。目前最新的论文是YOLOv9,但v9需要的算力太高了,普通人还是抱以欣赏态度吧。

代码下载

目前最新版本的YOLOv8公开版是8.2.0版本

官方Github下载地址:https://github.com/ultralytics/ultralytics

yolo预训练权重_计算机视觉

YOLOv8结构图

图片来源于:

yolo预训练权重_计算机视觉_02

YOLOv8实操过程

(1)安装环境依赖,输入命令 :

pip install ultralytics

(2) 训练train

数据集格式跟v5相同,数据集这里不多赘述,不懂的可以搜一下。
主讲一下需要注意的地方:
第一,第一次用v8的童鞋们,可能找不到train.py在哪。v8的根目录不像v5直接有train.py 在v8中,要先进入路径:ultralytics/models/yolo/v8/detect,就可以看到train.pyval.py文件;

第二,直接输入命令python train.py或者直接运行tarin.py都是不行的。而且,v8的train.py找不到类似v5那种参数设置,如batchsize、workers等。
如何解决?
YOLOv8将超参数和其他参数的设置全部集成到了ultralytics/yolo/cfg/default.yaml(注意看清路径,别找半天找不到);
其中,default.yaml文件的参数如下:
注意黄色框的几个参数,task是选择训练任务类型,detect是目标检测,segment是分割任务;mode参数,train是训练,val是验证,predict是推理测试;model是使用的网络结构;data是数据集的设置;

yolo预训练权重_yolo预训练权重_03

第三,参数都设置好之后,可以直接输入命令,即可开始训练:
yolo cfg=ultralytics/yolo/cfg/default.yaml (没看错,不用怀疑,就是这个命令,不用什么.py)

重点!!!重点!!!重点!!!
以上训练命令,改参数太麻烦了,还费劲。
推荐使用以下方式:
直接自己在根目录下新建一个**train.py**文件,内容如下:

from ultralytics import YOLO

# Load a model
model = YOLO("ultralytics/cfg/models/v8/yolov8n.yaml")  # build a new model from scratch
model = YOLO("yolov8n.pt")  # load a pretrained model 不使用预训练权重,就注释这一行即可
# train
model.train(data='dataset/data.yaml',
                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 train.py或者直接运行train.py即可

(3)验证val

注意,这里直接写推荐的方式。
直接根目录新建一个val.py文件,直接运行即可:

from ultralytics import YOLO

if __name__ == '__main__':
    model = YOLO('runs/train/exp/weights/best.pt') # 自己训练结束后的模型权重
    model.val(data='dataset/data.yaml',
              split='val',
              imgsz=640,
              batch=16,
              save_json=True, # if you need to cal coco metrice
              project='runs/val',
              name='exp',
              )

下面讲解一下参数,以及什么叫“验证”。部分新手不理解这个程序的作用。

首先,在训练时和训练结束后,我知道会直接输出mAP值。但是,这不是最终结果,不能直接用,也不能说这是验证的结果,这些说法都是错的。

什么叫做验证?就是训练完后的模型权重,用val.py跑一遍,才叫验证。(别懒,必须得跑)
我知道,有人会说,val.py之后的mAP结果和训练完后的mAP结果一样,或者相差很小,也有相差大的时候(都不重要,别管,以val.py跑出来的结果为准)
这是因为,你val.py里面split参数设置的是val,代表此时调用的是验证集图像,跑出来的就是验证集mAP结果
如果split参数设置是test,则代表此时调用的是测试集图像,跑出来的就是测试集mAP的结果

还有重要的一点,不知道大家听懂了没。没有什么test.py,验证和测试都是这个val.py这个程序,只是有的人叫法不同。

split参数设置为val,代表测的就是验证集结果,大家就习惯叫成验证结果

split参数设置为test,代表测的就是测试集结果,大家就习惯叫成测试结果

它们两个共用一个程序!!!没有什么所谓的test.py,别被迷惑了!!!

yolo预训练权重_yolo预训练权重_04

以上,大家常说的,验证集结果和测试集结果是多少。它们都是用这一个程序val.py跑出来的,split参数不同代表调用的数据集不同。

还有,问的比较多的一点,没有测试集怎么办??没有就不用呗,就把split参数设置为val