赞
踩
论文:暂无
官方文档:https://docs.ultralytics.com/
代码:https://github.com/ultralytics/ultralytics
出处:2023.01 | Ultralytics (同 YOLOv5)
YOLO (You Only Look Once) 是目前非常流行的一种目标检测和图像分割的框架:
YOLOv8 是由 Ultralytics 提出的,YOLOv8 的一个最大的特点是可扩展性,不仅仅支持一种算法,而是和前面的所有 YOLO 算法框架兼容的,可以通过修改配置参数来轻松的修改训练使用的 YOLO 算法。
YOLOv8 支持以下 3 个任务:
目标检测上的效果:
实例分割上的效果:
图像分类上的效果:
# 方法 1:直接安装
pip install ultralytics
# 方法 2:通过 clone 的方法安装
git clone https://github.com/ultralytics/ultralytics
cd ultralytics
pip install -e '.[dev]'
下面以目标检测任务来展示一下相关命令的简单使用,实例分割和图像分类只需要修改 task 和对应的 model 即可!
1、简单使用:
# python
from ultralytics import YOLO
# Load a model
model = YOLO("yolov8n.yaml") # build a new model from scratch
model = YOLO("yolov8n.pt") # load a pretrained model (recommended for training)
# Use the model
results = model.train(data="coco128.yaml", epochs=3) # train the model
results = model.val() # evaluate model performance on the validation set
results = model("https://ultralytics.com/images/bus.jpg") # predict on an image
success = model.export(format="onnx") # export the model to ONNX format
# CLI(command line interface, 命令行)
yolo task=detect mode=train model=yolov8n.yaml args...
classify predict yolov8n-cls.yaml args...
segment val yolov8n-seg.yaml args...
export yolov8n.pt format=onnx args...
# train
yolo task=detect mode=train model=yolov8n.pt data=coco128.yaml device=0
yolo task=detect mode=train model=yolov8n.pt data=coco128.yaml device=\'0,1,2,3\'
2、训练:
# python
from ultralytics import YOLO
# Load a model
model = YOLO("yolov8n.yaml") # build a new model from scratch
model = YOLO("yolov8n.pt") # load a pretrained model (recommended for training)
# Train the model
results = model.train(data="coco128.yaml", epochs=100, imgsz=640)
# CLI ()
yolo task=detect mode=train data=coco128.yaml model=yolov8n.pt epochs=100 imgsz=640
3、验证:
# python
from ultralytics import YOLO
# Load a model
model = YOLO("yolov8n.pt") # load an official model
model = YOLO("path/to/best.pt") # load a custom model
# Validate the model
results = model.val() # no arguments needed, dataset and settings remembered
# CLI
yolo task=detect mode=val model=yolov8n.pt # val official model
yolo task=detect mode=val model=path/to/best.pt # val custom model
4、预测可视化:
# python
from ultralytics import YOLO
# Load a model
model = YOLO("yolov8n.pt") # load an official model
model = YOLO("path/to/best.pt") # load a custom model
# Predict with the model
results = model("https://ultralytics.com/images/bus.jpg") # predict on an image
# CLI
yolo task=detect mode=predict model=yolov8n.pt source="https://ultralytics.com/images/bus.jpg" # predict with official model
yolo task=detect mode=predict model=path/to/best.pt source="https://ultralytics.com/images/bus.jpg" # predict with custom model
5、模型转换 Export
# python
from ultralytics import YOLO
# Load a model
model = YOLO("yolov8n.pt") # load an official model
model = YOLO("path/to/best.pt") # load a custom trained
# Export the model
model.export(format="onnx")
# CLI
yolo mode=export mod
el=yolov8n.pt format=onnx # export official model
yolo mode=export model=path/to/best.pt format=onnx # export custom trained model
YOLOv5 的数据格式回顾:
- images
- train
- img1.jpg
- val
- img2.jpg
- labels
- train
- img1.txt
- val
- img2.txt
其中,labels 中的 txt 内容示例如下:
类别 x_center y_center width height
45 0.479492 0.688771 0.955609 0.5955
45 0.736516 0.247188 0.498875 0.476417
50 0.637063 0.732938 0.494125 0.510583
45 0.339438 0.418896 0.678875 0.7815
49 0.646836 0.132552 0.118047 0.0969375
49 0.773148 0.129802 0.0907344 0.0972292
49 0.668297 0.226906 0.131281 0.146896
49 0.642859 0.0792187 0.148063 0.148062
上面的 5 列数据分别表示框的类别编号(coco 中的类别编号)、框中心点 x 坐标,框中心点 y 坐标,框宽度 w,框高度 h
框的坐标参数如何从 COCO 格式 (x_min, y_min, w, h)
转换为 YOLO 可用的格式 (x_center, y_center, w, h)
:
x_center
和 width
如何从坐标点转换为 0~1 的参数:x_center = x_coco/img_witdh
, width = width_coco/img_width
y_center
和 height
如何从坐标点转换为 0~1 的参数:y_center = y_coco/img_height
, height = height_coco/img_height
Ultralytics HUB 使用的数据集合 YOLOv5 一样,使用相同的组织结构和标签形式
在上传自己的数据集的时候,首先要确认的是 dataset root 中存在你的 dataset YAML,然后使用 zip
命令将数据集打包,上传至 https://hub.ultralytics.com/。
以 ultralytics/hub/coco6.zip
为例,coco6.yaml 要放到 coco6 文件夹里边,并一同打包用于上传,整理的格式如下:
YAML 中的内容格式和 YOLOv5 的相同,格式如下:
# Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..]
path: # dataset root dir (leave empty for HUB)
train: images/train # train images (relative to 'path') 8 images
val: images/val # val images (relative to 'path') 8 images
test: # test images (optional)
# Classes
names:
0: person
1: bicycle
2: car
3: motorcycle
...
将 COCO 格式的 json 转换成 YOLOv5 格式的 json 方式如下:
import os
import json
from pathlib import Path
def coco2yolov5(coco_json_path, yolo_txt_path):
with open(coco_json_path, 'r') as f:
info = json.load(f)
coco_anno = info["annotations"]
coco_images = info["images"]
for img in coco_images:
img_info = {
"file_name": img["file_name"],
"img_id": img["id"],
"img_width": img["width"],
"img_height": img["height"]
}
for anno in coco_anno:
image_id = anno["image_id"]
category_id = anno["category_id"]
bbox = anno["bbox"]
line = str(category_id - 1)
if image_id == img_info["img_id"]:
txt_name = Path(img_info["file_name"]).name.split('.')[0]
yolo_txt = yolo_txt_path + '{}.txt'.format(txt_name)
with open(yolo_txt, 'a') as wf:
# coco: [x_min, y_min, w, h]
yolo_bbox = []
yolo_bbox.append(round((bbox[0] + bbox[2]) / img_info["img_width"], 6))
yolo_bbox.append(round((bbox[1] + bbox[3]) / img_info["img_height"], 6))
yolo_bbox.append(round(bbox[2] / img_info["img_width"], 6))
yolo_bbox.append(round(bbox[3] / img_info["img_height"], 6))
for bbox in yolo_bbox:
line += ' ' + str(bbox)
line += '\n'
wf.writelines(line)
if __name__ == "__main__":
coco_json_path = "part1_all_coco.json"
yolo_txt_path = "val/"
if not os.path.exists(yolo_txt_path):
os.makedirs(yolo_txt_path)
coco2yolov5(coco_json_path, yolo_txt_path)
然后登陆 Ultralytics HUB 并上传 dataset:
训练好后,可以下载 Ultralytics App 然后在移动端进行部署。
YOLOv8(Anchor-free)相对于 YOLOv5(Anchor-based)的改动如下:
Label Assignment:
为了应对 NMS,anchor 分配应该满足如下两个规则:
TAL 是怎么做的:
TOOD 为什么被 YOLOv6、PP-YOLOE、PicoDet、YOLOv8 都选择了?
YOLOv8 和 YOLOv5 出自同一团队,故 YOLOv8 也可以看做在 YOLOv5 上的优化,结构也很类似,下面来对比一下 YOLOv5 和 YOLOv8 的异同点。
模块 | YOLOv8 | YOLOv5 |
---|---|---|
输入尺寸 | 640x640x3 | 640x640x3 |
Backbone | C2f(增加了更多梯度流的信息) | C3 |
Neck | PA-FPN | PA-FPN |
Head | 分类回归解耦 head | 耦合 head |
Anchor | Anchor-free | Anchor-based |
Label Assign | TAL | 以 gt 中心点在 grid 的象限位置来判断正负样本 |
objectness | 否 | 是 |
输出 | 20x20x(4+cls) / 40x40x(4+cls) / 80x80x(4+cls) | 20x20x(5+cls) / 40x40x(5+cls) / 80x80x(5+cls) |
YOLOv8 模型框架结构如下:
YOLOv8 模块细节如下:
YOLOv5 模型框架如下:
YOLOv5 模块细节如下:
1、数据集修改
在 ultralytics/datasets/
下新建自己的数据集 yaml 文件,改成自己数据集的 train、val、test 路径,将 names 也改成自己数据集的类别名称
2、模型配置文件修改
模型配置文件的基础文件在 ultralytics/yolo/cfg/default.yaml
中,其中写了很多默认的参数,如果在训练时候重新指定了更高级别的 --cfg,则 cfg 对应的 yaml 文件更高级,会覆盖 default.yaml 中的部分参数。
# Ultralytics YOLO 声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/90940
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。