以YOLOv8为例详解YOLO系列

一、History

YOLO:You only look once,其特征如其名,快!只看一次的速度就可以实现图片检测和分割。

由华盛顿大学的Redmon和Farhadi在15年发表,以其高超的速度和准确率迅速得到普及。

1.1 v2

提供了合并批量正则化;固定盒子;维度簇;

1.2 v3

使用更快速的主干网络,多重anchor和大椎池化层

1.3 v4

引入Mosaic 数据增强方法;一种无anchor的检测头;以及一种新的损失函数;

1.4 v5

进一步改善模型性能;增加了超参数优化器、完整的试验追踪、自动输出成流行的排版。

1.5 v6

被开源,用于很多公司的自动化交付机器人。

1.6 v7

提供了如COCO数据集上的姿势评估。

1.7 v8

最新版本,现在被Ultralytics所主持开发。

具有更强的表现,灵活性和效率。

支持物理检测、分割、姿势估计、追踪以及分类任务,几乎大多数AI主流的任务。

附上官网的历代版本性能对比,通过对于COCO数据集上的表现可以看出:可以看到每代之间参数更少,速度更快。

目前V8的子版本性能对比

二、YOLOv8的组成部分

官网上的DOC没有详细介绍模型的结构,随即找到其核心源码的分支目录。

退到上一节详细查看其各个核心组件(层)的结构:

2.1 block

第一个块DFL,是一种损失,通俗来说先进行了卷积,然后转置以后计算Softmax损失。

2.2 Proto

这是一种用于分割的模块,上采样以后经过两次卷积。

2.3 HGStem

这是一种PPHGNetV2 的主干附带了5个卷积以及一个最大池化层

2.4 HGBlock

属于PPHGNetV2带有两层卷积和一个轻量类型的卷积

2.5 SPP

是一种池化,在V3版本中被提出

2.6 SPPF

更快的SSP,在V5中被提出,它的快速的特性源于其m已经定义好,取代了原有的FOR循环,也就是说优化了性能。

2.7 C1-C3

使用了不同数量的卷积和CSP 瓶颈块,1-3代表其卷积数量。

2.8 GhostBottleneck

进行了特殊的卷积和深度可分离卷积(DeepWiseConvolution),然后产生输出向量。

三、Head分支(主要定义各种任务所要执行的类,一个任务一个类以及一个负责输出的模块)

主要有检测、分割、分类等。这些表示所要执行的任务的类负责将组成部分写好的各个方法集成在一起完成特定的任务。

负责输出的模块主要进行与编码器对接,并且进行参数的最后处理,其中主要有:接受编码器的输入;产生锚(anchor,俗一点来说就是框住物体的方框);以及重新调整超参数的函数。

好了,就到这里了,对于YOLO的解读。

码字不易,点赞收藏加关注。

欢迎关注无神一起学机器学习。

  • 8
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
yolov5是一个目标检测算法,yolo.py是其中的一个核心文件,主要实现了模型的构建和训练。下面是yolo.py的代码详解: 1. 导入必要的库和模块 ```python import torch import torch.nn as nn import numpy as np from collections import OrderedDict from utils.general import anchors, autopad, scale_img, check_anchor_order, check_file, check_img_size, \ check_requirements, non_max_suppression, xyxy2xywh, xywh2xyxy, plot_one_box from utils.torch_utils import time_synchronized, fuse_conv_and_bn, model_info from models.common import Conv, DWConv ``` 2. 定义YOLOv5模型 ```python class YOLOv5(nn.Module): def __init__(self, nc=80, anchors=(), ch=(), inference=False): # model, input channels, number of classes super(YOLOv5, self).__init__() self.nc = nc # number of classes self.no = nc + 5 # number of outputs per anchor self.nl = len(anchors) # number of detection layers self.na = len(anchors[0]) // 2 # number of anchors per layer self.grid = [torch.zeros(1)] * self.nl # init grid a = torch.tensor(anchors).float().view(self.nl, -1, 2) self.register_buffer('anchors', a) # shape(nl,na,2) self.register_buffer('anchor_grid', a.clone().view(self.nl, 1, -1, 1, 1, 2)) # shape(nl,1,na,1,1,2) self.m = nn.ModuleList(nn.Conv2d(x, self.no * self.na, 1) for x in ch) # output conv self.inference = inference # inference flag ``` 3. 定义前向传播函数 ```python def forward(self, x): self.img_size = x.shape[-2:] # store image size x = self.forward_backbone(x) # backbone z = [] # inference output for i in range(self.nl): x[i] = self.m[i](x[i]) # conv bs, _, ny, nx = x[i].shape # x(bs,255,20,20) to x(bs,3,20,20,85) x[i] = x[i].view(bs, self.na, self.no, ny, nx).permute(0, 1, 3, 4, 2).contiguous() if not self.training: # inference if self.inference == 'tflite': z.append(x[i].detach().cpu()) # inference tflite else: io = x[i].sigmoid() io[..., 4:] = io[..., 4:] * io[..., 4:].mean(1, keepdim=True) * self.nc # sigmoid obj,class scores bxy = io[..., :2].sigmoid() * 2. - 0.5 + self.grid[i] # xy bwh = io[..., 2:4].exp() * self.anchor_grid[i] # wh xywh = torch.cat((bxy, bwh), -1).view(bs, -1, 4) * self.stride[i] # xywh (center+offset) relative to image size z.append(xywh.view(bs, -1, self.no), ) # xywhn return x if self.training else (torch.cat(z, 1), x) ``` 4. 定义后向传播函数 ```python def forward_backbone(self, x): x = self.conv1(x) x = self.bn1(x) x = self.act1(x) x = self.pool1(x) x = self.layer1(x) x = self.layer2(x) x = self.layer3(x) x = self.layer4(x) x = self.layer5(x) x = self.layer6(x) x = self.layer7(x) x = self.layer8(x) x = self.layer9(x) return x ``` 以上就是yolo.py的代码详解,其中包括了YOLOv5模型的定义和前向传播函数的实现。相关问题如下: 相关问题: 1. YOLOv5模型的输入和输出是什么? 2. YOLOv5模型的训练过程是怎样的? 3. YOLOv5模型中的anchors是什么?

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值