当前位置:   article > 正文

再次认识ultralytics项目(大目标检测、小目标检测、yolov8-ghost、旋转目标检测、自动标注)_ultralytics yolov8

ultralytics yolov8

Ultralytics YOLOv8 是一款前沿、最先进(SOTA)的模型,基于先前 YOLO 版本的成功,引入了新功能和改进,进一步提升性能和灵活性。YOLOv8 设计快速、准确且易于使用,使其成为各种物体检测与跟踪、实例分割、图像分类和姿态估计任务的绝佳选择。
随着其官方团队对ultralytics项目的不断完善,其所支持的功能在不断扩展,为此重新对ultralytics项目进行深入分析。

1、基本情况

1.1 ultralytics项目能力

ultralytics项目支持图像分类、目标检测、实列分割、目标跟踪、姿态检测。

Ultralytics YOLO supported tasks

COCO数据集上预训练的YOLOv8 检测分割姿态模型可以在这里找到,以及在ImageNet数据集上预训练的YOLOv8 分类模型。所有的检测,分割和姿态模型都支持追踪模式。

所有模型在首次使用时会自动从最新的Ultralytics 发布版本下载。

1.2 与v5模型性能对比

yolov5与yolov8是最为广泛使用的目标检测项目,通过下图可以看出相同规模下的v5模型通常在速度比v8模型略快,但v8模型比v5要搞5个百分点;同时,v8模型比v5的更高档次模型精度更高。
在这里插入图片描述

1.3 性能信息

查看检测文档以获取这些在COCO上训练的模型的使用示例,其中包括80个预训练类别。从公开信息上看,yolov8的最搞coco map为53.9,似乎比yolov5p6(1280输入下 2 6 2^6 26倍下采样)要低,实则有待琢磨

模型尺寸
(像素)
mAPval
50-95
速度
CPU ONNX
(ms)
速度
A100 TensorRT
(ms)
参数
(M)
FLOPs
(B)
YOLOv8n64037.380.40.993.28.7
YOLOv8s64044.9128.41.2011.228.6
YOLOv8m64050.2234.71.8325.978.9
YOLOv8l64052.9375.22.3943.7165.2
YOLOv8x64053.9479.13.5368.2257.8
  • mAPval 值是基于单模型单尺度在 COCO val2017 数据集上的结果。
    通过 yolo val detect data=coco.yaml device=0 复现
  • 速度 是使用 Amazon EC2 P4d 实例对 COCO val 图像进行平均计算的。
    通过 yolo val detect data=coco.yaml batch=1 device=0|cpu 复现

yolov5的角度信息如下所示,可见其p6版本与正常版本相比将输入更改为1280,在v100 b1的推理下耗时约增加了30%~ 50% ,其精度提升了5~8个百分点。其中模型越小,推理时间增加越少,精度提升越快。yolov5np6提升了8个点,推理时间仅增加2ms(单图推理,增加30%的推理时间),性能基本上追平v8n模型。将图像size翻倍,计算量翻了4倍,cpu推理时间翻4倍,而gpu推理时间仅增加50%,可以看出单图推理时gpu是存在性能冗余;而在多图推理是,gpu时间差不多翻了4倍
在这里插入图片描述
目前v8也可以实现p6结构,参考v5p6结构的精度提升,可以预见v8模型的map提升4~7%,预计能将coco map突破60

2、基本使用

这里主要总结基于YOLOv8模型的常规使用

2.1 常规使用

通常使用yolov8都是进行目标检测与实例分割

from ultralytics import YOLO

# 加载模型
model = YOLO("yolov8n.yaml")  # 从头开始构建新模型
model = YOLO("yolov8n.pt")  # 加载预训练模型(建议用于训练)

# 使用模型
model.train(data="you-data.yaml", epochs=3)  # 训练模型
metrics = model.val()  # 在验证集上评估模型性能
results = model("https://ultralytics.com/images/bus.jpg")  # 对图像进行预测
success = model.export(format="onnx")  # 将模型导出为 ONNX 格式
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

其中yaml的格式如下所示

path: ./yolo-data  # dataset root dir
train: train/images  # train images (relative to 'path') 118287 images
val: val/images  # val images (relative to 'path') 5000 images
test: test/images  # 20288 of 40670 images, submit to https://competitions.codalab.org/competitions/20794

# Classes
names:
  0: cls1
  1: cls2
  2: cls3
  3: cls4
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

2.2 obb检测

obb是指旋转框检测,其对应的head代码如下,仅是在原来的detect上新增了一个角度预测分支。与之相应,在ultralytics\utils\loss.py中有v8OBBLoss,其主要包含RotatedTaskAlignedAssigner与RotatedBboxLoss,从中可以看出v8官方实现的obb在网络结构上是通用的,但在loss设计上与yolov5_obb的cls是完全不同的。

class OBB(Detect):
    """YOLOv8 OBB detection head for detection with rotation models."""

    def __init__(self, nc=80, ne=1, ch=()):
        super().__init__(nc, ch)
        self.ne = ne  # number of extra parameters
        self.detect = Detect.forward

        c4 = max(ch[0] // 4, self.ne)
        self.cv4 = nn.ModuleList(nn.Sequential(Conv(x, c4, 3), Conv(c4, c4, 3), nn.Conv2d(c4, self.ne, 1)) for x in ch)

    def forward(self, x):
        bs = x[0].shape[0]  # batch size
        angle = torch.cat([self.cv4[i](x[i]).view(bs, self.ne, -1) for i in range(self.nl)], 2)  # OBB theta logits
        # NOTE: set `angle` as an attribute so that `decode_bboxes` could use it.
        angle = (angle.sigmoid() - 0.25) * math.pi  # [-pi/4, 3pi/4]
        # angle = angle.sigmoid() * math.pi / 2  # [0, pi/2]
        if not self.training:
            self.angle = angle
        x = self.detect(self, x)
        if self.training:
            return x, angle
        return torch.cat([x, angle], 1) if self.export else (torch.cat([x[0], angle], 1), (x[1], angle))

    def decode_bboxes(self, bboxes):
        """Decode rotated bounding boxes."""
        return dist2rbox(self.dfl(bboxes), self.angle, self.anchors.unsqueeze(0), dim=1) * self.strides

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

目标v8官方团队并未公布v8-obb在dotav1上的精度,但根据博主自行实现的效果来看,map50与v5大致相同,map5095要比v5——obb搞5个百分点左右。
在这里插入图片描述基本使用
其使用代码与正常模型相同

from ultralytics import YOLO

# Load a model
model = YOLO('yolov8n-obb.yaml')  # build a new model from YAML
model = YOLO('yolov8n-obb.pt')  # load a pretrained model (recommended for training)
model = YOLO('yolov8n-obb.yaml').load('yolov8n.pt')  # build from YAML and transfer weights

# Train the model
results = model.train(data='dota128-obb.yaml', epochs=100, imgsz=640)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

其所需的数据格式与yolov8-seg类似,跟原始dota也相同(但没有difficult标注),不过其xy都是相对值
在这里插入图片描述

yolov8-obb的yaml文件如下所示

# Ultralytics YOLO 
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/380942
推荐阅读
相关标签