yolov8命令行运行参数详解,运行方式的改进(符合yolov5的风格)

yolov8的使用和改进

第一章:yolov8命令行运行参数详解,运行方式的改进(符合yolov5的风格)


前言

这篇主要介绍yolov8的参数含义以及命令行运行方式的改进,yolov8的参数含义与yolov5大致相似,但是运行方式又有所不同,这对于用惯yolov5(python命令行和argparse管理)的同学来说比较难受,所以改进了其命令行的运行方式,使得与yolov5的运行方式相同


一、yolov8参数含义

源码的参数可以归类为四部分:

  1. yolo【启动命令】
  2. task【是[detect、segment、classification]中的一个。如果没有显式传递,YOLOv8将尝试从模型类型中猜测TASK】
  3. mode 【(必选) 是[train, val, predict, export]中的一个】
  4. args【(可选) 是任意数量的自定义arg=value对,如imgsz=320,覆盖默认值】

值得注意的是,每一个mode都有固定而不同的args(参数),yolov8支持你可以输入所有参数,但是代码会根据mode来自动选择使用特定的参数。以下是不同mode的参数详解(同时附上官网链接):
train: https://docs.ultralytics.com/modes/train/#arguments
在这里插入图片描述
val: https://docs.ultralytics.com/modes/val/#arguments
在这里插入图片描述
predict: https://docs.ultralytics.com/modes/predict/#arguments
在这里插入图片描述
export: https://docs.ultralytics.com/modes/export/
在这里插入图片描述

二、参数管理和代码运行方式的改进

1.yolov8的运行示例

训练命令行示例:

# 从YAML中构建一个新模型,并从头开始训练
yolo detect train data=coco128.yaml model=yolov8n.yaml epochs=100 imgsz=640

# 从预先训练的*.pt模型开始训练
yolo detect train data=coco128.yaml model=yolov8n.pt epochs=100 imgsz=640

# 从YAML中构建一个新的模型,将预训练的权重传递给它,并开始训练
yolo detect train data=coco128.yaml model=yolov8n.yaml pretrained=yolov8n.pt epochs=100 imgsz=640

对应python代码示例

from ultralytics import YOLO

# Load a model
model = YOLO('yolov8n.yaml')  # 从YAML中构建一个新模型
model = YOLO('yolov8n.pt')  #加载预训练的模型(推荐用于训练)
model = YOLO('yolov8n.yaml').load('yolov8n.pt')  # 从YAML构建并传递权重

# Train the model
model.train(data='coco128.yaml', epochs=100, imgsz=640)

可以看出,不管是使用yolov8命令行运行代码,还是python示例运行,和yolov5的风格区别较大,这对于习惯于用argparse参数方式的人来说有些许难受,所以我把接口做了改进。

argparse模式

python train.py --data coco128.yaml --weights yolov8n.pt --imgsz 640

2.yolov8运行代码的改进

改进后的命令行格式只需要将yolo改成python,参数前面加上‘- -’,也就是说完全符合yolov5的风格。

命令行示例:

python pythoncil.py --task detect --mode train --data coco128.yaml --weights yolov8n.pt --imgsz 640

在工程主目录新建pythoncil.py文件,粘贴如下代码,就可以实现上述功能。值得注意的是:我将训练超参数单独写在一个yaml文件中,在以下代码中会加载进去覆盖yolov8默认的训练超参数(在- -hyp中指定地址)。(这样符合yolov5的文件管理方式,也方便参数管理)

# -*- coding:utf-8 -*-
"""
作者:ChenTao
日期:2023年05月20日
"""
import argparse
import yaml
from ultralytics import YOLO

remove = {'weight': None, 'hyp': None}


def parse_opt(known=False):
    parser = argparse.ArgumentParser()
    parser.add_argument('--task', type=str, default='detect', help='YOLO task, i.e. detect, segment, classify, pose')
    parser.add_argument('--mode', type=str, default='train',
                        help='YOLO mode, i.e. train, val, predict, export, track, benchmark')

    # Train settings ---------------------------------------------------------------------------------------------------
    parser.add_argument('--weight', type=str, default='yolov8s.pt', help='initial weights path')
    parser.add_argument('--model', type=str, default='ultralytics/models/v8/yolov8n.yaml', help='model.yaml path')
    parser.add_argument('--data', type=str, default='ultralytics/datasets/coco128.yaml', help='dataset.yaml path')
    parser.add_argument('--hyp', type=str, default='ultralytics/datasets/hyp/default.yaml', help='hyperparameters path')
    parser.add_argument('--epochs', type=int, default=300, help='total training epochs')
    parser.add_argument('--patience', type=int, default=50,
                        help='epochs to wait for no observable improvement for early stopping of training')
    parser.add_argument('--batch', type=int, default=1, help='total batch size for all GPUs, -1 for autobatch')
    parser.add_argument('--imgsz', '--img', '--img-size', type=int, default=640, help='train, val image size (pixels)')
    parser.add_argument('--save', type=bool, default=True, help='save train checkpoints and predict results')
    parser.add_argument('--save-period', type=int, default=-1, help='Save checkpoint every x epochs (disabled if < 1)')
    parser.add_argument('--cache', type=str, nargs='?', const='ram', help='--cache images in "ram" (default) or "disk"')
    parser.add_argument('--device', default='', help='cuda device, i.e. 0 or 0,1,2,3 or cpu')
    parser.add_argument('--workers', type=int, default=8, help='max dataloader workers (per RANK in DDP mode)')
    parser.add_argument('--project', default='runs/train', help='save to project/name')
    parser.add_argument('--name', default='exp', help='save to project/name')
    parser.add_argument('--exist-ok', action='store_true', help='existing project/name ok, do not increment')
    parser.add_argument('--pretrained', action='store_true', help='whether to use a pretrained model')
    parser.add_argument('--optimizer', type=str, choices=['SGD', 'Adam', 'AdamW'], default='SGD', help='optimizer')
    parser.add_argument('--verbose', type=bool, default=True, help='whether to print verbose output')
    parser.add_argument('--seed', type=int, default=0, help='Global training seed')
    parser.add_argument('--deterministic', type=bool, default=True, help='whether to enable deterministic mode')
    parser.add_argument('--single-cls', action='store_true', help='train multi-class data as single-class')
    parser.add_argument('--rect', action='store_true', help='rectangular training')
    parser.add_argument('--cos-lr', action='store_true', help='cosine LR scheduler')
    parser.add_argument('--close_mosaic', type=int, default=0,
                        help='(int) disable mosaic augmentation for final epochs')
    parser.add_argument('--resume', nargs='?', const=True, default=False, help='resume most recent training')
    parser.add_argument('--amp', type=bool, default=True,
                        help='Automatic Mixed Precision (AMP) training, choices=[True, False], True runs AMP check')
    # Segmentation
    parser.add_argument('--overlap_mask', type=bool, default=True,
                        help='masks should overlap during training (segment train only)')
    parser.add_argument('--mask_ratio', type=int, default=4, help='mask downsample ratio (segment train only)')
    # Classification
    parser.add_argument('--dropout', type=float, default=0.0, help='use dropout regularization (classify train only)')

    # Val/Test settings ------------------------------------------------------------------------------------------------
    parser.add_argument('--val', type=bool, default=True, help='validate/test during training')
    parser.add_argument('--split', type=str, default='val', help="dataset split to use for validation, i.e. 'val', "
                                                                 "'test' or 'train'")
    parser.add_argument('--save_json', action='store_true', help='save results to JSON file')
    parser.add_argument('--save_hybrid', action='store_true', help='save hybrid version of labels (labels + '
                                                                   'additional predictions)')
    parser.add_argument('--conf', type=float, default=0.001, help='object confidence threshold for detection (default '
                                                                  '0.25 predict, 0.001 val)')
    parser.add_argument('--iou', type=float, default=0.7, help='intersection over union (IoU) threshold for NMS')
    parser.add_argument('--max_det', type=int, default=300, help='maximum number of detections per image')
    parser.add_argument('--half', action='store_true', help='use half precision (FP16)')
    parser.add_argument('--dnn', action='store_true', help='use OpenCV DNN for ONNX inference')
    parser.add_argument('--plots', type=bool, default=True, help='save plots during train/val')

    # Prediction settings ----------------------------------------------------------------------------------------------
    parser.add_argument('--source', type=str, default='', help='source directory for images or videos')
    parser.add_argument('--show', action='store_true', help='show results if possible')
    parser.add_argument('--save_txt', action='store_true', help='save results as .txt file')
    parser.add_argument('--save_conf', action='store_true', help='save results with confidence scores')
    parser.add_argument('--save_crop', action='store_true', help='save cropped images with results')
    parser.add_argument('--show_labels', type=bool, default=True, help='show object labels in plots')
    parser.add_argument('--show_conf', type=bool, default=True, help='show object confidence scores in plots')
    parser.add_argument('--vid_stride', type=int, default=1, help='video frame-rate stride')
    parser.add_argument('--line_width', type=int, default=None, help='line width of the bounding boxes')
    parser.add_argument('--visualize', action='store_true', help='visualize model features')
    parser.add_argument('--augment', action='store_true', help='apply image augmentation to prediction sources')
    parser.add_argument('--agnostic_nms', action='store_true', help='class-agnostic NMS')
    parser.add_argument('--classes', nargs='+', type=int, help='filter results by class, i.e. class=0, or class=[0,2,3]')
    parser.add_argument('--retina_masks', action='store_true', help='use high-resolution segmentation masks')
    parser.add_argument('--boxes', type=bool, default=True, help='Show boxes in segmentation predictions')

    # Export settings --------------------------------------------------------------------------------------------------
    parser.add_argument('--format', type=str, default='onnx', help='format to export to')
    parser.add_argument('--keras', action='store_true', help='use Keras')
    parser.add_argument('--optimize', action='store_true', help='TorchScript: optimize for mobile')
    parser.add_argument('--int8', action='store_true', help='CoreML/TF INT8 quantization')
    parser.add_argument('--dynamic', action='store_true', help='ONNX/TF/TensorRT: dynamic axes')
    parser.add_argument('--simplify', action='store_true', help='ONNX: simplify model')
    parser.add_argument('--opset', action='store_true', help='opset version (optional)')
    parser.add_argument('--workspace', action='store_true', help='TensorRT: workspace size (GB)')
    parser.add_argument('--nms', action='store_true', help='CoreML: add NMS')
    return parser.parse_known_args()[0] if known else parser.parse_args()


def load_yaml(path):
    with open(path, 'r', encoding='utf-8') as f:
        hyp = yaml.safe_load(f)
    return hyp


def remove_key(dic):
    for key in remove.keys():
        del dic[key]
    return dic


def run(**kwargs):
    # Usage: import pythoncil; pythoncil.run(task='', mode='', data='coco128.yaml', imgsz=320, weights='yolov8m.pt')
    opt = parse_opt(True)
    dic = load_yaml('ultralytics/yolo/cfg/default.yaml')

    for k, v in kwargs.items():
        setattr(opt, k, v)
    for arg in vars(opt):
        dic[arg] = getattr(opt, arg)

    # Load Hyperparameters
    hyp = load_yaml(opt.hyp)
    for key in hyp.keys():
        dic[key] = hyp[key]

    dic['project'] = f"runs/{dic['task']}/{dic['mode']}"
    dic['name'] = f"{dic['data'].split('/')[-1].split('.')[0]}-{dic['model'].split('/')[-1].split('.')[0]}-{dic['imgsz']}- "
    if dic['mode'] == 'train':
        model = YOLO(dic['model'], task=dic['task']).load(dic['weight'])
        model.train(**remove_key(dic))
    elif dic['mode'] == 'val':
        model = YOLO(dic['weight'])
        model.val(**remove_key(dic))
    elif dic['mode'] == 'predict':
        model = YOLO(dic['weight'])
        model.predict(**remove_key(dic))
    elif dic['mode'] == 'export':
        model = YOLO(dic['weight'])
        model.export(**remove_key(dic))


run()


总结

本文分析的yolov8的参数含义和使用方式,并对其进行改进使得其符合yolov5的参数管理方式和代码运行方式,毕竟yolov5经过长时间的磨炼,是非常优秀的项目,值得我们借鉴。

  • 26
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 23
    评论
yolov8训练结果参数详解如下: - model:传入的model.yaml文件或者model.pt文件,用于构建网络和初始化。如果只传入yaml文件,则参数将会被随机初始化。 - data:训练数据集的配置yaml文件。 - epochs:训练轮次,默认为100。 - patience:早停训练观察的轮次,默认为50。如果经过50轮没有精度提升,则模型会直接停止训练。 - batch:训练批次,默认为16。 - imgsz:训练图片大小,默认为640。 - save:保存训练过程和训练权重,默认为开启。可以通过设置save_period参数来设定训练过程中每隔多少个轮次保存一次训练模型,默认为-1(不开启保存)。 - cache:是否采用RAM进行数据载入。设置为True可以加快训练速度,但会消耗大量内存。一般在服务器上使用。 - device:要运行的设备,可以是cuda device =0或Device =0,1,2,3,也可以是device = cpu。 - workers:载入数据的线程数。在Windows上一般为4,服务器可以设置更大。如果在Windows上遇到线程报错,可以尝试减少这个参数。默认为8。 - project:项目文件夹的名字,默认为runs。 - name:用于保存训练文件夹的名字,默认为exp,每次训练会依次累加。 - exist_ok:是否覆盖现有保存文件夹,默认为False。 - pretrained:是否加载预训练权重,默认为False。 - optimizer:优化器选择,默认为SGD。可选项包括SGD、Adam、AdamW、RMSProP。 - verbose:是否打印详细输出。 - seed:随机种子,用于复现模型,默认为0。 - deterministic:设置为True,保证实验的可复现性。 - single_cls:将多类数据训练为单类,将所有数据当作单类训练,默认为False。 - image_weights:使用加权图像选择进行训练,默认为False。 - rect:使用矩形训练,默认为False。 - cos_lr:使用余弦学习率调度,默认为False。 - close_mosaic:在最后x个轮次禁用马赛克增强,默认为10。 - resume:断点训练,默认为False。 - lr0:初始化学习率,默认为0.01。 - lrf:最终学习率,默认为0.01。 - label_smoothing:标签平滑参数,默认为0.0。 - dropout:使用dropout正则化(仅对训练进行分类),默认为0.0。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 23
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

泡椒香菜‍

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值