YoloV8理解及部署-TODO
Posted hansjorn
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了YoloV8理解及部署-TODO相关的知识,希望对你有一定的参考价值。
官方版本:https://github.com/ultralytics/ultralytics
转载:https://zhuanlan.zhihu.com/p/598566644
具体创新包括一个新的骨干网络、一个新的 Ancher-Free 检测头和一个新的损失函数,可以在从 CPU 到 GPU 的各种硬件平台上运行。
下表为官方在 COCO Val 2017 数据集上测试的 mAP、参数量和 FLOPs 结果。可以看出 YOLOv8 相比 YOLOv5 精度提升非常多,但是 N/S/M 模型相应的参数量和 FLOPs 都增加了不少,从上图也可以看出相比 YOLOV5 大部分模型推理速度变慢了。(来源:https://github.com/open-mmlab/mmyolo/blob/dev/configs/yolov8/README.md)
1. YOLOv8 概述
具体到 YOLOv8 算法,其核心特性和改动可以归结为如下:
- 提供了一个全新的 SOTA 模型,包括 P5 640 和 P6 1280 分辨率的目标检测网络和基于 YOLACT 的实例分割模型。和 YOLOv5 一样,基于缩放系数也提供了 N/S/M/L/X 尺度的不同大小模型,用于满足不同场景需求
- 骨干网络和 Neck 部分可能参考了 YOLOv7 ELAN 设计思想,将 YOLOv5 的 C3 结构换成了梯度流更丰富的 C2f 结构,并对不同尺度模型调整了不同的通道数,属于对模型结构精心微调,不再是无脑一套参数应用所有模型,大幅提升了模型性能。不过这个 C2f 模块中存在 Split 等操作对特定硬件部署没有之前那么友好了
- Head 部分相比 YOLOv5 改动较大,换成了目前主流的解耦头结构,将分类和检测头分离,同时也从 Anchor-Based 换成了 Anchor-Free
- Loss 计算方面采用了 TaskAlignedAssigner 正样本分配策略,并引入了 Distribution Focal Loss
- 训练的数据增强部分引入了 YOLOX 中的最后 10 epoch 关闭 Mosiac 增强的操作,可以有效地提升精度
下面将按照模型结构设计、Loss 计算、训练数据增强、训练策略和模型推理过程共 5 个部分详细介绍 YOLOv8 目标检测的各种改进,实例分割部分暂时不进行描述。
2. 模型结构设计
以上为基于 YOLOv8-P5 model structure 官方代码所绘制的模型结构图。
在暂时不考虑 Head 情况下,对比 YOLOv5 和 YOLOv8 的 yaml 配置文件可以发现改动较小。
骨干网络和 Neck 的具体变化为:
- 第一个卷积层的 kernel 从 6x6 变成了 3x3
- 所有的 C3 模块换成 C2f,结构如下所示,可以发现多了更多的跳层连接和额外的 Split 操作
- 去掉了 Neck 模块中的 2 个卷积连接层
- Backbone 中 C2f 的block 数从 3-6-9-3 改成了 3-6-6-3
- 查看 N/S/M/L/X 等不同大小模型,可以发现 N/S 和 L/X 两组模型只是改了缩放系数,但是 S/M/L 等骨干网络的通道数设置不一样,没有遵循同一套缩放系数。如此设计的原因应该是同一套缩放系数下的通道设置不是最优设计,YOLOv7 网络设计时也没有遵循一套缩放系数作用于所有模型
Head 部分变化最大,从原先的耦合头变成了解耦头,并且从 YOLOv5 的 Anchor-Based 变成了 Anchor-Free。其结构如下所示:
可以看出,不再有之前的 objectness 分支,只有解耦的分类和回归分支,并且其回归分支使用了 Distribution Focal Loss 中提出的积分形式表示法, DFL 的描述见知乎推文: https://zhuanlan.zhihu.com/p/147691786
3. Loss 计算
Loss 计算过程包括 2 个部分: 正负样本分配策略和 Loss 计算。
现代目标检测器大部分都会在正负样本分配策略上面做文章,典型的如 YOLOX 的 simOTA、TOOD 的 TaskAlignedAssigner 和 RTMDet 的 DynamicSoftLabelAssigner,这类 Assigner 大都是动态分配策略,而 YOLOv5 采用的依然是静态分配策略。考虑到动态分配策略的优异性,YOLOv8 算法中则直接引用了 TOOD 的 TaskAlignedAssigner。
TaskAlignedAssigner 的匹配策略简单总结为: 根据分类与回归的分数加权的分数选择正样本。
s 是标注类别对应的预测分值,u 是预测框和 gt 框的 iou,两者相乘就可以衡量对齐程度。
- 对于每一个 GT,对所有的预测框基于 GT 类别对应分类分数,预测框与 GT 的 IoU 的加权得到一个关联分类以及回归的对齐分数 alignment_metrics
- 对于每一个 GT,直接基于 alignment_metrics 对齐分数选取 topK 大的作为正样本
Loss 计算包括 2 个分支: 分类和回归分支,没有了之前的 objectness 分支。
- 分类分支依然采用 BCE Loss
- 回归分支需要和 Distribution Focal Loss 中提出的积分形式表示法绑定,因此使用了 Distribution Focal Loss, 同时还使用了 CIoU Loss
3 个 Loss 采用一定权重比例加权即可。
4. 训练数据增强
数据增强方面和 YOLOv5 差距不大,只不过引入了 YOLOX 中提出的最后 10 个 epoch 关闭 Mosaic 的操作。假设训练 epoch 是 500,其示意图如下所示:
考虑到不同模型应该采用的数据增强强度不一样,因此对于不同大小模型,有部分超参会进行修改,典型的如大模型会开启 MixUp 和 CopyPaste。数据增强后典型效果如下所示:
上述效果可以运行https://github.com/open-mmlab/mmyolo/blob/dev/tools/analysis_tools/browse_dataset.py 脚本得到
由于每个 pipeline 都是比较常规的操作,本文不再赘述。如果想了解每个 pipeline 的细节,可以查看 MMYOLO 中 YOLOv5 的算法解析文档:https://mmyolo.readthedocs.io/zh_CN/latest/algorithm_descriptions/yolov5_description.html#id2
5. 训练策略
YOLOv8 的训练策略和 YOLOv5 没有啥区别,最大区别就是模型的训练总 epoch 数从 300 提升到了 500,这也导致训练时间急剧增加。以 YOLOv8-S 为例,其训练策略汇总如下:
配置 | YOLOv8-s P5 参数 |
optimizer | SGD |
base learning rate | 0.01 |
Base weight decay | 0.0005 |
optimizer momentum | 0.937 |
batch size | 128 |
learning rate schedule | linear |
training epochs | 500 |
warmup iterations | max(1000,3 * iters_per_epochs) |
input size | 640x640 |
EMA decay | 0.9999 |
6. 模型推理过程
YOLOv8 的推理过程和 YOLOv5 几乎一样,唯一差别在于前面需要对 Distribution Focal Loss 中的积分表示 bbox 形式进行解码,变成常规的 4 维度 bbox,后续计算过程就和 YOLOv5 一样了。
以 COCO 80 类为例,假设输入图片大小为 640x640,MMYOLO 中实现的推理过程示意图如下所示:
其推理和后处理过程为:
(1) bbox 积分形式转换为 4d bbox 格式
对 Head 输出的 bbox 分支进行转换,利用 Softmax 和 Conv 计算将积分形式转换为 4 维 bbox 格式
(2) 维度变换
YOLOv8 输出特征图尺度为 80x80、40x40 和 20x20 的三个特征图。Head 部分输出分类和回归共 6 个尺度的特征图。
将 3 个不同尺度的类别预测分支、bbox 预测分支进行拼接,并进行维度变换。为了后续方便处理,会将原先的通道维度置换到最后,类别预测分支 和 bbox 预测分支 shape 分别为 (b, 80x80+40x40+20x20, 80)=(b,8400,80),(b,8400,4)。
(3) 解码还原到原图尺度
分类预测分支进行 Sigmoid 计算,而 bbox 预测分支需要进行解码,还原为真实的原图解码后 xyxy 格式。
(4) 阈值过滤
遍历 batch 中的每张图,采用 score_thr 进行阈值过滤。在这过程中还需要考虑 multi_label 和 nms_pre,确保过滤后的检测框数目不会多于 nms_pre。
(5) 还原到原图尺度和 nms
基于前处理过程,将剩下的检测框还原到网络输出前的原图尺度,然后进行 nms 即可。最终输出的检测框不能多于 max_per_img。
有一个特别注意的点:YOLOv5 中采用的 Batch shape 推理策略,在 YOLOv8 推理中暂时没有开启,不清楚后面是否会开启,在 MMYOLO 中快速测试了下,如果开启 Batch shape 会涨大概 0.1~0.2。
7. 特征图可视化
MMYOLO 中提供了一套完善的特征图可视化工具,可以帮助用户可视化特征的分布情况。
以 YOLOv8-s 模型为例,第一步需要下载官方权重,然后将该权重通过https://github.com/open-mmlab/mmyolo/blob/dev/tools/model_converters/yolov8_to_mmyolo.py 脚本将去转换到 MMYOLO 中,注意必须要将脚本置于官方仓库下才能正确运行,假设得到的权重名字为 mmyolov8s.pth
假设想可视化 backbone 输出的 3 个特征图效果,则只需要
cd mmyolo # dev 分支
python demo/featmap_vis_demo.py demo/demo.jpg configs/yolov8/yolov8_s_syncbn_fast_8xb16-500e_coco.py mmyolov8s.pth --channel-reductio squeeze_mean
需要特别注意,为了确保特征图和图片叠加显示能对齐效果,需要先将原先的 test_pipeline 替换为如下:
test_pipeline = [
dict(
type=\'LoadImageFromFile\',
file_client_args=_base_.file_client_args),
dict(type=\'mmdet.Resize\', scale=img_scale, keep_ratio=False), # 这里将 LetterResize 修改成 mmdet.Resize
dict(type=\'LoadAnnotations\', with_bbox=True, _scope_=\'mmdet\'),
dict(
type=\'mmdet.PackDetInputs\',
meta_keys=(\'img_id\', \'img_path\', \'ori_shape\', \'img_shape\',
\'scale_factor\'))
]
从上图可以看出不同输出特征图层主要负责预测不同尺度的物体。
我们也可以可视化 Neck 层的 3 个输出层特征图:
cd mmyolo # dev 分支
python demo/featmap_vis_demo.py demo/demo.jpg configs/yolov8/yolov8_s_syncbn_fast_8xb16-500e_coco.py mmyolov8s.pth --channel-reductio squeeze_mean --target-layers neck
从上图可以发现物体处的特征更加聚焦。
总结
本文详细分析和总结了最新的 YOLOv8 算法,从整体设计到模型结构、Loss 计算、训练数据增强、训练策略和推理过程进行了详细的说明,并提供了大量的示意图供大家方便理解。
简单来说 YOLOv8 是一个包括了图像分类、Anchor-Free 物体检测和实例分割的高效算法,检测部分设计参考了目前大量优异的最新的 YOLO 改进算法,实现了新的 SOTA。
Yolov5部署训练及代码解读
5.Yolov5实操训练(重点)
一、前言
1.集成的资源,包括我自己做成的成品,可以直接train与detect。需要加qq群:938162384
2.本文目的主要是能够让读者复现,直接使用,而且少讲原理。如果想深入了解yolov5的原理,可以去看热度比较高的博主做的
3.如果是制作自己的数据集,那么有一个自己给训练集打标签的过程,那么需要看第五、六部分;如果用公开的数据集,那么可跳过第五部分
4.本次大更新,采用2022.06.28版本,应该是v6.1,
二、学习内容
2020年6月25日,Ultralytics发布了YOLOV5 的第一个正式版本,其性能与YOLO V4不相伯仲,同样也是现今最先进的对象检测技术,并在推理速度上是目前最强,yolov5按大小分为四个模型yolov5s、yolov5m、yolov5l、yolov5x。
操作的流程图
三、版本与配置声明
# YOLOv5 requirements
# Usage: pip install -r requirements.txt
# Base ----------------------------------------
matplotlib>=3.2.2
numpy>=1.18.5
opencv-python>=4.1.1
Pillow>=7.1.2
PyYAML>=5.3.1
requests>=2.23.0
scipy>=1.4.1 # Google Colab version
torch>=1.7.0
torchvision>=0.8.1
tqdm>=4.41.0
protobuf<4.21.3 # https://github.com/ultralytics/yolov5/issues/8012
# Logging -------------------------------------
tensorboard>=2.4.1
# wandb
# Plotting ------------------------------------
pandas>=1.1.4
seaborn>=0.11.0
# Export --------------------------------------
# coremltools>=4.1 # CoreML export
# onnx>=1.9.0 # ONNX export
# onnx-simplifier>=0.3.6 # ONNX simplifier
# scikit-learn==0.19.2 # CoreML quantization
# tensorflow>=2.4.1 # TFLite export
# tensorflowjs>=3.9.0 # TF.js export
# openvino-dev # OpenVINO export
# Extras --------------------------------------
ipython # interactive notebook
psutil # system utilization
thop # FLOPs computation
# albumentations>=1.0.3
# pycocotools>=2.0 # COCO mAP
# roboflow
四、Yolov5的准备
1.基本的Python环境配置
我采用的是Anaconda+Pycharm的配置,大家要了解一些关于pip的指令,方便管理包,这里就不赘述了。
2.下载Yolov5
https://github.com/ultralytics/yolov5,放在合理的位置,如果这个下的慢的话,通过qq群下载。
3.安装依赖库
当我们下好yolov5后,可以发现有一个requirements.txt文件,我们可以使用Anaconda Prompt(或者cmd或者pycharm的终端),执行下面一行代码(要requirements.txt所在文件夹下使用cmd等),即可一步到位全部下完。
pip install -r requirements.txt
这个过程下载很慢,可以进行pip加速,参考如下博客:
https://blog.csdn.net/zhengyuehai/article/details/124081661?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522167807035016800188592370%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=167807035016800188592370&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-2-124081661-null-null.142^v73^insert_down1,201^v4^add_ask,239^v2^insert_chatgpt&utm_term=pycharm%E7%BB%88%E7%AB%AF%E5%AE%89%E8%A3%85pip%E5%A4%AA%E6%85%A2&spm=1018.2226.3001.4187
大部分都能pip install 。重点说两个
(1)对于Pytorch,如果文件较大没有办法下完的话,可以用我下面的网址单独下载whl文件,
https://download.pytorch.org/whl/torch_stable.html
torch>=1.7.0
torchvision>=0.8.1
(2)对于wandb,wandb安装方法,这个好像不是必须的,但我还是下了,版本为0.12.19,刚好能兼容,作用就是对训练分析,如图所示
wandb安装方法:如果使用pip加速,直接安装就行不需要注册
pip install wandb
否则参考如下:
https://blog.csdn.net/hhhhhhhhhhwwwwwwwwww/article/details/116124285?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162791597216780265438950%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=162791597216780265438950&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_v2~rank_v29-8-116124285.first_rank_v2_pc_rank_v29&utm_term=wandb&spm=1018.2226.3001.4187
wandb实际上是非必须的,如果影响到了使用,那么在程序中可以把它禁止使用,不影响任何效果。在yolov5/utils/loggers/wandb/wandb_utils.py前面几行,加入如下图所示的第28行输入wandb=None
四、初步测试:detect.py
下载完yolov5后,什么都不用改,运行detect.py
这个是帮你检测能不能正常运行的
若正常:
在runs/detect/exp中能发现被处理过的标签,说明成功了!若程序报错,大概率是因为有的库版本不正确或者还未安装,这个自己调试一下即可,应该没有太大难度
五、训练集要求及路径要求
训练集至少100张起步才有效果。要想效果好,用公开的数据集,几千张才会有较好的效果。
训练集就是你需要train并用于detect的东西,我以玉米作为例子,你可以跟着我来一遍,资源在qq群。要做自己的训练集的话再看第五步。跟着我的话可以不用做标签,因为资源中已经做好了
如下图所示创建文件夹,让操作更清晰方便
images是图片,labels是标签,train的话是用于训练的,test就是用于测试的,这里一定一定要照着我的格式去建文件夹(seed_detection_model指训练的数据文件夹,这个可以改成你们的数据集的名字,但是其余的一定要一样),不然后面训练会出现找不到文件的报错
六、制作自己的数据集之制作标签
可采用labelme和labelimg,前者需要json标注格式转txt,后者需要xml标注格式转txt。我只用过前者,只给出前者的用法。
1.下载labelme
https://github.com/wkentaro/labelme,如果下载得慢的话见文末资源
2.安装依赖库
在pycharm终端里pip install pyqt5和pip install labelme
3.labelme操作
然后在pycharm终端里输入labelme,打开界面如下
可以选择打开一个文件或者文件夹,如果是打开文件夹的话就会是下面那样子
右击,点击rectangle,即画矩形框,框选你要识别训练的东西,举种子识别的例子
框选之后输入标签的名字,注意,必须选择矩形框,否则json转txt会出错,可以框选多个作为标签。框选完一张图后保存,然后接着下一张图。保存的文件格式是.json
4.json转txt
由于yolov5只认txt而不认json,因此还要有一个转换的过程
在yolov5-master中创建一个.py文件,代码如下
import json
import os
name2id = 'corn': 0, 'soybean': 1 # 标签名称
def convert(img_size, box):
dw = 1. / (img_size[0])
dh = 1. / (img_size[1])
x = (box[0] + box[2]) / 2.0 - 1
y = (box[1] + box[3]) / 2.0 - 1
w = box[2] - box[0]
h = box[3] - box[1]
x = x * dw
w = w * dw
y = y * dh
h = h * dh
return (x, y, w, h)
def decode_json(json_floder_path, json_name):
txt_name = 'C:\\\\Users\\\\17616\\\\Desktop\\\\txt\\\\' + json_name[0:-5] + '.txt'
# 存放txt的绝对路径
txt_file = open(txt_name, 'w')
json_path = os.path.join(json_floder_path, json_name)
data = json.load(open(json_path, 'r', encoding='gb2312', errors='ignore'))
img_w = data['imageWidth']
img_h = data['imageHeight']
for i in data['shapes']:
label_name = i['label']
if (i['shape_type'] == 'rectangle'):
x1 = int(i['points'][0][0])
y1 = int(i['points'][0][1])
x2 = int(i['points'][1][0])
y2 = int(i['points'][1][1])
bb = (x1, y1, x2, y2)
bbox = convert((img_w, img_h), bb)
txt_file.write(str(name2id[label_name]) + " " + " ".join([str(a) for a in bbox]) + '\\n')
if __name__ == "__main__":
json_floder_path = 'C:\\\\Users\\\\17616\\\\Desktop\\\\json\\\\'
# 存放json的文件夹的绝对路径
json_names = os.listdir(json_floder_path)
for json_name in json_names:
decode_json(json_floder_path, json_name)
建两个文件夹
转化完后大概会是这样子,如果一张图有多个标签的话,这个数据就会变多,
转换完的txt文件务必放在datasets/labels/train文件夹中
简单说明一下,第一个数字是数据集中第0个种类,其余均是与坐标相关的值,软件生成,可不用管。
5.xml转txt
如果使用别的打标签文件或者是原先已经打好的xml文件标签,那么我也给出相关的转换代码
import xml.etree.ElementTree as ET
import pickle
import os
from os import listdir, getcwd
from os.path import join
def convert(size, box):
# size=(width, height) b=(xmin, xmax, ymin, ymax)
# x_center = (xmax+xmin)/2 y_center = (ymax+ymin)/2
# x = x_center / width y = y_center / height
# w = (xmax-xmin) / width h = (ymax-ymin) / height
x_center = (box[0] + box[1]) / 2.0
y_center = (box[2] + box[3]) / 2.0
x = x_center / size[0]
y = y_center / size[1]
w = (box[1] - box[0]) / size[0]
h = (box[3] - box[2]) / size[1]
# print(x, y, w, h)
return (x, y, w, h)
def convert_annotation(xml_files_path, save_txt_files_path, classes):
xml_files = os.listdir(xml_files_path)
# print(xml_files)
for xml_name in xml_files:
# print(xml_name)
xml_file = os.path.join(xml_files_path, xml_name)
out_txt_path = os.path.join(save_txt_files_path, xml_name.split('.')[0] + '.txt')
out_txt_f = open(out_txt_path, 'w')
tree = ET.parse(xml_file)
root = tree.getroot()
size = root.find('size')
w = int(size.find('width').text)
h = int(size.find('height').text)
for obj in root.iter('object'):
difficult = obj.find('difficult').text
cls = obj.find('name').text
# if cls not in classes or int(difficult) == 1:
# continue
cls_id = classes.index(cls)
xmlbox = obj.find('bndbox')
b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text),
float(xmlbox.find('ymax').text))
# b=(xmin, xmax, ymin, ymax)
# print(w, h, b)
bb = convert((w, h), b)
out_txt_f.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\\n')
if __name__ == "__main__":
# 把forklift_pallet的voc的xml标签文件转化为yolo的txt标签文件
# 1、需要转化的类别
classes = ['People', 'Car', 'Bus', 'Motorcycle', 'Lamp', 'Truck']
# 2、voc格式的xml标签文件路径
xml_files1 = r'D:\\Technology\\Python_File\\yolov5\\M3FD\\Annotation_xml'
# xml_files1 = r'C:/Users/GuoQiang/Desktop/数据集/标签1'
# 3、转化为yolo格式的txt标签文件存储路径
save_txt_files1 = r'D:\\Technology\\Python_File\\yolov5\\M3FD\\Annotation_txt'
convert_annotation(xml_files1, save_txt_files1, classes)
七、修改配置文件
1.coco128.yaml->seed_detection_parameter.yaml
在yolov5/data/coco128.yaml中先复制一份,粘贴到Seed_detection_model文件夹中,改名为Seed_detection_model_parameter.yaml(意义为Seed_detection_model的参数配置)
Seed_detection_model_parameter.yaml(文件需要修改的参数是nc与names。nc是标签名个数,names就是标签的名字,检测目标例子中有2个标签[玉米,大豆],标签名字都如下。
说明:
path是绝对路径
train是在path绝对路径条件下的训练集路径,即:Seed_detection_model\\datasets\\images\\train
val同上,但是是验证集,这里我为了方便,让训练集和验证集是一个,也没啥大问题。
test可不填
关于训练集、验证集、测试集三者关系:
https://blog.csdn.net/nkwshuyi/article/details/94593053
nc是训练集中种类的个数,names是他们对应的名字,这个顺序不要混了,尤其是自己打标签时,会有对应的顺序的。
2.yolov5x.yaml->seed_detection_model.yaml
yolov5有4种配置,不同配置的特性如下,我这里选择yolov5x,效果较好,但是训练时间长,也比较吃显存
yolov5有4种配置,不同配置的特性如下,我这里选择yolov5x,效果较好,但是训练时间长,也比较吃显存
在yolov5/models先复制一份yolov5x.yaml至Seed_detection_model文件夹中,更名为seed_detection_model.yaml(意为模型),只将如下的nc修改为训练集种类即可
八、开始训练train
1.调参
在train.py,找到def parse_opt(known=False)这行,这下面是我们要修改的程序部分
def parse_opt(known=False):
parser = argparse.ArgumentParser()
parser.add_argument('--weights', type=str, default='yolov5x.pt', help='initial weights path') # 修改处 初始权重
parser.add_argument('--cfg', type=str, default=ROOT /'Seed_detection_model/Seed_detection_model.yaml', help='model.yaml path') # 修改处 训练模型文件
parser.add_argument('--data', type=str, default=ROOT /'Seed_detection_model/Seed_detection_parameter.yaml', help='dataset.yaml path') # 修改处 数据集参数文件
parser.add_argument('--hyp', type=str, default=ROOT / 'data/hyps/hyp.scratch-low.yaml', help='hyperparameters path') # 超参数设置
parser.add_argument('--epochs', type=int, default=100) # 修改处 训练轮数
parser.add_argument('--batch-size', type=int, default=10, help='total batch size for all GPUs, -1 for autobatch') # 修改处 batch size
parser.add_argument('--imgsz', '--img', '--img-size', type=int, default=300, help='train, val image size (pixels)')# 修改处 图片大小
parser.add_argument('--rect', action='store_true', help='rectangular training')
parser.add_argument('--resume', nargs='?', const=True, default=False, help='resume most recent training')
parser.add_argument('--nosave', action='store_true', help='only save final checkpoint')
parser.add_argument('--noval', action='store_true', help='only validate final epoch')
parser.add_argument('--noautoanchor', action='store_true', help='disable AutoAnchor')
parser.add_argument('--noplots', action='store_true', help='save no plot files')
parser.add_argument('--evolve', type=int, nargs='?', const=300, help='evolve hyperparameters for x generations')
parser.add_argument('--bucket', type=str, default='', help='gsutil bucket')
parser.add_argument('--cache', type=str, nargs='?', const='ram', help='--cache images in "ram" (default) or "disk"')
parser.add_argument('--image-weights', action='store_true', help='use weighted image selection for training')
parser.add_argument('--device', default='cpu', help='cuda device, i.e. 0 or 0,1,2,3 or cpu')#修改处,选择
parser.add_argument('--multi-scale', action='store_true', help='vary img-size +/- 50%%')
parser.add_argument('--single-cls', action='store_true', help='train multi-class data as single-class')
parser.add_argument('--optimizer', type=str, choices=['SGD', 'Adam', 'AdamW'], default='SGD', help='optimizer')
parser.add_argument('--sync-bn', action='store_true', help='use SyncBatchNorm, only available in DDP mode')
parser.add_argument('--workers', type=int, default=4, help='max dataloader workers (per RANK in DDP mode)')#修改处
parser.add_argument('--project', default=ROOT / '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('--quad', action='store_true', help='quad dataloader')
parser.add_argument('--cos-lr', action='store_true', help='cosine LR scheduler')
parser.add_argument('--label-smoothing', type=float, default=0.0, help='Label smoothing epsilon')
parser.add_argument('--patience', type=int, default=100, help='EarlyStopping patience (epochs without improvement)')
parser.add_argument('--freeze', nargs='+', type=int, default=[0], help='Freeze layers: backbone=10, first3=0 1 2')
parser.add_argument('--save-period', type=int, default=-1, help='Save checkpoint every x epochs (disabled if < 1)')
parser.add_argument('--local_rank', type=int, default=-1, help='DDP parameter, do not modify')
yolov8从0开始搭建部署YOLOv8,环境安装+推理+自定义数据集搭建与训练,一小时掌握
Windows10下yolov8 tensorrt模型加速部署实战
win10下 yolov8 tensorrt模型加速部署实战